학습 매체 : 책
책이름 : 레트로의 유니티 게임 프로그래밍 에센스
저자 : 이제민
본 내용은 해당 강의 내용을 공부하면서 정리한 글입니다.
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);
}
}
gameObject는 컴포넌트 입장에서 자신이 추가된 게임 오브젝트를 가리키는 변수이다. gameObject는 GameObject 타입의 변수이며 컴포넌트들의 기반 클래스인 MonoBehaviour에서 제공한다.
모든 컴포넌트는 gameObject 변수를 이용해 자신을 사용 중인 게임 오브젝트(자신의 게임 오브젝트)에 접근할 수 있다.
따라서 이 스크립트에서 gameObject는 Player 게임 오브젝트를 가리키게 된다.
gameObject와 GameObject
- gameObject와 GameObject를 혼동하면 안 된다. gameObject는 변수이고, GameObject는 타입이다.
체크를 해제하여 게임 오브젝트를 비활성화하면 해당 게임 오브젝트에 추가된 컴포넌트들도 함께 비활성화되어 동작을 멈춘다.
반대로 체크박스를 체크하면 해당 게임 오브젝트와 해당 게임 오브젝트에 추가된 컴포넌트들이 다시 활성화되고 동작한다.
이와 같은 게임 오브젝트 활성화/비활성화를 코드 상에서는 SetActive( ) 메서드로 실행할 수 있다.
void SetActive(bool value);
SetActive( )는 게임 오브젝트를 나타내는 GameObject 타입에 내장되어 있는 메서드이다.
입력으로는 bool 값을 받으며 SetActive(true)가 실행되면 게임 오브젝트를 활성화한다. SetActive(false)가 실행되면 게임 오브젝트를 비활성화 한다.
따라서 우리가 사용한 gameObject.SetActive(false); 다음과 같은 순서로 게임 오브젝트를 비활성화 한다.
gameObject를 사용해 자신의 게임 오브젝트에 접근
접근한 게임 오브젝트의 SetActive(false);를 실행
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);
}
}
PlayerController 컴포넌트의 변수에 필요한 참조를 할당하자.
인스펙터 창에서 Rigidbody 컴포넌트를 PlayerController 컴포넌트의 Player Rigidbody 필드로 드래그&드롭
입력 감지가 안 되는 경우
- 코드에 특별한 에러가 없는데도 플레이 모드에서 키 입력이 감지되지 않는 경우가 있다. 보통은 다음과 같은 문제로 발생한다.
게임 창이 하이라이트되지 않았다.
한글 입력이 활성화되었다.
- 첫 번째 경우는 플레이 도중 씬 창이나 하이어라키 창 등을 사용하면 발생한다. 이때는 게임 창의 아무 곳이나 클릭하면 해결된다.
- 두 번째 경우는 운영체제의 활성화된 키보드 입력이 한글일 때 발생한다. 한영키를 눌러 키보드 입력을 한글에서 영문으로 바꾸면 해결된다.
다음 강의에서 계속~