오브젝트 검색 FindGameObject

FindGameObjectWithTag()

  • FindGameObjectWithTag() 메서드는 지정된 태그를 가진 게임 오브젝트를 빠르게 찾을 수 있게 해줌
  • 유용하긴 하지만, 특히 큰 씬에서는 이 메서드가 성능에 부담을 줄 수 있음
    GameObject player = GameObject.FindGameObjectWithTag("Player");
    

FindGameObjectsWithTag()

  • 동일한 태그를 가진 여러 게임 오브젝트에 접근해야 하는 상황에서는 FindGameObjectsWithTag()가 유용
  • 지정된 태그를 가진 모든 게임 오브젝트를 Array로 반환합니다.
    GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
    

SendMessageOptions

GameObject.SendMessage(string methodName, SendMessageOption option);
  • SendMessage() 메서드를 이용하면 게임 오브젝트에 동적으로 메서드를 호출할 수 있습니다.
  • SendMessageOptions 열거형은 이 호출이 어떻게 처리될지를 정합니다.
메서드 설명
SendMessageOptions.RequireReceiver 수신자가 없을 경우 에러를 발생시킵니다.
SendMessageOptions.DontRequireReceiver 수신자가 없어도 에러를 발생시키지 않습니다.
  • SomFunction과 동일한 메서드가 있다면, 실행 시키고 없어도 에러를 반환하지 않음
    gameObject.SendMessage("SomeFunction", SendMessageOptions.DontRequireReceiver
    


사용자 정의 이벤트 - Delegate

  • SendMessage의 같은 경우 호출해야 하는 오브젝트가 많다면, 성능에 문제가 생길 수 있다.
  • foreach 처럼 순차적인 함수 호출 방식에서 => 이벤트 구동방식 (Event Driven) 방식으로 최적화 가능

Event

  • 특정한 조건을 만족하면 자동으로 아려주는 메세지 (Notification)을 의미
  • 예를 들어, Player가 사망할 때 “Player Die”를 알리는 이벤트를 생성하면, 이러한 상황이 발생시 시스템에서 이를 자동으로 통보 (Notification)하고, 이벤트에 연결된 모든 적 유닛에 해당 동작을 수행 시킬 수 있음
  • 이벤트 방식은 for, foreach 구문을 사용해 순차적으로 호출하는 방식보다 메모리 사용, 구동속도에 효율적

Delegate

  • 델리게이트 함수(메서드)를 참조하는 변수를 의미
  • 즉, 메서드를 저장할 수 있는 일종의 변수 (C++의 함수 포인터와 같은 의미)
  • 델리게이트 사용시, 선언해야 함
    private delegate 반환타입 델리게이트명 (매개변수);
    
using UnityEngine;

public class DelegateDemo : MonoBehaviour
{
	// 델리게이트 선언
	delegate float SumHandler(float a, float b);
	// 델리게이트 타입의 변수 선언
	SumHandler sumHandler;
	
	// 덧셈 연산을 하는 함수
	private float Sum(float a, float b)
	{
		return a + b;
	} 
	
	private void Start()
	{
		// 델리게이트 변수에 함수 (메서드) 연결 (할당)
		sumHandler = Sum;
		// 델리게이트 실행
		float sum = sumHandler(10.0f, 5.0f);
		// 결괏값 출력
		Debug.Log($"Sum = {sum}");
	} 
}
// 스크립트 활성화 시 호출되는 이벤트 함수
private void OnEnable()
{
	// 이벤트 발생 시 수행할 함수 연결
	이벤트가 선언된 Class_Name.Event_Name += 이벤트 발생  호출할 함수; 
}

// 스크립트 비활성화 시 호출되는 이벤트 함수
private void OnDisable()
{
	// 기존 선언된 이벤트 해제
	이벤트가 선언된 Class_Name.Event_Name -= 이벤트 발생  호출했던 함수;
}