2015-06-08 45 views
0

我有一个UIpanel在我的申请,在运行时编程实例化游戏物体在里面,我的问题是我必须创造超过1000个gameobjects(有时高达6000),在该面板这需要很长时间来冻结UI,并且使用Coroutine尝试它也会导致一些滞后。
有没有什么办法可以在用户滚动该面板时获得一个游戏对象列表并在UI面板中创建它们?
或者有人可以建议一个更好的方式添加gameobjects面板没有任何滞后或UI冻结?有数据虚拟化

UPDATE:
我加入这个以清除我的目标。
我有我试图把它们放在一个列表中每个项目的项目一长串有图片的一些按钮和一些文字,下面有一个从单个项目的样本:

example of single item

现在我需要在面板中实例化这个复杂的示例,并且每个项目都会根据我在实例化后传递的ID进行更改。
但我有一个面板容量的问题,即使我削减了一些项目,当我把很多对象在面板上一次滚动面板使它非常缓慢和痛苦
也我需要一个滚动条,我的面板,所以我有有我所有的物体在面板

希望这些信息帮助可用。

回答

1

当你描述它的方式,它更清晰的&简单得多。

看任何移动应用程序:他们不把单页上6000分人的记录。它通常分页或分组,并带有搜索选项。相反,那样做。

如果你看看Facebook的移动应用程序(一个很好的标准),如果你开始滚动来看看旧帖子,每隔几秒钟就停顿了两秒钟加载下一个几个帖子。它与YouTube的应用程序相同。

因为这65535统一限制的,只是把寻呼限制(比如100-200项)。

+0

但如果我使用页面,我如何实现滚动条?我需要在侧面添加字母(就像联系人应用程序),以便在有人击中它时跳转到该信件 –

+0

http://unity3d.com/learn/tutorials/modules/beginner/ui有一些好东西在运行时创建滚动条和动态创建用户界面。 –

0

好吧,我刚刚写了一个测试程序,它生成了1000个文本UI元素。

public class MakeLoadsOfUI : MonoBehaviour { 

    public GameObject prefab; 
    // Use this for initialization 
    void Start() 
    { 
     MakeUI(); 

    } 

    void MakeUI() 
    { 
     float startTime = Time.realtimeSinceStartup; 
     for (int i = 0; i < 1000; i++) 
     { 
      int x=i/40, y=i%40; 

      GameObject obj = (GameObject)Instantiate(prefab); 
      obj.transform.SetParent(transform); // attack to the canvas 
      RectTransform rt = obj.GetComponent<RectTransform>(); 
      rt.anchoredPosition = new Vector2((x-10)*25, (y-10)*20); 
      obj.GetComponent<Text>().text = "UI:" + i; 
     } 
     float endTime = Time.realtimeSinceStartup; 
     Debug.Log("time taken:" + (endTime - startTime)); 
    } 
} 

1000个元素花了0.15秒,这是非常合理的。如果你有不同的结果,请详细说明,解释你是如何做到的。

+0

UIText非常微不足道。如果你实例化更复杂的对象,它会加载更长的时间... 1000确实是一个列表。您可以尝试合并对象并在显示对象时加载它们。 =>实例化X空的“单元格”,并在屏幕上用内容填充它们(asynchron => coroutine)。 –

+0

感谢您的回复@Mark,但有时我实例化了将近6000个gameobject,每个游戏对象至少有12个孩子需要很长时间,但最坏的情况是有时会给出canvas容量(不超过65535个顶点),或者如果我可以把很多画布6000可用的gameobject一次使得应用几乎无用并且一直冻结。我真的需要一种可视化这些物体的方法,因此他们不一定都在场景中。 –

+0

@MariusJunak我尝试了你的理论,但即使是6000个空的gameobject也使得应用程序变得缓慢且无用 –