You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity高尔夫游戏:球体进入触发圆柱后无法上浮问题

高尔夫球漂浮触发问题的排查与修复

核心问题分析

你的代码只在球体进入触发区的瞬间施加一次力,且触发事件可能未正常触发——这是球体直接穿过圆柱的主要原因。结合Unity碰撞触发规则,从以下几点逐一修复:

1. 先确保碰撞触发条件满足

Unity的OnTriggerEnter/Stay触发需要同时满足:

  • 触发体(圆柱):碰撞体勾选Is Trigger,且非静态
  • 球体:
    • 带有Rigidbody组件,未勾选Is Kinematic,Static未勾选
    • 碰撞体未勾选Is Trigger(两个Trigger之间不会触发碰撞事件)
  • 检查圆柱碰撞体的大小/位置,确保球体进入时能触发碰撞检测,不会从边缘穿过

2. 修正代码实现持续漂浮

你需要的是“漂浮”(持续向上的力),而非瞬间弹起,因此应该用OnTriggerStay持续施加力,而非OnTriggerEnter只触发一次:

using UnityEngine;

public class LevitationCylinder : MonoBehaviour
{
    public float UpwardsForce = 15f;

    // 球体停留在触发区内时,每帧调用一次
    private void OnTriggerStay(Collider other)
    {
        if (other.CompareTag("Ball"))
        {
            Rigidbody rb = other.GetComponent<Rigidbody>();
            if (rb != null && !rb.isKinematic) 
            {
                // ForceMode.Force会考虑球体质量,更符合真实漂浮感
                rb.AddForce(Vector3.up * UpwardsForce, ForceMode.Force);
            }
        }
    }

    // 可选:进入触发区时给一个初始冲量,让球立刻有向上的动势
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Ball"))
        {
            Rigidbody rb = other.GetComponent<Rigidbody>();
            if (rb != null && !rb.isKinematic) 
            {
                rb.AddForce(Vector3.up * UpwardsForce * 2, ForceMode.Impulse);
            }
        }
    }
}

3. 额外验证步骤

  • 在OnTriggerEnter里加一行Debug.Log("触发成功!");,运行后查看控制台是否输出,确认触发事件真的被调用(排除标签拼写错误,比如大小写不一致)
  • 检查球体Rigidbody的质量:如果质量设得太大,需要对应调大UpwardsForce
  • 确认没有其他脚本锁定了球体的Y轴移动,或者重置了Rigidbody的速度

内容的提问来源于stack exchange,提问作者The Official Don Cheadle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:12:53