항상 우리는 거의 Global에서 무엇인가를 조작한다. 하지만 때로는 Local로 조작하는 것이 더 쉬울 때가 있다.
이를 오늘 알아보자.
아무 3D 프로젝트를 켜놓고
Floor를 만들고 Sphere를 만들어보자
나는 이렇게 만들었다.
공에는 우리 입력을 받아 움직일 수 있게 스크립트를 짜주자.
public class PlayerController : MonoBehaviour
{
private Rigidbody playerRb;
public float speed = 5.0f;
//private GameObject focalPoint;
// Start is called before the first frame update
void Start()
{
playerRb = GetComponent<Rigidbody>(); // 힘을 주기 위해 rigidbody 객체생성
focalPoint = GameObject.Find("FocalPoint");
}
// Update is called once per frame
void Update()
{
float forwardInput = Input.GetAxis("Vertical"); // 사용자 입력
playerRb.AddForce(Vector3.up * speed * forwardInput);
//playerRb.AddForce(focalPoint.transform.forward * speed * forwardInput);
}
}
이렇게 되면 공이 움직일 수 있다.
우리가 의도했던 바를 잘 이해하는 움직임이다.
하지만 게임의 역동성, 조작감을 위해 카메라 시점을 바꿔보기로 한다.
MainCamera에 스크립트를 집어넣는다.
public class RotateCamera : MonoBehaviour
{
public float rotationSpeed;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float horizontalInput = Input.GetAxis("Horizontal");
transform.Rotate(Vector3.up, horizontalInput * rotationSpeed * Time.deltaTime);
}
}
이 또한 사용자 입력을 받아서
speed에 따라 움직인다.
우리는 시점이 바뀌어도 저런식으로 위아래로 움직이기를 원하지만
Global Coordinate를 염두한 설계는 아래와 같이 움직일 뿐이다.
그래서 우리는 Local로 바꾸기 위해 다른 GameObject를 추가시킨다.
FocalPoint라는 오브젝트를 추가시키자.
초점이라는 뜻이다. 즉, 우리가 기준으로 삼고 있는 시점이라고 봐도 무방하다.
그렇게 한 후 MainCamera를 그 오브젝트의 Children으로 놓는다.
Focal을 회전시키면 MainCamera가 자동으로 돌아가게끔 해놓는 것이다.
그리고 우린 그저 공이 움직이는 방향을 Global이 아닌 Local로 바꿔주면 된다.
여기서는 Focal이 바로 Local 좌표계가 되겠다.
public class PlayerController : MonoBehaviour
{
private Rigidbody playerRb;
public float speed = 5.0f;
private GameObject focalPoint;
// Start is called before the first frame update
void Start()
{
playerRb = GetComponent<Rigidbody>();
focalPoint = GameObject.Find("FocalPoint");
}
// Update is called once per frame
void Update()
{
float forwardInput = Input.GetAxis("Vertical");
playerRb.AddForce(focalPoint.transform.forward * speed * forwardInput);
}
}
focalPoint의 입장에서의 forward가 되는 것이다.
(1,0,0)이 아니라 (0,0,1)도 아니라 그냥 focalPoint의 기준이 되는 것이다.
그럼 어떻게 움직이느냐?
이렇게 움직인다.
좌표계가 이렇게 변한다.
카메라 시점에 따라 Local로 움직이게 하는 법 정말 유용하게 쓰일 수 있다.
'Game Development, 게임개발 > 개발' 카테고리의 다른 글
게임 제작 과정에서 한 번쯤 생각해야 할 체크리스트 (0) | 2021.03.05 |
---|---|
Physics Material에 대한 것 [Unity] (0) | 2021.03.02 |
정해진 시간마다 Method 실행시키기 [Unity] (0) | 2021.02.25 |
Prefab,프리팹을 이용해서 Random Spawn, 랜덤 생성해보기 [Unity] (0) | 2021.02.25 |
Prefab(ricate), 프리팹이란? [Unity] (2) | 2021.02.25 |