25/03/07 멋사 정리

YSB1026·2025년 3월 7일
0

코테 스터디도 시작하고, 최근에 과제 새로 만들거나 수정한다거나 해서
회고시간에 너무 바빠서 정리를 잘 못했었다.

MFC, C# 윈도우 프로그래밍 배울 때
델리게이트 같은 전달자라든지, 함수 포인터 등을 배우긴 했었는데,
써본적이 별로 없기도하고, 조금 생소 하기도 해서 정리해봤다.
(gpt한테 유니티에서 쓸 수 있는 예제도 물어봐서 정리했다)

1.델리게이트 (Delegate)
2.이벤트 (Event)
3.액션 (Action)

1.델리게이트
/*
델리게이트는 메서드의 참조를 나타내는 타입
매개변수와 반환 타입이 동일한 메서드를 참조할 수 있음.
플레이어 충돌 처리
*/

using UnityEngine;

public class Player : MonoBehaviour
{
    // 델리게이트 선언
    public delegate void PlayerHealthChanged(int newHealth);

    // 델리게이트를 이벤트처럼 사용할 수 있도록 선언
    public event PlayerHealthChanged OnHealthChanged;

    private int health = 100;

    void Start()
    {
        // 델리게이트에 메서드 추가
        OnHealthChanged += UpdateHealthUI;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) // 예시로 스페이스바를 누르면 데미지를 받음
        {
            TakeDamage(10);
        }
    }

    public void TakeDamage(int damage)
    {
        health -= damage;
        OnHealthChanged?.Invoke(health);  // 델리게이트 호출
    }

    // 델리게이트로 호출될 메서드
    void UpdateHealthUI(int newHealth)
    {
        Debug.Log("Health updated: " + newHealth);
        // UI 업데이트 코드 작성 가능
    }
}

/*
PlayerHealthChanged라는 델리게이트를 선언하여, 플레이어의 체력이 변할 때마다 이벤트를 호출합니다.
체력이 변화할 때마다 OnHealthChanged 이벤트가 발생하고, UpdateHealthUI 메서드가 호출됩니다.
*/

2.이벤트
/*
이벤트는 델리게이트를 사용하여 선언
구독자는 이벤트를 구독하여, 이벤트가 발생할 때마다 처리할 핸들러 메서드를 등록
이벤트는 일반적으로 public으로 선언되며, 외부에서 호출하기보다는 내부에서만 발생할 수 있다.
이벤트는 델리게이트의 확장으로, 객체 간의 통신을 쉽게 할 수 있게 해줌.
이벤트는 보통 Publisher-Subscriber 패턴에서 사용됩니다.(나중에 공부할 것)
*/

using UnityEngine;

public class GameManager : MonoBehaviour
{
    // 게임 오버 이벤트
    public event System.Action OnGameOver;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.G))  // G 키를 누르면 게임 오버 처리
        {
            TriggerGameOver();
        }
    }

    void TriggerGameOver()
    {
        OnGameOver?.Invoke();  // 구독자가 있을 경우 이벤트를 호출
    }
}

public class UIManager : MonoBehaviour
{
    public GameManager gameManager;

    void Start()
    {
        gameManager.OnGameOver += ShowGameOverScreen;  // 게임 오버 이벤트 구독
    }

    void ShowGameOverScreen()
    {
        Debug.Log("Game Over! Displaying Game Over UI.");
        // 실제 UI를 표시하는 코드
    }
}

/*
설명:
GameManager 클래스에서 OnGameOver 이벤트를 정의하고, 게임 오버를 발생시키는 TriggerGameOver() 메서드를 구현합니다.
UIManager 클래스에서는 이 이벤트를 구독하여 게임 오버 시 게임 오버 화면을 표시합니다.
*/


3. 액션 (Action)
/*
액션은 반환값이 없는 델리게이트로, 메서드 참조를 쉽게 처리할 수 있습니다. 이벤트와 함께 사용하면 다양한 작업을 동적으로 처리할 수 있습니다.
*/

using UnityEngine;
using UnityEngine.UI;

public class Player : MonoBehaviour
{
    public int health = 100;
    public event System.Action<int> OnHealthChanged;  // 체력 변화 이벤트
    public event System.Action OnGameOver;  // 게임 오버 이벤트

    public Text healthText;

    void Start()
    {
        // 체력 변화 이벤트 구독
        OnHealthChanged += UpdateHealthUI;
        // 게임 오버 이벤트 구독
        OnGameOver += ShowGameOverScreen;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))  // 스페이스바를 누르면 체력 감소
        {
            TakeDamage(10);
        }
    }

    public void TakeDamage(int damage)
    {
        health -= damage;
        OnHealthChanged?.Invoke(health);  // 체력 변화 이벤트 발생

        if (health <= 0)
        {
            OnGameOver?.Invoke();  // 게임 오버 이벤트 발생
        }
    }

    void UpdateHealthUI(int newHealth)
    {
        healthText.text = "Health: " + newHealth;
    }

    void ShowGameOverScreen()
    {
        Debug.Log("Game Over! Displaying Game Over UI.");
        // 실제 UI 변경 코드를 여기에 작성할 수 있습니다
    }
}
/*
설명:
OnHealthChanged 이벤트는 체력 변화에 따라 UI를 업데이트합니다.
OnGameOver 이벤트는 체력이 0 이하로 떨어졌을 때 게임 오버 화면을 표시합니다.
Action<int>와 Action 델리게이트가 사용되어, 체력 변화와 게임 오버 처리를 각각 담당합니다.
*/

정리
델리게이트 (Delegate): 특정 메서드를 참조하여 동적으로 실행할 수 있습니다.

이벤트 (Event): 객체 간의 통신을 위한 방법으로, 구독자들이 이벤트를 구독하고 처리할 수 있습니다.

액션 (Action): 반환값이 없는 델리게이트로, 특정 작업을 처리하는 데 유용합니다.
유니티에서는 게임 이벤트를 처리하거나 UI 업데이트를 위해 이들 기능을 많이 사용합니다.

아직 배울게 정말 많은 것 같다.
다음주부터 유니티 시작

0개의 댓글