【发布时间】:2016-07-31 20:43:16
【问题描述】:
不确定 StartCoroutine 是否会造成口吃。但是当禁用脚本而不在检查器中使用它时,使用脚本时口吃就消失了。
我正在使用附加到 ThirdPersonController 的航点脚本。 我还添加到 ThirdPersoncontroller Nav MesH Agent。
我在层次结构中还有两个球体作为导航窗口中的航路点,我勾选了复选框以使其成为静态导航,我也在飞机上进行了静态导航。
然后烤它。
在 Animator 窗口中,我使用 HumanoidWalk 创建了新状态 Walk 并设置为默认值,因此所有玩家在运行游戏时都会自动开始行走。
玩家在路点之间行走,但一切都结结巴巴。 如果我不使用脚本,玩家也可以正常行走,其他玩家我只有在使用脚本时才能正常行走。
这是航点脚本:
using UnityEngine;
using System.Collections;
public class Patrol : MonoBehaviour
{
public Transform[] patrolPoints;
private NavMeshAgent agent;
private int dest = 0;
// Use this for initialization
void Start()
{
agent = GetComponent<NavMeshAgent> ();
StartCoroutine (Patrolling ());
}
IEnumerator Patrolling()
{
bool startPatorl = false;
for (int i = 0; i < patrolPoints.Length; i++)
{
while (!startPatorl)
{
if (agent.remainingDistance < 2.5f)
{
i++;
dest = i;
}
if (i >= patrolPoints.Length)
{
i = 0;
dest = 0;
}
agent.destination = patrolPoints[dest].transform.position;
yield return null;
}
}
}
}
【问题讨论】:
-
您的程序将进入无限循环,因为在
Patrolling()函数中的任何地方,startPatorl从未设置为true。 while 循环将在startPatorl为false时运行。你应该在某处设置startPatorl。我不知道你在做什么,因此不知道在哪里做,但这就是问题所在。 -
@Programmer 我正在做的是在航点之间移动玩家。脚本是错误的(不是 startPatrol 整个脚本逻辑)?
-
是的。光看就错了。它没有冻结的唯一原因是因为这是一个协程函数,并且您在 while 循环中有
yield return null;。没有它,它只会冻结你的游戏。除此之外,我不明白您的其余代码...您将waypoints存储在patrolPoints中,并且您想将播放器从patrolPoints[0]移动到patrolPoints的长度? -
@Programmer 没错,这不是一个好的脚本。我应该使用并查看统一文档示例。一段时间以来,我想做的是玩家将在航路点之间行走。
-
所以问题是:您的问题中的脚本中存储的航点在哪里?
标签: c# unity3d unityscript unity5