코테 스터디도 시작하고, 최근에 과제 새로 만들거나 수정한다거나 해서
회고시간에 너무 바빠서 정리를 잘 못했었다.
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 업데이트를 위해 이들 기능을 많이 사용합니다.
아직 배울게 정말 많은 것 같다.
다음주부터 유니티 시작