Unity에서 C# 델리게이트 사용
정지 동작이 있는 게임을 만들고 있습니다. 게임이 프리즈 모드일 때 다른 게임 오브젝트에 알리고 싶습니다. 따라서 그들은 그에 따라 행동할 수 있습니다.
이 데모를 확인하십시오.
그것이 c# delegates이 편리한 곳입니다.
이벤트 매니저
일반적으로 이벤트를 등록할 장소가 필요합니다. 따라서 다른 게임 개체는 이벤트를 등록하고 수신할 수 있습니다. 내 앱에는 다음과 같은 GameConfig라는 클래스가 있습니다.
(이 클래스에는 더 많은 코드가 있지만 명확성을 위해 제거했습니다.)
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class GameConfig : MonoBehaviour
{
public delegate void FreezeChangeHandler(bool isFreezed);
private FreezeChangeHandler freezeHandlers;
public static GameConfig current;
void Start()
{
GameConfig.current = this;
}
// Update is called once per frame
void Update()
{
}
public void OnFreezeChange(FreezeChangeHandler e)
{
freezeHandlers += e;
}
public void OffFreezeChange(FreezeChangeHandler e)
{
if (freezeHandlers == null) return;
freezeHandlers -= e;
}
public void Freeze()
{
freezeHandlers?.Invoke(true);
}
public void UnFreeze()
{
freezeHandlers?.Invoke(false);
}
}
많아 보이지만 하나하나 자세히 설명드리겠습니다.
public delegate void FreezeChangeHandler(bool isFreezed);
여기서 우리는 대리자를 정의합니다. 함수 서명에 대한 사용자 정의 유형입니다. 이 경우 부울을 받아들이고 아무 것도 반환하지 않는 함수에 대한 대리자를 정의합니다.
private FreezeChangeHandler freezeHandlers;
여기서 우리는 델리게이트의 핸들러(기능)를 유지하기 위한 변수를 정의했습니다. 이 작업을 수행하지 못한 경우 걱정하지 마십시오. 당신은 조금 이해합니다.
public void OnFreezeChange(FreezeChangeHandler e)
{
freezeHandlers += e;
}
이것은 다른 게임 개체가 핸들러를 등록하는 우리 클래스의 공용 함수입니다. 이렇게 하면 앱의 정지 상태가 변경될 때 알림을 받을 수 있습니다.
보다. 이 함수의 첫 번째 인수는 대리자입니다. 따라서 함수를 인수로 사용하여 이 함수를 호출할 수 있습니다.
(우리는 그것을 조금 볼 수 있습니다)
public void OffFreezeChange(FreezeChangeHandler e)
{
if (freezeHandlers == null) return;
freezeHandlers -= e;
}
이것은 이전 것과 유사하지만 핸들러를 제거하기 위한 것입니다. 여기에서
freezeHandlers
가 null이 아닌지 확인해야 합니다. 내부에 해당 항목이 없으면 아무 것도 제거할 수 없기 때문입니다.public void Freeze()
{
freezeHandlers?.Invoke(true);
}
public void UnFreeze()
{
freezeHandlers?.Invoke(false);
}
마지막으로 이러한 핸들러를 알리거나 호출하는 두 가지 함수가 있습니다. 내 앱에는 이와 같은 두 가지 기능이 있습니다. 그러나 앱에서는 일부 사용자 입력 등을 기반으로 할 수 있습니다.
알아야 할 것은 이러한 핸들러를 다음과 같이 호출하는 방법입니다.
reezeHandlers?.Invoke(true);
핸들러 등록
이제 다음과 같이 이 델리게이트에 대한 핸들러를 등록할 수 있습니다.
using System;
using System.Collections;
using UnityEngine;
public class Drop : MonoBehaviour
{
void Start()
{
GameConfig.current.OnFreezeChange(WithFreezeChange);
}
private void OnDestroy()
{
GameConfig.current.OffFreezeChange(WithFreezeChange);
}
private void WithFreezeChange(bool isFreezed)
{
// Do something with the state change
}
}
각 코드 블록에 대해 설명하겠습니다.
private void WithFreezeChange(bool isFreezed)
{
// Do something with the state change
}
위 함수는 이벤트에 대한 핸들러입니다. 위임과 유사한 서명이 있습니다. 부울을 허용하고 아무것도 반환하지 않습니다.
void Start()
{
GameConfig.current.OnFreezeChange(WithFreezeChange);
}
그런 다음 게임 구성의 인스턴스를 가져와 핸들러를 등록합니다.
private void OnDestroy()
{
GameConfig.current.OffFreezeChange(WithFreezeChange);
}
또한 게임 개체가 파괴될 때 핸들러를 제거해야 합니다. 그렇지 않으면 오류 및 메모리 문제가 발생합니다.
예시
여기까지 읽어주셔서 감사합니다 🙏.
실제로 이것을 보려면 this example game을 살펴보십시오.
Reference
이 문제에 관하여(Unity에서 C# 델리게이트 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gamedev4k/using-c-delegates-in-unity-4l1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)