最近遇到了一个unity3D的笔试题,觉得挺有意思的就分享一下:
题目就是让用NGUI制作滚动列表,但是有这么几个要求:
(1) 滚动子项个数能代码定义.
(2) 滚动完毕后始终有一个子项出现在屏幕中央,滚动完毕后能调用spring运动回屏幕中央.
(3) 滚动子项在屏幕中央的时候,其xy轴自动放大1.2倍.
(4) 为了避免效率过低,请勿在Update类频繁刷新的接口里处理.
我这里用的NGUI是3.8.2版本,首先我们先来完成UI的铺设,在来完成上面的四点要求,
可以看到我这里的层级关系:一个背景图,一个panel,一个空物体。
第一步,在panel上添加一个UIScrollView;
第二步,在空物体上添加UIGrid。
第三步,在空物体下添加图片,给它加上UIDragScrollView
这里就基本设定好了初始的版本。
来看这个要求,第一步代码生成,我们给空物体上添加脚本,将空物体下的图片拖长预制。
public class test : MonoBehaviour {
public GameObject SpritePre;//图片预制体
private int childCount=5;//生成五张图片
void Awake () {
for (int i = 0; i < childCount; i++)
{
GameObject go = Instantiate(SpritePre);
go.name = i.ToString();
go.transform.SetParent(this.transform);
go.transform.localScale = Vector3.one;
go.GetComponent<UISprite>().depth = 1;
}
}
第二步滚动到中间,这个要给空物体添加UICenter OnChild,这样就居中了。
比较恶心的要求是第三第四个要求。这个怎么实现呢?学者这里显示用到
GetComponent<UICenterOnChild>().centeredObject.transform.localScale = new Vector3(1.2f, 1.2f, 1);
可是这样不符合要求啊,不能在Update里调用啊,这里学者用到了一个方法解决这个问题:
添加一个碰撞体,这里学者用了一个cube,勾上IsTrigger,将预制体添加一个tweenScale,给它添加一个脚本
void OnTriggerEnter(Collider other)//触发的时候动画执行
{
GetComponent<TweenScale>().PlayForward();
}
void OnTriggerExit(Collider other)//离开的时候动画恢复
{
GetComponent<TweenScale>().PlayReverse();
}
这样就达到了第三第四步的要求,变大而且没有在update里调用。
其实我们一直都用到的是鼠标放到图片上就变大,这个也很简单
给预制体添加一个UIButtonScale就可以了。