Unity Vector 与 Raycast

本文介绍Unity中Vector的基本运算及其与Raycast结合的应用,包括如何计算玩家与对象之间的距离与方向,如何使用Raycast检测玩家与对象间的碰撞,并介绍了几种避免自我碰撞的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vector 常用的计算

本身到玩家的 Vector2,该 Vector2 含方向与距离的信息
Vector2 heading = transform.position - player.position;

距离
float distance = heading.magnitude;

方向

Vector2 direction = heading / distance; // 或 heading.normalized


Unity 常用投射的方式检查碰撞等,如:Linecast、Raycast

用 Raycast 举例,其他类似

投射一条射线,检查是否能直接投射到 Player

RaycastHit2D hit = Physics2D.Raycast(transform.position, player.position - transform.position);

注意:不能从碰撞体内部发射,否则投射的对象永远是自己

解决方式一,在子物体中新建一个 checkpoint ,在父物体的碰撞器外面

解决方式二,通过 layerMask 开启或关闭相应的 layer ,目的是排除掉自身

RaycastHit2D hit = Physics2D.Raycast(transform.position, player.position - transform.position, Mathf.Infinity, ~(1 << LayerMask.NameToLayer("Enemies")));

Mathf.Infinity:表示 distance 正无穷

~(1 << LayerMask.NameToLayer("Enemies")): 关闭 Enemies 层的检测

注意,需使用如 ~(1 << 5 | 1 << 8) 的方式进行关闭,不能写成 0 << 8 


同时可以开启 Debug 画一条射线进行观察

Debug.DrawRay(transform.position, player.position - transform.position, Color.red);

注意,Debug 画的射线出现在游戏开发窗口,运行时需开启 Gizmos 才会显示


Vector2 head = player.position - transform.position;
RaycastHit2D hit = Physics2D.Raycast(transform.position, head, Mathf.Infinity, ~(1 << LayerMask.NameToLayer("Enemies")));
Debug.DrawRay(transform.position, playerToEnemy, Color.red);
if (hit.collider != null)
    Debug.Log(hit.collider.name);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值