【第017问 Unity Physics.OverlapSphere如何检测附近玩家?】

news/2024/11/8 21:24:10/

一、背景

如何检测一个对象范围内的玩家,这个可以直接使用距离判定,物体射线检测等相关方式;这里采用Physics.OverlapSphere的方式来实践其过程,并对Physics.OverlapSphere的使用做一下记录;

二、Physics.OverlapSphere

1、该API表示采用球体的方式进行物体的范围检测;那什么是球体,看下面的动画:请添加图片描述
上图就是Unity中创建的一个Sphere;想篮球、乒乓球也是这种形状;那么我们需要检测范围区域就是这种球形;

2、该球形检测的API有两个:
2.1 Physics.OverlapSphere(Vector3 position, float radius, int layerMask)
2.2 Physics.OverlapSphere(Vector3 position, float radius)

这两个API的区别就在于layerMask;如果你指定了layerMask,那么检测的对象就只针对指定的LayerMask,否则就是所有的碰撞体都会检测;

对该API进行详细说明:
position:表示需要指定的检测的位置,如下动画:请添加图片描述
上面移动的的位置就是该对象需要检测的起始位置,也就是这个球体的球心;整个检测的起始点位置;

radius: 表示该球心的半径,看动画:
请添加图片描述
可以看到上面的颜色部分,只是绘制除了一个平面的部分半径可视化的直线;当在进行检测的时候和半径的大小相关联;半径内的可以检测到,半径以外的不可以检测

layerMask: 可以设置,也可以不设置,如果设置那么就用方式:LayerMask.GetMask(“BoxCollider”); 进行设置;如果不进行设置就检测所有的Layer;这里的BoxCollider是自定义的Layer名字;

三、实践效果

1、检测LayerMask为BoxCollider的物体是否在球体范围内;半径可以调节:动画演示:请添加图片描述
默认白色的Cube表示没有被检测到,颜色变为红色的Cube表示在Sphere的范围内;
在上面的动画中:左右两个Cube的Layer为BoxCollider;上下两个Cube的layer为Default;

1.1 、可以看到在半径以外是不会被检测到的,也就是Cube不会变红的;
1.2、即使在半径范围内,如果和需要检测的LayerMask不一样,那么Cube也是不会变红的;

2、检测所有,不区分LayerMask 动画演示:
请添加图片描述
该动画就是不区分LayerMask,所有可以碰撞的物体都会被检测,如果在半径范围内,那么就会被检测到;

注意
既然是物体碰撞检测,那么被检测的对象一定要有Collider,要不然是不会被检测到的;以上就是通过可视化事件范围内NpC的检测;

四、源码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;[ExecuteAlways]
public class PhysicsSphereTest : MonoBehaviour
{private SphereCollider _sphereCollider;[SerializeField] private Material _material;[SerializeField] private Material defaultMaterial;[SerializeField] private List<MeshRenderer> _meshRenderers;private void Awake(){_sphereCollider = GetComponent<SphereCollider>();}// Start is called before the first frame updatevoid Start(){}private void OnDrawGizmos(){if (_sphereCollider == null)_sphereCollider = GetComponent<SphereCollider>();float radius = _sphereCollider.radius;for (int angel = 0; angel < 360; angel += 2){double x = Math.Cos(angel * 1.0f);double z = Math.Sin(angel * 1.0f);Vector3 v3 = Vector3.one;v3.y = 0;v3.x = (float) x * radius;v3.z = (float) z * radius;Vector3 target = transform.position + v3;Debug.DrawLine(transform.position, target, Color.magenta);}ResetMaterial();int layer = LayerMask.GetMask("BoxCollider");// Collider[] colliders = Physics.OverlapSphere(transform.position, radius, layer);Collider[] colliders = Physics.OverlapSphere(transform.position, radius);foreach (var boid in colliders){boid.GetComponent<MeshRenderer>().material = _material;}}void ResetMaterial(){foreach (var mr in _meshRenderers){mr.material = defaultMaterial;}}
}

五、结语

外面下雨,但屋里有点热[valaki]


http://www.ppmy.cn/news/35935.html

相关文章

趋势面模型分析实例(python)

python 趋势面模型分析实例 已知五个气象站&#xff0c;这五个站围绕着未知的0号站。下图为各个站点的x、y坐标及及其已知值 第一行为0号点x&#xff0c;y坐标 z值未知暂设为0 而后依次为1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5号点xyz值 对未知点0进行插值。…

es-head插件插入查询以及条件查询(五)

es-head插件插入查询以及条件查询 1.es-head插件页面介绍 页面详细介绍 2.es-head查询语句 2.1.查询索引中的全部数据 curl命令交互&#xff0c;采用GET请求 语法格式&#xff1a; curl -XGET es地址:9200/索引名/_search?pretty [rootelaticsearch ~]# curl -XGET 192…

模拟集成电路设计:Bandgap电路设计及版图实现

模拟集成电路设计 Bandgap电路设计及版图实现 一、目的&#xff1a; 1、熟悉模拟集成电路设计的基本流程&#xff0c;实现Bandgap电路设计&#xff1b; 2、熟悉Linux系统及Cadence Virtuoso icfb设计、仿真软件的使用方法。 二、原理&#xff1a; 1、设计目标&#xff1a;…

Unity --- Transform类

1.一个很有意思的事实是Transform类不仅用来管理游戏物体的位置缩放旋转&#xff0c;还用来管理游戏物体的父物体与子物体之间的关系 当游戏物体A的trasnform类a是游戏物体B的transform类b的父类的话&#xff0c;游戏物体A就是游戏物体B的父物体 2.如何访问脚本当前挂载的游戏…

Docker学习记录

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录阅读前请看一下&#xff1a;我是一…

【小杨带你玩转C语言】(入门篇)初识C语言(下)

本章目录 每篇前言1.导语 2.目标 3.知识点 一&#xff0c;常见关键字       1&#xff0c;认识关键字       2&#xff0c;关键字分类           2.1&#xff0c;数据类型关键字             2.1.1&#xff0c;基本数据类型关键字             2.…

利用Rust与Flutter开发一款小工具

1.起因 起因是年前看到了一篇Rust iOS & Android&#xff5c;未入门也能用来造轮子&#xff1f;的文章&#xff0c;作者使用Rust做了个实时查看埋点的工具。其中作者的一段话给了我启发&#xff1a; 无论是 LookinServer 、 Flipper 等 Debug 利器&#xff0c;还是 Flutt…

【深度强化学习】(5) DDPG 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下深度确定性策略梯度算法 (Deterministic Policy Gradient&#xff0c;DDPG)。并基于 OpenAI 的 gym 环境完成一个小游戏。完整代码在我的 GitHub 中获得&#xff1a; https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Mod…