Unity3d NavMeshAgent.isOnNavMesh 在特定功能中变为 false

2024-04-16

我更改了标题以反映添加的澄清信息。

我正在遵循 [Unity 教程][1],当需要测试播放器单击控件时,Unity 给出了一个错误:

“SetDestination”只能在已放置在导航网格上的活动代理上调用。

据我所知,我的代理处于活动状态并且位于 navMesh 上,因此这有点令人困惑。我尝试过重新烘焙 navMesh 并重新定位代理,但两者都不起作用。

到目前为止我发现的所有问题都表明提问者根本没有导航网格,所以......是的......不是很有帮助。任何有关如何解决此问题的建议都将受到赞赏。

EDIT:我刚刚添加了一个快速Debug.Log(agent.isOnNavMesh);我的代码&低&看它的评估结果是true。窥视混乱。

private void Start()
    {
        Debug.Log(agent.isOnNavMesh);       //Evaluates *true*
        agent.updateRotation = false;

        inputHoldWait = new WaitForSeconds(inputHoldDelay);

        destinationPosition = transform.position;
    }

EDIT-2放一样的Debug.Log(agent.isOnNavMesh);进入我的public void OnGroundClickfxn 且计算结果为false点击后。开始产生好奇的困惑。

这是由 Unity 事件系统调用的:

public void OnGroundClick(BaseEventData data)
{
    Debug.Log(agent.isOnNavMesh);       //Evaluates *FALSE*
    PointerEventData pData = (PointerEventData)data;
    NavMeshHit hit;

        //Click World Position, hit info, sample distance, navMesh areas to use
    if (NavMesh.SamplePosition(pData.pointerCurrentRaycast.worldPosition, out hit, navMeshSampleDistance, NavMesh.AllAreas))
    {
        destinationPosition = hit.position;
    }
    else
    {
        destinationPosition = pData.pointerCurrentRaycast.worldPosition;
    }

    //give the agent it's destination
    agent.SetDestination(destinationPosition);
    agent.isStopped = false;
}

EDIT-3 I put Debug.Log(agent.isOnNavMesh); in to private void Update(),它评估为true即使在 Click 调用之后也会继续这样做public void OnGroundClick.

在开始时禁用然后启用代理OnGroundClick不影响局势

尽管我仍然不知所措,但我至少更接近解决方案并且有更多信息“这不行,请帮忙!” now.

这是完整上下文中的代码:

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

public class PlayerMovement : MonoBehaviour
{
    public Animator animator;                               //Reference to animator
    public NavMeshAgent agent;                              //Reference to NavMeshAgent
    public float inputHoldDelay = 0.5f;                     //Delay player ability to control character while interacting with interactable object
    public float turnSpeedThreshold = 0.5f;                 //minimum speed before character will turn
    public float speedDampTime = 0.1f;                      //Character rate acceleration
    public float slowingSpeed = 0.175f;                     //Character rate of neg accel
    public float turnSmoothing = 15;                        //Character rotational speed


    private WaitForSeconds inputHoldWait;                   //Coroutine Wait timer to delay player input while interacting with interactable object
    private Vector3 destinationPosition;                    //Player designated destination for the agent to pursue


    private const float stopDistanceProportion = 0.1f;
    private const float navMeshSampleDistance = 4f;


    private readonly int hashSpeedParam = Animator.StringToHash("Speed");


    private void Start()
    {
        Debug.Log(agent.gameObject.name);   //Is the "Player" object
        Debug.Log(agent.isOnNavMesh);       //Evaluates *true*
        agent.updateRotation = false;

        inputHoldWait = new WaitForSeconds(inputHoldDelay);

        destinationPosition = transform.position;
    }


    private void OnAnimatorMove()
    {
        //Velocity = Distance over Time, where Distance = change in position between frames & Time = time between frames
        agent.velocity = animator.deltaPosition / Time.deltaTime;
    }


    private void Update()
    {
        Debug.Log(agent.isOnNavMesh);       //Evaluates *true*
        //If path pending, do nothing
        if (agent.pathPending)
            return;

        float speed = agent.desiredVelocity.magnitude;

        if (agent.remainingDistance <= agent.stoppingDistance * stopDistanceProportion)
        {
            Stopping(out speed);
        }
        else if (agent.remainingDistance <= agent.stoppingDistance)
        {
            Slowing(agent.remainingDistance, out speed);
        }
        else if(speed > turnSpeedThreshold)
        {
            Moving();
        }

        animator.SetFloat(hashSpeedParam, speed, speedDampTime, Time.deltaTime);
    }


    private void Stopping(out float speed)
    {
        agent.isStopped = true;
        transform.position = destinationPosition;
        speed = 0.0f;
    }


