호빵의 IT 개발소

[MMO RPG] Position 본문

C#, 유니티/MMO RPG 만들기 기초(클라이언트)

[MMO RPG] Position

호빵Stack 2022. 1. 19. 00:16

이전 시간 예제를 가져오겠습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    void Start()
    {
        
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.W))
            transform.position += new Vector3(0.0f, 0.0f, 1.0f);
        if (Input.GetKey(KeyCode.S))
            transform.position -= new Vector3(0.0f, 0.0f, 1.0f);
        if (Input.GetKey(KeyCode.A))
            transform.position -= new Vector3(1.0f, 0.0f, 0.0f);
        if (Input.GetKey(KeyCode.D))
            transform.position += new Vector3(1.0f, 0.0f, 0.0f);
    }
}

 

이전에 만든 코드는 모델에 적용시키면 엄청 빠르게 모델이 이동하는 모습을 볼 수 있습니다.

우선 수정한 코드를 이용하여 무엇이 바뀌었는지 기능은 무엇인지에 대해서 설명하겠습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [SerializeField]
    float _speed = 10.0f;

    void Start()
    {
        
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.W))
            transform.Translate(Vector3.forward * Time.deltaTime * _speed); 
        if (Input.GetKey(KeyCode.S))
            transform.Translate(Vector3.back * Time.deltaTime * _speed);
        if (Input.GetKey(KeyCode.A))
            transform.Translate(Vector3.left * Time.deltaTime * _speed);
        if (Input.GetKey(KeyCode.D))
            transform.Translate(Vector3.right * Time.deltaTime * _speed);
    }
}

우선 첫번째로 Time.deltaTime이라는게 생겼습니다.

1. Time.deltaTime이란?

 - 지난 시간 프레임 이후 경과된 시간, 즉 프레임이 1초에 60프레임일때 Time.deltaTime은 1/60(60분의 1)이 된다.

 - 여기서 지난 시간에 했던 Vector3에 deltaTime을 곱해주게 되면 속도가 현저히 느려진걸 확일 할 수 있습니다.

 

2. _speed 생성

 - 현재 Vecotor3에 deltatime만 곱한다면 속도가 현저히 느리게 느껴질 수 있습니다. 속도를 설정할 수 있는 float _speed를 생성하여 곱해주면 원하는 속도를 설정 할 수 있습니다.

 - 여기서 _speed를 설정한 뒤 앞에 public으로 공개를 해주면 유니티엔진 상에서 직접 속도를 설정할 수 있게 됩니다. 하지만 코드 상 외부에 노출되게 되고 잘못하면 _speed가 변화될 수 있기 때문에 public 대신 위에 [SerializeField]를 사용하면 유니티 엔진에서만 공개되게 되어 활용할 수 있게 됩니다.

 

3. 저번 시간 예제를 확인해 보면 transform.position += new Vector3(0.0f, 0.0f, 1.0f) * Time.deltaTime * _speed;를 사용해도 별 문제 없이 작동됩니다. 하지만 모델에 Rotation을 돌린다면?? 현재 이 코드는 World좌표라고 해서 아래 그림 왼쪽 상단에 좌표를 기준으로 움직이기 때문에 캐릭터가 전진하면 엉뚱한 방향으로 움직이게 됩니다. 이 현상을 잡기 위해 Local좌표를 기준으로 position이 움직여야 합니다. 2가지 방법이 있습니다. (전진 방향 기준 예)

 - 위 완성 예제에 보이는 Translate를 사용해서 World -> Local로 변경할 수있습니다.(가장 많이 사용함)

예) transform.Translate(Vector3.forward * Time.deltaTime * _speed); 

 - transform.TransformDirection를 사용하여 World -> Local로 변경 가능합니다.

예) transform.position += transform.TransformDirection(Vector3.forward * Time.deltaTime * _speed);

 

4. world 좌표에서 Local좌표로 바꾸는 방법이 있다면 반대도 있지 않을까요?

- InverseTransformDirection 이라는 코드를 사용하여 사용하실 수 있습니다.

예) transform.position += transform.InverseTransformDirection(Vector3.forward * Time.deltaTime * _speed);

 

※ 유니티에서는 기본적으로 World좌표 기준으로 모델에 표시되어있습니다. 만약 모델에 로컬좌표를 확인하고 싶다면?

-아래 사진에 상단 부분에 Global이라고 되어 있는 부분을 클릭하면 Local로 변경됩니다.

-Local로 변환해도 아무 변환이 없는 경우 모델과 world좌표는 현재 동일하게 되어 있다고 보시면 됩니다.

 

---------------------------------------------------------------------------------------------------------------------------

참고 : [인프런] Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티  엔진

'C#, 유니티 > MMO RPG 만들기 기초(클라이언트)' 카테고리의 다른 글

[MMO RPG] Trigger  (0) 2022.01.21
[MMO RPG] Collision  (0) 2022.01.21
[MMO RPG] Collider  (0) 2022.01.21
[MMO RPG] Rotation  (0) 2022.01.19
[MMO RPG] Player 간단한 움직임 구현  (0) 2022.01.17
Comments