Unity游戏优化脚本失效求助:移动时帧率骤降
问题排查与修复方案
核心问题分析
- OnTriggerExit2D逻辑错误:当前代码中,所有碰撞体离开触发区时都会执行禁用组件的操作,而非仅针对"PlayerDrawing"触发体。这会导致玩家移动时,物体频繁触发Enter/Exit(哪怕是和其他物体碰撞),反复启用/禁用SpriteRenderer、物理组件等,直接引发帧率暴跌。
- 触发体范围不合理:如果"PlayerDrawing"触发体尺寸过小,玩家移动时会反复进入/离开物体的触发区,高频触发状态切换操作,加剧性能消耗。
- 刚体约束判断逻辑错误:
rb2D.constraints != RigidbodyConstraints2D.FreezeAll || rb2D.bodyType != RigidbodyType2D.Kinematic使用||会导致不必要的约束重置操作,进一步增加性能开销。
修复后的代码
ObjectManager 脚本
using UnityEngine; [RequireComponent(typeof(ObjectParameters))] public class ObjectManager : MonoCache { public SpriteRenderer[] spriteRenderers; [Space] public ObjectParameters objectParameters; [Space] [SerializeField] bool freezeRotation; bool isBuilded; [Space] public bool usingDragging = true; [Space] [SerializeField] bool usingRigidBody; Rigidbody2D rb2D; float gS; [Space] [SerializeField] bool usingSheetDrop; SheetDrop sheetDrop; void Start() { rb2D = GetComponent<Rigidbody2D>(); objectParameters = GetComponent<ObjectParameters>(); sheetDrop = GetComponent<SheetDrop>(); if (usingRigidBody) { rb2D.constraints = RigidbodyConstraints2D.FreezeAll; gS = rb2D.gravityScale; } if (usingSheetDrop) { sheetDrop.enabled = false; } objectParameters.enabled = false; foreach (var renderer in spriteRenderers) { renderer.enabled = false; } } private void OnTriggerEnter2D(Collider2D collision) { if (collision.tag == "PlayerDrawing") { if (usingRigidBody) { // 恢复重力与约束 rb2D.gravityScale = gS; rb2D.constraints = freezeRotation ? RigidbodyConstraints2D.FreezeRotation : RigidbodyConstraints2D.None; } if (usingSheetDrop) { sheetDrop.enabled = true; } objectParameters.enabled = true; foreach (var renderer in spriteRenderers) { renderer.enabled = true; } } } private void OnTriggerExit2D(Collider2D collision) { // 仅当离开PlayerDrawing触发体时执行禁用逻辑 if (collision.tag == "PlayerDrawing") { if (usingRigidBody) { // 修正判断逻辑:仅当需要时重置约束 if (rb2D.constraints != RigidbodyConstraints2D.FreezeAll && rb2D.bodyType != RigidbodyType2D.Kinematic) { rb2D.constraints = RigidbodyConstraints2D.FreezeAll; } } if (usingSheetDrop) { sheetDrop.enabled = false; } objectParameters.enabled = false; foreach (var renderer in spriteRenderers) { renderer.enabled = false; } } } }
ObjectParameters 脚本(无需修改,仅优化细节)
using UnityEngine; public class ObjectParameters : MonoCache { public Dragging dragging; public Rigidbody2D rb; public Vector3 position; public Quaternion rotation; ObjectManager objectManager; Transform transform_; void Start() { objectManager = GetComponent<ObjectManager>(); transform_ = transform; rb = GetComponent<Rigidbody2D>(); } public override void OnTick() { position = transform_.position; rotation = transform_.rotation; } }
额外检查建议
- 调整触发体范围:将"PlayerDrawing"的碰撞体尺寸调整为玩家周围合理的范围(比如角色半径的1.5-2倍),避免移动时频繁触发Enter/Exit事件。
- 添加状态锁:可以在ObjectManager中添加
bool isActive变量,避免在同一帧内重复执行启用/禁用操作,进一步优化性能:bool isActive; // 在OnTriggerEnter2D开头添加 if (isActive) return; isActive = true; // 在OnTriggerExit2D开头添加 if (!isActive) return; isActive = false;
内容的提问来源于stack exchange,提问作者unwritten_k
相关产品推荐
相关产品推荐

