所以我有一个多类别的按钮,在每个类别中有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]);
}有什么解决方案可以提高性能吗?
所以这里是关于预置的内容:基本上预置包括背景图像,蒙版图像在这个图像分类图像,选择图像和一个文本。在init函数中,类别图像更改和文本值更改也包含在init设置中的背景按钮,该按钮的单击事件

发布于 2021-08-12 07:08:54
如果您知道类别和类别项的最大数量,则不必实例化它们。您可以根据物品的数量使用您激活和停用的插槽。在激活期间,您还可以将它们绑定和解除绑定到对象,您可以使用这些对象将正确的精灵和文本分配给按钮元素。
如果你事先不知道分类项目的数量,你仍然可以这样做,但如果有很多项目,从用户的角度来看,使用分页也是更可取的。
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-12 06:33:50
如果你的实例化对象是一个普通的对象,你可以通过预置来改进它,避免每次实例化和销毁这个对象。您有一个很好的工作流here示例
https://stackoverflow.com/questions/68752281
复制相似问题