프로그래밍 농장

유니티 이벤트 [ Unity ] 본문

Unity

유니티 이벤트 [ Unity ]

Tennessee201 2022. 7. 11.
728x90

이번글에서는 이벤트와 델리게이트를 사용하기 쉽게 유니티가 wrapping 해 놓은 오브젝트인 유니티 이벤트에 대해서 알아보자. 

 

- 이벤트?

: 사건이 발생되면 그 사건에 등록을 해놓은 기능들이 자동으로 같이 발동되는것

-> 이때 이벤트를 발생시키는쪽, 그 이벤트에 기능을 등록해놓은 오브젝트들 서로가 전혀 연계되어있지않다 -> 이로써 스파게티처럼 코드가 엮이는 불상사가 없어진다. 

예를 들어 플레이어가 사망함과 동시에  ->  사망했다는 UI / 도전과제 unlock / . . 과 같은 다양한 기능을 깔끔하게 수행하고 싶다고 가정해보자. 

위와 같이 PlayerAsset에 collider를 주어 아래 용암에 닿으면 console log에 죽었다는 알림과 함께 PlayerAsset을 삭제하고싶다.

당연하게도 PlayerAsset에 아래의 코드를 작성하여 component 추가만 해주면 될것이다.

void OnTriggerEnter(Collider other)
    {
        Debug.Log("죽었다!");
        Destroy(gameObject);
    }

용암에 닿은 결과

 

만약 위와 같이 플레이어가 용암에 닿아 죽었을때, console에 해당 text를 띄워줌과 동시에 아래와 같은 여러가지 기능들을 연쇄적으로 수행시키고 싶다면, 아래와 같이 하드하게 class 및 내부 기능들을 참조해주어야 할것이다. 

public class PlayerHealth : MonoBehaviour
{
    //
    public UIManager UIManager;

    public AchivementSystem achivementSystem;

    public GameManager gameManager;

    

    // 아래 Dead() 함수가 수행될때 타 스크립트의 기능을 연쇄적으로 수행하고싶음
    // -> 위와 같이 하드하게 전부 class를 참조해서 사용하여야한다. 
    private void Dead()
    {
        UIManager.OnPlayerDead();
        achivementSystem.UnLockAchivement("뉴턴의 법칙");
        gameManager.OnPlayerDead();

        Debug.Log("죽었다!");
        Destroy(gameObject);
    }
    
    void OnTriggerEnter(Collider other)
    {
        Dead();
    }

}

 


위와 같은 방식의 코드작성을 방지하기 위해 존재하는것이 유니티 이벤트이다. 

 

기본적으로 Player는 Dead()라는 기능을 가지고있다고 할때,  이 외에 UI Managert / Game Manager / Achivement System 세가지가 Dead()에 연결을 하고싶다. 

-> 이때 플레이어는 이 3가지 기능에 대해 신경쓸 필요없이 Dead()만을 수행하면 된다. 

-> Dead()라는 일종의 List에 위 세가지의 기능을 명단처럼 넣는다. -> but 서로에게 전혀 관심이 없기에 코드가 매우 간결해진다.

 

Script에서 using.UnityEngine.Event; 를 넣어주고, 기존의 함수 3가지를 지워준 후, 

public UnityEvent onPlayerDead;

private void Dead(){
	onPlayerDead.Invoke(); // Dead 함수가 돌아갈때 갈이 수행될 걸이 // 이곳에 수행될 기능을 건다.
    Debug.Log("죽었다!");
    Destory(gameobject);
    }

위와 같이 +버튼으로 3가지 빈창을 만들고 기존에 Dead()시 수행될 연쇄동작들을 넣어주면 된다. 

-> 이와 같은 구현을 통해 기능들이 서로의 존재를 굳이 알 필요가 없어, 코드가 간결하고 복잡할 필요가 없다. 

 

 

728x90

'Unity' 카테고리의 다른 글

Animator / Blending tree 구현 [ Unity ]  (0) 2022.07.14
델리게이트(delegate) / 대리자 [ Unity ]  (0) 2022.07.12
Property [ Unity ]  (0) 2022.07.11
Override [ Unity ]  (0) 2022.07.11
코루틴 [ Unity ]  (0) 2022.07.08