首页 > 其他分享 >Unity--Physics.OverlapSphere的参数LayerMask和GameObject的layer

Unity--Physics.OverlapSphere的参数LayerMask和GameObject的layer

时间:2022-11-29 20:36:45浏览次数:36  
标签:layer obj -- GameObject tr Layer public


Layer介绍:

Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)
在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共有24个(8—31层),官方已使用的是0—7层,默认不可编辑!LayerMask实际上是一个位掩码,在Unity3D中一共有32个Layer层,并且不可增加。

Unity--Physics.OverlapSphere的参数LayerMask和GameObject的layer_ide

注意事项一:

Physics.OverlapSphere(OverlapSphereCube.position, SearchRadius, 1 << LayerMask.NameToLayer("Team1"));

Physics.OverlapSphere方法以给定的位置为圆心,按照设定距离投射一个球体,返回与投射的球体相交的碰撞器。

第三个参数,传入的是LayerMask,是一个位掩码,可以用1 << LayerMask.NameToLayer("Team1")或者LayerMask.GetMask("Team1"),这两个语句返回的结果是一致的。

  1. 因此,如果你想让一条光线击中一个id为10的图层上的物体,那么你应该指定的是1 << 10而不是10。
  2. 如果你想让光线击中除了第10层上的内容之外的所有内容,那么只需使用按位补码运算符(〜)来反转位掩码上的每个位。
using UnityEngine;

public class LayerExample1 : MonoBehaviour
{
public float m_SearchRadius = 5.0f;

void Start()
{
SearchNearUnits();
}

public void SearchNearUnits()
{
// 1 << LayerMask.NameToLayer("Team1")与LayerMask.GetMask("Team1")的值是一样的
Collider[] colliders = Physics.OverlapSphere(transform.position, m_SearchRadius, 1 << LayerMask.NameToLayer("Team1"));

if (colliders.Length <= 0)
{
return;
}
for (int i = 0; i < colliders.Length; i++)
{
print(colliders[i].gameObject.name);
}
}
}

注意事项二:

设置GameObject的Layer,需要注意调用LayerMask.NameToLayer("Team2"),设置的Layer数组的索引。

下面是GameObject类中对layer属性的描述:

//
// 摘要:
// The layer the game object is in. A layer is in the range [0...31].
public int layer { get; set; }
using UnityEngine;

public class LayerExample2 : MonoBehaviour
{
public float m_SearchRadius = 5f;
public Transform m_Parent;

private void Start()
{
CreateGameObject();
}

private void CreateGameObject()
{
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
GameObject obj1 = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj1.transform.SetParent(obj.transform);
SetLayer(obj, LayerMask.NameToLayer("Team2"));
ResetTransform(obj);
}

/// <summary>
/// 设置对象的Layer
/// </summary>
/// <param name="obj"></param>
/// <param name="layer"></param>
private void SetLayer(GameObject obj, int layer)
{
if (obj == null)
{
return;
}
obj.layer = layer;
Transform tr = obj.transform;
for (int i = 0; i < tr.childCount; i++)
{
SetLayer(tr.GetChild(i).gameObject, layer);
}
}

private void ResetTransform(GameObject obj)
{
if (obj == null)
{
return;
}
Transform tr = obj.transform;
tr.localPosition = Vector3.zero;
tr.localRotation = Quaternion.identity;
tr.localScale = Vector3.one;
}
}

 

标签:layer,obj,--,GameObject,tr,Layer,public
From: https://blog.51cto.com/u_6871414/5896974

相关文章

  • C#数据结构--Dictionary、HashTable、List、HashSet区别
    在.Net  模仿java的过程中,抛弃了HashMap,所以我们今天分析下Dictionary、HashTable、HashSet区别。处理碰撞,即碰撞到同一个Bucket槽上:Hashtable和Dictionary从数据结构上......
  • C#设计模式读书笔记之设计模式的设计原则
    设计模式的设计原则:(重要性从上往下排列)开闭原则:对扩展开放,对修改关闭依赖倒转原则:高层模块不应该依赖底层模块,它们都应该依赖抽象;要针对抽象层编程,而不要针对具体类编程。......
  • lua获取数组的长度
    获取数组的长度对于一个数组我们通常可以使用#来获取其长度tabletest={1,2,3,5,7}print(#tabletest)------》5使用这两种方法都能得到这个数组的长度,但是如果tabletest=......
  • 基于FPGA的正弦PWM产生系统verilog实现
    目录一、理论基础二、案例背景三、部分FPGA仿真四、仿真结论分析五、参考文献一、理论基础根据如下公式,首先建立simulink仿真模型:   这里,主要需要设计cos模块......
  • Unity-Animator Override Controller
    AnimatorOverrideController是一种资产类型,允许您扩展现有的AnimatorController,替换使用的特定动画,但保留原始结构,参数和逻辑。允许您创建相同基本状态机的多个变体,但每......
  • ClassLoader
    ClassLoader:用来加载Class的。负责将Class的字节码形式转换成内存形式的Class对象。字节码可以来自于磁盘文件*.class,也可以是jar包里的*.class,也可以来自远程......
  • 虚幻4引擎垃圾回收原理
    虚幻引擎的GC是追踪式、非实时、精确式,非渐近、增量回收(时间片)。垃圾回收算法分类:分类项目描述引用计数/追踪式GC引用计数通过额外的计数来对单个对象的引用次数进行计算,当......
  • 类的加载过程、双亲委派
    一、类的加载过程类的加载过程分为以下三个阶段:1.加载 1.载入类的字节码(方法区),创建类.class对象(堆) 2.如果此类有父类,并且父类没有加载,则先加载父类 3.加载是懒惰执......
  • 产品版本发布的四种方案
    伴随着互联网技术的高速发展,产品功能的迭代速度也越来越快,年度、季度发布几乎成为历史,一线互联网公司都支持周度上万次发布。如此高频的发布,如果新版本不够稳定,或者新特性的......
  • tempdb大量闩锁等待问题分析
    背景客户业务系统升级后,高峰期运行缓慢,在SQL专家云上看到数据库出现严重等待,需要分析原因并紧急处理。现象登录到SQL专家云中,进入实时可视化页面,在活动会话里面看到有......