【宝贝项目001】【开发日志004】【Unity】Trigger基本 和 面向问题
Trigger 基本
当对象上挂载了Trigger,在脚本中写上OnTriggerEnter(Collider other)、OnTriggerStay(Collider other)、OnTriggerExit(Collider other),会自动绑定上对应的Trigger。
如果Trigger在子对象(Child GameObject)上,那么 OnTrigger... 脚本必须挂在那个子物体上,或者在子物体脚本里向父级传递消息。
假如对象上有多个Trigger,只要其中一个Trigger被触发,都会调用以上的函数,所以我们无法区分是哪个Trigger。
推荐的方法是,每个trigger都放在不同的子对象中,然后在再子对象写 OnTrigger... 脚本。
玩家面向问题
有时候互动,需要玩家面对被互动物体,才可以互动,所以需要判断面向问题。
不过其实这种情况,更简单的方法是,给玩家挂上一个空子对象,上面挂载
collider,并勾选trigger,然后该子节点写好接触时的脚本InteractionSenser即可。
让该子对象永远在角色的面向处即可。
方案 A:通用向量点乘(Vector3.Dot)—— 3D/2.5D 最标准的做法
点乘可以精准计算“玩家朝向”和“玩家指向可交互物体的向量”之间的夹角:
- 点乘结果 \(\approx 1\):玩家正对着可交互物体。
- 点乘结果 \(\approx -1\):玩家背对着可交互物体。
- 点乘结果 \(\approx 0\):玩家侧对着可交互物体。
private void OnTriggerStay(Collider other)
{
if (!other.CompareTag("Player")) return;
// 1. 计算从【玩家】指向【可交互物体】的方向向量
Vector3 dirToBox = (transform.position - other.transform.position).normalized;
// 2. 计算玩家正前方 (transform.forward) 与该向量的夹角余弦值
float dot = Vector3.Dot(other.transform.forward, dirToBox);
// 3. 当 dot > 0.5f 时,说明玩家朝向与箱子夹角小于 60°(即正对着箱子)
bool isFacingBox = dot > 0.5f;
}
方案 B:纯 X 轴相对位置判断
当游戏只有左右两向(\(Y\) 轴旋转 \(90^\circ\) 和 \(-90^\circ\)),逻辑可以直接简化为:
\[\begin{aligned} \text{玩家在可交互物体左侧 } (x_{\text{player}} < x_{\text{box}}) &\implies \text{必须面向右 } (\text{forward.x} > 0) \\ \text{玩家在可交互物体右侧 } (x_{\text{player}} > x_{\text{box}}) &\implies \text{必须面向左 } (\text{forward.x} < 0) \end{aligned}
\]
private void OnTriggerStay(Collider other)
{
if (!other.CompareTag("Player")) return;
bool isOnLeft = other.transform.position.x < transform.position.x;
bool isFacingRight = other.transform.forward.x > 0;
// 左侧且朝右,或者右侧且朝左
bool isFacingBox = (isOnLeft && isFacingRight) || (!isOnLeft && !isFacingRight);
}

浙公网安备 33010602011771号