| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 힙영역
- 반복문
- 자료구조
- 프래그멘테이션
- static_cast
- c#
- Queue
- std::map
- 공부
- 배열
- 인프런
- list
- 알고리즘
- std::unordered_map
- 트리
- 스택
- 기술면접
- 벡터
- 차이점
- vector
- 객체지향
- map
- thread
- MonoBehaviour
- 큐
- 스택영역
- 리스트
- rookiss
- 멀티쓰레드
- 해쉬맵
- Today
- Total
호빵의 IT 개발소
[MMO RPG] Position 본문
이전 시간 예제를 가져오겠습니다.
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 |