[캐릭터의 움직임 처리]
1. GetAxis를 사용하여 보다 섬세한 움직임을 처리하시오.
2. 마우스로 바라보는 방향으로 캐릭터를 회전시킬 수 있도록 처리하시오.
[카메라 이동 처리]
1. 카메라의 위치는 캐릭터의 후방 8m, 높이 3m에서 캐릭터를 바라볼 수 있도록
위치하시오.
2. 카메라를 캐릭터를 따라다닐 수 있도록 하면서 Damping을 넣어서 캐릭터의 움직임을
카메라가 조금 느리게 따라오도록 처리하시오.(씨네머신이 아닌 코드를 이용해서 처리)
[부드러운 움직임을 위한 맵핑 처리]
1. 부드러운 움직임과 대각선 움직임 시 속도를 일정하게 처리하기 위해서 아래의 맵핑을 적용시키시오.
2. 부드러운 움직임을 위해서 새로운 x’, y’로 맵핑
문제를 풀때는 유니티짱 에셋을 사용해서 풀어보려 한다
대충 새로운 프로젝트를 만들고 유니티짱을 가져온다
이제 대충 문제를 풀수 있도록 발판, 유니티짱 모델을 담을 빈 오브젝트도 만들어주자
대충 세팅을 했으니 첫번째 문제에 대해서 생각해보자
[캐릭터의 움직임 처리]
1. GetAxis를 사용하여 보다 섬세한 움직임을 처리하시오.
2. 마우스로 바라보는 방향으로 캐릭터를 회전시킬 수 있도록 처리하시오.
1의 핵심은 GetAxis로 캐릭터를 움직이는 것이다.
다만, 문제에는 없지만, characterController는 사용하지 말라는 조건이 추가 로 붙어있다
그래서 이전에 사용했던
characterController.Move(direction * moveSpeed * Time.deltaTime);
는 사용하지 못한다
아마 직접적으로 transform을 움직이는 방법이나, translate를 사용해야할 것 같다
public class PlayerMove_NoCharaterController : MonoBehaviour
{
[SerializeField]
private float _horizontal; // 좌우
[SerializeField]
private float _vertical; // 위아래
void Update()
{
_horizontal = Input.GetAxis("Horizontal");
_vertical = Input.GetAxis("Vertical");
}
}
우선 키를 누르면 변수값이 움직이게 하고 테스트해보자
이상없이 변수값이 변화하는걸 알 수 있다
이제 변수값에 따라서 캐릭터를 이동시켜보자
일단 대충 함수를 만들고 거기에 vector3값을 넣어서 움직이게 하려 한다
private void Move_Object()
{
gameObject.transform.Translate();
}
대충 이런 틀을 만들고 이제 여기에 수식을 더하는것이다
지금 건들여야 하는 좌표값은 x, z값이니, vector3의 x, z는 _hori, _verti가 될것이고, y는 0이 될것이다
gameObject.transform.Translate(_horizontal, 0, _vertical);
그럼 이런 형태가 될것이다
다만, 이렇게 하면 캐릭터가 너무 빠르게 이동하는 현상이 있을 수 있다.
이를 방지하기 위해서는 Time.deltatime를 넣어주어야 한다
gameObject.transform.Translate(_horizontal * Time.deltaTime, 0, _vertical * Time.deltaTime);
이를 적용하게 되면
이렇게 천천히 움직이는것을 확인할 수 있다
이제 함수를 조금 손봐서 가독성과 이동속도를 조절한다
우선 이동속도를 조절할 수 있는 변수를 추가한다
그리고 이를 함수에서 깔끔하게 받도록 수정한다
private void Move_Object()
{
float hori = _horizontal * speed * Time.deltaTime;
float vert = _vertical * speed * Time.deltaTime;
gameObject.transform.Translate(hori, 0, vert);
}
Vector3에 들어가는 x, z값을 한번더 변수 처리해서 가독성을 늘려주었다
결과적으로 잘 움직이는걸 확인할 수 있다
아직 회전과 애니메이션을 넣지 않았기에, 조금 어색할 수 있다
어쨋든, 결과적으로
1. GetAxis를 사용하여 보다 섬세한 움직임을 처리하시오.
는 만족했다
살짝만 누르면 살짝만 움직이는 동작이기 때문이다
이제 2번인
2. 마우스로 바라보는 방향으로 캐릭터를 회전시킬 수 있도록 처리하시오.
를 만들어보자
아마 탑뷰가 아니라 Tps시점을 의미하는 것 같다.... 아마.....
대충 마우스를 좌우로 움직여서 캐릭터에 회전을 주는 방식을 구현하면 될 것 같다
근데 마우스의 움직임 값을 float로 구현하는 방법을 모르겠으니, GPT에게 물어보자
뭔가 Mouse X라는 키워드가 있는 것 같다
이를 사용해보자
마우스의 좌표값을 담을 변수를 만들고
시점 변화 속도를 결정할 변수를 만든다
그후 마우스의 이동을 감지하게 한 뒤,
그 값을 기반으로 회전하게 한다
public class PlayerMove_NoCharaterController : MonoBehaviour
{
private float _horizontal; // 좌우
private float _vertical; // 위아래
private float _mouseX; // 마우스 좌표값
public int speed = 10;
public int view_speed = 100;
void Update()
{
_horizontal = Input.GetAxis("Horizontal");
_vertical = Input.GetAxis("Vertical");
Move_Object();
_mouseX = Input.GetAxis("Mouse X") * view_speed * Time.deltaTime;
}
private void Move_Object()
{
float hori = _horizontal * speed * Time.deltaTime;
float vert = _vertical * speed * Time.deltaTime;
gameObject.transform.Translate(hori, 0, vert);
gameObject.transform.Rotate(0, _mouseX * view_speed, 0);
}
}
전체적으로 이렇게 되어있다
마우스로 캐릭터를 회전시킬 수 있음을 알 수 있다
이제 2번을 풀어보자
[카메라 이동 처리]
1. 카메라의 위치는 캐릭터의 후방 8m, 높이 3m에서 캐릭터를 바라볼 수 있도록
위치하시오.
2. 카메라를 캐릭터를 따라다닐 수 있도록 하면서 Damping을 넣어서 캐릭터의 움직임을
카메라가 조금 느리게 따라오도록 처리하시오.(씨네머신이 아닌 코드를 이용해서 처리)
1번은 간단하다
그냥 카메라를 플레이어의 하위로 위치시켜버리면 된다
이렇게 좌표값을 고정시킨 뒤, 플레이어 오브젝트의 하위로 둔다
이제 그럼 이제 유사 Tps 시점을 볼 수 있다
근데, 애니메이션이 없으면 뭔가 허전하니 조금 넣어주자
애니메이터를 만들고 idle, run을 만든다
이제 이를 반영할 수 있도록 코드를 수정한다
private void Move_Object()
{
float hori = _horizontal * speed * Time.deltaTime;
float vert = _vertical * speed * Time.deltaTime;
gameObject.transform.Translate(hori, 0, vert);
gameObject.transform.Rotate(0, _mouseX * view_speed, 0);
if (new Vector3(_horizontal, 0, _vertical).magnitude > 0.5f)
animator.SetFloat("Speed", 1f);
else
animator.SetFloat("Speed", 0f);
}
이동 함수에 애니메이션 관련 코드를 추가해주었다
이제 덜 어색하게 움직이는 것을 알 수 있다
이제 여기에
2. 카메라를 캐릭터를 따라다닐 수 있도록 하면서 Damping을 넣어서 캐릭터의 움직임을
카메라가 조금 느리게 따라오도록 처리하시오.(씨네머신이 아닌 코드를 이용해서 처리)
를 만족하게 해보자
근데 해본적이 없으니 chat GPT 선생님에게 시작점을 물어보자
즉 Smoothdamp()를 사용하면 A - B좌표간에 간격을 자연스럽게 보간해서 움직이게 해주는 것 같다
비슷한 함수로는 Lerp()가 있는데 차이점이 뭘까
gpt선생님의 대답이다
즉, Lerp는 일정하게 선형보간시 일정하게 보정하는것이도
smoothdamp는 끝점에 다다를시 조금 느리게 보정해주는 것이다.
즉, 자연스러운 카메라 무빙을 의도할 수 있는 것 이다.
그래프로 표시할 시 이렇게 된다
이제 마지막
[부드러운 움직임을 위한 맵핑 처리]
1. 부드러운 움직임과 대각선 움직임 시 속도를 일정하게 처리하기 위해서 아래의 맵핑을 적용시키시오.
2. 부드러운 움직임을 위해서 새로운 x’, y’로 맵핑
이다
전혀 감이 잡히지 않는데
대충 이런 수식을 사용하라고 한다
일단 저 식에 맞게 코드를 짜면 이런 형태가 된다
private void Move_Object()
{
float x = _horizontal;
float y = _vertical;
float mappedX = x * Mathf.Sqrt(1 - (y * y) / 2);
float mappedY = y * Mathf.Sqrt(1 - (x * x) / 2);
float hori = mappedX * speed * Time.deltaTime;
float vert = mappedY * speed * Time.deltaTime;
gameObject.transform.Translate(hori, 0, vert);
}
이렇게 horizontal, vertical을 수식에 맞게 보정해주면 대각선 이동이 안정화되게 된다
'공부 > 유니티' 카테고리의 다른 글
유니티3D 공부(Part3) 말하는 유니티짱 만들기(효과음 넣기), 세이브, 로드기능 (1) | 2024.10.01 |
---|---|
유니티3D 공부(Part 2) 마우스로 카메라 이동, 회전, 줌 인, 아웃 (1) | 2024.09.29 |
유니티3D 공부(Part 1 - 5, Part 1 END) 씬 전환하기, 타이틀 화면, 승리, 패배 씬 추가 (0) | 2024.09.26 |
유니티3D 공부(Part 1-4) 적 만들기, 네이게이션 메쉬(NavMesh), 플레이어 추적 (1) | 2024.09.25 |
유니티3D 공부(Part 1-3) 동전 만들기(팩맨 만들기) (0) | 2024.09.25 |