https://extrememanual.net/37749
Unreal LiveCoding 단축기인 Ctrl + Alt + F11을 하면
확장입력기라는게 계속 떠서 삭제하였다.
이상한 곳에서 공중에 올라갈 수 있는 투명 발판이 존재했다.
특정 각도에서 버그성 Collision이 생기는 경우가 존재한다고 한다.
참고로 PlayerCollision을 사용해야만 보인다.
찾아보니, 계단 매시였고, Mesh 에셋을 확인해본다.
실제로 오류가 존재했고, 이런 오류를 해결하기 위해선 2가지 방법이 존재한다.
1. Collision을 아예 없애고, unreal기능에 의해 새로 만든다.
2. 간혹가다가 아래처럼 오류나는 Collision부분만 선택할 수 있는 경우가 존재하는데,
해당 섹션만 제거한다.
잘 보면 선택된 부분만 연두색으로 보임
없어졌다.
Skeletal Mesh는 Skeleton을 가지고 있는 Mesh를 의미한다.
즉, Mesh인데 Skeleton을 통해 조작하고자 하는 Mesh를 의미.
일반 Mesh는 고정된 형태인데,
SkeletalMesh는 Skeleton의 움직임에 의해 변경된다.
Skeleton의 주요 기능은, Mesh와 Animation을 묶는 역할을 한다.
그래서 Mesh가 다르더라도, Skeleton이 같다면,
Skeleton을 통해서 Animation을 공유할 수 있게 된다.
SkeletalMesh에서 동일한 Skeleton을 공유하는 다른 Mesh를 볼 수 있다.
Skeleton에 연결된 Animation들을 볼 수 있다.
Skeleton이 다른데 같은 애니메이션을 사용하고자 한다면,
따로 Retargeting하여 Skeleton끼리 동일한 부위를 매칭시켜야만 할것이다.
위처럼 Skeleton은 Mesh와 Animation에 연결할 수 있다.
위는 CharacterBP이고, Warith가 적용된 상태였다.
여기서 해당 SkeletalMesh의 Skeleton에 적용할 수 있는 Animation을 장착해보고,
SkeletalMesh를 바꾸면,
자동으로 Animation이 해제되는 것을 볼 수 있다.
Skeleton은 이런 존재이다.
애니메이션작업을 CPP에서 구현하는 것은 매우 비효율적이라고 한다.
따라서 바로 Animation BP를 생성한다.
이전 Satellite프로젝트에서도 AnimBP를 이용했었고,
CPP로 AnimInstance를 만들어서 상속시키고 BP를 관리하기도 했다.
BS를 만들어서 관리하는게 상당히 효율적이라고 한다.
물론 이전 Satellite프로젝트에서도 사용하였다.
AnimBP에 BS를 넣는다.
그리고 해당 애니메이션BP를 CharacterBP에 설정한다.
Satellite프로젝트에서는 CPP로 모드를 설정하고 넣었지만,
위를 활용하니 나름 복잡했던 코드 없이, Character와 연결할 수 있다.
Speed의 연결을 따로 AnimInstance에서 받아오는 것이 아니라,
AnimBP가 연결된 Pawn을 AnimGraph에서 가져와서 사용한다.
Update노드이기 때문에 틱마다 진행된다
AnimInstance를 연결하여 Player의 값을 가져왔던 방식과는 다르다.
하지만 사용하는 기능은 매우 유사해 보인다.
LocationVector는 Global원점으로부터의 방향을 나타내는 벡터이고,
DirectionVector는 Local원점으로부터의 방향을 나타낸다..고 하는데
모르겠고, DirectionVector를 통해 캐릭터의 Angle을 설정할 것이라고 한다.
이전에 Speed를 다룰 때, 속도에서 크기만 가져왔다.
Velocity값이고, 이번에는 속도에서 방향만 가져오려고 한다.
이를 하기 위해서 3가지 함수중에 선택을 해야만한다.
우선 Location은 이전에 말했다시피,
캐릭터 자체가 보는 방향이 아니라,
Global공간의 원점으로부터 좌표 위치를 의미한다.
따라서 어떤 방향을 표현하기에 Direction이 더 적합하다.
그러면 남은 것은 Transform direction, inverse Transform direction인데..
결론부터말하면 둘다 해봤고, 둘다 동작은 한다.
하지만 위처럼 다른점이 명시되어있다.
https://docs.unity3d.com/ScriptReference/Transform.InverseTransformDirection.html
유니티의 글이지만, 벡터연산은 유사할 것이라서 참고한다.
InverseTransform은 world -> local로 변환
그냥 Transform은 local -> world로 변환
따라서 Velocity라는 world/global기반의 값을
캐릭터인 local값으로 변환하여 방향으로 사용하겠다는 것으로,
inverse를 사용하는 것으로 보인다.
위처럼 적용하면 위화감이 든다.
그 이유는 애니메이션이 움직이는 만큼 발바닥이 땅에 닿는것과,
실제 이동속도의 격차가 존재하기 때문이다.
이를 간단히 설정하는 방법은 위와 같다.
이전의 BlendSpace에서 모션을 Speed에 따라 빠르게, 중간, 멈춤
3단계를 두었다.
각 단계 사이에 자동으로 Blend되어 Speed가 줄면 자동으로
모션의 속도도 느려지게 보이는 효과를 낸다.
지금 100에서는 달리기, 50에서는 걷기, 0에서는 멈춤이다.
하지만 100에서 달리기는 괜찮다.
50의 Speed에서 걷기가 진행되는 부분이 문제다.
따라서 해당 Speed를 세분화하여 나누려고 한다.
그 전에, 걷기가 정확히 Speed로 치면 어느정도인지 구한다.
이동 Animation의 Speed를 구하기 가장 쉬운 방법은,
발이 지면에 닿았을 때 ~ 발이 땅에서 떨어졌을 때 거리 / 시간
1 - 위의 공식을 사용하여 속도를 구한다.
[시간]
닿았을 때 0.34 / 떨어졌을 때 0.71 =시간 0.37
[거리 =발의 y좌표값]
20.976 / -35.334 =거리 56.31
따라서 속도 = 152.xxx
같은 원리로 달리기 모션의 속도를 구했을 때,
속도 = 350이 나왔다.
2 - 상대적으로 BS에 구현만 하면 끝이다.
350을 최대로 갖는 7분할 BlendSpace로 만든다.
350인 달리기를 기준으로, 150위치에 걷기 애니메이션을 넣는다.
그러면 Blend시에 훨씬 자연스럽게 애니메이션이 나올 것이다.
이동속도에 맞게 미끄러짐없이 움직이는 모습.
떨림은 블루트스패드 이슈
3 - 더 자연스럽게 하길 원한다면, 격자에 맞는
애니메이션을 추가로 만들면 될것이다.
위의 BlendSpace 격자 사이사이에 끼워 넣는 것이다.
BlendSpace가 Blend하는 간격을 줄이는 것이다.
아래 내용은 지나가도 된다.
AxisValue에 의한 값은 최소-1 최대 1 사이의 값이다.
Speed는 현재 Pawn의 속도벡터의 크기를 의미하고,
캐릭터의 최대 속도의 0~1배까지의 실수값으로 나타난다.