我有什么
球体向立方体移动的场景。有多个立方体。我希望它到达视线范围内的 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;
}
我无法重现这种情况,但这段代码不会返回到以前的多维数据集。如果您希望保存球体移动的最后一个立方体的引用,并在 WithinSight
的 OnUpdate()
中进行比较。
关于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/