레트로의 유니티 게임 프로그래밍 에센스 - 6.6

Cosmos·2023년 4월 5일
0

학습 매체 : 책

책이름 : 레트로의 유니티 게임 프로그래밍 에센스

저자 : 이제민


본 내용은 해당 강의 내용을 공부하면서 정리한 글입니다.


6.6 플레이어 사망 처리


  • 사망 처리를 실행하는 Die( ) 메서드를 만들어 플레이어 사망을 구현한다.

6.6.1 Die( ) 메서드 추가

  • Die( ) 메서드는 자신의 게임 오브젝트를 비활성화하여 '죽음'을 구현하는 메서드이다.

  • Die( ) 메서드는 탄알과 플레이어가 충돌했을 때 실행된다. 탄알과 플레이어 사이의 충돌 감지는 7장에서 탄알과 함께 구현한다.

  • Die( ) 메서드는 PlayerController 스크립트가 스스로 실행하지 않는다. 대신 플레이어에 부딪힌 탄알이 Player 게임 오브젝트의 PlayerController 컴포넌트에 접근하여 실행한다.

  • 따라서 Die( ) 메서드는 public으로 지정되어 PlayerController 클래스 외부에서 접근할 수 있어야 한다.

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

public class PlayerController : MonoBehaviour
{
    public Rigidbody playerRigidbody;
    public float speed = 8f;

    void Start()
    {
        
    }

    void Update()
    {
        if(Input.GetKey(KeyCode.UpArrow) == true)
        {
            playerRigidbody.AddForce(0f, 0f, speed);
        }

        if (Input.GetKey(KeyCode.DownArrow) == true)
        {
            playerRigidbody.AddForce(0f, 0f, -speed);
        }

        if (Input.GetKey(KeyCode.RightArrow) == true)
        {
            playerRigidbody.AddForce(speed, 0f, 0f);
        }

        if (Input.GetKey(KeyCode.LeftArrow) == true)
        {
            playerRigidbody.AddForce(-speed, 0f, 0f);
        }
    }

    public void Die()
    {
        gameObject.SetActive(false);
    }
}
  • 추가된 Die( ) 메서드의 gameObject.SetActive(false);는 자신의 게임 오브젝트에 접근하여 비활성화한다.

6.6.2 gameObject

  • gameObject컴포넌트 입장에서 자신이 추가된 게임 오브젝트를 가리키는 변수이다. gameObject는 GameObject 타입의 변수이며 컴포넌트들의 기반 클래스인 MonoBehaviour에서 제공한다.

  • 모든 컴포넌트는 gameObject 변수를 이용해 자신을 사용 중인 게임 오브젝트(자신의 게임 오브젝트)에 접근할 수 있다.

  • 따라서 이 스크립트에서 gameObject는 Player 게임 오브젝트를 가리키게 된다.

gameObject와 GameObject

  • gameObject와 GameObject를 혼동하면 안 된다. gameObject는 변수이고, GameObject는 타입이다.

6.6.3 SetActive( ) 메서드

  • 모든 게임 오브젝트는 스스로를 끄고 켜는 기능을 가지고 있다. 인스펙터 창에서 게임 오브젝트 이름 왼쪽에 보이는 체크 박스가 게임 오브젝트를 활성화/비활성화하는 버튼이다.

  • 체크를 해제하여 게임 오브젝트를 비활성화하면 해당 게임 오브젝트에 추가된 컴포넌트들도 함께 비활성화되어 동작을 멈춘다.

  • 반대로 체크박스를 체크하면 해당 게임 오브젝트와 해당 게임 오브젝트에 추가된 컴포넌트들이 다시 활성화되고 동작한다.

  • 이와 같은 게임 오브젝트 활성화/비활성화를 코드 상에서는 SetActive( ) 메서드로 실행할 수 있다.

void SetActive(bool value);
  • SetActive( )는 게임 오브젝트를 나타내는 GameObject 타입에 내장되어 있는 메서드이다.

  • 입력으로는 bool 값을 받으며 SetActive(true)가 실행되면 게임 오브젝트를 활성화한다. SetActive(false)가 실행되면 게임 오브젝트를 비활성화 한다.

  • 따라서 우리가 사용한 gameObject.SetActive(false); 다음과 같은 순서로 게임 오브젝트를 비활성화 한다.

  1. gameObject를 사용해 자신의 게임 오브젝트에 접근

  2. 접근한 게임 오브젝트의 SetActive(false);를 실행


6.6.4 완성된 스크립트 확인(1차)

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

public class PlayerController : MonoBehaviour
{
    public Rigidbody playerRigidbody;
    public float speed = 8f;

    void Start()
    {
        
    }

    void Update()
    {
        if(Input.GetKey(KeyCode.UpArrow) == true)
        {
            playerRigidbody.AddForce(0f, 0f, speed);
        }

        if (Input.GetKey(KeyCode.DownArrow) == true)
        {
            playerRigidbody.AddForce(0f, 0f, -speed);
        }

        if (Input.GetKey(KeyCode.RightArrow) == true)
        {
            playerRigidbody.AddForce(speed, 0f, 0f);
        }

        if (Input.GetKey(KeyCode.LeftArrow) == true)
        {
            playerRigidbody.AddForce(-speed, 0f, 0f);
        }
    }

    public void Die()
    {
        gameObject.SetActive(false);
    }
}
  • 이제 유니티 에디터로 돌아가자.

6.6.5 PlayerController 컴포넌트 설정하기

  • PlayerController 스크립트를 하이어라키 창의 Player 게임 오브젝트로 드래그&드롭

  • PlayerController 컴포넌트의 변수에 필요한 참조를 할당하자.

  • 인스펙터 창에서 Rigidbody 컴포넌트를 PlayerController 컴포넌트의 Player Rigidbody 필드로 드래그&드롭

  • 이제 플레이 모드를 켜서 테스트를 해보자.

  • 정상적으로 움직인다. 다만 관성이 적용되어 무게감이 느껴질 거다. 이 문제는 차후에 수정할 것이다. 테스트를 끝냈다면 씬 플레이 모드를 해제하고 씬을 저장하자.

입력 감지가 안 되는 경우

  • 코드에 특별한 에러가 없는데도 플레이 모드에서 키 입력이 감지되지 않는 경우가 있다. 보통은 다음과 같은 문제로 발생한다.
  • 게임 창이 하이라이트되지 않았다.

  • 한글 입력이 활성화되었다.

  • 첫 번째 경우는 플레이 도중 씬 창이나 하이어라키 창 등을 사용하면 발생한다. 이때는 게임 창의 아무 곳이나 클릭하면 해결된다.
  • 두 번째 경우는 운영체제의 활성화된 키보드 입력이 한글일 때 발생한다. 한영키를 눌러 키보드 입력을 한글에서 영문으로 바꾸면 해결된다.

다음 강의에서 계속~

profile
게임 개발을 목적으로 공부하고 있는 대학생입니다.

0개의 댓글