게임 엔진/Unity

[Unity] 글로벌 이벤트 관리 방법

2020. 7. 6. 15:25
목차
  1. 글로벌 이벤트 관리 방법

글로벌 이벤트 관리 방법

이벤트를 관리하는 시스템을 하나 만듦으로서 굉장히 편하게 게임 개발을 진행할 수 있다.

게임오브젝트간의 상호작용이 필요한 상황에서는 필연적으로 종속성이 생길 수 밖에 없다.

하지만 이 종속성을 Event Manager라는 하나의 오브젝트로 모으도록 할 수 있다.

 

내 캐릭터가 어떤 영역에 들어갔을 때, 문이 열리는 상황을 가정해 보자.

문이 열리는 행동을 어떤 영역이 이벤트를 발생시켜서 수행해야 하는데,

객체 간 서로 상호참조를 통해 코드를 구현하면 코드가 너무 지저분해진다.

그러므로 먼저 EventManager 클래스를 생성하자.

 

 

EventManager.cs

EventManager는 게임 내 모든 오브젝트 간 상호작용 이벤트를 다루는 클래스이다.

싱글턴 클래스로 설계하여 어떤 오브젝트에서도 접근이 가능하다.

여기에 문이 열릴 경우, 닫힐 경우에 발생하는 이벤트와 이벤트를 수행하는 함수를 정의해준다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class EventManager : MonoBehaviour
{
	public static EventManager Instance;

	// Edit -> Project Settings -> Script Execution Order
	// Add EventManager -100 을 통해 Awake가 다른 객체들보다 먼저 호출됨을 보장한다.
	void Awake()
	{
		Instance = this;
	}

	public event Action<int> onDoorTriggerEnter;

	public void OnDoorTriggerEnter(int id)
	{
		if (onDoorTriggerEnter != null)
		{
			onDoorTriggerEnter(id);
		}
	}

	public event Action<int> onDoorTriggerExit;

	public void OnDoorTriggerExit(int id)
	{
		if (onDoorTriggerExit != null)
		{
			onDoorTriggerExit(id);
		}
	}
}

 

 

 

DoorController.cs

DoorController  클래스는 Door 오브젝트에 붙어있는 스크립트로 Door를 직접 움직여주는 역할을 담당한다.

이 객체는 생성될때 Door를 여는 작업과 닫는 작업에 대한 함수를 EventManager의 이벤트에 등록한다.

그리고 파괴될 때 이벤트를 제거한다.

또한 이 객체는 Door의 이벤트 수행 시 id를 통해 현재 이벤트가 자기 자신이 보낸 이벤트인지 확인한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DoorController : MonoBehaviour
{
	public int id;

    // Start is called before the first frame update
    void Start()
    {
		EventManager.Instance.onDoorTriggerEnter += OnDoorOpen;
		EventManager.Instance.onDoorTriggerExit += OnDoorExit;
	}

	void OnDoorOpen(int id)
	{
		if (id == this.id)
		{
			LeanTween.moveLocalY(gameObject, 3.6f, 1f);
		}
	}

	void OnDoorExit(int id)
	{
		if (id == this.id)
		{
			LeanTween.moveLocalY(gameObject, 0.9f, 1f);
		}
	}

	private void OnDestroy()
	{
		EventManager.Instance.onDoorTriggerEnter -= OnDoorOpen;
		EventManager.Instance.onDoorTriggerExit -= OnDoorExit;
	}
}

 

 

TriggerArea.cs

TriggerArea는 이벤트가 발생하는 영역이다.

충돌의 시작, 끝에 대한 함수를 정의하고 EventManager를 통해 각 상황에 이벤트를 발생시킨다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TriggerArea : MonoBehaviour
{
	public int id;

	private void OnTriggerExit(Collider collision)
	{
		EventManager.Instance.OnDoorTriggerExit(id);
	}

	private void OnTriggerEnter(Collider other)
	{
		EventManager.Instance.OnDoorTriggerEnter(id);
	}
}

 

 

 

Inspector

인스펙터에서 다음과 같이 게임오브젝트를 생성시켜준다.

빈 게임 오브젝트 -> EventManager.cs

 

빈 게임 오브젝트(Wall) 

    3D Cube 오브젝트 -> DoorController.cs  (id = 1)

    3D Box Collider -> TriggerArea  (id = 1)

 

빈 게임 오브젝트(Wall)

    3D Cube 오브젝트 -> DoorController.cs  (id = 2)

    3D Box Collider -> TriggerArea  (id = 2)

 

 

 

결과 화면

다음과 같이 문이 열림을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

'게임 엔진 > Unity' 카테고리의 다른 글

[Unity] [Example] Singleton  (0) 2020.07.13
[Unity] Hp Bar 만들기  (0) 2020.07.13
[Unity] 전략게임 카메라 제작 방법  (0) 2020.07.06
[Unity] 동적타임에 NavMesh 생성하기  (0) 2020.07.02
[Unity] 커스텀 에디터 제작 방법 (Editor Customize)  (0) 2020.06.30
  1. 글로벌 이벤트 관리 방법
'게임 엔진/Unity' 카테고리의 다른 글
  • [Unity] [Example] Singleton
  • [Unity] Hp Bar 만들기
  • [Unity] 전략게임 카메라 제작 방법
  • [Unity] 동적타임에 NavMesh 생성하기
AlgorFati
AlgorFati
algorfati@gmail.com
AlgorFati
AlgorFati의 개발 기록
AlgorFati
전체
오늘
어제
  • 분류 전체보기 (111)
    • 경제 (0)
    • 서비스 운영 (3)
    • 시행착오 (1)
    • 프로그래밍 (50)
      • CS 개념 (3)
      • 알고리즘 (32)
      • C++ (7)
      • C# (3)
      • OS (1)
      • Python (4)
    • 사업 (0)
    • Back End (1)
    • 생활 (1)
    • 정보 보안 (0)
    • 게임 개발 (1)
    • Tool (2)
    • 기술 (0)
    • AI (2)
    • 게임 엔진 (50)
      • Unreal (36)
      • Unity (14)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • geom
  • Animation
  • property editor
  • 대기업
  • ml agent
  • data asset
  • unity
  • Collision
  • c#
  • 취업
  • Slate
  • aggregate geom
  • Unreal
  • Serialize
  • TickGroup
  • pathfinding
  • Editor
  • hp bar
  • 코딩테스트
  • 알고리즘
  • 카카오
  • 프로그래머스
  • asset to editor
  • debug draw
  • Nullable
  • 비동기 프로그래밍
  • 불변성
  • customize
  • navmesh
  • Event Handling

최근 댓글

최근 글

hELLO · Designed By 정상우.
AlgorFati
[Unity] 글로벌 이벤트 관리 방법
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.