Transform이란 게임오브젝트의 위취, 회전, 크기를 저장하는 컴포넌트이다.
transform : 게임오브젝트에 있는 Transform 컴포넌트에 접근할 수 있다.
thisTransform = transform;
Translate : 트랜스폼 이동 함수
// 1. 절대 위치로 이동
transform.position = new Vector3(1, 2, 3);
// 2. 방향 벡터를 이용한 이동
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
// 3. 목적지로 일정 속도로 이동시키기
transform.position = Vector3.MoveTowards(
transform.position,
target.position,
moveSpeed * Time.deltaTime
);
// 4. 보간해서 부드럽게 이동시키기 Lerp = Linear Interpolation, 선형보간
transform.position = Vector3.Lerp(
source.position,
target.position,
rate
);
// 5. 축 기준 이동
transform.Translate(0, 0, moveSpeed * Time.deltaTime);
// 6. 포지션을 직접 더해서 이동
transform.position += new Vector3(0, 0, moveSpeed * Time.deltaTime);
회전 반영됨), (로컬 기준)회전 반영됨), (로컬 기준)회전 반영 X), (월드 기준)트랜스폼 이동 기준 설정
// 1. 월드를 기준으로 이동
transform.Translate(0, 0, 1, Space.World);
// 2. 로컬을 기준으로 이동
transform.Translate(0, 0, 1, Space.Self);
// 3. 다른 대상을 기준으로 이동
transform.Translate(0, 0, 1, otherTransform);
회전과 상관 없이 이동회전에 따라 이동다른 오브젝트의 회전에 따라 이동Rotation은 (x, y, z)를 직접 사용하지 않고 Quaternion을 사용한다.
짐벌락 현상이 발생하기 때문이다.
2개 이상의 축이 겹치면서 한 방향으로는 더 이상 회전불가한 상황이 나온다.
쿼터니언 값은 직접 지정해서 넣기 매우 어렵다. 따라서 오일러 각으로 변환해서 넣을 수 있는 메서드가 있다.
// 1. 회전 직접 지정: Euler 각을 이용하여 회전각을 직접 대입
transform.rotation = Quaternion.Euler(0, 60, 0);
// 2. 축을 기준으로 회전
transform.Rotate(Vector3.up, rotateSpeed * Time.deltaTime); // y축을 기준으로 1초 당 rotateSpeed만큼 회전
// 3. 지점을 기준으로 회전
transform.RotateAround(
target.position,
Vector3.up,
rotateSpeed * Time.deltaTime
);
// 4. 지점을 바라보도록 회전
transform.LookAt(target.position);
// 5. Lerp
transform.rotation = Quaternion.Lerp(
transform.rotation,
Quaternion.LookRotation(targetDir),
Time.deltaTime * turnSpeed
);
// 6. Slerp
transform.rotation = Quaternion.Slerp(
transform.rotation,
Quaternion.LookRotation(targetDir),
Time.deltaTime * turnSpeed
);
// 1-1 오일러 각을 쿼터니언으로 변환
Quaternion a = Quaternion.Euler(0, 60, 0); // Vector3도 됨
// 1-2 쿼터니언을 오일러로 변환
Vector3 b = transform.rotation.eulerAngles;
// 1-3 방향벡터를 쿼터니언으로 변환
Quaternion c = Quaternion.LookRotation(Vector3.right);
// 1-4 현재 회전을 방향벡터로 변환
Vector3 d = transform.right;
대입// 1. 월드를 기준으로 회전
transform.Rotate(0, 0, 1, Space.World);
// 2. 로컬을 기준으로 회전
transform.Rotate(0, 0, 1, Space.Self);
// 3. 위치를 기준으로 회전
transform.RotateAround(otherTransform.position, Vector3.up, 1);
오브젝트 회전과 상관 없이 회전오브젝트 회전에 따라 축도 함께 회전, 누적 회전월드 스페이스(World Space):
로컬 스페이스(Local Space):
프레임: 각각의 정지 게임 상황을 프레임이라 한다.
FPS(Frame per Second): 1초 동안 표현한 프레임 수
단위 시간: 1프레임 동안 소모한 시간
-
- deltaTime은 Update() 직전에 갱신된다
시간동기화
- 게임의 FPS은 가변적이며 확정되어 있지 않다.
- 다양한 요인으로 인해 지연시간 및 처리시간이 발생할 수 있으나 어디서든 동일한 게임 진행이 되어야한다.
- 단위시간을 이용하면 처리 시간과 무관하게 동일한 게임 진행이 가능하다
게임이 10 FPS일 경우: 초마다 만큼 처리 => 결과는 1초 동안 1 처리
게임이 FPS일 경우: 초마다 만큼 처리 => 결과는 1초 동안 1 처리
private static readonly Vector3 zeroVector = new Vector3(0f, 0f, 0f);
private static readonly Vector3 oneVector = new Vector3(1f, 1f, 1f);
private static readonly Vector3 upVector = new Vector3(0f, 1f, 0f);
private static readonly Vector3 downVector = new Vector3(0f, -1f, 0f);
private static readonly Vector3 leftVector = new Vector3(-1f, 0f, 0f);
private static readonly Vector3 rightVector = new Vector3(1f, 0f, 0f);
private static readonly Vector3 forwardVector = new Vector3(0f, 0f, 1f);
private static readonly Vector3 backVector = new Vector3(0f, 0f, -1f);
Vector3에 단위벡터가 설정되어있어 속도를 곱했을 때 속도만큼 이동할 수 있게된다.
Input Class는 유니티에서 사용자의 명령을 감지할 수 있는 수단이며 이를 통해 사용자는 다양한 외부 장치(키보드 및 마우스, 조이스틱, 등)를 이용하여 게임을 제어할 수 있다.
Input.GetKey(KeyCode.W);
GetKey() 메서드는 KeyCode(열거체)를 매개변수로 갖는다.키보드 & 게임패드
GetKey(): 누르고 있는 동안 true
GetKeyDown(): 눌렀을 때 한 번만 true
GetKeyUp(): 뗐을 때 한 번만 true
마우스
GetMouseButton(): 누르고 있는 동안 true
GetMouseButtonDown(): 눌렀을 때 한 번만 true
GetMouseButtonUp(): 뗐을 때 한 번만 true
Input Manager란 Unity 에디터에서 키보드, 마우스, 게임패드 등의 입력 키와 축(Axis)을 사전에 설정해두는 입력 설정 도구이다.
위의 한 키에 한 코드를 매칭하는 방식으로는 여러 키와 플랫폼에 대한 대응은 어려울 수 있다.
그러나 Input Manager에서는 이름과 입력을 정의하고 묶어서 관리할 수 있기에 아래의 방법처럼 사용할 수 있다.
if (Input.GetButtonDown("Fire1"));
{
//...
}
Fire1에 대응하는 키들을 매핑함으로써 소스코드 한 개로 여러 키를 대응시킬 수 있으며, 가독성에도 도움이 된다.
하지만 유니티 초창기의 방식이기 때문에, 키보드, 마우스, 조이스틱에 대한 장치만을 고려하여 최신 기기들에 대해서는 지원하지 않는다.
Input Manager 설정 방법
Main Menu(좌상단) - Edit - Project Settings - Input Manager<InputSystem>
InputSystem 패키지를 이용한 입력방식이다.
컴포넌트를 통해 입력의 변경사항을 확인 및 최신에 지원한 방식으로 다양한 기기를 지원한다.