MoveTowards 无法正常工作
MoveTowards not working properly
我想从数组中移动到每个对象,我的意思是先移动到 [0],然后移动到 [1],依此类推。我在动画方面遇到问题。
function exit( path : Array){
var node : Node;
var go : GameObject;
for(var i=1 ; i < path.length ; i++){
node = path[i] as Node;
go = node.getContent() as GameObject;
nodeS.getContent().transform.position = Vector3.MoveTowards(nodeS.getContent().transform.position, go.transform.position ,1);
}
}
我在 Update()
中调用了退出函数。结果,我的动作很奇怪,我知道问题出在 for 循环和 Update 函数之间。
你得到了奇怪的动作,因为在每个 Update()
(你的 exit()
的每次调用)中,你遍历了 path
和 [=43= 中的所有节点]向他们迈出一步。因为Vector3.MoveTowards只计算从current到target的下一步移动。你的步长是“1”(Vector3.MoveTowards()
的第三个参数)
所以基本上,在每个 Update()
中,都会发生这种情况:
- 向
path
的第一个节点靠近 1 个单元
- 向
path
的第二个节点移动1个单元
- 向
path
的第三个节点移动1个单元
- 等等
所以,我会这样做:
function exit(path : Array) {
var node : Node;
var go : GameObject;
node = path[CurrentNodeIndex] as Node;
go : GameObject = node.getContent() as GameObject;
if (!Mathf.Approximately(
Vector3.Distance(nodeS.getContent().transform.position, go.transform.position),
0
)) {
nodeS.getContent().transform.position = Vector3.MoveTowards(nodeS.getContent().transform.position, go.transform.position, 1);
} else {
CurrentNodeIndex++;
Debug.Log("Starting to move towards next node: " + CurrentNodeIndex);
if (CurrentNodeIndex >= path.length) {
Debug.Log("The final node was reached!");
return;
}
}
}
这是做什么的:
- 从
path
中获取第一个节点(CurrentNodeIndex
开头为1)
- 如果当前节点与nodeS之间的距离(使用
Vector3.Distance
)不近似为0(使用Mathf.Approximately
),向节点靠近一步(使用Vector3.MoveTowards
)
- 每次更新都会调用这个,直到两个节点之间的距离大约为0。然后
CurrentNodeIndex
增加。
- 在下一次更新中,select 来自
path
的下一个节点并重复该过程 - 开始向它移动
- 当到达
path
的最后一个节点时,只是 return。您还可以有一些全局私有 bool 标志来指示这一点并优化
编译错误请见谅;我不使用Unityscript,而是使用C#,现在没有办法测试它。
顺便说一句,你从 path
开始用索引 1 而不是 0 做笔记有什么原因吗?如果您打算从 path
的实际第一个节点开始,请将 CurrentNodeIndex
初始化为 0 而不是 1。
我想从数组中移动到每个对象,我的意思是先移动到 [0],然后移动到 [1],依此类推。我在动画方面遇到问题。
function exit( path : Array){
var node : Node;
var go : GameObject;
for(var i=1 ; i < path.length ; i++){
node = path[i] as Node;
go = node.getContent() as GameObject;
nodeS.getContent().transform.position = Vector3.MoveTowards(nodeS.getContent().transform.position, go.transform.position ,1);
}
}
我在 Update()
中调用了退出函数。结果,我的动作很奇怪,我知道问题出在 for 循环和 Update 函数之间。
你得到了奇怪的动作,因为在每个 Update()
(你的 exit()
的每次调用)中,你遍历了 path
和 [=43= 中的所有节点]向他们迈出一步。因为Vector3.MoveTowards只计算从current到target的下一步移动。你的步长是“1”(Vector3.MoveTowards()
的第三个参数)
所以基本上,在每个 Update()
中,都会发生这种情况:
- 向
path
的第一个节点靠近 1 个单元
- 向
path
的第二个节点移动1个单元 - 向
path
的第三个节点移动1个单元 - 等等
所以,我会这样做:
function exit(path : Array) {
var node : Node;
var go : GameObject;
node = path[CurrentNodeIndex] as Node;
go : GameObject = node.getContent() as GameObject;
if (!Mathf.Approximately(
Vector3.Distance(nodeS.getContent().transform.position, go.transform.position),
0
)) {
nodeS.getContent().transform.position = Vector3.MoveTowards(nodeS.getContent().transform.position, go.transform.position, 1);
} else {
CurrentNodeIndex++;
Debug.Log("Starting to move towards next node: " + CurrentNodeIndex);
if (CurrentNodeIndex >= path.length) {
Debug.Log("The final node was reached!");
return;
}
}
}
这是做什么的:
- 从
path
中获取第一个节点(CurrentNodeIndex
开头为1) - 如果当前节点与nodeS之间的距离(使用
Vector3.Distance
)不近似为0(使用Mathf.Approximately
),向节点靠近一步(使用Vector3.MoveTowards
) - 每次更新都会调用这个,直到两个节点之间的距离大约为0。然后
CurrentNodeIndex
增加。 - 在下一次更新中,select 来自
path
的下一个节点并重复该过程 - 开始向它移动 - 当到达
path
的最后一个节点时,只是 return。您还可以有一些全局私有 bool 标志来指示这一点并优化
编译错误请见谅;我不使用Unityscript,而是使用C#,现在没有办法测试它。
顺便说一句,你从 path
开始用索引 1 而不是 0 做笔记有什么原因吗?如果您打算从 path
的实际第一个节点开始,请将 CurrentNodeIndex
初始化为 0 而不是 1。