[UNITY],[C#]/TIL : UNITY

Unity와 C#의 기본 개념 다지기

네,가능합니다 2024. 11. 22. 22:53

오늘은 여러가지 개념들을 정리해보는 시간을 가져볼것이다.

최근들어 기본기를 다져야겠다는 생각이 들어서인지 이런 글을 자주 쓰게 된다.

생각보다 많은걸 깨달았고 많은걸 놓치면서 배워온게 느껴져서인것같다.

 

첫번째로 객체지향 프로그래밍의 기본 개념들을 정리해보자

 

클래스: 데이터와 행동(메서드)를 묶는 청사진, 객체를 생성하는 기반

 

상속: 부모 클래스의 속성과 메서드를 자식 클래스에서 재사용

 

다형성: 부모 클래스를 참조하여 자식 클래스의 행동을 실행

 

두번째는 유니티의 컴포넌트 기반 구조의 개념을 살펴보자

유니티는 컴포넌트 기반 설계를 채택하였다.

GameObject는 빈 컨테이너 이고 컴포넌트를 이용하여 동작을 정의한다.

 

MonoBehaviour: 유니티에서 제공하는 기본 컴포넌트 스크립트, 생명주기 메서드를 제공

 

세번째는 이벤트와 델리게이트이다.

델리게이트: 메서드를 참조하고 실행할 수 있는 타입, 동작을 다른 코드에 전달할 수 있다.

 

이벤트: 델리게이트를 기반으로 특정 상황에서 메서드 호출을 자동화할 수 있다.

 

네번째는 ScriptableObject이다.

ScriptableObject는 데이터를 관리하는 '경량'오브젝트 이다.

게임 데이터를 저장하고 공유할 수 있고, 직렬화가 가능하다.

SO는 데이터 중심 설계에 적합하며, 코드와 데이터분리를 가능하게 한다.

 

 

 

여기까지 정리했는데, 델리게이트를 사용안해본지 너무 오래돼서 델리게이트와 이벤트의 개념을 좀 짚고넘어가고싶다.

 

아래의 표를 보면 한눈에 이해가 가능하다.

정의 메서드 참조를 저장하고 실행. 델리게이트를 기반으로, 구독/발행 패턴 구현.
외부 접근 외부에서 메서드 추가, 제거, 호출 가능. 외부에서 직접 호출 불가능(발행자 내부에서만 호출).
주요 기능 콜백 및 메서드 체인. 구독/발행 시스템으로 코드 결합도를 낮춤.
사용 사례 콜백, 동적 메서드 호출, 유연한 메서드 실행. 특정 상태 변화(게임 이벤트, UI 이벤트) 처리.

 

 

유니티에서 대부분의 상호작용은 이벤트 기반으로 설계된다.

아래의 예제의 버튼 클릭같은것도 이벤트이다.

 

using UnityEngine;
using UnityEngine.UI;

public class ButtonExample : MonoBehaviour
{
    public Button myButton;

    void Start()
    {
        myButton.onClick.AddListener(OnButtonClick);
    }

    void OnButtonClick()
    {
        Debug.Log("버튼클릭");
    }
}

 

아래는 적이 죽었을 때 점수가 증가하는걸 구현한 내용이다.

 

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public delegate void EnemyDeathHandler();
    public static event EnemyDeathHandler OnEnemyDeath;

    public void Die()
    {
        OnEnemyDeath?.Invoke(); // 이벤트 발생
    }
}

public class ScoreManager : MonoBehaviour
{
    void OnEnable()
    {
        Enemy.OnEnemyDeath += IncreaseScore;
    }

    void OnDisable()
    {
        Enemy.OnEnemyDeath -= IncreaseScore;
    }

    void IncreaseScore()
    {
        Debug.Log("점수 증가!");
    }
}

 

이런구현은 다들 많이 했을것이다.

 

그렇다면 유니티에서 델리게이트를 사용하는 경우는 어떤게 있을까 ?

 

첫번째로 콜백 처리가 있다.

 

델리게이트는 특정 메서드를 매개변수로 전달해야 하는 경우 유용하다.

using UnityEngine;

public class AsyncTask : MonoBehaviour
{
    public delegate void TaskCompleted();
    
    public void StartTask(TaskCompleted callback)
    {
        StartCoroutine(TaskCoroutine(callback));
    }

    private IEnumerator TaskCoroutine(TaskCompleted callback)
    {
        Debug.Log("Task Started...");
        yield return new WaitForSeconds(2);
        Debug.Log("Task Completed!");
        callback?.Invoke();
    }
}

public class TaskUser : MonoBehaviour
{
    void Start()
    {
        AsyncTask task = new AsyncTask();
        task.StartTask(OnTaskComplete);
    }

    void OnTaskComplete()
    {
        Debug.Log("Callback Executed!");
    }
}

 

AsyncTask는 비동기 작업을 관리하는 클래스이다.

 

콜백으로 사용할 델리게이트를 선언하고

 

StartTask는 작업 시작 메서드이다.

해당 메서드를 호출하면 코루틴을 사용하여 콜백을 전달하고

작업시작 메세지 후 2초간대기하고 작업완료 메세지를 출력한다.

그리고 콜백을 호출한다.

그러면 매개변수로 전달받은 메서드를 호출한다.

 

하.. 사실 델리게이트는 유니티에서는 걍 별로 안쓰인다.