👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:unity每日一记
⭐🅰️推荐文章⭐
⭐【Unityc#专题篇】之c#系统化大礼包】
⭐【unity数据持久化】数据管理类_PlayerPrfs
⭐【unity本站最全系列】unity常用API大全一篇文章足以
⭐⭐
🎶(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 )
🎶(O)Ray射线检测
-
特点
只需要判断一条线和物体的碰撞情况
可以在指定点发射一个指定方向的射线
判断该射线与哪些碰撞器相交,得到对应对象
瞬时 -
应用场景
1.鼠标选择场景上一物体
2.FPS射击游戏(无弹道-不产生实际的子弹对象进行移动)等
射线声明
API
- Ray X = new Ray(Vector3.right, Vector3.forward);
参数一 | 参数二 |
---|---|
起点 | 方向 |
X.origin | X.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#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、文章来源:https://www.toymoban.com/news/detail-648686.html
文章来源地址https://www.toymoban.com/news/detail-648686.html
到了这里,关于【Unity每日一记】关于物体(敌方)检测—(向量点乘相关)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!