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

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;
    }
}

关键改动说明

  1. 触发器事件替换:将OnTriggerEnter2D/OnTriggerExit2D换成3D对应的OnTriggerEnter/OnTriggerExit,参数从Collider2D改为Collider。
  2. 方向判断适配:保留X轴方向判断逻辑,你也可以根据游戏视角换成Z轴,或者用collision.transform.position - transform.position获取相对方向向量做更精准的判断。
  3. 可配置参数:把晃动轴和角度做成可序列化变量,直接在Inspector面板调整,无需修改代码即可适配不同物品的晃动需求。
  4. 动画逻辑复用:原2D版本的协程动画逻辑基本保留,仅将固定Z轴旋转改为自定义轴旋转,适配3D场景。

注意事项

  • 确保3D物体和玩家都添加了Collider组件,且至少一个物体挂载Rigidbody(可勾选Is Kinematic),否则触发器事件不会触发。
  • 如果需要更真实的物理晃动,可给物体添加Rigidbody,在碰撞时施加扭矩而非直接旋转Transform,效果更贴合物理规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:40:24