【问题标题】:Targeting Closest Enemy With Joystick用操纵杆瞄准最近的敌人
【发布时间】:2014-01-01 03:49:25
【问题描述】:

我的定位系统实际上并没有像我想要的那样运行。我的方法是首先获取敌人(绿色三角形)的本地位置(如下图所示),然后使用所选目标(紫色圆圈)中操纵杆的 x 和 y 轴过滤列表。

假设我将摇杆推到 X 轴的 +1,它过滤所有具有正 X 的绿色三角形,并按与紫色圆圈(选定目标)的最近距离对列表进行排序以获得下一个目标.

为了更清楚,这是我的代码示例。

// Switching target system
private void SwitchTarget()
{
    // Right stick direction
    float rightXRaw = Input.GetAxisRaw("RightStickX");
    float rightYRaw = Input.GetAxisRaw("RightStickY");

    // List for the enemies
    localTargets = new List<Transform>();

    // Filtering and adding the target based on the right stick direction (Only right, left, up and down)
    foreach (Transform localTarget in targets)
    {
        // Setting the enemies' world coordinate to local coordinate relative to the selected target
        Vector3 localChildPos = selectedTarget.Find("localChild").transform.InverseTransformPoint(localTarget.position);

        if (rightXRaw == 1 && localChildPos.x < 0)
        {
            localTargets.Add(localTarget);
        }

        if (rightXRaw == -1 && localChildPos.x > 0)
        {
            localTargets.Add(localTarget);
        }

        if (rightYRaw == 1 && localChildPos.z < 0 && Mathf.Abs (localChildPos.x) < 3)
        {
            localTargets.Add(localTarget);
        }

        if (rightYRaw == -1 && localChildPos.z > 0 && Mathf.Abs (localChildPos.x) < 3)
        {
            localTargets.Add(localTarget);
        }

    }

    // Sorting the created list based on distance from the selected target, then select the first member from the list.
    SortDistTarget(localTargets);
    SelectTarget();
}

没关系,但在某些情况下,它不会选择我想要的,因为它仅基于 4 个方向(例如左、右、上和下)进行过滤。所以我想也许有一种更好、更精确的方法可以直接使用操纵杆方向来执行此操作,也许可以使用光线投射。很想听听这个问题的任何替代方案。

回到这个方法,我的问题是,如何通过操纵杆方向(从紫色圆圈,所选目标投射)从投射的射线中获得最接近敌人?

【问题讨论】:

    标签: c# list unity3d


    【解决方案1】:

    你需要做的是计算每个敌人相对于你当前位置的角度。你可以通过计算得到这个:

    Math.Atan(localchildpos.x/localchildpos.y) * 180 / Math.PI

    针对每个本地目标。您还需要具有不同操纵杆方向的角度。在那个方向上“最近”的敌人将是角度最接近操纵杆方向的敌人(请记住,355 度的敌人距离操纵杆方向 0 度只有 5 度)。

    我怀疑这可能仍然无法让您获得您真正想要的行为。如果一个敌人距离很远但与操纵杆方向直接对齐,那么这个敌人将被选中而不是更近但只是略微偏离线的敌人。让他们知道是否是这种情况,我很乐意与您讨论解决方案。

    【讨论】:

    • 好主意,使用两个向量之间的三角角从未越过我的矿井。愿意改用这种方法,如果它更快的话。无论如何,我正在使用一个好人的解决方案,我想这是一种更直接的方法,使用叉积来查找距离。 float targetRayDist = Vector3.Cross (selectedTarget.TransformDirection(stickDirection), localTarget.transform.position - selectedTarget.position).sqrMagnitude;
    • 目前它比以前工作得更好。而我选择最接近的方法是使用棒方向的点积和目标来排除与棒方向相反的目标加上另一个使用仅返回小于 1 个单位的叉积的条件。所以只有靠近摇杆方向向量的目标才会出现在列表中。
    • 在条件之后,我在选择下一个目标之前按与所选目标的距离对过滤后的目标列表进行排序。这是为了确保在切换到使用新过滤列表选择下一个新目标之前选择最近的目标。我可以看到,当目标相距 1 个单位或更近时,我会遇到一些问题。因此对您的解决方案感到好奇和好奇,如果不是很想听听您的想法。
    • 本质上,我的方法是在距中心的距离和相对于操纵杆的角度之间进行权衡。浮动 targetProximity = 2.4 *(操纵杆和目标之间的角度)+ 3.7(到目标的距离)之类的东西。数字最少的目标获胜。你必须玩弄这些数字才能得到感觉正确的东西。点积方法类似,但较远的目标会优先于较近的目标(如果我记得 - 我的向量数学有点生疏)。
    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多