본문 바로가기
디지털노마드

[챗GPT게임개발18] ChatGPT를 활용하여 트리거와 이벤트 시스템을 활용

by 인텔리노마드라이프 2024. 5. 9.
728x90

안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.

오늘은 ChatGPT를 활용하여 Unity 플랫포머 게임에서 트리거와 이벤트 시스템을 활용해봐요. 

[오늘의 목표]
1. 트리거 관련 소스 코드를 살펴보기
2. 트리거 소스 코드를 활용하는 방법을 알아보기 
3. 스크립트 적용을 통해 트리거 및 이벤트 시스템 알아보기 
4. 실습하기

 

 ChatGPT 답변 내용 중 제가 별도로 표시한 파란색 내용을 기준으로 읽으시면 좀 더 이해가 쉽게 될거예요.

SimpleTrigger 스크립트 살펴보기 

Platfomer Microgame에서 제공하는 SimpleTrigger 코드를 보면 다음과 같아요. 

using UnityEngine;
using UnityEngine.Events;

public class SimpleTrigger : MonoBehaviour
{

    public Rigidbody2D triggerBody; 
    public UnityEvent onTriggerEnter;


    void OnTriggerEnter2D(Collider2D other){
        //do not trigger if there's no trigger target object
        if (triggerBody == null) return;

        //only trigger if the triggerBody matches
        var hitRb = other.attachedRigidbody;
        if (hitRb == triggerBody){
            onTriggerEnter.Invoke();
        }
    }

}

[소스 설명]

SimpleTrigger라는 이름의 이 Unity 스크립트는 특정 조건에서 유니티 이벤트를 실행하는 기능을 합니다. 주로 게임 개발에서 특정 객체가 특정 지점에 도달했을 때 원하는 행동을 실행하게 하기 위해 사용됩니다. 이 스크립트의 각 구성 요소와 기능을 자세히 살펴보겠습니다:

코드 분석

  1. 변수 선언:
    • public Rigidbody2D triggerBody;: 이 변수는 스크립트가 반응할 대상 객체의 Rigidbody2D 컴포넌트를 참조합니다. Unity 인스펙터에서 이 Rigidbody2D를 지정해야 합니다.
    • public UnityEvent onTriggerEnter;: 이벤트 발생 시 호출될 UnityEvent입니다. 이 이벤트는 인스펙터에서 사용자가 원하는 함수나 작업을 연결할 수 있게 해주며, OnTriggerEnter2D 메서드에서 호출됩니다.
  2. 이벤트 핸들러:
    • void OnTriggerEnter2D(Collider2D other): 이 메서드는 다른 콜라이더가 이 객체의 트리거 존에 진입할 때 자동으로 호출됩니다. Unity의 물리 시스템에서 이를 처리하며, Collider2D 객체가 이 메서드의 인자로 제공됩니다.
  3. 조건 검사 및 이벤트 호출:
    • if (triggerBody == null) return;: triggerBody가 설정되지 않았다면 메서드를 빠져나옵니다. 이는 에러 방지를 위한 안전장치 역할을 합니다.
    • var hitRb = other.attachedRigidbody;: 충돌한 객체의 Rigidbody2D를 가져옵니다.
    • if (hitRb == triggerBody) { onTriggerEnter.Invoke(); }: 충돌한 객체의 Rigidbody2D가 triggerBody와 일치할 경우, onTriggerEnter 이벤트를 발생시킵니다. 이 이벤트는 인스펙터에서 설정한 대로 다양한 함수나 작업을 수행할 수 있습니다.

사용 예

이 스크립트를 사용하여 다음과 같은 기능을 구현할 수 있습니다:

  • 문 열기: 플레이어가 특정 영역에 도달했을 때 자동으로 문을 여는 기능.
  • 퍼즐 트리거: 특정 아이템을 특정 위치에 놓았을 때 퍼즐이 완성되는 효과를 발생시키는 기능.
  • 씬 전환: 플레이어가 지정된 위치에 도착했을 때 다음 씬으로 넘어가는 이벤트를 호출.

