Question>
unreal engine 4에서
아래 source로 character를 이동을 하려고 함.
UNavigationSystem* ns = GWorld->GetNavigationSystem();
FVector vecSomeWhere = FVector( 1000.0f, 1000.0f, 0.0f );
ns->SimpleMoveToLocation( GetController(), vecSomeWhere );
그런데, 이동 속도 조절이 안됨.
Tick()에서 CharacterMovement->Velocity를 강제로 조정해도 효과가 없음.
navigation system을 이용해서 이동할 때,
속도를 조절하려면 어떻게 해야 하는가?
-------------------------------------------------------------
Answer>
어느 Tick()에서 'Velocity'를 조정하셨는지는 모르겠지만,
UNavigationSystem::SimpleMoveToLocation()를 사용하셨다면,
UPathFollowingComponent::TickComponent()나 UPathFollowingComponent::FollowPathSegment()에서
조정한다면 효과가 있겠지만,
다른 Tick()에서 'Velocity'를 조정하시는 건 효과가 전혀 없습니다.
왜냐하면,
UPathFollowingComponent는 주기적으로
UPathFollowingComponent::TickComponent()를 호출하고 있고,
또, UPathFollowingComponent::TickComponent()에서 이동이 감지되면,
UPathFollowingComponent::FollowPathSegment()를 계속 호출하기 때문입니다.
그리고,
navigation system 내에서 속도를 균등하게 만드는 부분은
UPathFollowingComponent::FollowPathSegment() 밖에 없거든요.^^;;;;;
분석해 보셔서 아시겠지만,
UNavigationSystem::::SimpleMoveToLocation()는
UNavigationComponent와 UPathFollowingComponent를 사용해서, 움직임을 통제합니다.
따라서, UNavigationSystem::::SimpleMoveToLocation()를 호출한다면,
UPathFollowingComponent의 통제에서 벗어날 방법이 없습니다.
그렇기 때문에, 다른 Tick()에서 'Velocity' 조정하는 건 의미가 없습니다.
위와 같은 이유로,
굳이 SimpleMoveToLocation()를 사용하셔서,
이동을 해결하셔야 한다면, 2가지 방법이 가능하겠습니다.
방법1>
UPathFollowingComponent 상속한 새로운 class로
UPathFollowingComponent::FollowPathSegment()를 재정의한 뒤에
새로운 class를 이용하도록 SimpleMoveToLocation()를 수정하시기 바랍니다.
방법2>
UPathFollowingComponent::FollowPathSegment()의 아래 부분을
님 의도대로 수정하시기 바랍니다.^^
수정전:
FVector MoveVelocity = (CurrentTarget - CurrentLocation) / DeltaTime;
수정후:
FVector MoveVelocity = (CurrentTarget - CurrentLocation) / DeltaTime;
MoveVelocity *= m_fYourVelocityCtrlRate;
m_fYourVelocityCtrlRate는 님이 정의한 float형 변수이고, '속도 조정 비율'이 되겠습니다.
두가지 중에 하나 고르세요.^^
Tag:
안기훈, Kee Hoon Ahn, Unreal, UDK, iPhone, iPad, app, 앱, iOS