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

Unity C#实现按键触发触发器检测并为刚体施加向上力的问题

问题分析与修正方案

原代码的核心问题

  • 嵌套类Triggerdetecting完全多余:Unity的触发回调(如OnTriggerStay)是引擎自动调用的,必须挂载在继承MonoBehaviour的脚本所在GameObject上,手动实例化类根本触发不了这些方法。
  • 语法错误:AddForce((Vector3.up * 10)多了一个左括号,语法不合法。
  • 逻辑偏差:你需要按下空格时给触发器内物体施力,但原代码试图通过实例化类触发检测,完全不符合Unity的回调机制。

修正后的代码

using System.Collections.Generic;
using UnityEngine;

// 类名要和脚本文件名一致,符合C#命名规范
public class CollisionDetectorLeft : MonoBehaviour
{
    // 存储当前在触发器范围内的所有物体
    private List<Collider> _objectsInTrigger = new List<Collider>();

    // 物体进入触发器时,加入列表
    private void OnTriggerEnter(Collider other)
    {
        if (!_objectsInTrigger.Contains(other))
        {
            _objectsInTrigger.Add(other);
        }
    }

    // 物体离开触发器时,从列表移除
    private void OnTriggerExit(Collider other)
    {
        if (_objectsInTrigger.Contains(other))
        {
            _objectsInTrigger.Remove(other);
        }
    }

    // Update适合处理输入检测
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            ApplyUpwardForce();
        }
    }

    // 给触发器内的物体施加向上的力
    private void ApplyUpwardForce()
    {
        foreach (var collider in _objectsInTrigger)
        {
            if (collider.attachedRigidbody != null)
            {
                // 用脉冲力适配按键瞬间触发的场景,若要持续力可换成ForceMode.Force
                collider.attachedRigidbody.AddForce(Vector3.up * 10, ForceMode.Impulse);
            }
        }
    }
}

逻辑说明(对应你的Python伪代码)

你的Python伪代码逻辑是「按下空格时,检查触发区是否有物体,有则向上移动物体」,对应到Unity的实现逻辑:

  1. 用OnTriggerEnter和OnTriggerExit维护一个动态列表,持续记录当前在触发范围内的物体。
  2. 在Update中检测空格键按下事件,触发施力方法。
  3. 遍历列表,给每个带Rigidbody的物体施加向上的力。

额外注意事项

  • 挂载脚本的GameObject必须有Collider组件,且勾选Is Trigger。
  • 被检测的物体需要有Rigidbody组件,且不能勾选Is Kinematic(否则施加力无效)。

内容的提问来源于stack exchange,提问作者jetrldz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:15:35