Unity 3D游戏中实现玩家碰撞时物体晃动的方法求助
Unity 3D 碰撞触发物体晃动效果实现(从2D版本迁移)
你的2D版本核心是通过触发器事件+Z轴旋转实现晃动,迁移到3D只需要调整几个关键部分:
- 替换2D触发器事件为3D版本
- 调整方向判断逻辑适配3D空间
- 修改旋转轴以符合3D场景的视觉逻辑
以下是适配后的3D版本代码,关键改动已标注:
using System.Collections; using UnityEngine; public class ItemNudge3D : MonoBehaviour { private WaitForSeconds pause; private bool isAnimating = false; // 可在Inspector调整晃动轴,比如桌上物品用X轴,竖立物品用Y轴 [SerializeField] private Vector3 shakeAxis = new Vector3(1, 0, 0); [SerializeField] private float shakeAngle = 2f; private void Awake() { pause = new WaitForSeconds(0.04f); } // 替换2D触发器事件为3D版本 private void OnTriggerEnter(Collider collision) { if (!isAnimating) { // 3D空间以X轴判断碰撞方向,可根据视角换成Z轴(前后方向) bool isFromRight = transform.position.x < collision.transform.position.x; StartCoroutine(isFromRight ? ShakeAntiClock() : ShakeClock()); // 保留播放音效逻辑 // if (collision.CompareTag("Player")) PlayRustleSound(); } } // 替换2D退出事件为3D版本 private void OnTriggerExit(Collider collision) { if (!isAnimating) { // 退出时方向判断与进入时相反 bool isFromRight = transform.position.x > collision.transform.position.x; StartCoroutine(isFromRight ? ShakeAntiClock() : ShakeClock()); // 保留播放音效逻辑 // if (collision.CompareTag("Player")) PlayRustleSound(); } } // 重构旋转逻辑,适配3D自定义轴 private IEnumerator ShakeAntiClock() { isAnimating = true; for (int i = 0; i < 4; i++) { transform.Rotate(shakeAxis * shakeAngle); yield return pause; } for (int i = 0; i < 5; i++) { transform.Rotate(shakeAxis * -shakeAngle); yield return pause; } transform.Rotate(shakeAxis * shakeAngle); yield return pause; isAnimating = false; } private IEnumerator ShakeClock() { isAnimating = true; for (int i = 0; i < 4; i++) { transform.Rotate(shakeAxis * -shakeAngle); yield return pause; } for (int i = 0; i < 5; i++) { transform.Rotate(shakeAxis * shakeAngle); yield return pause; } transform.Rotate(shakeAxis * -shakeAngle); yield return pause; isAnimating = false; } }
关键改动说明
- 触发器事件替换:将
OnTriggerEnter2D/OnTriggerExit2D换成3D对应的OnTriggerEnter/OnTriggerExit,参数从Collider2D改为Collider。 - 方向判断适配:保留X轴方向判断逻辑,你也可以根据游戏视角换成Z轴,或者用
collision.transform.position - transform.position获取相对方向向量做更精准的判断。 - 可配置参数:把晃动轴和角度做成可序列化变量,直接在Inspector面板调整,无需修改代码即可适配不同物品的晃动需求。
- 动画逻辑复用:原2D版本的协程动画逻辑基本保留,仅将固定Z轴旋转改为自定义轴旋转,适配3D场景。
注意事项
- 确保3D物体和玩家都添加了Collider组件,且至少一个物体挂载
Rigidbody(可勾选Is Kinematic),否则触发器事件不会触发。 - 如果需要更真实的物理晃动,可给物体添加
Rigidbody,在碰撞时施加扭矩而非直接旋转Transform,效果更贴合物理规则。
内容的提问来源于stack exchange,提问作者Mark Denn
相关产品推荐
相关产品推荐

