效果图
- 本文使用NGUI制作按钮,通过点击按钮,改变Cube(或其他带有MeshRenderer组件的对象)的材质来达到切换图片的效果。
操作步骤
-
1.新建工程,导入NGUI插件。
-
2.随意创建一个对象(如sprite),以创建UI Root,NGUI»Create»Sprite,删除Main Camera。
-
3.为了方便编辑,取消勾选Camera,让它暂时处于未激活状态
-
4.删除之前创建的sprite,在UI Root中创建一个Panel(用它来当容器,装之后创建的子对象),选中UI Root»NGUI»Create»Panel
-
5.选中Panel,创建Sprite(在场景中右键快捷创建或者NGUI»Create»Sprite创建),命名为Button-Next,将它拖放到合适位置。
-
6.选中Sprite,设置Atlas»设置Sprite»设置Sprite Type为Sliced(如果不做这个设置,后续添加碰撞器时将报错)
-
7.添加一个碰撞器,然后再添加Button脚本
-
8.创建一个lable用于显示按钮名称
-
9.导入图片制作材质
-
10.添加一个Cube(其它有Mesh Renderer的对象也行),设置大小和旋转,使得播放时能够看到图片,这里要注意的是,需要在3D模式下将Cube往UI层靠后拖动,以免挡住按钮UI,相机的CullingMask选择Everything
-
11.为Cube添加脚本SlideCube.cs(代码附于博文最后)
-
12.添加完成后为数组Mats手动附上材质
-
13.运行发现图片有些黑,为场景添加平行光即可
优化
-
14.你肯定会发现使用GetComponentsInChildren
()获取到的button的顺序是按照添加顺序来定的,这样太不稳定了,而且将button(UI)作为cube(gameobject)的子物体后,调整起来很不方便,改进代码附于博文最后。 -
15.将Cube拖拽到UI Button上,选择函数。
-
16.选择函数前后对比:
- 17.项目视图
拓展
代码
工程链接:https://github.com/caedmom/dEveloper/blob/master/Projects/Unity%20Projects/SlidePictures.rar
C#
//* 代码片断 1:初始代码
using UnityEngine;
using System.Collections;
public class SlideCube : MonoBehaviour {
public Material[] mats;
private UIButton[] btns;
//private UIButton btn_back;
private int index = 0;
private Renderer render;
// Use this for initialization
void Start () {
btns = this.GetComponentsInChildren();
//btn_back = this.GetComponentInChildren();
render=this.GetComponent();
}
// Update is called once per frame
void Update () {
EventDelegate.Add (btns[0].onClick,delegate() {
Debug.Log("click");
index=index==mats.Length-1?0:index+1;
Render();
});
EventDelegate.Add (btns[1].onClick,delegate() {
Debug.Log("click");
index=index==0?mats.Length-1:index-1;
Render();
});
}
void Render(){
render.material = mats[index];
}
}
//* 代码片断 2:改进代码
using UnityEngine;
using System.Collections;
public class SlideCube : MonoBehaviour {
public Material[] mats;
//private UIButton[] btns;
//private UIButton btn_back;
private int index = 0;
private Renderer render;
// Use this for initialization
void Start () {
//btns = this.GetComponentsInChildren();
//btn_back = this.GetComponentInChildren();
render=this.GetComponent();
}
// Update is called once per frame
void Update () {
Next ();
Back ();
Render();
}
public void Next(){
/*
EventDelegate.Add (btns[0].onClick,delegate() {
Debug.Log("click");
index=index==mats.Length-1?0:index+1;
Render();
});
*/
index=index==mats.Length-1?0:index+1;
}
public void Back(){
/*
EventDelegate.Add (btns[1].onClick,delegate() {
Debug.Log("click");
index=index==0?mats.Length-1:index-1;
Render();
});
*/
index=index==0?mats.Length-1:index-1;
}
void Render(){
render.material = mats[index];
}
}
</code></pre>