설정 방법

  • Unity 에디터에서 이 스크립트를 게임 오브젝트에 부착합니다.
  • 인스펙터에서 triggerBody에 반응할 대상의 Rigidbody2D 컴포넌트를 드래그하여 연결합니다.
  • onTriggerEnter에 실행하고 싶은 함수를 연결합니다. 이는 드래그 앤 드롭을 통해 해당 함수를 리스트에 추가하는 방식으로 설정할 수 있습니다.

SimpleTrigger 스크립트는 유니티의 트리거 시스템과 이벤트 시스템을 활용하여 게임에서 다양한 인터랙티브 기능을 손쉽게 구현할 수 있게 해줍니다.

 

사용 예를 보면 유용한 기능을 만들 수 있을 것 같아요.

- 문 열기: 플레이어가 특정 영역에 도달했을 때 자동으로 문을 여는 기능.
- 퍼즐 트리거: 특정 아이템을 특정 위치에 놓았을 때 퍼즐이 완성되는 효과를 발생시키는 기능.
- 씬 전환: 플레이어가 지정된 위치에 도착했을 때 다음 씬으로 넘어가는 이벤트를 호출.

 

플레이어가 특정 영역에 도달했을 때 올바른 게임 방향을 알려주기

트리거를 사용해서 플레이어가 특정 영역에 도달했을 때 화살표를 보여주는 걸 만들어봐요. 

코드 즉 스크립트는 만들어달라고 했어요.

[질문] 안녕 ChatGPT, 플레이어가 특정 지점으로 왔을 때 스프라이트가 사라지게 하는 스크립트를 만들어줘 

[답변]
아래 코드는 SpriteHider 클래스를 Platformer.Mechanics 네임스페이스에 정의한 것으로, 이 클래스는 Unity 게임 오브젝트에 대해 스프라이트의 비활성화 기능을 수행합니다. 이 코드는 지정된 스프라이트 게임 오브젝트를 SetActive(false)를 호출하여 비활성화시키는 메서드 HideSprite를 포함하고 있습니다.

using UnityEngine;

namespace Platformer.Mechanics
{
    /// <summary>
    /// This class is responsible for hiding a sprite when triggered.
    /// </summary>
    public class SpriteHider : MonoBehaviour
    {
        // This is the GameObject that will be hidden.
        public GameObject spriteObject;

        /// <summary>
        /// Hides the sprite by setting its active state to false.
        /// </summary>
        public void HideSprite()
        {
            if (spriteObject != null)
                spriteObject.SetActive(false);
        }
    }
}

코드 설명

  • 네임스페이스 (Platformer.Mechanics): 이 네임스페이스는 코드가 특정 프로젝트 구조 내의 'Mechanics' 부분에 속함을 명시합니다. 다른 관련 클래스들과 함께 이 네임스페이스를 공유할 수 있습니다.
  • 클래스 선언 (SpriteHider): MonoBehaviour에서 파생된 SpriteHider 클래스는 Unity 게임 개발에서 사용할 수 있는 컴포넌트입니다.
  • 변수 선언 (spriteObject): spriteObject 변수는 인스펙터에서 설정할 수 있으며, 이는 게임에서 비활성화하고자 하는 스프라이트의 게임 오브젝트를 참조합니다.
  • 메서드 (HideSprite): HideSprite 메서드는 spriteObject의 SetActive 함수를 호출하여 해당 오브젝트를 비활성화합니다. 이 메서드는 외부에서 호출될 수 있으며, 이벤트에 의해 트리거될 수 있습니다.

