【发布时间】: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 立方体和球之间的距离,而不是简单地检查两者之间的碰撞?