Unity Vector 与 Raycast

来源:互联网 发布:兖州区网络问政平台 编辑:程序博客网 时间:2024/04/27 16:25

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);

0 0