Unity(四十七):寻路网格-内置组件实现自动寻路避障

这篇具有很好参考价值的文章主要介绍了Unity(四十七):寻路网格-内置组件实现自动寻路避障。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

自动避障寻路

unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格

配置寻路区域 Navigation Static

配置静态游戏对象 Navigation Static

unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格

导航网格生成 Navigation

Navigation 窗口进行烘焙(菜单:Window > AI > Navigation)中进行处理的

unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格

自动寻路并绘制路线 Nav Mesh AgentNavMeshPath

属性 功能
Agent Size
Radius 代理的半径,用于计算障碍物与其他代理之间的碰撞
Height 代理通过头顶障碍物时所需的高度间隙
Base offset 碰撞圆柱体相对于变换轴心点的偏移
Steering
Speed 最大移动速度(以世界单位/秒表示)
Angular Speed 最大旋转速度(度/秒)
Acceleration 最大加速度(以世界单位/平方秒表示)
Stopping distance 当靠近目标位置的距离达到此值时,代理将停止
Auto Braking 启用此属性后,代理在到达目标时将减速。对于巡逻等行为(这种情况下,代理应在多个点之间平滑移动)应禁用此属性
Obstacle Avoidance
Quality 障碍躲避质量。如果拥有大量代理,则可以通过降低障碍躲避质量来节省 CPU 时间。如果将躲避设置为无,则只会解析碰撞,而不会尝试主动躲避其他代理和障碍物
Priority 执行避障时,此代理将忽略优先级较低的代理。该值应在 0–99 范围内,其中较低的数字表示较高的优先级
Path Finding
Auto Traverse OffMesh Link 设置为 true 可自动遍历网格外链接 (Off-Mesh Link)。如果要使用动画或某种特定方式遍历网格外链接,则应关闭此功能
Auto Repath 启用此属性后,代理将在到达部分路径末尾时尝试再次寻路。当没有到达目标的路径时,将生成一条部分路径通向与目标最近的可达位置
Area Mask Area Mask 描述了代理在寻路时将考虑的区域类型。在准备网格进行导航网格烘焙时,可设置每个网格区域类型。例如,可将楼梯标记为特殊区域类型,并禁止某些角色类型使用楼梯

unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格

using UnityEngine;
using UnityEngine.AI;

public class Player : MonoBehaviour
{
    // 导航网格代理
    private NavMeshAgent navMeshAgent;
    // 导航系统计算的路径
    private NavMeshPath navMeshPath = null;

    private void Start()
    {
        navMeshAgent = GetComponent<NavMeshAgent>();
        navMeshPath = new NavMeshPath();
    }

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            // 穿透所有Mesh
            RaycastHit[] hits = Physics.RaycastAll(ray);
            foreach (RaycastHit hit in hits)
            {
                // 计算路径
                NavMesh.CalculatePath(transform.position, hit.point, NavMesh.AllAreas, navMeshPath);
                // 移动角色
                navMeshAgent.SetDestination(hit.point);
            }
        }
        // 绘制路径
        for (int i = 0; i < navMeshPath.corners.Length - 1; i++)
        {
            Debug.DrawLine(navMeshPath.corners[i], navMeshPath.corners[i + 1], Color.red);
        }
    }

}

连接两点 Off Mesh Link

解决角色在多个平台间的自动寻路问题

属性 功能
Start 描述网格外链接起始位置的对象
End 描述网格外链接起始位置的对象
Cost Override 如果值为正,则在计算处理路径请求的路径成本时使用该值。否则,使用默认成本(此游戏对象所属区域的成本)。如果 Cost Override 设置为值 3.0,则在网格外链接上移动的成本将是在默认导航网格区域上移动相同距离的成本的三倍。如果希望让代理通常优先选择步行,但当步行距离明显更长时使用网格外链接,则 Cost Override 设置将变得有用
Bi-Directional 如果启用此属性,则可以在任一方向上遍历链接。否则,只能按照从 Start 到 End 的方向遍历链接
Activated 指定寻路器 (pathfinder) 是否将使用此链接(如果将此属性设置为 false,则将忽略它)
Auto Update Positions 如果启用此属性,当端点移动时,网格外链接将重新连接到导航网格。如果禁用,即使移动了端点,链接也将保持在其起始位置
Navigation Area 描述链接的导航区域类型。该区域类型允许您对相似区域类型应用常见的遍历成本,并防止某些角色根据代理的区域遮罩 (Area Mask) 访问网格外链接

unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格

动态阻挡 Nav Mesh Obstacle

Nav Mesh Obstacle

