0

所以我有多个类别按钮,每个类别有 20 多个项目。因此,按下按钮时制作预制件并实例化。问题是当我实例化预制件时,我必须使用名称、精灵、btn 点击事件等信息对其进行初始化。这将需要时间来实例化预制件和游戏挂起。这是代码

        for (int i = 0; i < prefab.Length; i++)
        {
            GameObject go = Instantiate(basePrefab) as GameObject;
            go.SetActive(true);
            go.transform.SetParent(prefabParent, false);
            go.transform.localScale = Vector3.one;
            go.GetComponent<Category>().Init(prefab[i]);
        }

此代码在按钮单击中调用。或者,为了在 start 方法中实现一些性能,我已经在一个空的游戏对象上实例化了一些 basePrefab,并且在按钮单击时只需更改父级并初始化它们。这种方法会带来一些好处,但游戏仍然会挂起 2 秒这是代码

        for (int i = 0; i < prefab.Length; i++)
        {
            GameObject go = InstantiatedGameObject[i];
            go.SetActive(true);
            go.transform.SetParent(prefabParent, false);
            go.transform.localScale = Vector3.one;
            go.GetComponent<Category>().Init(prefab[i]);
        }

任何提高性能的解决方案?

所以这里是关于预制内容:基本上预制包含背景图像,此图像中的蒙版图像类别图像,选择图像和文本。在初始化函数中类别图像更改和文本值更改此外背景包含初始化中的按钮设置此按钮的单击事件这是图像

4

2 回答 2

0

如果您的实例化对象是一个普通对象,您可以改进它池化预制件,避免每次都实例化和销毁该对象。您在这里有一个很好的工作流程示例

于 2021-08-12T06:33:50.243 回答
0

如果您知道类别和类别项目的最大数量,则不必实例化它们。您可以使用根据项目数量激活和停用的插槽。在激活期间,您还可以将它们绑定和取消绑定到可用于将正确的精灵和文本分配给按钮元素的对象。

如果您事先不知道类别项目的数量,您仍然可以这样做,但如果有很多项目,从用户的角度来看,这可能更可取。


public class SomeUI : MonoBehavior
{
    public GameObject categorySlotsParent;
    public GameObject categoryItemSlotsParent;
    public Category[] categories;
    
    CategorySlot[] categorySlots;
    CategoryItemSlot[] categoryItemSlots;

    public void Awake(){
        
        categorySlots = GetComponentsInChildren<CategorySlot>();
        categoryItemSlots = GetComponentsInChildren<CategoryItemSlot>();
        AssignCategories(categories);
        
        if(categories.Length > 0 && categories[0] != null)
            SelectCategory(categories[0]);
    }
    
    void AssignCategories(Category[] categories){
        
        for(int i = 0; i < categorySlots.Length;  i++){
            if(i < categories.Length)
            {
                categorySlots[i].SetActive(true);
                categorySlots[i].AssignCategory(categories[i]);
            }
            else
            {
                categorySlots[i].SetActive(false);
                categorySlots[i].AssignCategory(null);
            }
        }
    }
    
    void AssignCategoryItems(CategoryItem[] categoryItems){
        
        for(int i = 0; i < categorySlots.Length;  i++)
        {
            if(i < categoryItems.Length)
            {
                categoryItemSlots[i].SetActive(true);
                categoryItemSlots[i].AssignCategoryItem(categoryItems[i]);
            }
            else
            {
                categoryItemSlots[i].SetActive(false);
                categoryItemSlots[i].AssignCategoryItem(null);
            }
        }
    }
    
    void SelectCategory(Category category){
        AssignCategoryItems(category.categoryItems);
    }
}
于 2021-08-12T07:08:54.197 回答