Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity C#-for循环:从一个对象转到下一个对象(移动)-卡在第一个对象上_C#_For Loop_Unity3d - Fatal编程技术网

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

Unity C#-for循环:从一个对象转到下一个对象(移动)-卡在第一个对象上,c#,for-loop,unity3d,C#,For Loop,Unity3d,我拥有的 球体向立方体移动的场景。有多个立方体。我想让它进入1个在视线范围内的立方体,当它到达立方体时,我想让它搜索下一个立方体。我知道这应该很容易,但我已经试着解决了好几个小时了 代码 WithinSight.cs using UnityEngine; using BehaviorDesigner.Runtime; using BehaviorDesigner.Runtime.Tasks; public class WithinSight : Conditional { publi

我拥有的

球体向立方体移动的场景。有多个立方体。我想让它进入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;
    }

}
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;

    }
}
使用UnityEngine;
使用BehaviorDesigner.Runtime;
使用BehaviorDesigner.Runtime.Tasks;
WithinSight的公共类:条件{
公众视野;
公共字符串targetTag;
上市公司股权转让目标;
私有转换[]可能获取;
public override void OnAwake(){
var targets=GameObject.FindGameObjectsWithTag(targetTag);
possibleTargets=新变换[targets.Length];
对于(int i=0;i
移动到.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;
    }

}
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;

    }
}
使用UnityEngine;
使用BehaviorDesigner.Runtime;
使用BehaviorDesigner.Runtime.Tasks;
公众阶级:行动{
公共浮动速度=0;
上市公司股权转让目标;
私人布尔·皮埃杰;
无效打印消息(字符串消息){
Debug.Log(消息);
}
void Start(){
pietje=假;
}
公共覆盖TaskStatus OnUpdate(){
if(向量3.SqrMagnitude(transform.position-target.Value.position)<0.1f&&!pietje){
PrintMessage(“找到了多维数据集”);
pietje=正确;
如果(皮埃杰){
打印消息(“搜索…”);
pietje=假;
}
返回任务状态。成功;
}
transform.position=Vector3.moveToward(transform.position、target.Value.position、speed*Time.deltaTime);
transform.LookAt(目标、值、位置);
返回任务状态。正在运行;
}
}

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

我认为错误是
WithinSight
类中的
OnUpdate()。当你返回时,它不会这样做
gameObject.tag=“untaged”

像这样更改行的顺序

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;
}
public override TaskStatus OnUpdate(){
for(int i=0;i

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

进行比较,有人知道可能的解决方案吗?此代码的原因是什么:
pietje=true;如果(pietje){…}
?您的代码对于您试图实现的目标来说似乎太复杂了:1。找到所有的目标对象,将它们保存在数组中(你得到了)。循环通过数组减去每对向量,直到找到最接近的3。使用Vector3.Lerp或Vector 3.MoveTo 4移动到该位置。确保此基本功能正常工作,然后添加所有附加功能,如查看目标等。是否有理由检查更新立方体和球之间的距离,而不是简单地检查两者之间的碰撞?我不知道这是否会解决上述问题,但这肯定是一个需要修复的错误。