void Update()
{
// 스페이스바가 눌렸을 때
if (Input.GetKeyDown(KeyCode.Space)) {}
// "W" 키가 눌려있는 동안
if (Input.GetKey(KeyCode.W)) {}
// "S" 키가 뗴어졌을 때
if (Input.GetkeyUp(KeyCode.S)) {}
// 마우스 좌클릭이 눌렸을 때
if (Input.GetMouseButtonDown(0)) {}
// 마우스 우클릭이 눌려있는 동안
if (Input.GetMouseButton(1)) {}
// 마우스 중앙 클릭이 떼어졌을 때
if (Input.GetMousrButtonUp(2)) {}
// 게임패드의 수평축과 수직축 입력 값
// GetAxis : 0 -> 1 까지 올라감 , GetAxisRaw : 바로 1이 할당됨.
float horizontal = Input.GetAxis("Horizontal");
float vetical = Input.GetAxis("Vertical");
if (horizontal != 0 || vertical != 0) {}
}
생명주기 이벤트
렌더링 이벤트
- OnRenderObject, OnPreCull, OnPostRender
이벤트의 목적과 타이밍을 잘 이해하고 사용할 것
과도한 Update사용은 피할 것
물리 계산은 FixedUpdate에서 사용. 고정된 시간 간격으로 호출되기 때문.
public class LifecycleExample : Monobehaviour
{
void Awake()
{
Debug.Log("오브젝트가 생성될 때 호출된다.");
}
void Start()
{
Debug.Log("첫 번째 Update 호출 전에 실행된다.");
}
void Update()
{
Debug.Log("매 프레임마다 호출된다.");
}
void FixedUpdate()
{
Debug.Log("고정된 시간 간격으로 호출된다. (주로 물리 계산에 사용)");
}
void LateUpdate()
{
Debug.Log("모든 Update메소드가 호출된 후에 실행된다.");
}
void OnEnable()
{
Debug.Log("오브젝트가 활성화될 때 호출된다.");
}
void OnDisable()
{
Debug.Log("오브젝트가 비활성화될 때 호출된다.");
}
void OnDestory()
{
Debug.Log("오브젝트가 파괴될 때 호출된다.");
}
}
충돌 이벤트
- OnCollisionEnter : 다른 물체와 충돌할 때 처음 호출
트리거 이벤트
많은 수의 트리거와 충돌 이벤트는 게임의 성능을 저하시킴
물리 이벤트는 물리 엔진의 업데이트 주기에 따라 호출되므로 Update() 메소드와는 다른 타이밍으로 실행될 수 있다.
애니메이션 상태 변화 이벤트
- OnStateEnter : 애니메이션의 시작
OnStateUpdate는 사용을 주의할 것. 매 프레임 호출되므로 성능과 직접적 영향.
애니메이션 상태 변화 이벤트는 애니메이션 클립과 연결되어 있어야 한다.
버튼 클릭, 드래그, 드롭 이벤트
- OnClick, OnDrag, OnDrop
UI상호작용 이벤트
- IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler
UI는 사용자 친화적 이어야한다. 터치나 클릭같은 행동이 잘 되어야 한다. ( 클릭 영역이 충분하게 구현을 한다거나 등 사용자의 입장을 항상 생각하며 구현을 해야한다. )
C# 델리게이트와 이벤트
개발자가 정의한 특정조건이나 행동에 반응하는 사용자 정의 이벤트
델리게이트
이벤트
- 이벤트는 델리게이트를 기반으로 한다.
델리게이트 : 나는 나중에 이 메서드를 호출할 것이다.
이벤트 : 이 일이 발생하면 알려줄께, 그러면 너는 ~~를 해라 하고 명령하는 것에 가깝다.
델리게이트 : 일종의 메소드에 대한 참조를 저장하는 것, 메소드를 변수처럼 저장하고. 전달하고 실행하고 이러한 기능을 말한다. 그래서 반환타입이나 매개변수가 똑같으면 특정 메소드를 참조할 수 있다.
이벤트 : 델리게이트를 기반으로 함. 특정 이벤트가 발생했을 때, 그 이벤트를 구독하는 다른 모든 메소드들 한테 신호를 보내는 그런 시스템. (클래스 외부에서는 직접 호출 불가능)
Delegate
// 델리게이트 선언, 호출할려는 메소드의 시그니처와 일치하는 델리게이트 선언
public delegate void CustomEventHandler();
// 델리게이트를 사용하여 이벤트를 선언
// 이 이벤트는 클래스 내부에서 발생하고 외부에서는 구독만 가능하다.
public static event CustomEventHandler OnCustomEvent;
// 이벤트 발생, 이벤트를 발생시키는 메소드를 정의함. 이 메소드는 이벤트를 구독하는 모든 메소드를 호출함.
public static void TriggerCustomEvent()
{
if (OnCustomEvent != null)
{
OnCustomEvent.Invoke();
}
}
// 이벤트 구독과 해제, 이벤트를 구독하고자 하는 클래스에서 이벤트를 구독, 필요한 경우에는 해제함.
void OnEnable()
{
CustomEventClass.OnCustomEvent += CustomEventHandler;
}
void OnDisable()
{
CustomEventClass.OnCustomEvent -= CustomEventHandler;
}
void CustomEventHandler()
{
// 이벤트가 발생했을 때 실행할 코드
}
public event MyDelegate MyEvent;
// 구독
someObject.MyEvent += MyEvnetHandeler;
// 발행
if (someCondition)
{
MyEvent?.Invoke(10);
}
Unity_Event
// 사용자 정의 이벤트를 가진 클래스
public class CustomEventClass
{
public delegate void CustomEventHandler();
public static event CustomEventHandler OnCustomEvent;
public static void TriggerCustomEvent()
{
OnCustomEvent?.Invoke();
}
}
// 이벤트를 구독하는 다른 클래스
public class EventSubscriber : MonoBehaviout
{
void OnEnable()
{
CustomEventClass.OnCustomEvent += CustomEventHandler;
}
void OnDisable()
{
CustomEventClass.OnCustonEvent -= CustomEventHandler;
}
void CustomEventHandler()
{
// 이벤트가 발생했을 때 실행할 코드
Debug.Log("Custom Event Triggered!");
}
}
장점
- **유연성 :** 다양한 메소드를 동일한 델리게이트 변수에 할당할 수 있다.
단점
- **복잡성 :** 델리게이트의 사용이 과도하면 코드의 복잡성이 증가할 수 있다.
public delegate void MyDelegate(int value);
MyDelegate myDelegate = MyFunction;
void MyFunction(int number)
{
// 실행할 코드
}
myDelegate(5);
장점
- **캡슐화 :** 이벤트는 클래스 외부에서 직접 발생시킬 수 없어서, 캡슐화를 통해 안전한 코드 관리가 가능하다.
단점
- **이해도 요구 :** 이벤트의 개념과 사용 방법을 이해하는 데 시간이 소요될 수 있다.