Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么机器人会不停地绕着一个航路点转?我该如何修复这种行为?_C#_Unity3d - Fatal编程技术网

C# 为什么机器人会不停地绕着一个航路点转?我该如何修复这种行为?

C# 为什么机器人会不停地绕着一个航路点转?我该如何修复这种行为?,c#,unity3d,C#,Unity3d,在大多数情况下,机器人在各航路点之间移动良好,但有时机器人会不停地围绕一个航路点旋转。然后我需要停止比赛,重新开始 我试图站在机器人路径的中间移动玩家第一人,这可能是造成问题的原因吗?p> 我在楼梯上添加了一些航路点,让机器人在楼梯上上/下移动,然后在航路点之间移动了几圈后,他开始绕楼梯上的一个航路点旋转 机器人漂浮在空中。机器人有动画师、长方体碰撞器、刚体: 这是航路点的脚本: using System.Collections; using System.Collections.Generi

在大多数情况下,机器人在各航路点之间移动良好,但有时机器人会不停地围绕一个航路点旋转。然后我需要停止比赛,重新开始

我试图站在机器人路径的中间移动玩家第一人,这可能是造成问题的原因吗?p> 我在楼梯上添加了一些航路点,让机器人在楼梯上上/下移动,然后在航路点之间移动了几圈后,他开始绕楼梯上的一个航路点旋转

机器人漂浮在空中。机器人有动画师、长方体碰撞器、刚体:

这是航路点的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Waypoints : MonoBehaviour
{
    public GameObject objectToMove;
    public GameObject[] waypoints;
    public Transform target;
    public float moveSpeed = 1f;
    public float rotationSpeed = 1f;

    private Transform myTransform;
    private int targetsIndex = 0;
    private Vector3 originalPosition;

    // Use this for initialization
    void Start()
    {
        if (objectToMove == null)
        {
            myTransform = transform;
        }
        else
        {
            myTransform = objectToMove.transform;
        }

        originalPosition = myTransform.position;

        if (waypoints.Length == 0)
        {
            waypoints = GameObject.FindGameObjectsWithTag("Waypoint");
        }
    }

    // Update is called once per frame
    void Update()
    {
        WayPointsAI();
        DrawLinesInScene();
    }

    private void WayPointsAI()
    {
        if (targetsIndex == waypoints.Length)
            targetsIndex = 0;
        target = waypoints[targetsIndex].transform;
        float distance = Vector3.Distance(myTransform.position, target.transform.position);
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);

        //move towards the player
        myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
        if (distance < 0.3f)
            targetsIndex++;
    }

    void DrawLinesInScene()
    {
        // draw lines between each checkpoint //
        for (int i = 0; i < waypoints.Length - 1; i++)
        {
            Debug.DrawLine(waypoints[i].transform.position, waypoints[i + 1].transform.position, Color.blue);
        }

        // draw a line between the original transform start position 
        // and the current transform position //
        Debug.DrawLine(originalPosition, myTransform.position, Color.red);

        // draw a line between current transform position and the next waypoint target
        // each time reached a waypoint.
        if (target != null)
            Debug.DrawLine(target.transform.position, myTransform.position, Color.green);
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类航路点:单一行为
{
公共游戏对象对象;
公共游戏对象[]航路点;
公共转型目标;
公共浮动速度=1f;
公共浮子旋转速度=1f;
私有变换;
私有int targetsIndex=0;
私有向量3初始位置;
//用于初始化
void Start()
{
if(objectToMove==null)
{
myTransform=转换;
}
其他的
{
myTransform=objectToMove.transform;
}
原始位置=myTransform.position;
如果(航路点长度==0)
{
航路点=GameObject.FindGameObjectsSwithTag(“航路点”);
}
}
//每帧调用一次更新
无效更新()
{
航路点sai();
DrawLinesInScene();
}
专用void航路点sai()
{
if(targetsIndex==航路点长度)
targetsIndex=0;
目标=航路点[targetsIndex]。转换;
浮动距离=矢量3.距离(myTransform.position,target.transform.position);
myTransform.rotation=Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position-myTransform.position),rotationSpeed*Time.deltaTime);
//向玩家移动
myTransform.position+=myTransform.forward*moveSpeed*Time.deltaTime;
如果(距离<0.3f)
targetsIndex++;
}
无效DrawLinesInScene()
{
//在每个检查点之间画线//
对于(int i=0;i

<>我再次测试了它,我发现如果玩家不站在机器人路径的中间,它就不会发生。但是如果我站在机器人路径的中间,它会传递给我这个玩家,但之后它将开始在下一个路径点上做圆圈。 机器人必须在目标航路点“if(距离<0.3f)”的0.3f范围内,如果driod不在该距离范围内,则targetIndex不会增加

看起来,移动速度和旋转速度的组合太大了,机器人可以在距离目标0.3f的范围内飞行,因此它只能绕轨道飞行

尝试增加0.3f距离,您应该能够得到您想要的结果


增加旋转速度和/或降低移动速度也会有所帮助。

机器人必须位于目标航路点的0.3f范围内“如果(距离<0.3f)”,如果driod不在该距离范围内,则目标索引不会增加

看起来,移动速度和旋转速度的组合太大了,机器人可以在距离目标0.3f的范围内飞行,因此它只能绕轨道飞行

尝试增加0.3f距离,您应该能够得到您想要的结果


<>增加旋转速度和/或减少运动速度也会有帮助。

我现在又测试了它,我发现如果玩家不站在机器人路径的中间,它就不会发生。但是如果我站在机器人路径的中间,它会传递给我这个玩家,但之后它将开始在下一个路径点上做圆圈。我现在再次测试它,我发现如果玩家不是站在机器人路径的中间,它就不会发生。但是如果我站在机器人路径的中间,它会传递给我这个玩家,但接下来会开始在下一个路径点上做圆圈。好的,我改变了这个设置,这是个问题。但现在我发现,如果我的球员站在中间的路径上的机器人,当他正在移动时,他与我碰撞,球员,他不继续运动,因为他移动和卡在墙上,我好像把他推到一边。也许因为玩家我也有一个角色控制器和一个刚体,当机器人与我碰撞时,它会制造问题。不像navmesh特工,他不知道如何继续。有没有办法让机器人避免碰撞,并告诉他找到并继续在路径上移动?我不能使用navmesh代理,因为机器人在空中而不是在地板上。你的机器人逻辑非常简单,只需朝目标旋转并向前移动。让机器人很容易被困在物体后面。即使droid在空中,Navmesh代理仍然可以工作,但在某些情况下,例如上楼梯时,您可能必须手动控制垂直位置。你可以关闭碰撞,但我不认为这是你想要的效果,机器人会通过播放器,而不是绕过它。好的,我改变了这个设置,这是一个问题。但是现在我发现如果我是圣