Game Development, 게임개발/개발

시점에 따라 좌표축 바꾸기, Local Coordinates [Unity]

게임이 더 좋아 2021. 3. 1. 21:01
반응형
728x170

항상 우리는 거의 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로 움직이게 하는 법 정말 유용하게 쓰일 수 있다.

 

 

728x90
반응형
그리드형