Unity300个技巧检测物体在地面的三种方式
Posted 给我丶鼓励
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity300个技巧检测物体在地面的三种方式相关的知识,希望对你有一定的参考价值。
在游戏中,角色跳跃是普通且常见的能力。但就这么看似简单的功能,在实现过程中也会遇到很多问题。
在本篇文章,我将分享地面检测的三种方式。
项目地址
为什么要地面检测?
在游戏中。用户对在空中的角色和地面的角色可操作方式是不同的。
比如,空中和地面不同的攻击方式、地面上可以下蹲、空中二段跳、触地失败等等。
所以,要实现这种差异,我们首先要知道角色当前的空间位置,所以地面检测就是必须的。
射线检测
核心思路:
在角色底部向下发出一条射线,当触碰到地面时,则认为角色在地面上。
代码如下:
void Update()
// TODO 避免检测太频繁影响性能,可以增大检测间隔时间
var raycastAll = Physics2D.RaycastAll(transform.position, Vector2.down, 0.1f, layerMask);
if (raycastAll.Length > 0)
// 在地面
isGrounded = true;
else
// 离地
isGrounded = false;
但是,这种现实会有问题。
当角色在地面边缘或者斜坡时,单条射线会检测不到地面从而导致判断错误。
要解决这个问题也很简单,我们可以增加多几条射线,既可以了。
但是这样实现起来有点繁琐,有没有更方便的方法呢?
碰撞体
核心思路:
利用 Unity 引擎提供的碰撞体,我们可以监听碰撞函数来完成地面检测逻辑。
代码如下:
void OnTriggerStay2D(Collider2D other)
if (other.CompareTag("Ground"))
// 在地面
isGrounded = true;
void OnTriggerExit2D(Collider2D other)
// 离地
isGrounded = false;
通过调整碰撞器的大小,已经可以满足我们日常开发需求了。
如果你不想添加多个碰撞器,那可以试试下面的射线盒子。
射线盒子
核心思路:
也是利用射线检测,只是从多条射线换成射线盒子。由线变成面。
代码如下:
void Update()
var raycastAll = Physics2D.OverlapBoxAll(transform.position, new Vector2(0.4f,0.4f), 0,layerMask);
if (raycastAll.Length > 0)
// 在地面
isGrounded = true;
else
// 离地
isGrounded = false;
以上就是本篇的内容。如果你觉得还不错,可以点个赞和关注噢~
Unity play模式下选中物体的三种方式
射线检测(需要碰撞器)
// 创建一条点击位置为光标位置的射线
Ray rays = Camera.main.ScreenPointToRay(Input.mousePosition);
//将射线以黄色的表示出来
Debug.DrawRay(rays.origin, rays.direction * 100, Color.yellow);
//创建一个RayCast变量用于存储返回信息
RaycastHit hit;
//将创建的射线投射出去并将反馈信息存储到hit中
if (Physics.Raycast(rays, out hit))
//获取被射线碰到的对象transfrom变量
target = hit.transform.position;
target就是被选中的物体的坐标
屏幕坐标对比(不需要碰撞器)
//设置鼠标点击的精度
WHrate = (float)Screen.width / (float)Screen.height;
xdelta = Screen.width * delta / WHrate;
ydelta = Screen.height * delta;
Vector3 screenPos;
Vector3 mousePos;
foreach (Vector3 v3 in positions)
//把包围盒中心点转化为屏幕坐标
screenPos = Camera.main.WorldToScreenPoint(v3);
mousePos = Input.mousePosition;
//如果鼠标点击的位置在包围盒中心点屏幕坐标的一定范围内
if (mousePos.x >= screenPos.x - xdelta && mousePos.x <= screenPos.x + xdelta
&& mousePos.y >= screenPos.y - ydelta && mousePos.y <= screenPos.y + ydelta)
target = v3;
break;
包围盒(不需要碰撞器)
//判断模型的包围盒是否与射线交互
if (meshes[i].bounds.IntersectRay(rays))
target = meshes[i].bounds.center;
break;
以上是关于Unity300个技巧检测物体在地面的三种方式的主要内容,如果未能解决你的问题,请参考以下文章