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的实现逻辑:
- 用
OnTriggerEnter和OnTriggerExit维护一个动态列表,持续记录当前在触发范围内的物体。 - 在
Update中检测空格键按下事件,触发施力方法。 - 遍历列表,给每个带Rigidbody的物体施加向上的力。
额外注意事项
- 挂载脚本的GameObject必须有Collider组件,且勾选
Is Trigger。 - 被检测的物体需要有Rigidbody组件,且不能勾选
Is Kinematic(否则施加力无效)。
内容的提问来源于stack exchange,提问作者jetrldz
相关产品推荐
相关产品推荐