사용 방법

  • Unity 에디터에서 SpriteHider 스크립트를 스프라이트 게임 오브젝트에 적용합니다.
  • 인스펙터를 통해 spriteObject 필드에 비활성화하려는 스프라이트의 게임 오브젝트를 드래그하여 연결합니다.
  • 이 스크립트의 HideSprite 메서드를 이벤트나 다른 트리거 조건에 연결하여 사용합니다. 예를 들어, 플레이어가 특정 영역에 도착하면 이 메서드를 호출하여 스프라이트를 숨기는 방식으로 구성할 수 있습니다.

이 구조를 통해 특정 게임 기능을 모듈화하고 조직화하여, 게임의 다른 부분과 쉽게 통합할 수 있습니다.

 

쉽네요. 코드를 만들기 위해 생각도 그리고 코드 한줄 만들 필요가 없어요.

이제 스프라이트를 표시하는 코드도 추가해볼께요.

[질문] 안녕 ChatGPT, 스프라이트를 나타나게 하는 코드도 추가해줘

[답변]
위의 SpriteHider 클래스에 스프라이트를 다시 나타나게 하는 기능을 추가하여, 클래스의 기능을 확장해 보겠습니다. 이제 이 클래스는 스프라이트를 비활성화할 뿐만 아니라, 필요에 따라 스프라이트를 다시 활성화할 수도 있습니다.

using UnityEngine;

namespace Platformer.Mechanics
{
    /// <summary>
    /// This class is responsible for hiding and showing a sprite when triggered.
    /// </summary>
    public class SpriteHider : MonoBehaviour
    {
        // This is the GameObject that will be hidden or shown.
        public GameObject spriteObject;

        /// <summary>
        /// Hides the sprite by setting its active state to false.
        /// </summary>
        public void HideSprite()
        {
            if (spriteObject != null)
                spriteObject.SetActive(false);
        }

        /// <summary>
        /// Shows the sprite by setting its active state to true.
        /// </summary>
        public void ShowSprite()
        {
            if (spriteObject != null)
                spriteObject.SetActive(true);
        }
    }
}

코드 설명

  • 클래스 기능 확장: 기존의 SpriteHider 클래스는 이제 HideSprite와 ShowSprite 두 가지 메서드를 갖습니다. 이 메서드들은 각각 스프라이트를 비활성화하고 활성화하는 기능을 수행합니다.
  • 메서드 추가 (ShowSprite): ShowSprite 메서드는 spriteObject의 SetActive(true)를 호출하여 해당 오브젝트를 활성화합니다. 이 메서드를 호출함으로써 스프라이트를 다시 보이게 만들 수 있습니다.

사용 방법

  • 이 스크립트를 게임 오브젝트에 적용하고, spriteObject 필드에 해당 스프라이트의 게임 오브젝트를 지정합니다.
  • 게임의 특정 이벤트 또는 트리거를 사용하여 HideSprite 또는 ShowSprite 메서드를 호출합니다. 예를 들어, 플레이어가 특정 영역에 들어갔을 때 스프라이트를 숨기고, 특정 조건을 만족하면 다시 스프라이트를 보이게 할 수 있습니다.
  • Unity의 인스펙터에서 이벤트를 설정하여, 예를 들어 버튼 클릭, 특정 지점 통과 등의 조건에서 이 메서드들을 실행하도록 설정할 수 있습니다.

이 코드를 통해 게임 디자이너는 게임의 인터랙티브 요소를 더욱 풍부하게 만들 수 있으며, 플레이어의 행동에 따라 동적으로 게임 환경을 변경할 수 있습니다.

 

끝. 간단한 질문 만으로 스크립트를 완성했어요.

 

이제 스크립트를 적용해서 특정 지점에 도착했을 때 특정 이벤트를 발생 시켜봐요.

그 전에 사용 방법을 좀 더 알아봐요.

사용 방법을 좀 더 자세히 물어봐요.

전체적으로 어떻게 연결하는 지를 다시 물어봤어요.

[질문] 안녕 ChatGPT, 플레이어가 특정 지점으로 왔을 때 특정 스프라이트가 사라지게 하는 방법을 알려줄래

