【宝贝项目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);

}


posted @ 2026-10-06 21:12  SEHOD  阅读(5)  评论(0)    收藏  举报