Unity C# - for循环:从一个对象转到下一个对象(移动) - 卡在第一个对象上

时间:2016-08-31 08:46:44

标签: 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;

    }
}

任何可以帮助我的人都会获得虚拟cookie! (嗯...)

1 个答案:

答案 0 :(得分:0)

我认为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;
}

我无法重现这种情况,但此代码不会返回到previuos多维数据集。如果你想要,你应该保存最后一个立方体的引用,球体移动并在OnUpdate()的{​​{1}}进行比较。