현재까지 완성된 부분
1. 이동구현
2. 이동 애니메이션
3. 카메라 무빙
불안전 요소
1. 카메라 이동 속도가 빠를시 생기는 계단현상
2. 벽넘기가 불안정함
3. 대각 이동시 원을 그리게 변경해야함
현재 완성까지 필요한 요소
1. 엄폐기능
2. 총기 조작 기능
3. 시네마씬을 이용한 게임 씬 제작
우선 불안전 요소의 3부터 수정해보려 한다
2024 / 11 / 23 / 01 34
요즘 림버스 컴퍼니라는 게임을 동시에 하면서 코딩을 하고 있어서 조금 코딩 속도가 느릴 수 있을 것 같다
현재 대각 이동을 구현하는 코드는 이러하다
private void HandleInput()
{
_horizontal = Input.GetAxis("Horizontal");
_vertical = Input.GetAxis("Vertical");
_mouseX = Input.GetAxis("Mouse X") * viewSpeed * Time.deltaTime;
/*
if (Input.GetKeyDown(KeyCode.Space))
{
if (Time.time - _lastSpaceTime <= _doubleClickThreshold)
{
StartCoroutine(Slide());
}
_lastSpaceTime = Time.time;
}
*/
ControllSpeed();
}
private void MovePlayer()
{
if (_canMove)
{
float mappedX = _horizontal * Mathf.Sqrt(1 - (_vertical * _vertical) / 2);
float mappedY = _vertical * Mathf.Sqrt(1 - (_horizontal * _horizontal) / 2);
Vector3 movement = new Vector3(mappedX, 0, mappedY) * moveSpeed * Time.deltaTime;
transform.Translate(movement);
RotatePlayer();
}
}
현재 대각 이동을 하는 가장 큰 이유는 MovePlayer에서 대각 이동시 말 그대로 대각으로 이동하게 하고 있기 때문이다
왼쪽이 현재 상황이고 오른쪽이 현재 구현하고자 하는 형태이다
개인적으로 직접적으로 키 입력을 받을 시, 캐릭터를 회전시키는 방향으로 하는게 맞는것 같다
현재 개발에 AI를 적극적으로 사용하는 형태를 하고 있기에 한번 GPT에게 물어보자
AI의 제안은 대각 이동시 캐릭터를 직접적으로 회전시키는 방법으로 대각 이동시 회전을 주는 방식을 추천하고 있다
다만 적용해보니 이상한 방식으로 적용되어 있다
설계 자체는 참고할 영역이 있으니 조금 생각을 해보도록 하자
대충 이 키보드 입력을 Vector3로 해석하는 방향은 사용하면 좋을 것 같다
// 이동 입력이 있는 경우에만 회전하도록 조건 추가
if (moveDirection.magnitude > 0.1f)
{
// 이동 방향으로 회전하도록 목표 회전값 계산
Quaternion targetRotation = Quaternion.LookRotation(moveDirection);
// 부드럽게 회전하도록 Lerp 사용
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * viewSpeed);
}
다만, 이 블럭에서 이상하게 해석한 결과가 위의 상황인 것 같다
이를 해석해서 적용해 보자
private void RotatePlayer()
{
transform.Rotate(0, _mouseX * viewSpeed * Time.deltaTime, 0);
}
원래 함수 상태이다. 이를 위의 설계과 종합하여 제 설계한다
------------------------------------------------------------------------------------------------------------------------------------------------
설계가 조금 이상한것 같아 다시 설계했다
private void RotatePlayer()
{
transform.Rotate(0, _mouseX * viewSpeed * Time.deltaTime, 0);
if (_vertical > 0.01f && _horizontal != 0)
{
Debug.Log("check");
Vector3 forward = Vector3.Slerp(transform.forward, direction,
viewSpeed * Time.deltaTime / Vector3.Angle(transform.forward, direction));
}
}
아직 완성된 함수는 아니지만, 매커니즘만 짜고 생각중이다
즉, 플레이어가 대각 이동시, 대각이동에 대한 방향을 구하고, 그 값을 이동하는 벡터값에 곱연산을 해주면 된다
이말인 즉슨, 지금 회전 매서드에서 무언가를 할려고 하는게 아니라, 이동 매서드에서 조작을 해야 한다는 의미이다
이동 매서드에서 대각 이동시 Vector3값을 곱연산 해서 원형으로 이동하게 설계를 수정한다
------------------------------------------------------------------------------------------------------------------------------------------------
라고 생각했는데 사실 첫번째가 맞았다
private void RotatePlayer()
{
transform.Rotate(0, _mouseX * viewSpeed * Time.deltaTime, 0);
if (_vertical > 0.01f && _horizontal != 0) // WD
{
Debug.Log("check");
transform.rotation = transform.rotation * Quaternion.Euler(0, _horizontal * 0.5f, 0);
}
}
본 회전 메서드를 사용하면 완벽히 작동한다
문제점이 뭐였는가?
1. Vector3는 곱연산이 안된다
Vector3 a = new Vector3(1, 1, 1);
a * new Vector3.forward;
이건 회전 매서드에서 이동 매서드에서 무언가 할려다 생긴 문제다
movement = new Vector3(mappedX, 0, mappedY) * moveSpeed * Time.deltaTime;
이 이동을 계산하는 Vector3에
Vector3 direction = new Vector3(_horizontal, 0, _vertical);
이 방향을 담당하는 Vector3를 곱연산 하려다 오류가 뜨는걸보고 무언가 하자를 느꼈다
2. 회전의 합연산 하는 방법을 몰랐다
문제의 상황을 보자
transform.rotation += Quaternion.Euler(new Vector3(moveDirection));
지옥의 코드이다
Quaternion은 더하기 연산을 지원하지 않는다. - 비선형적 구조
그래서 이를 해결하는 대안책으로
transform.rotation = transform.rotation * Quaternion.Euler(0, _horizontal * 0.5f, 0);
이런식으로 현재 회전 = 현재 회전 * 원하는 방향
이렇게 구현을 해주어야 한다
GPT선생님이 확실한 답을 주어서 알 수 있었다
세상에 마상에 코드 한줄을 짤려고 1시간을 날리는 기적!
이 문제의 시발점은 무엇인가?
이 GPT선생님의 이해못할 대답이라고 생각한다
물론, 저렇게 설계도 되긴 하지만, 굳이굳이?
코더들은 GPT를 코드 생성기보다, 간단한 지식의 단편을 찾는 용도로 사용하면 좋겠다고 느끼는 부분이다
즉, 설계를 자신이 한 뒤, 그 설계에 필요한 부품을 찾아야지
설계를 시키고 자신 그것에 맞추려 하면 개판이 될 가능성이 높아 보인다
2024 11 23 03 02
'개발일지 > 게임개발' 카테고리의 다른 글
유니티 3D 게임 개발 - VFX 넣기 (0) | 2024.11.26 |
---|---|
유니티 3D 게임 개발 - TPS 조작 개발(Part 2 총기 조작 기능 구현, 장전 기능) (1) | 2024.11.24 |
[유니티 게임 개발] 동방을 걷다 프로젝트 15 - 레이무 상애 엔딩 2024 05 30(PM 08:30) (0) | 2024.05.31 |
[유니티 게임 개발] 동방을 걷다 프로젝트 14 - 레이무 상애 엔딩 2024 05 30(AM 01:30) (0) | 2024.05.30 |
[유니티 게임 개발] 동방을 걷다 프로젝트 13 - BGM 변화 기능 2024 05 30(AM 00:30) (0) | 2024.05.30 |