모름

유니티 게임 엔진은 기본적으로 콤포넌트 패턴을 활용하고 있습니다. 객체지향 프로그래밍에서 쓰이는 이 패턴을 이해해보겠습니다.

 

간단하게 총알을 예재로 보겠습니다.

 

콤포넌트 패턴 예제 - 적용 전

 

 

총알이 날라가다가 벽에 부딪히면 멈추는 장면입니다. 코드를 확인해보겠습니다.

 

using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float lifeTime;
    public float speed;

    private Rigidbody rb;
    private bool isMoveable = true;

    private void Start()
    {
        rb = gameObject.AddComponent<Rigidbody>();
        rb.useGravity = false;

        Destroy(this.gameObject, lifeTime);
    }

    private void Update()
    {
        if(isMoveable) transform.position += new Vector3(0, 0, speed) * Time.deltaTime;
    }


    private void OnCollisionEnter(Collision collision)
    {
        rb.useGravity = true;
        isMoveable = false;
    }
}

 

총알을 구성하기 위해 Bullet 스크립트를 만들어서 붙여주었습니다. 스타트에서 라이프타임이 주어지고, 업데이트에서 이동합니다. 그리고 콜라이더에 부딪혔을 때 중력이 적용하면서 떨어지게 됩니다. 이 구성을 예를 들어 콤포넌트 패턴을 적용한다고 치면 아래와 같이 변경할 수 있습니다.

 

 

 


 

 

 

콤포넌트 패턴 예제 - 적용 후

 

 

기능은 똑같지만 스크립트가 세 개로 늘었습니다.

 

public class SelfDestructable : MonoBehaviour
{
    public float lifeTime;

    private void Start() { Destroy(this.gameObject, lifeTime); }
}
public class Collisionable : MonoBehaviour
{
    private Rigidbody rb;

    private void Awake(){ rb = gameObject.AddComponent<Rigidbody>(); }

    private void OnCollisionEnter(Collision collision){ rb.useGravity = true; }
}
public class Moveable : MonoBehaviour
{
    public float speed;

    private Rigidbody rb;

    private void Start(){ rb = GetComponent<Rigidbody>(); }

    private void Update(){ if(rb.useGravity == false)  transform.position += new Vector3(0, 0, speed) * Time.deltaTime; }
}

 

똑같은 기능을 하지만, 스크립트를 3가지로 나누어 콤포넌트로 붙여넣었습니다. 총알에 들어가는 각각의 기능을 쪼개서말입니다.

 

이게 기본적인 콤포넌트 패턴의 이해입니다.

 

이렇게 로직을 분리하는 것의 장점은 다양하게 조립해서 유연하게 사용이 가능하다는 점이지만, 단점으로는 복잡도가 올라가는것이 되겠습니다. 

 

중요한 것은 이렇게 꼭 기능을 쪼개서 콤포넌트 형식으로 쓰는게 좋다는것이 아니라, 적절하게 상황에 맞게 콤포넌트로 뺴야할 것은 빼서 재사용해야할것입니다.

 

상황에 맞게 고민해서 어떨 때 콤포넌트 패턴을 적용할 것인가, 내가 만들고자 하는것에 어떤부분이 적용될수있는가 스스로 고민해보는게 필요해보입니다. 그리고 이러한 경우를 고민할 수 있다는거 자체가 이렇게 콤포넌트 패턴을 다시 상기하는것의 장점이 아닐까 싶습니다.

 

한 줄 정리 :

다양한 기능의 로직을 필요에 따라 분리하여 재사용 가능한 개별적인 기능의 콤포넌트로 만드는 패턴