Unity에서 C# 델리게이트 사용

10721 단어 unitygamedevcsharp
먼저 사용 사례에 대해 이야기해 보겠습니다.

정지 동작이 있는 게임을 만들고 있습니다. 게임이 프리즈 모드일 때 다른 게임 오브젝트에 알리고 싶습니다. 따라서 그들은 그에 따라 행동할 수 있습니다.

이 데모를 확인하십시오.



그것이 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을 살펴보십시오.

좋은 웹페이지 즐겨찾기