[답변]
플레이어가 특정 지점에 도착했을 때 스프라이트를 사라지게 하려면, Unity의 콜라이더와 트리거 시스템을 활용할 수 있습니다. 여기서는 SimpleTrigger 스크립트를 사용하는 예제를 바탕으로, 플레이어가 특정 위치에 도착하면 지정된 스프라이트를 비활성화하는 방법을 설명하겠습니다.

1단계: 트리거 설정

  1. 트리거 영역 설정: 플레이어가 도달해야 하는 지점에 게임 오브젝트를 생성하고, 이 오브젝트에 BoxCollider2D 또는 CircleCollider2D 등의 콜라이더 컴포넌트를 추가합니다. 콜라이더 컴포넌트의 Is Trigger 속성을 체크하여 콜라이더를 트리거로 설정합니다.
  2. 스크립트 추가: 해당 게임 오브젝트에 SimpleTrigger 스크립트를 추가합니다. 플레이어의 Rigidbody2D를 SimpleTrigger 스크립트의 triggerBody 필드에 드래그하여 연결합니다.

2단계: 이벤트 설정

SimpleTrigger 스크립트의 onTriggerEnter 이벤트에 함수를 연결하여, 플레이어가 트리거 존에 진입할 때 스프라이트를 비활성화하는 로직을 추가합니다.

1. 스프라이트를 관리할 스크립트 생성: 새 C# 스크립트를 만들어서 스프라이트를 제어하는 코드를 작성합니다. 예를 들어 스크립트 이름을 SpriteHider로 하고 다음과 같이 작성할 수 있습니다:

using UnityEngine;

public class SpriteHider : MonoBehaviour
{
    public GameObject spriteObject; // 비활성화할 스프라이트의 게임 오브젝트

    public void HideSprite()
    {
        spriteObject.SetActive(false); // 스프라이트 비활성화
    }
}

 

2. 스프라이트 관리 스크립트 연결: SpriteHider 스크립트를 비활성화하려는 스프라이트의 게임 오브젝트나 다른 게임 오브젝트에 부착합니다. 인스펙터에서 spriteObject 필드에 비활성화하려는 스프라이트의 게임 오브젝트를 드래그하여 연결합니다.

3. 이벤트에 함수 연결: SimpleTrigger 스크립트의 onTriggerEnter 항목에 SpriteHider 컴포넌트의 HideSprite 메서드를 연결합니다. 이렇게 하려면 Unity 인스펙터에서 onTriggerEnter의 '+' 버튼을 클릭하여 새로운 이벤트 항목을 추가한 후, SpriteHider 컴포넌트를 드래그하고, 드롭다운 메뉴에서 HideSprite 메서드를 선택합니다.

3단계: 게임 테스트

  • Unity 에디터에서 플레이 모드로 전환하고, 플레이어를 트리거 영역으로 이동시켜 스프라이트가 제대로 비활성화되는지 확인합니다.

이 절차를 통해 플레이어가 특정 지점에 도착했을 때 원하는 스프라이트를 사라지게 할 수 있습니다. 이 기법은 레벨 디자인에서 매우 유용하게 사용될 수 있습니다.

 

챗GPT가 알려준 사용 방법대로 아래 영상과 같이 설정했어요.

 

이제 플레이 모드로 전환해서 스프라이트가 제대로 활성화 / 비활성화 되는지를 확인해볼께요.

 

아래 영상에서와 같이 잘 동작하네요. 

 

오늘은 ChatGPT를 활용하여 Unity 플랫포머 게임에서 트리거와 이벤트 시스템을 살펴봤어요.

트리거는 게임 내에서 유용하게 사용될 수 있을 것 같아요.

 

 

지금까지,

언제나 성장하는 인텔리원스튜디오(IntelliOneStudio)입니다.

감사합니다.

728x90