【Unity每日一记】关于五种Unity范围检测方法的总结

本文详细介绍了Unity中的C#技术,包括碰撞器与触发器的网格检测、向量点乘用于角度判断、Raycast的不同用法(如RaycastHit和非分配版本),以及物理范围瞬时检测方法。同时涵盖了数据持久化的相关概念。
摘要由CSDN通过智能技术生成

在这里插入图片描述


👨‍💻个人主页@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unity每日一记

👨‍💻 专栏交流🧧
🟥Unity100个实战基础✨🎁
🟦 Unity100个精华一记✨🎁
🟩 Unity50个demo案例教程✨🎁
🟨 Unity100个精华细节BUG✨🎁

在这里插入图片描述

在这里插入图片描述




🎶(A 碰撞器和触发器的网格检测

在这里插入图片描述


🎶(B 向量点乘检测


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 关于物体的检测:物体在前方5米内45度角中方可检测到
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class targetPrage : MonoBehaviour
{
    public Transform target; //目标物体

    private void Update()
    {
        if(Vector3 .Distance(transform.position ,target.position )<= 5)
        {
            //向量检测
            //B-A = AB,此时是单位向量的乘积
            //点乘的结果是余弦值
            float vaule = Vector3.Dot(transform.forward, (target.position - transform.position).normalized );
            //反三角函数计算夹角
            if(Mathf.Acos(vaule * Mathf.Deg2Rad)<30f)
            {
                Debug.Log("敌军来袭");
            }
        }
     

    }
}


🎶(C Vector3API检测


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 关于物体的检测:物体在前方5米内45度角中方可检测到
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class targetPrage : MonoBehaviour
{
    public Transform target; //目标物体

    private void Update()
    {
        if(Vector3 .Distance(transform.position ,target.position )<= 5)
        {
            //向量检测
            //B-A = AB,此时是单位向量的乘积
            float vaule = Vector3.Dot(transform.forward, (target.position - transform.position).normalized );
            if(Vector3 .Angle (transform.position  ,target .position )<30f)
            {
                Debug.Log("敌军来袭");
            }
        }
     

    }
}


🎶(D物理范围瞬时检测


特点:

  • 1.执行该句代码时 进行一次范围检测 它是瞬时的
  • 2.范围检测相关API 并不会真正产生一个碰撞器 只是碰撞判断计算而已

共同参数:

  • 参数一:物体中心点
  • 参数二:物体的边长大小
  • 参数三:物体的角度
  • 参数四:检测指定层级(不填检测所有层)
  • 参数五:是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 (不填使用UseGlobal)
  • 返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)

1.方块状范围检测


  • Physics.OverlapBox ——返回值为数组,存储检测到的碰撞器
 Collider[] colliders = Physics.OverlapBox( Vector3.zero, Vector3.one, 
 Quaternion.AngleAxis(45, Vector3.up), 
        1 << LayerMask.NameToLayer("UI") |
        1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal);
  • Physics.OverlapBoxNonAlloc——返回值为Int 表示检测的数量(最多6个参数)
if(Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, 自定义数组名) != 0)


2.球形状范围检测


无角度参数
参数二为球半径

  • Physics.OverlapSphere
    colliders = Physics.OverlapSphere(Vector3.zero, 5, 1 << LayerMask.NameToLayer("Default"));
  • Physics.OverlapSphereNonAlloc——同BOX
   if( Physics.OverlapSphereNonAlloc(Vector3.zero, 5, colliders) != 0 )

3.胶囊体范围检测


参数一:半圆一中心点
参数二:半圆二中心点
参数三:半圆半径

  • Physics.OverlapCapsule
        colliders = Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal);
  • Physics.OverlapCapsuleNonAlloc

if ( Physics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, colliders ) != 0 )



🎶(ORay射线检测


  • 特点
    只需要判断一条线和物体的碰撞情况
    可以在指定点发射一个指定方向的射线
    判断该射线与哪些碰撞器相交,得到对应对象
    瞬时

  • 应用场景
    1.鼠标选择场景上一物体
    2.FPS射击游戏(无弹道-不产生实际的子弹对象进行移动)等

射线声明


API

  • Ray X = new Ray(Vector3.right, Vector3.forward);
参数一参数二
起点方向
X.originX.direction
  • Ray XX = Camera.main.ScreenPointToRay(Input.mousePosition);
    屏幕视口坐标转成射线——鼠标点击的地方变成射线

Physics.Raycast 普通射线


  • Physics.Raycast 无法检测碰到了谁,只会检测碰到了没有

最多有16个重载

Physics.Raycast常用参数作用
参数射线
参数检测的最大距离 超出这个距离不检测
参数检测指定层级(不填检测所有层)
参数是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 不填使用UseGlobal
返回bool 当碰撞到对象时 返回 true 没有 返回false
//第一种写法
Physics.Raycast(XX, 1000, 
1 << LayerMask.NameToLayer("层级名字"), 
QueryTriggerInteraction.UseGlobal   )

//第二种写法
Physics.Raycast(Vector3.right, Vector3.forward,  
1 << LayerMask.NameToLayer("层级名字"), 
QueryTriggerInteraction.UseGlobal   )

RaycastHit 物体信息类

  • RaycastHit 物体信息类——得到相交的单个物体物理信息
    在这里插入图片描述
RaycastHit 在Physics.Raycast的应用作用
参数射线
参数out RaycastHit 为什么是out ?RaycastHit是结构体 是值类型 out加上去就变成了引用类型,而RaycastHit没有复制所以不用ref
参数检测的最大距离 超出这个距离不检测
参数检测指定层级(不填检测所有层)
参数是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 不填使用UseGlobal
返回bool 当碰撞到对象时 返回 true 没有 返回false
//写法一
      RaycastHit YY;   
     if( Physics.Raycast(XX, out YY, 1000, 
     
     1<<LayerMask.NameToLayer("层级名字"), 
     
     QueryTriggerInteraction.UseGlobal) )
     
//写法二
if( Physics.Raycast(Vector3.right, Vector3.forward, out YY, 1000,
 
     1<<LayerMask.NameToLayer("层级名字"), 
     
     QueryTriggerInteraction.UseGlobal) )
  • 碰撞到物体的名字 YY.collider.gameObject.name;
  • 碰撞到的点 YY.point
  • 法线信息 YY.normal
  • 碰撞到对象的位置 YY.transform.position
  • 碰撞到对象 离自己的距离 YY.distance等等

Physics.RaycastAll 得到多个物体信息


  • RaycastHit[] XX= Physics.RaycastAll——得到相交的多个物体物理信息

在这里插入图片描述
特点: 先碰到的在数组的后面


Physics.RaycastNonAlloc 返回的碰撞的数量


  • Physics.RaycastNonAlloc——返回的碰撞的数量 通过out得到数据
  if((r3, XX, 1000, 1 << LayerMask.NameToLayer("Monster"), 
  QueryTriggerInteraction.UseGlobal) > 0 )
 
        {
        }

🅰️系统路线学习点击跳转


【Unityc#专题篇】之c#进阶篇】

【Unityc#专题篇】之c#核心篇】

【Unityc#专题篇】之c#基础篇】

【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秩沅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值