Unity是高度可视化编辑工具,但是难免有很多时候我们做UI需要动态创建UI元素,或者修改元素坐标、尺寸、锚点、轴心点等需求
前段时间正好遇到了这种需求,需要在UI界面上摆放一排带有动画的星星,但是星星的个数和位置是从配置表中读取的,不是固定的,这里我的解决方案是:
1、星星制作预设体
因为星星带有动画等属性,所以肯定是作为预设体放入Resources中动态实例化。
2、添加一个Image作为这些星星的父节点,主要是用来固定星星群的位置,用来做适配的
Image img = imgObj.AddComponent<Image>();
//设置透明度为0
img.color = new Color(0,0,0,1);
//查找父节点
Transform obj = this.transform.Find("BottomUI");
if(null != obj){
//设置父节点(父节点一定要在设置坐标、锚点、轴心点之前,否则会被转化掉)
img.transform.parent = obj.transform;
//设置轴心点
img.rectTransform.pivot = new Vector2(0.5f,0);
//设置本地缩放
img.rectTransform.localScale = new Vector3(1,1,1);
//设置锚点
img.rectTransform.anchorMin = new Vector2(0.5f,0);
img.rectTransform.anchorMax = new Vector2(0.5f,0);
//设置坐标(相对于锚点的坐标,注意rectTransform与Transform中的区别,localPosition是另一坐标系下的概念,这边不能混用)
img.rectTransform.anchoredPosition3D = new Vector3(0,483,0);
//星星个数+(星星个数-1)*间距
float w = maxStarNum*116 + 40*(maxStarNum-1);
//设置宽度和高度(下面两个方法都可以,都收锚点和轴心点的影响)
//img.rectTransform.sizeDelta = new Vector2(w,100);
var rt = img.GetComponent<RectTransform>();
rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, w);
rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 100);
3. 添加星星预设体
//添加星星预设体 for(int i = 1; i < maxStarNum+1; i++){ GameObject star = (GameObject)MonoBehaviour.Instantiate(Resources.Load("UIPrefabs/Star")); //设置坐标 star.transform.parent = img.transform; //设置锚点 Image starImg = star.transform.GetComponent<Image>() as Image; if(null != starImg){ starImg.rectTransform.pivot = new Vector2(0.5f,0.5f); starImg.rectTransform.localScale = new Vector3(1,1,1); starImg.rectTransform.anchorMin = new Vector2(0,0.5f); starImg.rectTransform.anchorMax = new Vector2(0,0.5f); starImg.rectTransform.anchoredPosition3D = new Vector3(((2.0f*i-1)/2.0f*116+40*(i-1)),0,0); } }
总体来说方法很简单,喜欢用代码更灵活的创建UI的同学可以尝试下。