본문 바로가기

Unity/▶ Game Development: Dodge

[Dodge] #2. 플레이어

728x90
반응형

플레이어 스크립트 생성

플레이어를 조종하는 Player Control 스크립트를 생성한다.

  1. 하이어라키 > Create > C# Script
  2. 생성된 프로젝트의 이름을 Player Control로 변경

게임 오브젝트의 이동을 구현할 때 물리적인 힘을 가하는 방식을 사용한다. 따라서 게임 오브젝트에 추가된 리지드 바디 컴포넌트를 변수로 가져오고 사용한다.

 

다음과 같이 코드를 수정한다.

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

public class PlayerControl : MonoBehaviour
{
    public Rigidbody PlayerRigidbody;
    //이동에 필요할 리지드 바디 컴포넌트
    public float speed = 8f;//이동 속력
    
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 

Rigidbody 타입의 변수 RigidbodyPlayer를 선언한다고 해서 Rigidbody 타입의 오브젝트가 생성되는 것은 아니다.
하지만 변수 RigidbodyPlayer를 통해 Rigidbody 타입의 오브젝트를 가리킬 수 있다.

 

사용자 입력 감지

이제 사용자의 입력을 감지하고 움직일 수 있는 메서드가 필요하다.

 

Update() 메서드

게임은 주기적으로 갱신 처리를 함으로서 플레이어의 위치를 체크하고, 변화하는 정보에 따라 갱신을 실행한다.

 

Update() 메서드는 Start() 메서드와 같이 특정 시점에 자동으로 실행되는 이벤트 메서드이다. Update() 메서드는 한 프레임에 한 번, 매 프레임 마다 반복 실행된다.

 

Update() 메서드는 한 프레임에 한 번, 매 프레임 마다 반복 실행된다.

 

Input을 이용한 입력 감지

유니티의 Input 클래스는 사용자 입력을 감지하는 메서드를 모아 놓은 집합이다. Input 입력 감지 메서드는 실행 시점에 어떤 키를 눌렀는지 파악하고 알려주는 기능을 수행한다.

 

Update() 메서드는 1초에 수십 번씩 실행되며, 이 Update() 메서드에서 입력 감지 메서드를 사용하면 짧은 간격으로 빨리 실행되므로 플레이어(게임 사용자)는 즉시 반응한다고 느끼게된다.

 

Update() 메서드를 다음과 같이 수정한다.

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);
        
    }

Input.GetKey()

Input.GetKey() 메서드는 키보드의 식별자를 KeyCode 타입으로 받는다.

bool Input.GetKey(KeyCode key);
//key: 분석할 키

Input.GetKey() 메서드는 실행될 때 해당 키를 누르고 있으면 true, 아니면 false를 반환한다. Input.GetKey()는 1초에 수십 번 씩 실행되므로 해당 코드도 수십 번씩 실행된다.

 

KeyCode
Input.GetKey() 메서드의 입력으로 사용하는 KeyCode는 키보드의 키 식별자를 쉽게 가리키기 위한 타입이다. KeyCode 타입은 내부적으로 숫자로 동작한다. 이때 KeyCode는 키보드에 할당된 식별자로 작동하며 숫자로 설정되있다.

 

Input.GetKey() 계열 메서드
Input.GetKey() 메서드는 지정한 키를 누르는 동안 true를 반환한다. 이외에도 Input.GetKey() 메서드 처럼 키보드 입력을 감지하지만 감지 시점이 다른 메서드가 존재한다.

 

Input.GetKey()
//해당 키를 '누르는 동안' true, 그 외에는 false 반환

Input.GetKeyDown()
//해당 키를 '누르는 순간' true, 그 외에는 false 반환

 

Input.GetKey() 해당 키를 '누르는 동안' true, 그 외에는 false 반환
Input.GetKeyDown() 해당 키를 '누르는 순간' true, 그 외에는 false 반환

플레이어 사망 처리

플레이어의 사망을 처리하는 Die()메서드를 만들어보자.

 

Die() 메서드

Die() 메서드는 탄알과 플레이어가 충돌 시 실행되며 자신의 게임 오브젝트를 비활성화하여 게임 종료를 구현하는 메서드이다.

 

Die() 메서드는 PlayerController 스크립트가 스스로 실행시키지 않고, 플레이어와 부딪힌 탄알이 게임 오브젝트의 PlayerController 컴포넌트에 접근했을때 실행된다. 따라서 Die() 메서드는 public으로 지정되어 클래스 외부에서 접근이 가능해야한다.

 

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

public class PlayerController : MonoBehaviour
{
    // Start is called before the first frame update
    public Rigidbody PlayerRigidbody; 
    public float speed = 8f;
    void Start()
    {
        
    }

    // Update is called once per frame
    
    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 타입의 변수이며 컴포넌트들의 기반 클래스인 MonoBehaviour에서 제공한다.

 

SetActive(): 인스펙터 창에서 게임 오브젝트를 활성화 또는 비활성화하는 메서드

실행 영상.mov
2.83MB

위의 영상은 게임 실행 동영상이다.

728x90
반응형

'Unity > ▶ Game Development: Dodge' 카테고리의 다른 글

[Dodge] #6. 바닥 회전  (0) 2022.03.02
[Dodge] #5. 탄알 생성기  (0) 2022.02.26
[Dodge] #4. 탄알 생성  (0) 2022.02.25
[Dodge] #3. 스크립트 개선하기  (0) 2022.02.24
[Dodge] #1. 게임 베이스 생성  (0) 2022.02.04
댓글