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