캐릭터가 움직일 수 있는 땅을 먼저 만들어줍시다.
땅의 재질은 Hierarchy에서 우클릭을 한 후 3D Object > Plane 으로 만들어줍니다.
Plane을 생성하셨으면 Plain의 Inspector 창에서 Transform > Position을 0, 0, 0 으로 바꿔주고, Scale을 5, 1, 5로 설정해줍시다.
다음은 캐릭터를 만들어줄 차례입니다. 저는 Capsule 오브젝트를 사용하여 만들어주겠습니다.
Capsule의 이름을 Player로 바꾸고, 위치를 0, 1, 0 으로 설정합니다. Y좌표의 위치가 1인 이유는 Plane의 Y좌표가 0이기 때문에 두 오브젝트가 겹치지 않게 하기 위함입니다. Plane의 Y좌표를 -1로 하고 새로 생성하는 오브젝트의 Y좌표를 0으로 설정해도 무방합니다.
오브젝트의 이동을 위해서는 오브젝트에 RigidBody라는 컴포넌트가 있어야 합니다. Player의 Inspector 창에서 맨 밑의 Add Component를 누르고 RigidBody를 추가해주도록 합시다.
이제 본격적으로 Player 오브젝트를 이동시킬 스크립트를 짜주도록 합시다. Script들을 모아둘 수 있도록 Assets 밑에 Scripts라는 폴더를 생성해주겠습니다.
이제 Scripts 폴더 밑에 Player라는 C# Script를 생성해주겠습니다.
스크립트 생성 시 주의할 점은 스크립트의 이름과 스크립트 내 클래스 명이 다를 경우 오류가 날 수 있다는 점입니다. 스크립트 이름을 잘못 적어서 변경한다면 꼭 클래스명도 변경해주도록 합시다.
다음은 함수 내 코드입니다. 간단한 설명은 주석으로 처리했습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float Speed = 10.0f; // 움직이는 속도. public으로 설정하여 유니티 화면에서 조정할 수 있다.
float h, v; // 가로축과 세로축을 담을 변수를 전역변수로 생성. FixedUpdate에서 직접 생성하지 않은 이유는
// 이후 다른 함수에서도 접근할 것이기 때문.
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
// 이동 관련 함수를 짤 때는 Update보다 FixedUpdate가 더 효율이 좋다고 한다. 그래서 사용했다.
void FixedUpdate()
{
// Point 1.
h = Input.GetAxis("Horizontal"); // 가로축
v = Input.GetAxis("Vertical"); // 세로축
// Point 2.
transform.position += new Vector3(h, 0, v) * Speed * Time.deltaTime;
}
}
Point 1.
1. Input.GetAxis(string name)
-1.0f 부터 1.0f 까지의 범위의 값을 반환합니다. 즉, 부드러운 이동이 필요한 경우에 사용됩니다.
2. Input.GetAxisRaw(string name)
-1, 0, 1 세 가지 값 중 하나가 반환된다. 키보드 값을 눌렀을 때 즉시 반응해야한다면 GetAxisRaw를 사용하면 됩니다.
[Edit] -> [Project Settings] -> Input Manager 에 보면 괄호 안에 들어가는 항목들을 확인할 수 있고 수정할 수 있습니다.
*출처 : onecoke.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-GetAxis%EC%99%80-GetAxisRaw
기본 설정은 키보드의 상하좌우 화살표와 wasd로 되어있습니다. 임의로 변경할 수 있습니다.
Point 2.
transform.position은 월드 좌표를 기준으로 해당 스크립트를 가진 오브젝트의 transform의 위치를 설정합니다. 자세한 설명은 notyu.tistory.com/23를 참고하시면 좋습니다.
new Vector3(h, 0, v) : h, v값은 Input에 의해 결정되고, 이 결정된 값에 따라 새로운 위치가 Vector를 통해 설정됩니다.
* Speed : 처음 설정한 이동속도를 곱해줍니다.
* Time.deltaTime : 각 컴퓨터마다 처리하는 속도가 다르므로 프레임당 처리속도를 설정하여 모든 컴퓨터에서 처리하는 속도가 동일해주도록 보정하는 역할을 합니다
스크립트가 완성되었으니, 이 스크립트를 Player에게 부여해주도록 합시다. 스크립트를 플레이어에게 드래그하거나 Inspector 창에서 Add Component할 수 있습니다.
주석에서 설명했듯 Speed를 public으로 설정했기 때문에 유니티 화면에서 Speed를 조정할 수 있는 것을 알 수 있습니다.
스크립트를 부착하였으니 실행해보도록 합시다. 실행 버튼을 누르고 Game화면을 클릭해야 Input이 들어갑니다.
이 때, Capsule 오브젝트를 사용했기 때문에 움직이는 도중 넘어지는 경우가 생길 수 있습니다. 그때는 Player의 Inspector 창에서 RigidBody > Constraints에서 Freeze Rotation 옵션을 체크해주면 됩니다.
'Unity' 카테고리의 다른 글
[Unity] 캐릭터 이동 시 카메라 따라가기 (3인칭) (1) | 2021.04.09 |
---|---|
[Unity] 캐릭터 점프 시 벽에 붙는 현상 수정 (0) | 2021.04.04 |
[Unity] 충돌처리 (0) | 2021.04.03 |
[Unity] 캐릭터 점프 (0) | 2021.04.03 |
[Unity] 캐릭터가 바라보는 방향으로 회전 (0) | 2021.04.03 |