
retr0의 유니티 (Unity C#) 게임 프로그래밍 에센스 - Sokovan만들기
캐릭터를 움직이는 방법에 대해 알아보자!
1. input의 활용
아주 간단하게 생각해보면 사용자에게 움직이려는 방향의 방향키를 받아 캐릭터를 움직일 수 있습니다.
이는 input을 통해 구현이 가능한데 코드로 보여드리자면
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
float speed = 10f;
public Rigidbody playerRigidbody; //Rigidbody를 playerRigidbody로 바꿔 부르겠다
// 게임이 시작되었을 때 한 번만 실행
void Start()
{
}
// 화면이 한 번 깜빡일 때 한 번 실행
void Update()
{
if(input.GetKey(KeyCode.W)
playerRigidbody.AddForce(speed, 0, 0);
}
}
해당 코드를 설명해보자면
먼저 speed를 10으로 지정했습니다.
그리고 Update 함수 내에 사용자에게 키보드 입력을 받는 if문을 구현했습니다.
input.GetKey(KeyCode.W)는 W라는 키 입력을 받는다 라는 의미입니다.
이때 keyCode는 모든 키보드의 키마다 정해져있는 것이므로 찾아보면됩니다.
그리고 바로 밑의 코드에서 playerRigidbody에 AddForce를 통해서 (x, y, z)자리에서 x에 speed를 넣었습니다.
즉 위의 코드는 사용자가 W를 입력했을 때 10의 speed로 캐릭터가 이동하는 코드입니다.
이와 같은 방법으로 W, A, S, D 4방향 모두 만들어 주면 아래와 같은 코드가 됩니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
float speed = 10f;
// 게임이 시작되었을 때 한 번만 실행
void Start()
{
}
// 화면이 한 번 깜빡일 때 한 번 실행
void Update()
{
if(input.GetKey(KeyCode.W)
playerRigidbody.AddForce(speed, 0, 0);
if(input.GetKey(KeyCode.S)
playerRigidbody.AddForce(-speed, 0, 0);
if(input.GetKey(KeyCode.D)
playerRigidbody.AddForce(0, 0, speed);
if(input.GetKey(KeyCode.A)
playerRigidbody.AddForce(0, 0, -speed);
}
}
실제로 플레이를 해보면 조작이 쉽지않다는 것을 알 수 있습니다.
이는 AddForce 함수의 기능 때문입니다.
AddForce는 힘을 주는 것이기 때문에 왼쪽에서 오른쪽으로 간다면 왼쪽으로 가려던 힘때문에 오른쪽으로 즉시 가지지않고 잠시 멈추었다가 가게 됩니다.
이는 즉, AddForce가 물리적인 '힘'을 주기때문에 관성이 생겨서 발생하는 일입니다.
또한 Getkey방식은 일일이 모든 키들의 입력에 맞추어 코드를 짜야하다보니 불편함이 있습니다.
이를 보완하기위해 나온것이 GetAxis입니다.
밑의 코드는 GetAxis를 사용하여 코드를 작성하고 플레이한 모습입니다.
보다시피 반대방향으로 갈 때 멈추지않고 즉시 이동합니다.
그렇다면 코드를 보겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float speed = 10f;
public Rigidbody playerRigidbody;
// 게임이 시작되었을 때 한 번만 실행
void Start()
{
}
// 화면이 한 번 깜빡일 때 한 번 실행
void Update()
{
float inputX = Input.GetAxis("Horizontal");
float inputZ = Input.GetAxis("Vertical");
Vector3 velocity = new Vector3(inputX, 0, inputZ); //xyz를 지정하는 친구
velocity = velocity * speed; //(inputX* speed, 0* speed, inputZ* speed)
playerRigidbody.velocity = velocity;
}
}
inputX라는 변수에 input.GetAxis("Horizontal")을 통해 Horizontal의 입력을 받는데
이때 Horizontal은 수평움직일을 읽컷는 유니티가 지정한 별칭입니다. (Unity의 Edit -> Project Setting -> Input Manager)
Horizontal은 Ture와 False처럼 딱딱 떨어지는 것이 아닌 -1~1까지의 숫자로된 수치입니다.
그래서 -1은 Negative Button으로 이때는 A(왼쪽)를 말하고, 1은 Positive Button으로 D(오른쪽)를 말합니다.
즉, inputX라는 변수에 좌우의 입력을 받는 것과 동일한 의미입니다.
Vertical은 상하의 움직을 읽컷는 말입니다.
Horizontal과 Vertical이 -1 ~ 1의 수치를 표현하는 이유!
=> 조이스틱(컨트롤러)에도 대응하기 위함!
조이스틱에는 캐릭터의 움직임을 조종하는 아날로그 스틱이라고하는 것이 있는데
이것은 조금 밀게되면 캐릭터가 조금만 움직이고, 쭉 밀게되면 캐릭터가 쭉 이동하게된다.
그래서 아날로그 스틱의 미세한 조종을 통한 움직임을 표현하기위해 속도를 0과 1이 아닌 -1~1로 표현하는 것이다!
Vector3는 xyz를 지칭하는 말이고 간단하게 xyz에 대한 속도를 new Vector3(inputX, 0, inputZ)와 같이 괄호안에 수치로 만들어 준 것 입니다.
그리고는 방금 만든 velocity에 각 xyz에 speed를 곱해 원하는 속도로 이동하도록 만들었습니다.
정리 해보자면
움직임을 만드는 방법에는 getKey와 GetAxis가 있다.
getKey는 특정 키코드를 얻어 움직임을 만듬.
GetAxis는 특정 이름을 찾아가 특정 기능이 작동하도록 만듬.
getKey의 단점 : 모든 움직임에 대해 키를 할당해야해서 코드가 길어짐.
GetAxis의 장점 : 특정 이름에 대한 세팅을 바꿔 키를 할당 할 수 있으므로 코드를 작성할 필요가 없어짐.
AddForce는 함수로, 그만큼의 힘이 내부 계산을 통해 적용된다. 이는 관성이 있어 제어가 힘들다.
velocity는 변수로, 속도 자체를 바꾸는 것이고 Vector3를 사용한다.

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!