Game/Unity

· Game/Unity
앉기 및 슬라이딩이제 파쿠르 동작을 구현해 보자.첫 번째로 슬라이딩을 구현하려 하는데 이는 앉기 키와 동일하게 사용할 예정이라 앉기를 먼저 구현하고 달리면서 앉기 키를 눌렀을 때 슬라이딩이 되도록 구현할 것이다. 앉기Control키를 눌러 캐릭터가 앉을 수 있도록 만들어 보자.우선 입력부터 처리하자.누르고 있을 때만 상태를 변경해야 하기 때문에 PassThrough로 설정하였다.public void OnCrouch(InputValue value){ crouch = value.isPressed;} crouch가 참일 때 상태를 변경해 보자. if (blackBoard.parkourInputController.crouch && _currentParkourState != ParkourState.C..
· Game/Unity
동적 콜라이더 캡슐애니메이션이 진행되며 캐릭터의 범위가 변경되는데 collider는 변경되지 않아 예상하지 못하는 충돌이 일어나기도 한다.이를 개선하기 위해 애니메이션에 맞춰 collider가 변경되는 시스템을 만들어 보자. 애니메이션 실행 중 바운드 계산Collider가 적용되려면 애니메이션이 적용될 때 캐릭터의 바운드를 계산할 수 있어야 한다.먼저 이를 시도해 보자.가장 먼저 생각나는 방법은 skeleton을 갖고 있는 오브젝트의 바운드를 받아오면 되지 않을까 싶다.skeleton 구조는 오브젝트의 계층 구조로 이루어져 있기 때문에 최상위 오브젝트에서 재귀적으로 자식들을 모두 트래킹 하여 저장한 뒤 포지션상 가장 낮은 값과 높은 값을 통해 Bound를 만들어주면 될 것 같다. 우선, 모든 bo..
· Game/Unity
경사 체크 오류 수정현재 경사 체크는 3점 탐지(제자리, 오른쪽, 앞쪽)로 기울기를 구하고 있다.얇은 바닥이나 경사로의 끝쪽에 위치했을 경우 오른쪽 부분이 높이가 낮게 hit가 되어 제자리의 y좌표와 동일하게 설정하여 해결했었다.하지만 특수한 경우에 지형의 모서리를 hit하거나 하면 잘못된 경사가 계산되기도 한다.이런 경우는 조작감이 매우 떨어지는 경우이다.따라서 이렇게 오탐지하는 경우에는 예외 처리가 필요하다. 정확한 경사 체크우선 생각나는 방법으로는 전방에 찍힌 hit의 높이가 stepOffset을 넘으면 움직일 수 없게 만드는 방법이 있을 것 같다.이는 높은 계단도 처리할 수 있을 것 같다.public float stepOffset;if (_playerBlackBoard.footTracker..
· Game/Unity
경사 슬라이딩경사면이 가파르거나 내려오는 속도가 충분하다면 경사면을 슬라이딩하여 내려오도록 하는 시스템을 만들어 보자.추가로 이전에 높은 경사를 오르는 부분을 막아놨는데 이를 현실처럼 최대한 올라가다가 미끄러져 내려오듯이 만들어 보자. 경사 제한경사를 올라갈 수 있는지 아닌지 계산하는 두 가지 방법이 떠오른다.현재 속도로 어느 정도 올라갈지 예측하기경사를 오르며 한계에 다다르면 미끄러지게 만들기 우선 첫 번째 방법은 경사의 각도가 변할 수 있으며 이를 모두 예측하는 것은 쉽지 않을 것이다.따라서 두 번째 방법으로 구현해 보자. 이전에 경사의 기울기를 구하여 이동 벡터를 변경하는 것 까지는 구현해 놨다.경사의 기울기가 한계를 넘어갈 때 캐릭터를 경사의 내리막 방향으로 회전한 후 애니메이션을 변경해 ..
· Game/Unity
경사 및 낮은 낙차경사면을 오를 때 뚝뚝 끊기는 현상과 낮은 낙차를 내려갈 때 점프 애니메이션이 나오는 부분을 개선해 보자.그리고 점프 시 콜라이더는 크게 상승하지 않아 캐릭터의 발은 걸리지 않았는데 콜라이더에 의해 충돌되는 문제도 같이 해결해 보자. 경사 이동경사면을 오를 때 뚝뚝 끊기는 원인은 CharacterController에서 Move를 통해 이동을 수행하면서 충돌 발생 시 벽, 경사로, 계단에 대한 체크를 진행하기 때문이다.CharacterController에는 Step Offset, Slope Limit이라는 옵션이 존재한다.Step Offset은 오를 수 있는 계단의 높이 차에 대한 설정 값이고 Slope Limit은 오를 수 있는 경사로의 최대 각도를 의미한다.CharacterCo..
· Game/Unity
이동 애니메이션 디테일현재 걷는 모션과 뛰는 모션 사이 그리고 걷는 모션과 멈추는 모션의 사이 등이 조금 어색한 부분이 있다.걷기에서 뛰기로 모션이 전환될 때 너무 빠르게 전환되는 문제나 멈출 때 등 어색한 부분을 개선해 보자.그리고 점프에서도 어색한 부분이 있다. 걷기 애니메이션현재 걷는 모션에서 뛰는 모션으로 전환될 때 너무 빠르게 전환되어 속도가 갑자기 변하는 것처럼 끊겨보이는 느낌이 든다.if (!animator.IsUnityNull()){ _animSpeed = Mathf.Lerp(_animSpeed, _targetSpeed, Time.deltaTime * playerMovementData.speedChangeRate); animator.SetFloat(SpeedAnimID, ..
· Game/Unity
이동 애니메이션이전까지 만든 이동 로직에 애니메이션을 추가하고 디테일을 잡아보자. 스프린트shift에 스프린트를 넣어 이동속도를 빠르게 만들어보자.PassThrough로 설정해 눌려있는 상태에서만 켜지도록 설정해 준다.public void OnSprint(InputValue value){ sprint = value.isPressed;}이후 입력 콜백을 구현하여 sprint라는 변수를 변경하도록 설정한다.private void Move(){ _targetSpeed = parkourInputController.sprint ? playerMovementData.sprintSpeed : playerMovementData.moveSpeed; ...이후 Move에서 sprint 여부에 따라 ..
· Game/Unity
캐릭터 이동 구현분석한 내용을 직접 구현해 보자. 구조구조는 유사하게 Input을 처리하는 스크립트와 이를 참조하여 캐릭터를 제어하는 구조로 설계하였다.이동 관련한 데이터는 따로 SO로 분리하여 관리하려 한다. 이동이동부터 구현해 보자.흐름을 정리하자면 다음과 같다.입력 방향의 각도를 구한다 = Atan2카메라 회전 각도를 구한다 = camera eulerAnge.y둘을 합해 최종 캐릭터 회전 방향을 구해 회전시킨다현재 이동 속도를 구한다현재 속도가 유효 범위밖이라면 속도를 조정한다 = Lerp최종 이동 = 수평, 수직 포함 입력 방향에 대한 각도를 구하는 것은 Atan2와 Reg2Deg를 통해 구해내면 된다.이후, 카메라의 회전은 mainCamera의 참조에서 transform을 받아와 ..
· Game/Unity
캐릭터 이동3인칭 캐릭터 이동에 대해서는 이전에 다룬 적이 있지만 이번에는 파쿠르 시스템을 개발하고 애니메이션 보간 등을 자연스럽게 처리하는 방식을 연구하려 한다.가장 기본이 되는 이동부터 구현해 보자.유니티에서 제공하는 튜토리얼 코드를 분석해보며 적용해 보자. Controllerusing UnityEngine;#if ENABLE_INPUT_SYSTEMusing UnityEngine.InputSystem;#endif/* Note: animations are called via the controller for both the character and capsule using animator null checks */namespace StarterAssets{ [RequireComponent(..
· Game/Unity
RoomGenerator랜덤한 그래프를 생성하는 로직을 구현해야 하는 상황이다.간단한 이론과 알고리즘이 있을 거라 생각했지만 그리 만만하지 않았다...여러 이론과 방법들을 분석하며 실제로 구현해 보자. 보로노이 + 들로네 삼각 분할보로노이는 평면을 분할하는 방법중 하나이다.평면의 두 점을 연결하고 그에 수직하는 선분으로 평면을 나누어 나간다.그러면 왼쪽 사진과 같이 평면이 자연스럽게 나눠진다.이는 CG에서 땅을 부수거나 벽이 부서지는 등의 효과를 만들 때 많이 사용된다.자연스러움이 있기 때문인 듯 하다.들로네 삼각 분할은 점들을 연결하는 삼각형을 만들 때, 최대한 정삼각형에 가깝게 만드는 방식으로 분할하는 것이다.그러기 위해서, 세 점으로 이루어진 삼각형의 외접원안에 다른 점이 없도록 해야 한다...
hvv_an
'Game/Unity' 카테고리의 글 목록