bool UAvoidanceManager::RegisterMovementComponent(UMovementComponent* MovementComp, float AvoidanceWeight)
{
	if (IRVOAvoidanceInterface* AvoidingComp = Cast<IRVOAvoidanceInterface>(MovementComp))
	{
		const int32 NewAvoidanceUID = GetNewAvoidanceUID();
		AvoidingComp->SetRVOAvoidanceUID(NewAvoidanceUID);
		AvoidingComp->SetRVOAvoidanceWeight(AvoidanceWeight);

		RequestUpdateTimer();

		FNavAvoidanceData AvoidanceData(this, AvoidingComp);
		UpdateRVO_Internal(AvoidingComp->GetRVOAvoidanceUID(), AvoidanceData);

		return true;
	}

	return false;
}
예제 #2
0
bool UAvoidanceManager::RegisterMovementComponent(UCharacterMovementComponent* MovementComp, float AvoidanceWeight)
{
	if (MovementComp && MovementComp->GetCharacterOwner())
	{
		if (UCapsuleComponent *OurCapsule = MovementComp->GetCharacterOwner()->CapsuleComponent.Get())
		{
			const int32 NewAvoidanceUID = GetNewAvoidanceUID();
			MovementComp->AvoidanceUID = NewAvoidanceUID;
			MovementComp->AvoidanceWeight = AvoidanceWeight;

			RequestUpdateTimer();
			UpdateRVO(NewAvoidanceUID, MovementComp->GetActorFeetLocation(),
				OurCapsule->GetScaledCapsuleRadius(), OurCapsule->GetScaledCapsuleHalfHeight(),
				MovementComp->Velocity, AvoidanceWeight,
				MovementComp->AvoidanceGroup.Packed, MovementComp->GroupsToAvoid.Packed, MovementComp->GroupsToIgnore.Packed);

			return true;
		}
	}
	return false;
}