오늘은 여러가지 개념들을 정리해보는 시간을 가져볼것이다.
최근들어 기본기를 다져야겠다는 생각이 들어서인지 이런 글을 자주 쓰게 된다.
생각보다 많은걸 깨달았고 많은걸 놓치면서 배워온게 느껴져서인것같다.
첫번째로 객체지향 프로그래밍의 기본 개념들을 정리해보자
클래스: 데이터와 행동(메서드)를 묶는 청사진, 객체를 생성하는 기반
상속: 부모 클래스의 속성과 메서드를 자식 클래스에서 재사용
다형성: 부모 클래스를 참조하여 자식 클래스의 행동을 실행
두번째는 유니티의 컴포넌트 기반 구조의 개념을 살펴보자
유니티는 컴포넌트 기반 설계를 채택하였다.
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초간대기하고 작업완료 메세지를 출력한다.
그리고 콜백을 호출한다.
그러면 매개변수로 전달받은 메서드를 호출한다.
하.. 사실 델리게이트는 유니티에서는 걍 별로 안쓰인다.
'[UNITY],[C#] > TIL : UNITY' 카테고리의 다른 글
[Unity] Physics 시스템에 대해 자세히 알아보자 (0) | 2024.11.21 |
---|---|
[Unity] 최적화 방법들을 알아보자 (0) | 2024.11.20 |
3. DOTween 활용하기 (0) | 2024.11.18 |
2. DOTween 을 배워보자 (0) | 2024.11.15 |
1. DOTween 이랑 씨름하기 (0) | 2024.11.14 |