    private void Slowing(float distanceToDestination, out float speed)
    {
        agent.isStopped = true;
        transform.position = Vector3.MoveTowards(transform.position, destinationPosition, slowingSpeed * Time.deltaTime);

        float proportionalDistance = 1f - distanceToDestination / agent.stoppingDistance;
        speed = Mathf.Lerp(slowingSpeed, 0, proportionalDistance);
    }


    private void Moving()
    {
        Quaternion targetRotation = Quaternion.LookRotation(agent.desiredVelocity);
        transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, turnSmoothing * Time.deltaTime);
    }


    public void OnGroundClick(BaseEventData data)
    {
        agent.enabled = false;              //Disabling then enabling the agent...
        agent.enabled = true;               //does not change anything.

        Debug.Log(agent.gameObject.name);   //Is the "Player" object
        Debug.Log(agent.isOnNavMesh);       //Evaluates *FALSE*

        PointerEventData pData = (PointerEventData)data;
        NavMeshHit hit;

            //Click World Position, hit info, sample distance, navMesh areas to use
        if (NavMesh.SamplePosition(pData.pointerCurrentRaycast.worldPosition, out hit, navMeshSampleDistance, NavMesh.AllAreas))
        {
            destinationPosition = hit.position;
        }
        else
        {
            destinationPosition = pData.pointerCurrentRaycast.worldPosition;
        }

        //give the agent it's destination
        agent.SetDestination(destinationPosition);
        agent.isStopped = false;
    }
}

您有两个实例PlayerMovement组件引用代理的两个不同实例!

一个实例就是一个agent.isOnNavMesh is true并正常工作在Start and Update。另一个实例指的是不同的agent where agent.isOnNavMesh is false但这是一个OnGroundclick正在被呼叫。

我们可以说因为GetInstanceID()返回不同的值Update vs. OnGroundClick.

