范围检测

public class L14 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //范围检测 - 游戏中瞬时的攻击范围判断一般会使用范围检测
        //比如玩家攻击使前方1米圆形范围内对象都受到伤害
        //这种没有实体物体,只想要检测在某一指定范围内的对象,对对象进行一定的逻辑处理

        //如何进行范围检测
        //想要被范围检测到的对象必须有碰撞器,不用有刚体
        //范围检测相关的API只有执行该句代码时进行一次范围检测,是瞬时的
        //范围检测相关API并不会真正产生一个碰撞器,只是碰撞判断计算而已

        //范围检测API
        //盒状范围检测
        //参数一 立方体中心点
        //参数二 立方体三边大小的一半
        //参数三 立方体角度
        //参数四 检测指定层级(不填检测所有层)
        //参数五 是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 不填则为UseGlobal
        //返回值 在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
        Collider[] colliders =  Physics.OverlapBox(Vector3.zero, new Vector3(1, 2, 3), Quaternion.AngleAxis(45, Vector3.up),
            1 << LayerMask.NameToLayer("UI")|
            1 << LayerMask.NameToLayer("Default"),
            QueryTriggerInteraction.UseGlobal);

        //关于层级
        //通过名字得到层级编号 LayerMask.NameToLayer
        //我们需要通过编号左移构建二进制数
        //每一个编号的层级其实都是一个对应为1的2进制数
        //我们可以通过位运算就可以选择想要检测的层级

        //Physics.OverlapBoxNonAlloc()
        //返回值:碰撞到的碰撞器数量
        //参数中需要传入一个数组进行存储
        Physics.OverlapBoxNonAlloc(Vector3.zero,Vector3.one,colliders);

        //球形范围检测
        //参数一 中心点
        //参数二 球半径
        //参数三 指定层级
        //参数四 是否忽略触发器
        //返回值是该范围内的触发器
        colliders = Physics.OverlapSphere(Vector3.zero, 5,1<<LayerMask.NameToLayer("Default"));

        //同上
        //Physics.OverlapSphereNonAlloc()

        //胶囊范围检测
        //参数一 半圆一中心点
        //参数二 半圆二中心点
        //参数三 半圆半径
        //参数四 指定层级
        //参数五 是否忽略触发器
        //返回值是该范围内的触发器
        colliders = Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1);

        //同上
        //Physics.OverlapCapsuleNonAlloc()
    }
}

posted @ 2025-03-22 14:32  cannedmint  阅读(35)  评论(0)    收藏  举报