【问题标题】:Player is stuttering when using StartCoroutine how can i fix it?播放器在使用 StartCoroutine 时出现口吃,我该如何解决?
【发布时间】: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 循环将在 startPatorlfalse 时运行。你应该在某处设置startPatorl。我不知道你在做什么,因此不知道在哪里做,但这就是问题所在。
  • @Programmer 我正在做的是在航点之间移动玩家。脚本是错误的(不是 startPatrol 整个脚本逻辑)?
  • 是的。光看就错了。它没有冻结的唯一原因是因为这是一个协程函数,并且您在 while 循环中有 yield return null;。没有它,它只会冻结你的游戏。除此之外,我不明白您的其余代码...您将waypoints 存储在patrolPoints 中,并且您想将播放器从patrolPoints[0] 移动到patrolPoints 的长度?
  • @Programmer 没错,这不是一个好的脚本。我应该使用并查看统一文档示例。一段时间以来,我想做的是玩家将在航路点之间行走。
  • 所以问题是:您的问题中的脚本中存储的航点在哪里?

标签: c# unity3d unityscript unity5


【解决方案1】:

我认为问题是你的协程循环太多,尝试改变这一行

yield return null;

这个:

yield return new WaitForEndOfFrame();

或者这个:

yield return new WaitForSeconds(1);

【讨论】:

    猜你喜欢
    • 2016-05-21
    • 2013-05-19
    • 2016-06-19
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多