>> >> >> Reference << << << <<<<<<Ref>>>>>>
>> >> >> Indexer << << << <<<<<<Idx>>>>>>
Matched: 0

Tags

    Categories

      Types

        Top Results

          Unity Invisible Trap
          M: 2025-06-01 - ljf12825

          Unity实际开发中,有很多“看起来正常、实则容易出错”的奇怪问题(或称为隐形陷阱

          Quick List

          Class1 交互相关

          现象原因解决方式标签
          按下交互键时多个箱子同时打开范围内存在多个交互体,未判断距离使用 OverlapSphere + 计算最近距离输入、交互
          鼠标点击物体无反应被 UI 或透明物体挡住,Raycast 被拦截检查 UI 的 Raycast Target 设置输入、射线
          射线打不中目标射线层级错误或未设置 LayerMask使用正确 Layer 和 LayerMask输入、射线
          玩家进入 Trigger 区域被触发两次存在多个 Collider 重叠,重复触发判断 other.gameObject 是否重复触发器、碰撞

          Class2 动画控制

          现象原因解决方式标签
          SetTrigger 后动画无反应没有关闭 Has Exit Time 或过渡设置错误调整 Animator Transition 设置动画、状态机
          动画状态切换卡顿切换时未等待上一状态结束使用 CrossFade,设置合理 transition duration动画
          动画参数更新后立即调用 Play 无效Animator 状态未刷新等待一帧或避免立即 Play动画、代码时序
          动画过渡后恢复原始状态未使用 Animator.ResetTrigger设置状态触发后重置 Trigger动画、状态机

          Class3 UI系统

          现象原因解决方式标签
          UI 按钮点击无效被其他透明 UI 挡住检查 Canvas 层级,关闭遮挡物的 Raycast TargetUI、输入
          Text 性能差、频繁 GC使用 Text 频繁更新使用 TextMeshPro + 对象池UI、性能
          UI 点击穿透到底部物体未正确使用 CanvasGroup.blocksRaycasts设置为 false 阻止穿透UI、射线
          ScrollView 滚动方向错乱锚点、Pivot 设置错误调整 Content 和 Viewport 的锚点UI、布局

          Class4 物理系统

          现象原因解决方式标签
          移动物体穿过墙体使用了 transform.position 移动刚体改用 Rigidbody.MovePosition()物理、穿透
          刚体滑动不自然没有设置 Drag、Mass 等属性设置合理的阻力与摩擦系数物理
          触发器触发失效Collider 未勾选 isTrigger,或 Rigidbody 缺失确保至少一方含 Rigidbody 且 Collider 是触发器物理、触发器

          Class5 资源加载与管理

          现象原因解决方式标签
          Resources.Load 的资源未释放Destroy 了物体但资源仍驻留内存调用 Resources.UnloadUnusedAssets()内存、加载
          Addressables 资源释放失败未调用 Release()每次加载后使用 Addressables.Release(handle)Addressables
          AudioClip 提前中断多个 AudioSource 播放相同 Clip 被覆盖PlayOneShot 或动态创建 AudioSource音频、资源

          Class6 生命周期与协程

          现象原因解决方式标签
          WaitForSeconds() 在暂停时不起作用依赖 Time.timeScale,暂停后为 0使用 WaitForSecondsRealtime()协程、暂停
          Update 在隐藏物体时仍执行脚本和 GameObject 仍处于 enabled 状态手动控制 enabled = false生命周期
          OnDisable 未被调用GameObject 被销毁不是禁用区分 DestroySetActive(false)生命周期、事件

          Class7 性能优化相关

          现象原因解决方式标签
          场景切换时卡顿同步加载资源或过多 Awake 初始化LoadSceneAsync,资源异步预加载性能、加载
          Update() 性能开销大多个脚本使用 Update,逻辑分散使用事件驱动 + 管理器合并 Update性能、架构
          GC Alloc 频繁每帧创建新对象(如字符串、new Vector3)复用变量、使用对象池性能、GC

          Class8 编译器 vs 构建行为差异

          现象原因解决方式标签
          编辑器正常,打包后报错使用了 UnityEditor API#if UNITY_EDITOR 包裹构建、平台差异
          场景中未勾选物体在运行时出现被代码运行时 Instantiate确认代码逻辑未动态生成构建、场景管理
          路径访问失败各平台 persistentDataPath 不一致使用平台判断封装路径IO、平台兼容

          Class1 交互相关

          1.多个可交互物体,输入触发多个

          • 场景:靠近多个箱子同时按下E,多个箱子一起打开
          • 原因:所有物体监听E,没有加距离或唯一判定
          • 解决方案:只响应最近/朝向前方的一个对象

          2.Trigger触发多次Enter/Exit

          • 场景:一个对象靠近某个Trigger区域,OnTriggerEnter被触发两次
          • 原因:
            • 可能身上挂有多个Collider
            • 或包含子物体的Collider也触发了
          • 解决方案:确认是否是重复触发,加入other.gameObject == expectedObject判断

          3.Button UI点击两次才响应

          • 原因:
            • UI按钮背后有透明/未关闭的UI元素挡住射线
            • 或者EventSystem被禁用、Canvas未设置正确Sorting Order
          • 解决方案:调试Graphic Raycaster、Canvas排序、Raycast Target勾选项

          Class2 物理系统相关

          1.Rigidbody设置position导致穿透

          • 使用transform.position = ...设置刚体位置,会跳过物理引擎检测,导致穿墙
          • 正确做法:使用Rigidbody.MovePosition()

          2.Collider和Rigidbody的组合错误

          • 常见错误组合

            • 静态物体(如地面)用了非Kinematic的Rigidbody
            • 移动物体没加Rigidbody,靠transform移动导致物理行为异常
          • Unity的推荐:

            • 静态物体(地面)用Collider,无Rigidbody
            • 动态物体加Rigidbody,控制用物理接口

          Class3 生命周期相关

          1.协程中的WaitForSeconds在TimeScale为0时失效

          StartCoroutine(Example());
          
          IEnumerator Example()
          {
            yield return new WaitForSeconds(2f); // 如果Time.timeScale == 0,不会等待
          }
          
          • 解决方案:用`WaitForSecondRealtime(2f);

          2.脚本的Update()仍被调用,虽然物体不可见

          • 即使物体在摄像机外、隐藏或inactive子物体,只要GameObject时active的、脚本时enable的,Update就会继续执行

          Class4 动画系统相关

          1.Animator动画不能立即切换

          • 使用SetTrigger后动画没反应,原因是当前状态没有达到可以跳转的条件或冷却没完成
          • 解决方案:Animator控制器中正确配置Transition,并关闭Has Exit Time(除非需要完整播放)

          2.Animator状态机切换卡顿或不触发

          • 在代码里调用了:
          animator.SetBool("isOpen", true);
          animator.Play("Open");
          
          • 原因:设置参数后马上Play,但Unity还没更新Animator的状态,应延迟一帧或合并状态逻辑

          Class5 资源加载与内存相关

          1.Addressables或Resources.Load的资源加载了但没释放

          • 开发中用完资源后Destroy(obj)了,却发现内存依然飙高
          • 原因:Unity对部分资源(如Texture、Mesh)会做缓存,要手动调用Resources.UnloadUnusedAssets()Addressables.Release(handle)

          2.AudioClip播放一半没声音或提前中断

          • 多个AudioSource播放相同Clip时,其中一个会抢断另一个
          • 使用PlayOneShot()或实例化新的AudioSource

          Class6 编译器运行与构建差异

          1.在Editor模式下一切正常,打包后就崩溃

          • 原因:用了AssetDatabaseEditorUtilityUnityEditor命名空间代码
          • #if UNITY_EDITOR包裹相关逻辑

          2.场景中物体没勾选但运行中出现了

          • 某些Prefab被脚本Instantiate()出来了,但在场景中没看到
          • 检查脚本逻辑力是否有运行时代码加载或启动对象