属性 描述
Shape 障碍物几何体的形状。选择最适合对象形状的选项
Box - Center 盒体的中心(相对于变换位置)
Box - Size 盒体的大小
Capsule - Center 胶囊体的中心(相对于变换位置)
Capsule - Radius 胶囊体的半径
Capsule - Height 胶囊体的高度
Carve 勾选 Carve 复选框后,导航网格障碍物会在导航网格中创建一个孔
Move Threshold 当导航网格障碍物的移动距离超过 Move Threshold 设置的值时,Unity 会将其视为移动状态。使用此属性可设置该阈值距离来更新移动的雕孔
Time To Stationary 将障碍物视为静止状态所需等候的时间(以秒为单位)
Carve Only Stationary 启用此属性后,只有在静止状态时才会雕刻障碍物。请参阅下面的移动的导航网格障碍物的逻辑以了解更多信息

unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格

using UnityEngine;

public class DynamicObstacle : MonoBehaviour
{
    public Transform pointA;
    public Transform pointB;

    public float duration = 3;  // 时间

    public float pingPong;

    private void FixedUpdate()
    {
        // PingPong 返回一个值,该值将在值 0 与 length 之间递增和递减
        pingPong = Mathf.PingPong(Time.fixedTime, duration);
        // 在两个点之间进行线性插值
        transform.position = Vector3.Lerp(pointA.position, pointB.position, pingPong);
    }
}

导出寻路网格信息

绘制可视化的寻路网格信息

注意:脚本需要绑定到地面对象上

unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格

导出寻路网格信息
unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格
unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格
unity自动寻路躲避障碍,Unity,unity,游戏引擎,c#,寻路避障,寻路网格文章来源地址https://www.toymoban.com/news/detail-791699.html

using System.IO;
using System.Text;
using UnityEngine;
using UnityEngine.AI;

public class TerrainMeshData : MonoBehaviour
{
    private void OnDrawGizmos()
    {
        // NavMesh.CalculateTriangulation 计算当前导航网格的三角形剖分
        // NavMesh.CalculateTriangulation().indices 导航网格三角形剖分的三角形索引(包含每个三角形的 3 个整数。这些整数指的是顶点数组)
        if (NavMesh.CalculateTriangulation().indices.Length > 0)
        {
            Vector3 size = GetComponent<Terrain>().terrainData.size;
            float width = size.x;
            float height = size.y;
            float length = size.z;
            Gizmos.color = Color.yellow;
            Vector3 ponit01 = transform.position + new Vector3(0, 0, length);
            Vector3 ponit02 = transform.position + new Vector3(width, 0, length);
            Vector3 ponit03 = transform.position + new Vector3(width, 0, 0);
            Vector3 ponit04 = transform.position;
            Gizmos.DrawSphere(ponit01, 0.3f);
            Gizmos.DrawSphere(ponit02, 0.3f);
            Gizmos.DrawSphere(ponit03, 0.3f);
            Gizmos.DrawSphere(ponit04, 0.3f);

            // 获取当前游戏对象的名称作为文件名
            string fileName = transform.name;
            // 配置文件存储路径
            string filePath = Path.ChangeExtension(Path.Combine(Application.dataPath, fileName), "txt");
            // 如果文件存在,则删除文件
            if (File.Exists(filePath)) File.Delete(filePath);
            // 写入的基础信息
            StringBuilder sb = new StringBuilder();
            sb.Append($"name={fileName}\n")
                .Append($"size={size}\n")
                .Append("data={\n");

            // 遍历长宽
            for (int i = 0; i <= length; i++)
            {
                sb.Append("\t{");
                for (int j = 0; j <= width; j++)
                {
                    // 每个单元点的位置
                    Vector3 pos = transform.position + new Vector3(j, 0, i);
                    Gizmos.DrawCube(pos, Vector3.one * 0.2f);
                    // 导航网格查询的结果信息
                    NavMeshHit hit;
                    Color color = Color.red;
                    // #障碍物 -正常区域
                    string str = "#";
                    // SamplePosition	在指定范围内找到导航网格上最近的点
                    // NavMesh.AllAreas 包含所有导航网格区域的区域遮罩常量
                    if (NavMesh.SamplePosition(pos, out hit, 0.1f, NavMesh.AllAreas))
                    {
                        color = Color.green;
                        str = "-";
                    }
                    sb.Append($"{str},");
                    // 绘制向上的射线
                    Debug.DrawRay(pos, Vector3.up * 2, color);
                }
                sb.Append("},").AppendLine();
            }
            sb.Append("}").AppendLine();

            Gizmos.DrawLine(ponit01, ponit02);
            Gizmos.DrawLine(ponit02, ponit03);
            Gizmos.DrawLine(ponit03, ponit04);
            Gizmos.DrawLine(ponit04, ponit01);

            File.WriteAllText(filePath, sb.ToString());
        }
    }
}

