Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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
Unity c#-无法在NavMesh上生成预设_C#_.net_Unity3d_Navmesh - Fatal编程技术网

Unity c#-无法在NavMesh上生成预设

Unity c#-无法在NavMesh上生成预设,c#,.net,unity3d,navmesh,C#,.net,Unity3d,Navmesh,我正在尝试制作一个僵尸波游戏,并且为我的敌人准备一个预制场。如果当我点击run时,预设在场景中,它们会连接到NavMesh并完美地跟踪玩家。我想做到这一点,但敌人是从一个空的游戏对象中产生的,所以我可以让海浪产生。我已经让它们产卵,但它们有错误 "SetDestination" can only be called on an active agent that has been placed on a NavMesh. UnityEngine.AI.NavMeshAgent

我正在尝试制作一个僵尸波游戏,并且为我的敌人准备一个预制场。如果当我点击run时,预设在场景中,它们会连接到NavMesh并完美地跟踪玩家。我想做到这一点,但敌人是从一个空的游戏对象中产生的,所以我可以让海浪产生。我已经让它们产卵,但它们有错误

"SetDestination" can only be called on an active agent that has been placed on a NavMesh.
UnityEngine.AI.NavMeshAgent:SetDestination(Vector3)
EnemyAI:Update() (at Assets/Scripts/EnemyAI.cs:25)
这是我的EnemyAI脚本

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

public class EnemyAI : MonoBehaviour
{
    public float lookRadius = 10f;

    Transform target;
    NavMeshAgent agent;
    public GameObject Player;
    
    void Start() 
    {
        agent = GetComponent<NavMeshAgent>();
    }
    // Update is called once per frame
    void Update()
    {
        float distance = Vector3.Distance(Player.transform.position, transform.position);
        
        if (distance <= lookRadius)
        {
            agent.SetDestination(Player.transform.position);
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.AI;
公共类EnemyAI:单一行为
{
公共浮动半径=10f;
转化目标;
NavMesh代理;
公共游戏对象玩家;
void Start()
{
agent=GetComponent();
}
//每帧调用一次更新
无效更新()
{
浮动距离=矢量3.距离(Player.transform.position,transform.position);

如果(距离某些原因,可能会发生这种情况:

  • 代理与任何navmesh都不在同一水平面上,即可能太高或太低。您希望它“靠近navmesh曲面”。在地板上使用光线投射来定位代理或添加刚体并将其从地板上放下。执行此操作后,可能需要禁用和启用代理
  • 自己移动变换,而不是使用函数。在这里,您可以检查模拟位置和实际位置是否同步
  • 损坏的navmesh,因此您可能需要重新烘焙它

  • 它本质上是想告诉你你的代理不在网格上,所以它找不到路径。试着在你放置代理的地方玩游戏。

    我记得不久前遇到过类似的问题,问题是我忘记在
    窗口>AI>导航中烘焙NavMesh
    。以防万一。

    我也遇到过同样的问题,而且我没有关于此问题,我们没有解释,但只有解决方法:

    在开始功能中,我添加了:

    navAgent = GetComponent<NavMeshAgent>();
    navAgent.enabled = false;
    
    // Invoke is used as a workaround for enabling NavMeshAgent on NavMeshSurface
    Invoke("EnableNavMeshAgent", 0.025f);
    

    如果我将调用延迟设置为小于0.025秒的值,错误将继续出现,但对于0.025,我只有两次调用延迟,之后的行为就是我想要的行为。

    让它在不使用代理的情况下生成多维数据集,并检查多维数据集是否正确显示在navmesh中,因为我猜它位于navmesh区域的下方,或者位于navmesh区域之外。是否烘焙了navmesh?@MarkDavies是的,我有一个烘焙网格,因为我可以在运行时在场景中已经存在的预设将起作用并跟踪玩家,所以烘焙网格可以工作。当我想在敌人的浪潮中繁殖时,预设被默认禁用了吗?当你设置目标时,你实例化的游戏对象是否启用了?当游戏对象在运行前就在那里,然后它就工作了,但是如果我在运行后生成它,它会给我错误提示,这是因为你需要在运行时重新生成它。NavMeshSurface将你生成的预制体视为一个全新的代理,所以它需要在设置新生成代理的目的地之前重新生成。这里有一个链接,介绍了如何重新生成预制体的多种方法祝你好运
    navAgent = GetComponent<NavMeshAgent>();
    navAgent.enabled = false;
    
    // Invoke is used as a workaround for enabling NavMeshAgent on NavMeshSurface
    Invoke("EnableNavMeshAgent", 0.025f);
    
    private void EnableNavMeshAgent ()
    {
        navAgent.enabled = true;
    }