Unity C#-for循环:从一个对象转到下一个对象(移动)-卡在第一个对象上
我拥有的 球体向立方体移动的场景。有多个立方体。我想让它进入1个在视线范围内的立方体,当它到达立方体时,我想让它搜索下一个立方体。我知道这应该很容易,但我已经试着解决了好几个小时了 代码 WithinSight.csUnity 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
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移动到该位置。确保此基本功能正常工作,然后添加所有附加功能,如查看目标等。是否有理由检查更新立方体和球之间的距离,而不是简单地检查两者之间的碰撞?我不知道这是否会解决上述问题,但这肯定是一个需要修复的错误。