到了这里,关于Unity(四十七):寻路网格-内置组件实现自动寻路避障的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity2d】2DNavMesh自动寻路实现

            在u3d中,系统自带了NavMesh组件,能够极其方便的实现自动寻路,新版的NavMesh并没有随着Unity的更新添加进引擎功能中,在2d项目中,我们想要实现NavMesh自动寻路还需要下载新的组件。这里提供网址:GitHub - h8man/NavMeshPlus: Unity NavMesh 2D Pathfinding         要在小伙

    2024年02月14日
    浏览(44)
  • Unity AI Navigation自动寻路

    Unity是一款强大的游戏开发引擎,而人工智能(AI)导航是游戏中至关重要的一部分。通过Unity的AI Navigation系统,开发者可以轻松地为游戏中的角色实现自动导航功能。本文将介绍Unity中AI Navigation的基础内容,帮助开发者快速入门。 Unity中的AI Navigation是一套用于游戏开发的导

    2024年04月16日
    浏览(40)
  • Unity丨自动巡航丨自动寻路丨NPC丨

    提示:这里可以添加技术概要 本文功能是制作一个简单的自动巡逻的NPC,随机自动寻路。 注意代码要挂载在NPC身上,并且确定要挂载Rigidbody 组件 可以把组件的旋转X和z关掉就只有前后和左右旋转了。 后期功能可以自己扩展,功能简单但是实用。

    2024年01月16日
    浏览(50)
  • unity的AI自动寻路navigation基本用法

     1.场景中的地面和障碍物都设置成静态的,  2.给需要寻路的AI物体添加Nav Mesh Agent 组件, 3在window下面找到navigation,打开选all,调好参数后点击bake 4.运行时用代码实现鼠标点击屏幕一点,AI就自动避让障碍物到达(代码在下面)      

    2024年02月11日
    浏览(48)
  • unity有限状态机和模糊状态机(怪物AI、自动寻路)

    自动寻路步骤: 1、把场景中不同的物体勾选static 2、烘培寻路网格 3、添加NavMeshAgent组件 4、给需要寻路的物体添加脚本 游戏中有限状态机的体现:小怪的巡逻和追逐功能 模糊状态机的体现:当玩家离小怪比较近时,小怪会追逐玩家,当玩家离小怪比较远时小怪会停止追逐玩

    2024年02月04日
    浏览(54)
  • Unity 中的简单A*寻路 (AStar寻路)实现

    本文实现的A*算法,未经过大量的优化,后续文章会进一步实现优化 后篇:A*优化讨论 结点类: 结点管理类: 单例模板: 测试脚本: 新建一个场景,将测试脚本挂载在任意物体上 新建一个画布,并添加一个按钮。其它ui元素可随意设定 将按钮关联Init方法 后续优化文章:

    2024年02月03日
    浏览(56)
  • 第四十九章 Unity UI适配器组件

    首先,我们介绍内容大小适配器 (Content Size Fitter)组件。 我们新建一个“SampleScene6.unity”场景,然后添加一个Text UI元素,让其居中显示,并且尺寸设置为50*30。   由于我们设置Text的尺寸在水平方向上面太小,也就是Width值太小,里面的内容“New Text”无法全部显示。当然,我

    2024年02月04日
    浏览(49)
  • UE4 动态创建寻路网格

    目录 1. 配置 2. 组件种类 3. 导航数据反推 4. UE4 Navmesh寻路 4.1 Recast 4.1.2生成Navmesh的流程 4.2 Detour 6. Recast 7. 导航网格创建(Runtime) 8. 导航网格绘制(Runtime) 8.1源码分析 初始化: 收集数据方式一 收集数据方式二 8.2绘制方法         项目设置-》引擎-》导航系统(Na

    2024年02月21日
    浏览(48)
  • Unity UGUI的GridLayoutGroup(网格布局)组件的介绍及使用

    GridLayoutGroup是Unity UGUI中的一种布局组件,用于在UI界面中创建网格布局。它可以根据指定的行数、列数和间距自动排列子物体,使它们按照网格的形式排列。 GridLayoutGroup组件会根据指定的行数和列数,将子物体按照从左到右、从上到下的顺序排列。它还可以设置间距,控制子

    2024年02月11日
    浏览(59)
  • 一种解决A*Pathfindings使用RichAI寻路 跌落出导航网格的方法

    A*Pathfinding是Unity中一个比较常用的寻路插件,其主要功能是绘制导航图并让物体沿着导航图向目标移动,可结合多种方法进行寻路方式的扩展。   该插件付费的Pro版拥有一个通过投影方式获得场景中所有网格(mesh),在网格(mesh)表面自动生成导航网格的功能,称为RecastGraph,同

    2024年02月05日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包