这里的解决方案是确保OnGroundClick事件系统中注册的事件是正确实例中的事件PlayerMovement!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity3d NavMeshAgent.isOnNavMesh 在特定功能中变为 false 的相关文章

  • 在 Unity 3D 中使用触摸输入在地形上移动相机

    我是 Unity 新手 我正在尝试弄清楚如何使用触摸输入在地图 地形上移动相机 摄像机将以 90 0 0 的旋转角度俯视地形 地形位于第 8 层 我用键盘移动它没有问题 现在我尝试移动到触摸 如果你想在 iOS 上保持预期的使用情况 那就非
  • 游戏对象出现在场景视图中但不在游戏视图中

    似乎我在这里遗漏了一些东西 使用最新版本的统一 并且我在单击时实例化了一个游戏对象 它在场景视图中看起来很好 但在游戏视图中却不是 我已经用谷歌搜索并尝试了所有这些回复 我检查了屏幕右上角的图层 它们都显示了 而且 z 值也低于相机的值 但
  • 具有枚举功能的 Unity UI Onclick 检查器

    我有个问题 这是我的检查器窗口 在 On Click 窗口的情况下 我想设置枚举类型的参数 不是字符串或整数 换句话说 我想用 无效GoToNext DATA TYPE类型 但这并没有显示出来 即使我将枚举设置为 SerializedFie
  • 未找到 void com.unity3d.player.UnityPlayer.nativeRestartActivityIndi​​cator() 的实现

    我是 Unity 新手 我正在尝试将 Unity 游戏 它有 ARcore 集成到本机 Android 应用程序中 我可以在新的 HelloWorld 应用程序中启动 unity 但无法在我的真实应用程序 具有其他模块 中启动 注意 当我从
  • UnityARAlignment 在 Unity ARKit 插件中意味着什么?

    UnityAR对齐 https i stack imgur com uwCOI png public enum UnityARAlignment UnityARAlignmentGravity UnityARAlignmentGravity
  • Unity项目没有解决方案文件

    我刚刚开始学习 Unity 并且创建了一个项目 但我的项目中没有包含 sln 文件 每次我创建 C 脚本并在 Xamarin Studio 中打开它时 我都无法获得任何智能感知 unity项目中没有sln文件正常吗 如果没有 如何将解决方案
  • 使用 Unity 3D 移动鼠标时相机跟随玩家

    我有一个简单的脚本 当我转动相机时 可以移动和环顾四周 但相机不随角色转动 我如何让它们一起转动 using System Collections Generic using UnityEngine public class PlayerF
  • 移动 Rigidbody 游戏对象的正确方法

    我刚刚开始学习Unity 我尝试使用此脚本进行简单的盒子移动 前提是 每当有人按下 w 时 盒子就会向前移动 public class PlayerMover MonoBehaviour public float speed private
  • 在 Unity 中双向旋转门

    我在 Unity 中创建了一扇打开和关闭的门 我可以通过打电话打开那扇门Interact 现在我想创建一扇始终远离玩家打开的门 就像酒吧的门一样 如果玩家在房间前面 门就会旋转到房间 如果玩家在房间里 门就会旋转出去 目前我创建了一个布尔值
  • 统一使用单例的最佳方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道哪种是使用单例实例的正确方法 当我创建一个名为 Manager 的单例类并且它包含一个名为 value 的 int 变量并且我有另一个名
  • Total Blank Unity / Microsoft Store Build 未通过 WACK 测试

    我一直在努力为我的游戏取得成功统一 2018 2 1f1 and 视觉工作室 2017 15 8 0 尝试为 Windows 商店成功构建 打包 WACK 失败后所有 每个不同的配置 我尝试了完全空白默认Unity UWP平台应用程序 生成
  • 如何将字节数组转换为任何类型

    好的 我看到有人问如何将字节数组转换为int string Stream等等 答案各不相同 我个人还没有找到任何令人满意的答案 这里有一些我们想要将字节数组转换成的类型 UnityEngine Font可以吸收ttf data UnityE
  • 如何让一个不可见的透明按钮起作用?

    查看 Unity 论坛和问答网站中的一些答案 如何制作隐形按钮的答案不起作用 因为删除与按钮关联的图像会使其不起作用 如何解决这个问题并保持不可见属性 同时允许按钮实际工作 这是 Unity 的怪异之处之一 100 的现实世界项目都需要这个
  • 如何在Unity中使用MediaCapture类访问相机预览帧?

    我正在尝试在 Unity 应用程序的脚本中访问 Hololens 的相机预览帧 但遇到一些问题 我想使用 MediaCapture 类访问相机预览 我知道它可以在 UWP 应用程序中实现 但我想在 Unity 中实现 在 UWP 应用程序中
  • Unity3D:在 AA 解析后绘制粒子以提高性能

    我正在尝试评估 MSAA 对 Unity 中含有大量粒子的场景的影响 为此 我需要 使用 8x MSAA 绘制场景中的所有非粒子对象 使用上一个通道中解析的深度缓冲区来渲染所有 将非遮挡粒子系统转移到较小的渲染目标上 将 2 的颜色缓冲区与
  • 与动态功能模块(应用程序包)一起安装时“存储空间不足”

    我有一个使用 Android App Bundle 的 DFM 动态安装的 Unity 项目 使用 Unity 2019 3 导出 并将其上传到 google play 进行内部测试 动态模块可以按需下载 但是当我运行 UnityActiv
  • 创建对话框/弹出窗口

    有这样的代码 bool b EditorUtility DisplayDialog Test Reset or continue Reset Continue if b ResetGame 但它仅在编辑器中有效 在游戏中无效 如何将 Edi
  • UV 展开运行时优化

    我正在尝试在运行时创建 UV 我使用 BOX 类型 UV 类似于 3ds max 中的 BOX UVW 并基于面方向进行计算 我知道将其创建为运行时不是一个好的选择 但我别无选择 它是在计算后保存的 所以我做了一次 但我花了 40 秒处理
  • foreach 循环为 Unity 中的按钮赋值时出现问题

    我正在尝试在 Unity 中为我的游戏制作一个类似 Candy Crush 的地图 我正在尝试将所有按钮收集到一个数组中 然后设置其 onclick 属性 这样当我单击它们时 我就可以达到我想要的级别 我正在使用 Foreach 循环来实现
  • 在我的 Unity 应用程序中检测来电

    我试图让我的游戏在接到电话时暂停 我想知道我使用的任何函数是否可以做到这一点 我在我的源代码中使用了它们 但它们都不起作用 void OnApplicationPause bool paused if paused true if isPa

