c# - Unity C# - for 循环 : go from one object to the next one (movement) - gets stuck on first object

标签 c# for-loop unity3d

我有什么

球体向立方体移动的场景。有多个立方体。我希望它到达视线范围内的 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;

    }
}

任何能帮助我的人都会得到一个虚拟 cookies ! (嗯……)

最佳答案

我认为错误是 WithinSight 类中的 OnUpdate()。当你返回时,它永远不会这样做 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;
}

我无法重现这种情况,但这段代码不会返回到以前的多维数据集。如果您希望保存球体移动的最后一个立方体的引用,并在 WithinSightOnUpdate() 中进行比较。

关于c# - Unity C# - for 循环 : go from one object to the next one (movement) - gets stuck on first object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39244859/

相关文章:

ios - 在 NSArray 2 中搜索 NSArray 1 以获取值匹配元素的最佳方法

c# - 让玩家根据摄像机角度向前、向右、向左和向后移动

c# - Expression Blend 与 Visual Studio

c# - 通过 Windows 窗体输入空值并将值插入数据库

java - 如何在java中延迟循环点数组?

bash - 将 sed 放入 "for cycle"

c# - 命名空间中不存在 Unity 5.3.3 UI

c# - 如何在 C# 的 Unity3D 中从 Steamworks API 获取 steamID?

c# - 对多种 Material 应用不同的纹理(Unity3D)

c# - 为什么网站显示一个页面只能有一个服务器端Form标签