안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.
오늘은 GPT-4, GPT-4o 활용해서 Unity에서 Scriptable Objects를 이용하여 게임 내 이벤트를 처리해볼께요.
[오늘의 목표] GPT-4, GPT-4o 활용해서 Unity에서 Scriptable Objects를 이용하여 게임 내 이벤트를 처리하기
- 플레이어가 보물 상자를 열면 특정 아이템을 획득하고, 이를 화면에 표시하는 시스템 만들기
※ 지난 시간에 설명한 Scriptable Objects 기능 외 오늘은 Scriptable Objects를 이용해서 이벤트 시스템을 구축하는 방법을 설명해요.
Scriptable Objects는 게임 데이터를 효율적으로 관리하고 재사용할 수 있게 하며, 코드와 데이터의 분리를 통해 유지보수성을 높여줘요. Unity의 강력한 에디터 통합 기능을 활용하여 비개발자도 쉽게 데이터 작업을 할 수 있어, 협업과 프로젝트 개발 속도를 크게 향상시킬 수 있어요.
Scriptable Objects의 또 다른 기능
Unity의 Scriptable Objects는 데이터 세트 관리 외에도 이벤트 시스템을 구현하여 이벤트를 전파하는 기능을 가지고 있어요. 이 기능을 통해 게임 내에서 발생하는 다양한 이벤트를 효율적으로 관리하고 처리할 수 있어요. 이를 통해 코드의 복잡성을 줄이고, 더 모듈화된 이벤트 시스템을 구현할 수 있죠.
쉽게 이해할 수 있도록 플레이어가 보물 상자를 열 때 발생하는 이벤트를 Scriptable Objects를 이용해볼께요.
이 예제에서는 플레이어가 보물 상자를 열면 특정 아이템을 획득하고, 이를 화면에 표시하는 시스템을 만들거예요.
이제 아래 설명하는 단계를 차근차근 진행해요.
1. Scriptable Object 이벤트 클래스 정의
먼저, ScriptableObject를 이용하여 이벤트를 정의해요.
using UnityEngine;
using System;
[CreateAssetMenu(fileName = "NewTreasureEvent", menuName = "Events/TreasureEvent")]
public class TreasureEvent : ScriptableObject
{
private event Action<string> listeners = delegate { };
public void Raise(string item)
{
listeners.Invoke(item);
}
public void RegisterListener(Action<string> listener)
{
listeners += listener;
}
public void UnregisterListener(Action<string> listener)
{
listeners -= listener;
}
}
2. 이벤트 리스너 클래스 작성
이벤트를 구독하고 발생 시 아이템을 화면에 표시하는 리스너 클래스를 작성해요.
using UnityEngine;
using UnityEngine.UI;
public class TreasureEventListener : MonoBehaviour
{
public TreasureEvent treasureEvent;
public Text displayText;
private void OnEnable()
{
treasureEvent.RegisterListener(OnEventRaised);
}
private void OnDisable()
{
treasureEvent.UnregisterListener(OnEventRaised);
}
public void OnEventRaised(string item)
{
displayText.text = "You found: " + item;
}
}
3. 보물 상자 클래스 작성
보물 상자를 열 때 이벤트를 발생시키는 클래스를 작성해요.
using UnityEngine;
public class TreasureChest : MonoBehaviour
{
public TreasureEvent treasureEvent;
public string[] possibleItems;
void OnMouseDown()
{
if (possibleItems.Length > 0)
{
string item = possibleItems[Random.Range(0, possibleItems.Length)];
treasureEvent.Raise(item);
Debug.Log("Treasure Chest opened! Found item: " + item);
}
else
{
Debug.Log("Treasure Chest opened, but no items are available.");
}
}
}
4. Unity 에디터 설정
아래 단계별로 설정을 해요.
Step 1: Scriptable Object 인스턴스 생성
- 프로젝트 창에서 우클릭 > Create > Events > TreasureEvent를 선택하여 새 TreasureEvent 인스턴스를 생성해요.
- 생성한 TreasureEvent 인스턴스를 TreasureChestOpened라고 이름을 지정해요.
Step 2: 보물 상자 오브젝트에 Box Collider 추가
- 보물 상자 오브젝트 선택:
- 씬에서 보물 상자 모델을 선택해요.
- Box Collider 추가:
- 인스펙터 창에서 Add Component 버튼을 클릭해요.
- Box Collider를 검색하여 추가해요.
- Box Collider의 크기와 위치를 보물 상자 모델에 맞게 조정해요.
Step 3: 보물 상자 설정
- TreasureChest 스크립트 추가:
- 보물 상자 모델에 TreasureChest 스크립트를 추가해요.
- treasureEvent 필드에 TreasureChestOpened를 할당해요.
- possibleItems 배열에 보물 상자에서 나올 수 있는 아이템 이름들을 추가해요 (예: "Gold", "Diamond", "Potion").
Step 4: 이벤트 리스너 설정
- 이벤트 리스너 오브젝트 생성:
- 빈 게임 오브젝트를 생성하고 TreasureEventListener 스크립트를 추가해요.
- treasureEvent 필드에 TreasureChestOpened를 할당해요.
- displayText 필드에 화면에 표시할 텍스트 UI 요소를 할당해요.
Step 5: UI 설정
- UI 텍스트 요소 추가:
- 캔버스를 생성하고 그 안에 텍스트 요소를 추가해요.
- 텍스트 요소의 위치와 크기를 적절히 조정해요.
- 텍스트 요소를 TreasureEventListener 스크립트의 displayText 필드에 할당해요.
변경사항을 저장하고 실행해요
모든 변경 사항을 저장하고 실행하면 아래 영상과 같이 이벤트 시스템이 만들어져요.
아래 이벤트 흐름을 살펴보면 이해가 더 쉽게 될거예요.
오늘은 GPT-4, GPT-4o 활용해서 Unity에서 Scriptable Objects를 이용하여 게임 내 이벤트를 처리해봤어요.
지금까지,
언제나 성장하는 인텔리원스튜디오(IntelliOneStudio)입니다.
감사합니다.
[정리 1] 이벤트 흐름 살펴보기
이벤트 흐름을 살펴보면 이해가 쉬울거에요.
- 플레이어가 보물 상자를 클릭해요:
- 플레이어가 보물 상자 오브젝트를 클릭해요.
- TreasureChest 스크립트의 OnMouseDown 메서드가 호출돼요.
- 보물 상자 스크립트가 이벤트를 발생시켜요:
- OnMouseDown 메서드 내에서 possibleItems 배열에서 무작위로 아이템을 선택해요.
- 선택된 아이템 이름을 TreasureEvent 인스턴스에 전달하여 Raise 메서드를 호출해요.
- 콘솔에 디버그 로그가 출력돼요.
- 이벤트가 발생하고 리스너가 이를 수신해요:
- TreasureEvent의 Raise 메서드가 호출되면 등록된 모든 리스너에 이벤트가 전파돼요.
- TreasureEventListener 스크립트는 OnEventRaised 메서드를 통해 이 이벤트를 수신해요.
- 리스너가 이벤트를 처리해요:
- TreasureEventListener의 OnEventRaised 메서드가 호출되어 전달된 아이템 이름을 받아와요.
- 받아온 아이템 이름을 UI 텍스트 요소에 표시해요.
- UI를 업데이트해요:
- 이벤트에 의해 전달된 아이템 이름이 화면에 표시돼요.
- 플레이어는 보물 상자에서 발견한 아이템을 UI를 통해 확인할 수 있어요.
[정리 2] 시각화된 이벤트 흐름 살펴보기
- 플레이어가 보물 상자를 클릭해요:
- TreasureChest 오브젝트 클릭
- OnMouseDown 호출
- 보물 상자 스크립트가 이벤트를 발생시켜요:
- 무작위 아이템 선택
- TreasureEvent.Raise(item) 호출
- 디버그 로그 출력
- 이벤트가 발생하고 리스너가 이를 수신해요:
- TreasureEventListener의 OnEventRaised 호출
- 리스너가 이벤트를 처리해요:
- 아이템 이름을 displayText에 표시
- UI를 업데이트해요:
- 화면에 "You found: 아이템 이름" 표시