【问题标题】:Unity C# - for loop: go from one object to the next one (movement) - gets stuck on first objectUnity C# - for 循环:从一个对象到下一个对象(运动) - 卡在第一个对象上
【发布时间】:2017-01-07 18:19:49
【问题描述】:

我有什么

球体向立方体移动的场景。有多个立方体。我希望它到达视线内的 1 个立方体,当它到达立方体时,我希望它搜索下一个。我知道这应该很容易,但我已经尝试修复了几个小时。

代码

WithinSight.cs

using UnityEngine;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;

public class WithinSight : Conditional {

    public float fieldOfViewAngle;
    public string targetTag;
    public SharedTransform target;

    private Transform[] possibleTargets;

    public override void OnAwake() {
        var targets = GameObject.FindGameObjectsWithTag (targetTag);
        possibleTargets = new Transform[targets.Length];
        for (int i = 0; i < targets.Length; ++i) {
            possibleTargets [i] = targets [i].transform;
        }
    }


    public override TaskStatus OnUpdate() {
        for (int i = 0; i < possibleTargets.Length; ++i) {
            if (withinSight(possibleTargets [i], fieldOfViewAngle)) {
                target.Value = possibleTargets [i];
                return TaskStatus.Success;
                gameObject.tag = "Untagged";
            }
        }
        return TaskStatus.Failure;
    }



    public bool withinSight(Transform targetTransform, float fieldOfViewAngle) {
        Vector3 direction = targetTransform.position - transform.position;
        return Vector3.Angle(direction, transform.forward) < fieldOfViewAngle;
    }

}

MoveTowards.cs

using UnityEngine;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;

public class MoveTowards : Action {

    public float speed = 0;
    public SharedTransform target;
    private bool pietje;

    void PrintMessage (string message) {
        Debug.Log(message);
    }

    void Start() {
        pietje = false;
    }

    public override TaskStatus OnUpdate() {

        if (Vector3.SqrMagnitude (transform.position - target.Value.position) < 0.1f && !pietje) {
            PrintMessage ("Found the cube.");
            pietje = true;
            if (pietje) {
                PrintMessage ("Searching...");
                pietje = false;
            }
            return TaskStatus.Success;
        }

        transform.position = Vector3.MoveTowards (transform.position, target.Value.position, speed * Time.deltaTime);
        transform.LookAt (target.Value.position);
        return TaskStatus.Running;

    }
}

任何可以帮助我的人都会得到一个虚拟饼干! (嗯……)

【问题讨论】:

  • 有人知道可能的解决方案吗?
  • 这段代码是什么原因:pietje = true; if (pietje) {...}?
  • 你的代码对于你想要实现的目标来说似乎太复杂了:1. 找到所有目标对象,将它们保存在数组中(你明白了。) 2. 遍历数组减去每对向量直到找到最接近的位置,3. 使用 Vector3.Lerp 或 Vector 3.MoveTo 移动到该位置 4. 确保此基本功能正常工作,然后添加所有附加功能,例如查看目标等。
  • 您是否有理由检查 OnUpdate 立方体和球之间的距离,而不是简单地检查两者之间的碰撞?

标签: c# for-loop unity3d


【解决方案1】:

我认为错误是OnUpdate()WithinSight 类中。当您进行退货时,它永远不会这样做gameObject.tag = "Untagged";

像这样改变行的顺序。

public override TaskStatus OnUpdate() {
    for (int i = 0; i < possibleTargets.Length; ++i) {
        if (withinSight(possibleTargets [i], fieldOfViewAngle)) {
            target.Value = possibleTargets [i];
            gameObject.tag = "Untagged";
            return TaskStatus.Success;
        }
    }
    return TaskStatus.Failure;
}

我无法重现此场景,但此代码不会返回到之前的多维数据集。如果您希望保存球体移动到的最后一个立方体的引用,并在OnUpdate()WithinSight 中进行比较。

【讨论】:

  • 我不知道这是否会解决上述问题,但这绝对是一个需要修复的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
相关资源
最近更新 更多