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

Unity游戏优化脚本失效求助:移动时帧率骤降

问题排查与修复方案

核心问题分析

  1. OnTriggerExit2D逻辑错误:当前代码中,所有碰撞体离开触发区时都会执行禁用组件的操作,而非仅针对"PlayerDrawing"触发体。这会导致玩家移动时,物体频繁触发Enter/Exit(哪怕是和其他物体碰撞),反复启用/禁用SpriteRenderer、物理组件等,直接引发帧率暴跌。
  2. 触发体范围不合理:如果"PlayerDrawing"触发体尺寸过小,玩家移动时会反复进入/离开物体的触发区,高频触发状态切换操作,加剧性能消耗。
  3. 刚体约束判断逻辑错误: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;
    }
}

额外检查建议

  1. 调整触发体范围:将"PlayerDrawing"的碰撞体尺寸调整为玩家周围合理的范围(比如角色半径的1.5-2倍),避免移动时频繁触发Enter/Exit事件。
  2. 添加状态锁:可以在ObjectManager中添加bool isActive变量,避免在同一帧内重复执行启用/禁用操作,进一步优化性能:
    bool isActive;
    
    // 在OnTriggerEnter2D开头添加
    if (isActive) return;
    isActive = true;
    
    // 在OnTriggerExit2D开头添加
    if (!isActive) return;
    isActive = false;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:52:40