이번주에는 지난 번에 작성한 플레이어 스크립트인 PlayerController를 개선하여 좀 더 나은 조작감을 구현하도록 하였다.
먼저 기존의 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) //위쪽 방향키 입력이 감지된 경우 z방향 힘 주기
{
playerRigidbody.AddForce(0f, 0f, speed);
}
if (Input.GetKey(KeyCode.DownArrow) == true) //위쪽 방향키 입력이 감지된 경우 -z방향 힘 주기
{
playerRigidbody.AddForce(0f, 0f, -speed);
}
if (Input.GetKey(KeyCode.RightArrow) == true) //위쪽 방향키 입력이 감지된 경우 x방향 힘 주기
{
playerRigidbody.AddForce(speed, 0f, 0f);
}
if (Input.GetKey(KeyCode.LeftArrow) == true) //위쪽 방향키 입력이 감지된 경우 -x방향 힘 주기
{
playerRigidbody.AddForce(-speed, 0f, 0f);
}
}
public void Die() //게임 오브젝트 비활성화
{
gameObject.SetActive(false);
}
}
이러한 스크립트로도 충분히 이용할 수 있으나, 몇가지 문제점이 있다.
1. 조작이 게임에 즉시 반영되지 않는다.
- 1차 시연 영상에서 확인할 수 있는 문제인데. 기존의 AddForce() 메서드는 힘을 추가하기에 속도가 충분히 빨라질 때까지 시간이 걸리고, 이동 중 반대 방향으로 이동하려는 경우 관상에 의해 힘이 상쇄되어 방향 전환이 바로 이루어지지 않음. 이는 조작감의 불편으로 여겨질 수 있는 문제기에 수정해야함.
2. 입력 감지 코드가 복잡하다.
- 방향키를 감지하는 데 if문이 네 개나 사용하여 비효율적임.
3. playerRigidbody 컴포넌트를 드래그&드롭 할당하는 것이 불편하다.
- 변수에 컴포넌트를 직접 드래그&드롭하는 방식은 불편하며, 잘못된 값을 할당할 위험이 있기에 보다 직접적인 코드를 실행하고자 함.
이러한 문제점들을 개선하고자, 스크립트를 조금 수정하였다.
첫번째로, 3번 문제인 playerRigidbody 컴포넌트 할당 문제를 해결하였다.
private Rigidbody playerRigidbody; //이동에 사용할 리저드바디 컴포넌트
public float speed = 8f; //이동 속력
void Start()
{
//게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 playerRigidbody에 할당
playerRigidbody = GetComponent<Rigidbody>();
}
변수 playerRigidBody의 접근 한정자를 public에서 private로 변경하였고, 사용하지 않던 Start() 메서드 부분을 수정하여 변수 playerRigidbody에 리지드바디 컴포넌트의 참조를 할당하도록 하였다.
//실제 이동 속도를 입력값과 이동 속력을 사용해 결정
float xSpeed = xInput * speed;
float zSpeed = zInput * speed;
//Vector3 속도를 (xSpeed, 0 , zSpeed)로 생성
Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
//리지드바디의 속도에 newVelocity 할당
playerRigidbody.velocity = newVelocity;
}
여기서 Input.GetAxis() 메서드가 등장하는데, 이는 어떤 **축에 대한 입력값을 숫자로 변환하는 메서드**이다.
>✍ **Horizontal 축**의 경우
- 음의 방향 : ←(왼쪽 방향키), A 키에 대응되어 -1.0이 출력됨.
- 양의 방향 : →(오른쪽 방향키), D 키에 대응되어 +1.0이 출력됨.
- 아무것도 누르지 않을 때는 0이 출력됨.
>✍ **Vertical 축**의 경우
- 음의 방향 : ↓(아래쪽 방향키), S 키에 대응되어 -1.0이 출력됨.
- 양의 방향 : ↑(위쪽 방향키), W 키에 대응되어 +1,0이 출력됨.
- 아무것도 누르지 않을 때는 0이 출력됨.
이를 입력받아 각각을 speed와 곱하여 X 방향 이동 속도, Z 방향 이동 속도를 표현하여 조작감을 개선하였다.
이러한 점을 개선하여 2차 스크립트를 완성하였다.
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody playerRigidbody; //이동에 사용할 리저드바디 컴포넌트
public float speed = 8f; //이동 속력
void Start()
{
//게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 playerRigidbody에 할당
playerRigidbody = GetComponent<Rigidbody>();
}
void Update()
{
//수평축과 수직축의 입력값을 감지하여 저장
float xInput = Input.GetAxis("Horizontal");
float zInput = Input.GetAxis("Vertical");
//실제 이동 속도를 입력값과 이동 속력을 사용해 결정
float xSpeed = xInput * speed;
float zSpeed = zInput * speed;
//Vector3 속도를 (xSpeed, 0 , zSpeed)로 생성
Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
//리지드바디의 속도에 newVelocity 할당
playerRigidbody.velocity = newVelocity;
}
public void Die() //게임 오브젝트 비활성화
{
gameObject.SetActive(false);
}
}
이와 같은 코드를 실행하였을 때의 시연 영상이다.
지난 1차 시연 영상과 비교하면, 갑작스럽게 가속도가 붙는 모습이 줄었으며 방향 조작이 좀 더 즉각적으로 이루어지고 있다는 것을 확인할 수 있다.
일단 이번 주에는 조작감 개선 방법을 알아내어 수정하였고, 다음 주 부터는 게임 오브젝트를 추가하는 등의 작업을 하여 게임을 완성해 나갈 것이다.