1

几天前我发布了这个问题,从评论中我没有像我认为我需要的那样制定这个问题。

这是我的更新版本,包含更多信息。

我有以下。

在此处输入图像描述

与中心左侧对齐的点行。

通过以下方式实现:

// Loop for basically CurrentWaveCount + 1
for (int32 Index = CurrentWaveCount; Index >= 0; Index--)
{
    FHitResult HitResult(ForceInit);
    FCollisionQueryParams TraceParams = FCollisionQueryParams();
    TraceParams.AddIgnoredActor(GetOwner());
    TraceParams.AddIgnoredActor(this);

    //////////////////////////////////////////////////////////////////////////

    FVector CastLocation = (GetActorForwardVector() * (CurrentWaveCount * WaveSpawnDistanceIncrement) + GetActorLocation());
    CastLocation += (-GetActorRightVector() * (Index * ChildWaveActorSeperationIncrement));

    //////////////////////////////////////////////////////////////////////////

    CastLocation.Z += FixedCastTraceHeightOffset;

    FVector TraceStart = CastLocation;
    FVector TraceEnd = TraceStart + (-FVector::UpVector * MaxFallbackTraceDistance);

    GetWorld()->LineTraceSingleByChannel(HitResult, TraceStart, TraceEnd, ECC_FixedCastableTraceChannel, TraceParams);

CastLocation 变量控制每个点的位置。

但是我想将它们对齐到中心而不是偏移到一侧,我无法计算出数学来做到这一点。

答案不必在 C++ 中,可以只是数学,如果有帮助,我可以从那里解决。

谢谢。

在此处输入图像描述

当前的:

在此处输入图像描述

预期的:

在此处输入图像描述

更新的解决方案代码:

// Loop for basically CurrentWaveCount + 1
for (int32 Index = CurrentWaveCount; Index >= 0; Index--)
{
    FHitResult HitResult(ForceInit);
    FCollisionQueryParams TraceParams = FCollisionQueryParams();
    TraceParams.AddIgnoredActor(GetOwner());
    TraceParams.AddIgnoredActor(this);

    //////////////////////////////////////////////////////////////////////////

    float HalfWidth = CurrentWaveCount * ChildWaveActorSeperationIncrement / 2;

    FVector CastLocation = (GetActorForwardVector() * (CurrentWaveCount * WaveSpawnDistanceIncrement) + GetActorLocation());
    CastLocation += -GetActorRightVector() * (Index * ChildWaveActorSeperationIncrement);
    CastLocation += GetActorRightVector() * HalfWidth;

    //////////////////////////////////////////////////////////////////////////

    CastLocation.Z += FixedCastTraceHeightOffset;

    FVector TraceStart = CastLocation;
    FVector TraceEnd = TraceStart + (-FVector::UpVector * MaxFallbackTraceDistance);

    GetWorld()->LineTraceSingleByChannel(HitResult, TraceStart, TraceEnd, ECC_FixedCastableTraceChannel, TraceParams);
4

1 回答 1

1

我做出以下假设:

  • GetActorLocation()返回金发字符的位置。
  • GetActorForwardVector()返回一个指向 blondie 所面对方向的单位向量。
  • GetActorRightVector()返回与 ForwardVector 正交(垂直)且与地面水平的单位向量。

那么问题似乎就在这里:

CastLocation += (-GetActorRightVector() * (Index * ChildWaveActorSeperationIncrement));

如果ChildWaveActorSeperationIncrement总是非负数(并且Index是非负数),那么这条线总是将施法位置移到 blondie 左侧的某个位置。

最大向左位移是Index最大的时候,所以是CurrentWaveCount * ChildWaveActorSeperationIncrement。这也是以 RightVector 为单位的行的宽度。要按要求使行居中,我们只需将每一行向右移动该宽度的一半,方法是添加(在伪代码中):

half_width = CurrentWaveCount * ChildWaveActorSeperationIncrement / 2
CastLocation = ExistingCastLocation + GetActorRightVector() * half_width
于 2018-05-18T02:50:15.667 回答