随机推荐

  • FROM 子句中的 PostgreSQL json_array_elements - 为什么这不是笛卡尔连接?

    如果我有这样的表达 SELECT t json column gt gt x nested gt gt y FROM my table t json array elements t gt nested nested 为什么我不需要加入 更
  • 如何在mysql中启用INNODB

    当我在 MySQL 中执行查询时 它返回一个错误 指出 InnoDB 未启用 当我点击存储引擎时 InnoDB被禁用 如何启用 InnoDB 您需要在中启用它my cnf文件 然后重新启动服务器 http dev mysql com doc
  • 使用||在开关的情况下?

    因此 对于 Java 基础知识的大学实验室来说 我遇到了麻烦 我必须设置一个开关 并在该开关内放置一个盒子 有3个选项供用户输入 每个选项都可以用字母来回答 问题是这个字母允许是大写或小写 问题是我似乎不知道如何设置它 所以一个案例将允许其
  • Greasemonkey 脚本中的 XPath 未在 XHTML 页面上选择正确的节点

    我正在为 Greasemonkey 编写脚本微博网 我无法在 XHTML 页面上使用 XPath 选择元素 此代码无法获取我想要的元素 function resolver prefix return prefix x http www w3
  • iOS 11 - 键盘高度在键盘通知中返回 0

    我一直在使用键盘通知 没有任何问题 并且获得了键盘的准确高度 void keyboardDidShow NSNotification notification CGSize keyboardSize notification userInf
  • 删除 data.table 的分组变量

    我想用data table进行一些争论并希望我的结果数据表not包括分组变量 这是一个 MWE library data table DT lt data table x 1 10 grp rep 1 2 5 DT mmm mean x b
  • 使用 Robolectric 运行 Android 测试 - 依赖错误

    我使用的是 Android Studio 1 2 和 Windows 7 当按照此运行机器人电测试时example https github com nenick AndroidStudioAndRobolectric blob maste
  • 如何从 Objective-C 代码将文件保存到 $(PROJECT_DIR)?

    我有生成资源的代码 我想将其保存在 PROJECT DIR 的子目录中 如何在代码中从该环境变量获取真实路径 打开项目构建设置并添加SAVEPATH PROJECT DIR 到预处理器宏 然后你可以像这样获取项目目录 NSString pr
  • Android Studio中TextView和Button卡在蓝图的左上角

    当我在 Android Studio 中将 TextView 和 Button 添加到蓝图时 它会卡在蓝图的左上角 我遇到了同样的问题 单击 自动连接到父级 按钮 图标看起来像字母 U 磁铁符号 它位于设计视图的左上角
  • 执行查询并返回结果的方法

    应用程序无法运行 尝试执行查询来打印特定值 Method public Cursor trying String vg String q SELECT quantity FROM TABLE CONTACTS WHERE name vg S
  • 匈牙利算法的最少行数

    我想知道匈牙利算法覆盖所有零的最少行数 我已经关注了这个链接 但是那里的代码是一个贪婪的代码 匈牙利算法 如何用最少的行数覆盖0个元素 https stackoverflow com questions 14795111 hungarian
  • 什么是更好的? Password_hash 与 SHA256 与 SHA1 与 md5

    搭配什么比较好salt用于密码存储 MD5 hash md5 password salt 密码 哈希 hash password hash password PASSWORD DEFAULT salt SHA1 result sha1 sa
  • Oracle SQL 案例中的数字无效

    您好 我在处理 SQL 案例时遇到了麻烦 问题是我尝试运行具有 7 个不同列的案例 这些列可以具有不同类型的数据 字符串 日期 数字 具体取决于 id 这意味着在某些 id 下 列中的行将是字符串 而在其他 id 下 列中的行将是数字 我意
  • 纯ASP上传带图片检测

    如何将文件从浏览器上传到运行经典 ASP 的服务器并检测服务器端文件是否是有效图片 对于有效的图片 如何获取其尺寸 通常经典ASP中的文件上传是由第三方组件完成的 这些组件带有DLL文件 需要在服务器上注册 有时还需要花钱 不用说 出于安全
  • Spring Boot加载图片后上传

    我能够将图像上传到服务器 并且可以在路径中找到我的图像 static images gallery 现在 当我尝试加载上传的图像时 应用程序不显示主题 仅在应用程序重新启动后 我遇到了同样的问题 因为启动时加载了静态目录 上传路径一定要放在
  • 当mysql WHERE子句为空时,返回所有行

    randomvariable GET randomvariable search SELECT from objects WHERE transactiontype randomvariable order by id DESC Now i
  • 在asp.net mvc中动态添加文本框并将值保存到数据库

    我想通过单击添加按钮动态添加文本框 可以删除文本框 最后可以保存文本框中的列表值 我的模特班 public class CustModel public List
  • 使用 ASP.New MVC 4 Web Api 进行授权过滤器依赖注入

    我正在尝试在 MVC 4 Web Api 授权过滤器上实现依赖项注入 我创建了一个继承自 ActionDescriptorFilterProvider 的 FilterProvider public class UnityWebApiFil
  • jQuery validate:如何添加正则表达式验证规则?

    我正在使用jQuery http en wikipedia org wiki JQuery验证插件 好东西 我想迁移现有的 ASP NET 解决方案以使用 jQuery 而不是 ASP NET 验证器 我缺少替代品正则表达式验证器 我希望能
  • Unity3d NavMeshAgent.isOnNavMesh 在特定功能中变为 false

    我更改了标题以反映添加的澄清信息 我正在遵循 Unity 教程 1 当需要测试播放器单击控件时 Unity 给出了一个错误 SetDestination 只能在已放置在导航网格上的活动代理上调用 据我所知 我的代理处于活动状态并且位于 na