Unity - Unity Event) 복습을 위해 작성하는 글 2023-05-12

rizz·2023년 5월 12일
0

Unity

목록 보기
4/4

📒 갈무리 - Unity Event

📌 Unity Event란?

- C#의 이벤트와 델리게이트 기능을 사용하기 편하도록 랩핑 해놓은 것

- 어떤 이벤트가 발생하면 그 이벤트에 등록해 둔 모든 함수가 자동으로 호출된다.

- 등록된 함수들은 언제 발동될지, 어떻게 발동될지 관심이 없다.

- 이벤트를 발생시키는 측도, 이벤트에 등록된 함수들도 서로에게 관심이 없다.

- 코드들이 스파게티처럼 엮이지 않아 코드가 간결해진다.

 

📌 이벤트를 사용하지 않았을 때의 예를 들어보자...

PlayerHealth에서 플레이어가 죽었음을 감지했을 때 일어나는 상황을 가정

UIManager

- 도전 과제가 해제되었다는 메세지를 화면에 출력

AchivementSystem

- 플레이어가 죽으면 5초 뒤에 게임을 재시작시킨다.

GameManager

- "You Die!" 텍스트를 화면에 출력

// C# Script

public class PointManager : MonoBehavior
{
	public UIManagger uiManager;
    public AchivementSystem achivementSystem
    public GameManager gameManager;
    
    private void Dead()
    {
    	uiManager.OnPlayerDead();
        achivementSystem.UnLockAchivement();
        gameManager.OnPlayerDead();
        
        Debug.Log("Dead");
        Destroy(gameObject);
    }
}

위처럼 이벤트를 사용하지 않고 구현하였을 때의 문제점

- 실행시키는 측, 실행되는 측 둘 다 서로를 알고 있고 연결되어 있어야 한다.

- PlayerHealth.cs는 UIManager, AchivementSystem, CameNanger 이 3개를 다 알고 있어야 한다. (무언가 추가되면 그것 또한 알아야 할 것이다.)

- 각 3개 스크립트를 참조할 수 있는 변수를 선언하고(uiManager, achivementSystem, sameManager) 유니티 슬롯에 각 3개의 스크립트가 붙어있는 오브젝트들을 죄다 드래그 앤 드롭 해주어야 한다.

- 그러나 AchivementSystem은 보통 게임 제작이 완료된 후에 만들기 때문에 PlayerHealth.cs를 쓸 때는 AchivementSystem 에 대한 정보를 모를 수 있다.

- PlayerHealth.es 은 딱 플레이어의 체력에 관한 내용만 들어가는 것이 좋은데 UManager, Achivementsystem, CameNanger 등 다른 오브젝트들까지 다 알고 있어야 한다.

- 플레이어와 관련된 기능이 추가될 때마다 PlayerHealth.cs에 또 참조할 수 있는 변수를 추가해야 한다.

- 스파게티 코드가 될 확률이 높다.

- 코드가 점점 복잡해지고 서로의 코드에 영향을 많이 받게 된다.

- 이벤트가 발생할 시 실행되야 할 함수가 많다면 일일이 유니티 슬롯에서 다 드래그 앤 드롭 해주어야 하는 불편이 따른다.

 

📌 이벤트를 사용한다면...

// C# Script

public class PlayerHealth : MonoBehavior
{
	public UnityEvent onPlayerDead;
    
    private void Dead()
    {
    	// UnityEvent만 호출하면 끝.
    	onPlayerDead.Invoke();
        
        Debug.Log("Dead!");
        Destroy(gameObject);
    }
}

- 결합성이 낮아진다.

- 코드 관리가 아주 수월해진다.

profile
삼겹살_치킨_햄버거_피자

0개의 댓글