IGDC 입문 프로젝트입니다.
스크립트를 작성하기 전, Transform과 Vector에 대해 알아봅시다.
Transform은 모든 오브젝트에 기본적으로 붙어있는 컴포넌트로, position, rotation, scale 속성을 가지고 있습니다.
Cube를 하나 꺼내온 후, 이동시켜봅시다. Cube에는 Rigidbody가 붙어있어야 합니다. 그리고 이전에 만든 Cube 스크립트도 하나 붙여줍시다. 없다면 새로 만들어도 무방합니다.
스크립트를 아래와 같이 수정합니다. 코드 아래부터 하나하나 코드를 살펴봅시다.
using UnityEngine;
public class Cube : MonoBehaviour
{
public float speed;
void Update() {
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
transform.position += new Vector3(h, 0, v) * Time.deltaTime * speed;
}
}
using UnityEngine;
UnityEngine의 네임스페이스를 가져옵니다. 이것은 Debug, Input 등 유니티에서 지원하는 클래스의 네임스페이스입니다.
- class와 Monobehaviour은 생략하겠습니다.
void Update() {
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
transform.position += new Vector3(h, 0, v) * Time.deltaTime * speed;
}
Input은 키보드, 마우스와 같은 입력장치의 입력을 받기 위한 도구입니다.
GetAxisRaw는 파라미터로 넘어온 Input Name의 키가 눌렸을 때, 1 혹은 -1을 반환합니다. 눌리지 않았다면 0을 반환합니다. Horizontal은 기본으로 '←', '→' 와 서브로 'd', 'a'를 입력받습니다. Vertical은 '↑', '↓'와 'w', 's'를 입력받습니다.
transform은 Cube 오브젝트에 붙어있던 Transform 컴포넌트입니다. 이것의 position에 값을 += 연산자를 통해 더해줌으로써 이동시킵니다. position을 바꿔버립니다.
Time.deltaTime은 프레임 차이 때문에 발생하는 차이를 보정하기 위한 도구입니다.
speed는 속도를 조절하기 위한 변수입니다. public이므로 에디터 상에서 조절할 수 있습니다.
Vector는...

다음 그림과 같이 x, y, z의 값을 가지며, Vector 객체에 각각 접근할 수 있습니다.
유니티는 y축은 위아래로 합니다.
또한 코드 상에서 만들 수 없는 Transform과 달리 Vector는 선언해서 만들 수 있습니다.
(Tranform 변수를 만들 수는 있지만, new 연산자를 통해 새 인스턴스로 만들 수는 없습니다)
Vector3 vec = new Vector3(1, 2, 3);
vec *= 3 // vec은 (3, 6, 9)가 된다.
vec += new Vector3(1, 0, 0) // vec은 (4, 6, 9)가 된다.
vec.x = 10 // vec은 (10, 6, 9)가 된다.
곱셈, 덧셈이 가능하며, 코드의 마지막 줄처럼 x, y, z에 값을 하나하나 넣을 수도 있습니다.
유니티에서는 Vector2와 Vector3를 제공하는데, Vector2는 x, y축만 가지고 있어 주로 2D에서 사용됩니다.
Time.deltaTime은 왜 필요한가?

만일 컴퓨터의 성능 차 때문에 Update문이 컴퓨터마다 다르게 호출된다면, 이동 등이 플레이어마다 다르게 나타납니다.
그렇기 때문에, deltaTime, 마지막 프레임으로부터 현재 프레임까지의 간격(단위: 초)을 곱해주어 프레임 차를 이동거리를 바꿈으로써 보정해줍니다.

실행시킨 후, wasd 혹은 화살표를 눌러 이동시킬 수 있습니다.

position을 딱딱 맞추는 것이기 때문에 일종의 순간이동을 하는 셈입니다. position에 더해지는 값이 크다면, 뚝뚝 이동이 끊기는 것을 볼 수 있습니다.
transform.Translate()를 통해서도 이동시킬 수 있습니다. 이 경우에는 부드럽게 이동합니다.
에디터에서 speed 값을 키울수록 더 빨리 움직입니다.
아래의 문서에서 더 많은 함수, 변수를 알아볼 수 있습니다.
https://docs.unity3d.com/kr/530/ScriptReference/Transform.html
UnityEngine.Transform - Unity 스크립팅 API
Position, rotation and scale of an object.
docs.unity3d.com
https://docs.unity3d.com/ScriptReference/Vector3.html
Unity - Scripting API: Vector3
This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doing common vector operations. Besides the functions listed below, other classes can be used to manipulate vectors and points as well. For e
docs.unity3d.com
'Unity > IGDC 입문 프로젝트' 카테고리의 다른 글
7. GameOver 알림 (0) | 2023.09.02 |
---|---|
6. 몬스터 스폰 및 이동 (0) | 2023.09.01 |
4. 맵 만들기 (0) | 2023.08.31 |
3. Script 생성 (0) | 2023.08.30 |
2. Rigidbody & Collider (0) | 2023.08.29 |