본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(27) - 3D 게임 만들기(7)

by jyppro 2023. 5. 18.

3D 게임 만들기(7)

저번에는 게이지 UI, 소리, 파티클을 적용시켰습니다. 이번에는 2D 플랫포머 게임 만들기에서 했던 경계를 생성해 주겠습니다. 게임 맵을 구성하여 만들긴 했지만, 현재 맵을 이동하다 보면 이탈할 가능성이 있습니다. 물론 벽의 높이를 높여 탈출하지 못하게 하는 방법도 있지만, 저희는 경계를 생성하여 벗어나면 원위치로 돌아올 수 있게끔 만들어 주겠습니다.

 

경계 생성

경계를 생성하여 정해진 위치로 돌아오게 만드는 방법은 여러가지가 있습니다. 이전에 2D 플랫포머 게임 만들기에서 했던 경계생성은 Vector3.zero를 사용하였기 때문에 원점으로 돌아오는 방식이었습니다. 하지만 이런 경우는 우리가 오브젝트를 원점에 생성했을 때에만 적용이 가능합니다. 이번에는 조금 다른 방식으로 경계를 생성해 보겠습니다.

 

3D 오브젝트로 Cube를 생성하여 우리가 사용할 맵 아래에 넓게 장판을 만들어 주겠습니다. 저는 이것을 Boundary라고 부르겠습니다.

경계-생성
생성한 경계의 모습이 보인다

 

이것을 만들면 흰색으로 밑에 크게 있다는 것이 게임씬에서도 보입니다. 하지만 저희는 보이는 경계를 원하지 않습니다. 그렇기에 생성한 Boundary의 Material를 0으로 만들어 투명으로 만들어 줍니다.

투명화시킨-경계
투명해진 경계

이제 플레이어가 이 경계를 인식하고, 부딪히면 원래 자리로 돌아가게끔 해줘야 합니다. 스크립트를 만들겠습니다.

 

PlayerBoundary

using UnityEngine;

public class PlayerBoundary : MonoBehaviour
{
    private Vector3 originalPosition;

    private void Start()
    {
        originalPosition = transform.position;
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Boundary"))
        {
            // 경계를 벗어난 경우 원래 위치로 돌아옴
            transform.position = originalPosition;
        }
    }
}

플레이어의 시작위치를 저장하고, Boundary라고 태그된 오브젝트와 부딪히고 난 후, 빠져나오면 저장해 두었던 원래 위치로 돌려보내는 코드입니다. 여기서 Boundary를 태그로 관리하는데 저희가 이전에 작성한 PlayerController의 item 충돌처리와 겹치기 때문에 구분을 해주어야 합니다.

 

아이템 충돌처리는 isTrigger를 사용하는 충돌 오브젝트가 아이템 한가지 종류밖에 없었기 때문에 other로 처리할 수 있었지만, 두개 이상의 오브젝트가 생겨 태그로 구분하여 따로 처리를 해주는 것입니다. PlayerController의 변경사항을 보여드리겠습니다.

 

void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Item"))
        {
        score += 10;

        AS.Play();
        PS.Play();
        // 감독 스크립트에 플레이어와 아이템이 충돌했다고 전달한다 
        GameObject director = GameObject.Find("GameDirector");
        director.GetComponent<GameDirector>().DecreaseHp();

        if(score >= 0){
            this.item.GetComponent<Text>().text = "Score: " + score.ToString();
        }

        Destroy(other.gameObject);
        }
    }

이전과 같은 코드를 Item태그가 충돌 했을 때 작동하도록 if문을 만들어 넣어주었습니다. 이렇게 하고 Item 태그를 만들어 아이템 오브젝트에 전부 적용시켜 주어야 합니다. 두 오브젝트의 충돌처리를 Trigger로 판단하기 때문에, Boundary와 공통으로 isTrigger 옵션을 사용합니다.

 

이제 PlayerBoundary 스크립트를 플레이어에게 적용시키고 실행하면 보이지 않는 바닥을 넘어갔을 때, Boundary의 트리거가 작동하여 플레이어의 시작위치로 옮겨줍니다. 사진으로는 표현이 안될 것 같아 생략하겠습니다.

 

<NEXT>

이번에는 이전에 했었던 경계생성을 다른 방식으로 작성해 보았습니다. 현재 알려드린 두가지 말고도 많은 방법이 존재할 것이니 꾸준히 공부하고 찾아보시기 바랍니다. 다음에는 플레이어가 아이템을 먹으면 일정시간이 지난 후, 같은 자리에 다시 생겨나도록 하는 아이템 리스폰에 대해 알아보겠습니다. 감사합니다.