网站被k 换个域名可以,在线取公司名字 免费,服务公司沈傲芳,湘潭网站网站建设目录
知识点一#xff1a;什么是范围检测
知识点二#xff1a;如何进行范围检测
问题#xff1a;
Physics.queriesHitTriggers 怎么查看是不是true#xff1f;
QueryTriggerInteraction.UseGlobal 参数意味着是否检测触发器将依据全局设置 Physics.queriesHitTrigge…
目录
知识点一什么是范围检测
知识点二如何进行范围检测
问题
Physics.queriesHitTriggers 怎么查看是不是true
QueryTriggerInteraction.UseGlobal 参数意味着是否检测触发器将依据全局设置 Physics.queriesHitTriggers 来决定 能不能通俗易懂讲解
1. 球形范围检测Sphere
2. 非分配球形范围检测Sphere NonAlloc
3. 胶囊形范围检测Capsule
4. 非分配胶囊形范围检测Capsule NonAlloc
代码补全 知识点一什么是范围检测
范围检测是一种在游戏开发中常用的技术用于判断某个特定区域内是否存在游戏对象。这种检测通常是瞬时的用于实现如技能伤害、效果施加等不需要物理碰撞响应的交互。 应用场景 玩家释放技能如地刺或火球需要判断技能范围内是否有敌人。玩家使用近战攻击需要判断周围一定范围内是否有可攻击的目标。游戏中的区域触发事件如进入特定区域触发剧情或机关。 特点 范围检测不涉及物理碰撞的响应如弹力或摩擦力。范围检测可以是瞬时的也可以是持续的如每帧检测。
知识点二如何进行范围检测 必备条件 想要被范围检测到的对象必须具备碰撞器Collider因为范围检测是基于碰撞器的形状和位置进行的。 注意点 范围检测API只在执行该代码时进行一次检测它是瞬时的。范围检测API并不会真正产生一个碰撞器它只是进行碰撞判断计算。 范围检测API 盒状范围检测OverlapBox 参数 参数一立方体中心点Vector3参数二立方体三边大小Vector3参数三立方体角度Quaternion参数四检测指定层级LayerMask参数五是否忽略触发器QueryTriggerInteraction返回值在该范围内的碰撞器数组Collider[] 其他范围检测API 球状范围检测OverlapSphere 参数一球体中心点参数二球体半径参数三检测指定层级参数四是否忽略触发器返回值在该范围内的碰撞器数组胶囊状范围检测OverlapCapsule 参数一胶囊的中心点参数二胶囊的半径参数三胶囊的高度参数四胶囊的角度参数五检测指定层级参数六是否忽略触发器返回值在该范围内的碰撞器数组 层级检测 通过 LayerMask.NameToLayer 方法可以通过层级名称获取层级编号。使用位运算左移构建二进制数来表示想要检测的层级。层级编号是0~31对应一个int数的32位。 示例代码
using UnityEngine;public class RangeDetectionScript : MonoBehaviour
{void Update(){// 盒状范围检测示例Vector3 center new Vector3(5, 0, 0); // 中心点Vector3 halfExtents new Vector3(1, 1, 1); // 半大小Quaternion direction Quaternion.identity; // 角度LayerMask layerMask (1 LayerMask.NameToLayer(Enemy)); // 只检测Enemy层Collider[] hits Physics.OverlapBox(center, halfExtents, direction, layerMask);foreach (var hit in hits){Debug.Log(检测到对象 hit.gameObject.name);}}
} int uiLayer LayerMask.NameToLayer(UI);
int defaultLayer LayerMask.NameToLayer(Default);
Collider[] colliders Physics.OverlapBox(Vector3.zero, Vector3.one, Quaternion.AngleAxis(45, Vector3.up),(1 uiLayer) | (1 defaultLayer), QueryTriggerInteraction.UseGlobal);for (int i 0; i colliders.Length; i)
{Debug.Log(colliders[i].gameObject.name);
}// 使用Physics.OverlapBoxNonAlloc进行范围检测传入一个数组进行存储
int count Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, colliders, Quaternion.AngleAxis(45, Vector3.up),(1 uiLayer) | (1 defaultLayer), QueryTriggerInteraction.UseGlobal);
if (count 0)
{Debug.Log(检测到 count 个碰撞器);
}问题
Physics.queriesHitTriggers 怎么查看是不是true 通过 Unity 编辑器界面检查 打开 Unity 编辑器。转到 Edit Project Settings Physics在 Unity 2020 及以后的版本中这个选项可能在 Edit Settings Project Physics 中。查看 Queries Hit Triggers 选项。如果这个选项被勾选那么 Physics.queriesHitTriggers 的值就是 true如果没有勾选那么它的值就是 false 。 QueryTriggerInteraction.UseGlobal 参数意味着是否检测触发器将依据全局设置 Physics.queriesHitTriggers 来决定 能不能通俗易懂讲解
这里的“全局老大”指的是Unity的一个全局设置名字叫做 Physics.queriesHitTriggers。这个设置决定了在物理查询中是否考虑触发器。
如果 Physics.queriesHitTriggers 设置为 true开启状态那么使用 QueryTriggerInteraction.UseGlobal 时物理查询比如 Physics.OverlapBox就会检测触发器。如果 Physics.queriesHitTriggers 设置为 false关闭状态那么即使使用了 QueryTriggerInteraction.UseGlobal物理查询也不会检测触发器。
简单来说QueryTriggerInteraction.UseGlobal 就是让物理查询是否检测触发器取决于Unity编辑器中的那个全局设置。如果全局设置允许检测触发器它就检测如果全局设置不允许它就不检测。这样你可以通过修改全局设置来统一控制所有物理查询是否检测触发器而不需要在每个物理查询中单独设置。
1. 球形范围检测Sphere
用途用于检测指定球形区域内的对象。参数 参数一球体中心点Vector3。参数二球体半径float。参数三检测指定层级LayerMask。如果不填则检测所有层。参数四是否忽略触发器QueryTriggerInteraction。UseGlobal 使用全局设置Collide 检测触发器Ignore 忽略触发器。返回值在该球形范围内的碰撞器数组Collider[]。
2. 非分配球形范围检测Sphere NonAlloc
用途与 OverlapSphere 类似但使用预先分配的数组来存储结果提高性能。参数 参数一球体中心点Vector3。参数二球体半径float。参数三用于存储结果的碰撞器数组Collider[]。返回值碰撞到的碰撞器数量int。
3. 胶囊形范围检测Capsule
用途用于检测指定胶囊形区域内的对象。参数 参数一胶囊的一个中心点Vector3。参数二胶囊的另一个中心点Vector3。参数三胶囊的半径float。参数四检测指定层级LayerMask。如果不填则检测所有层。参数五是否忽略触发器QueryTriggerInteraction。UseGlobal 使用全局设置Collide 检测触发器Ignore 忽略触发器。返回值在该胶囊形范围内的碰撞器数组Collider[]。
4. 非分配胶囊形范围检测Capsule NonAlloc
用途与 OverlapCapsule 类似但使用预先分配的数组来存储结果提高性能。参数 参数一胶囊的一个中心点Vector3。参数二胶囊的另一个中心点Vector3。参数三胶囊的半径float。参数四用于存储结果的碰撞器数组Collider[]。返回值碰撞到的碰撞器数量int。
代码补全
using UnityEngine;public class RangeDetectionScript : MonoBehaviour
{void Start(){// 球形范围检测int defaultLayer LayerMask.NameToLayer(Default);Collider[] colliders Physics.OverlapSphere(Vector3.zero, 5, 1 defaultLayer, QueryTriggerInteraction.UseGlobal);foreach (var collider in colliders){Debug.Log(球形检测到对象 collider.gameObject.name);}// 非分配球形范围检测Collider[] sphereBuffer new Collider[100]; // 假设最多检测100个int sphereCount Physics.OverlapSphereNonAlloc(Vector3.zero, 5, sphereBuffer, 1 defaultLayer, QueryTriggerInteraction.UseGlobal);for (int i 0; i sphereCount; i){Debug.Log(非分配球形检测到对象 sphereBuffer[i].gameObject.name);}// 胶囊形范围检测int uiLayer LayerMask.NameToLayer(UI);colliders Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 uiLayer, QueryTriggerInteraction.UseGlobal);foreach (var collider in colliders){Debug.Log(胶囊形检测到对象 collider.gameObject.name);}// 非分配胶囊形范围检测Collider[] capsuleBuffer new Collider[100]; // 假设最多检测100个int capsuleCount Physics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, capsuleBuffer, 1 uiLayer, QueryTriggerInteraction.UseGlobal);for (int i 0; i capsuleCount; i){Debug.Log(非分配胶囊形检测到对象 capsuleBuffer[i].gameObject.name);}}
}