NavMesh名字、层索引、层值之间的转换

简介: // Nav层名字-->层的值,1、2、4、8、16 public static int AgentLayerNameToValue(string name) { int idx = NavMesh.
    // Nav层名字-->层的值,1、2、4、8、16
    public static int AgentLayerNameToValue(string name)
    {
        int idx = NavMesh.GetNavMeshLayerFromName(name);
        return 0x1 << idx;
    }

    // Nav层名字-->层索引,0、1、2、3、4
    public static int AgentLayerNameToIndex(string name)
    {
        return NavMesh.GetNavMeshLayerFromName(name);
    }

    // 获取角色当前所在的层值,1、2、4、8、16
    public static int GetAgentLayer(NavMeshAgent agent)
    {
        NavMeshHit hit;
        // 不要使用agent.raduis为采样范围,因为当该值为0时,函数将返回0
        bool reach = NavMesh.SamplePosition(agent.transform.position, out hit, 1f, -1);
        return hit.mask;
    }

    public static Vector3 SampleNavMeshPosition(Vector3 logicPosition, out bool reachable)
    {
        NavMeshHit hit;
        reachable = NavMesh.SamplePosition(logicPosition, out hit, 1f, -1);
        return reachable ? hit.position : logicPosition;
    }

    // 开启导航层
    public static void EnableNavMeshLayer(NavMeshAgent agent, string layerName)
    {
        if (agent == null)
            return;

        int layerValue = NavMesh.GetNavMeshLayerFromName(layerName);
        if (layerValue == -1)
            return;

        int mask = agent.walkableMask | 0x1 << layerValue;
        WalkArbiter.SetWalkableMask(agent, mask);
    }

    // 关闭导航层
    public static void DisableNavMeshLayer(NavMeshAgent agent, string layerName)
    {
        if (agent == null)
            return;

        int layerValue = NavMesh.GetNavMeshLayerFromName(layerName);
        if (layerValue == -1)
            return;

        int mask = agent.walkableMask & ~(0x1 << layerValue);

        WalkArbiter.SetWalkableMask(agent, mask);
    }

    // 检查某个层是否为开启
    public static bool IsNavMeshLayerOpen(NavMeshAgent agent, string layerName)
    {
        int layerValue = NavMesh.GetNavMeshLayerFromName(layerName);
        if (layerValue == -1)
            return true;

        int ret = agent.walkableMask & (0x1 << layerValue);
        return ret > 0 ? true : false;
    }

 

目录
相关文章
|
7月前
2.14 PE结构:地址之间的转换
在可执行文件PE文件结构中,通常我们需要用到地址转换相关知识,PE文件针对地址的规范有三种,其中就包括了`VA`,`RVA`,`FOA`三种,这三种该地址之间的灵活转换也是非常有用的,本节将介绍这些地址范围如何通过编程的方式实现转换。VA(Virtual Address,虚拟地址):它是在进程的虚拟地址空间中的地址,用于在运行时访问内存中的数据和代码。VA是相对于进程基址的偏移量。在不同的进程中,相同的VA可能映射到不同的物理地址。RVA(Relative Virtual Address,相对虚拟地址):它是相对于模块基址(Module Base Address)的偏移量,用于定位模块内部的数
136 1
2.14 PE结构:地址之间的转换
|
3月前
|
SQL C++
组合两个表(C++)
组合两个表(C++)
19 0
|
7月前
|
安全
RxSwift特征序列Driver的使用,以及共享附加作用与非共享附加作用的区别?
RxSwift特征序列Driver的使用,以及共享附加作用与非共享附加作用的区别?
127 0
|
9月前
【各种进之间的转换】
【各种进之间的转换】
|
9月前
|
JSON JavaScript 数据格式
查找一组数据中一组或多组数据(filter和find的区别)
查找一组数据中一组或多组数据(filter和find的区别)
57 0
|
10月前
|
JavaScript 索引
数据类型及相互规则转换,我被问麻了!!!
数据类型及相互规则转换,我被问麻了!!!
86 2
|
10月前
|
C语言 C++
C++——数据类型之间的转换
C++——数据类型之间的转换
|
11月前
|
监控
数据标准应用(一):落标映射关系
数据标准创建完成后,需要指定其关联的资产对象才能发挥应用价值。数据标准和资产对象的映射关系当前可以通过落标映射规则来管理;生成映射关系后,对象是否遵循了映射到的标准定义则通过落标监控评估来判断。本文为您介绍落标映射关系的分类和管理方式。
947 0
C结构中包含自己的嵌套定义
C结构中包含自己的嵌套定义
51 0
关系,属性,域,元组,码,分量,关系模式
试述关系模型的概念,定义并解释以下术语:关系,属性,域,元组,码,分量,关系模式。 关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。在用户观点下,关系模型中数据的逻辑结构是一张二维表,它由行和列组成。 (l)关系:一个关系对应通常说的一张表 (2)属性:表中的一列即为一个属性 (3)域:属性的取值范围 (4)元组:表中的一行即为一个元组 (5)主码:表中的某个属性组,它可以惟一确定一个元组 (6)分量:元组中的一个属性值 (7)关系模式:对关系的...
352 0