在《【Unity3D】公告栏与开始界面的布置》(点击打开链接)我曾经简单地提到UGUI是怎么布置与使用的,但这根本不完整,就像单身狗缺个另一半永远只能被喂狗粮似的,组件也因为事件的存在才能够精彩。因此,UGUI的事件设置也是很重要的,下面举个例子来说明,Unity3D中如何进行场景切换、UGUI组件事件、开始游戏与关闭游戏的。如下图所示:
我们将设置2个场景,其中一个场景极其简单,只有“开始游戏”这个按钮,点击之后能进到我们的主场景,在主场景里面我们将设置slider和toggle控制一个cube的旋转。具体如下图所示:
具体做法如下。
一、开始场景Start
1、这一个场景的UGUI布置没什么好说的,就一个Canvas和Button,可以参详《【Unity3D】公告栏与开始界面的布置》(点击打开链接),自己利用矩形工具调好位置,设置好文字的大小之后。新建一个空物体,这物体之后用于附着脚本。
2、新建一个脚本StartScript,里面写下如下的代码,然后附着于空白物体GameObject上面,至于Unity3D的脚本具体怎么弄,可以参考《【Unity3D】Helloworld》(点击打开链接)。
using UnityEngine;
using System.Collections;
public class StartScript : MonoBehaviour
{
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
}
//之所以要如此复杂写一个函数接口,是因为UGUI事件函数需要。
//理论上是可以直接写 public void OnStartGame(){Application.LoadLevel("Game");}
//但这样一、不规范,二、脚本的复用性大大降低,如果这里有N个地方要实现场景撤换,那么则会有N个脚本
//所以要这样写,我也不想弄这样的函数接口!-_-!
public void OnStartGame(string sceneName)
{
Application.LoadLevel(sceneName);
}
}
另外再提一句,如果是Unity5.x可能会报过时,可以参考《【Unity3D】物体、材质的设置、物体位移与旋转》( 点击打开链接)写成SceneManager.LoadScene("XX");,其头文件是using UnityEngine.SceneManagement;,自求多福吧,我发现Unity5.x是个坑,文档少得可以,还是自觉退回Unity4.x继续学,以后估计就像Hibernate打死不用4.x一样,死守3.x阵线。
3、废话说多了,言归正传,将这个脚本付给空物体GameObject,还需要在Button设置这个事件,具体如下图所示。线画得有点乱,没有艺术修养的屌丝就这尿性,将就着看吧~
至此这个场景就做完了,Ctrl+S保存一下个场景,Save一下这个场景,命名为Start,这个场景叫啥没所谓,关键是一会儿你要创建的新场景叫啥,你这个OnClick()事件就传个啥名字给函数接口。
二、主场景Game
1、【File】->【New Scene】创建一个新场景,由于我们的Onclick表示要切到Game场景里面去,所以我们马上【File】->【Save Scene】一个叫Game就可以,然后Game场景我们需要布置如下的UI,具体如下图所示,除了Slider部分属性需要调整一下以外,其余没什么好说的,其中这里的Whole Numbers表示Slider是全条都可以使用,而不是一格一格的只有整数位,然后value意表开始的默认值为500:
2、接下来轻点上面的2D,切回3d视图,视角就没所谓了,反正在3D视角从来不好拖,我们直接设坐标算了,如《【Unity3D】物体、材质的设置、物体位移与旋转》(点击打开链接)所示,【GameObject】,布置一个【3D】->【Cube】和【Light】->【Directional Light】,Directional Light如果是Unity3D 5.x就本身自带。对Cube、Main Camera和Directional Light进行如下的调整。
3、之后就是对脚本的编写,首先,我们先从简单的关闭游戏按钮,事件入手,具体脚本如下,与上面设置开始游戏这个场景切换的道理完全一模一样,操作过场一模一样,就是新建一个CloseScript脚本赋予一个空物体GameObject,再对“关闭游戏”按钮设置OnClick事件而已,不再赘述。
using UnityEngine;
using System.Collections;
public class CloseScript : MonoBehaviour
{
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
}
//这里还是无参数的,因为关闭游戏本身就不需要任何参数,好嘛-_-!
public void OnCloseGame()
{
Application.Quit();
}
}
4、最后就是我们的重中之重,也就是这个游戏的最后一步了。编写RotationScript脚本如下,直接赋予给Cube这个物体。至于物体为甚可以旋转,请参考《【Unity3D】物体、材质的设置、物体位移与旋转》( 点击打开链接)。
using UnityEngine;
using System.Collections;
public class RotationScript : MonoBehaviour
{
public float speed = 0f;//旋转的速度,循例初始化而已,其实这个值没任何意义,后面通过slider当前值赋予
public float orientation = 1f;//旋转的方向,故意写成float而不是bool,省得类型转换了
// Use this for initialization
void Start()
{
}
//如英文缩写的,这个函数里面的内容将会被每帧执行,也就是说,此乃死循环函数,永远被执行
// Update is called once per frame
void Update()
{
//让脚本被赋予者,用Vector3表示,永远在旋转
transform.Rotate(Vector3.forward * Time.deltaTime * speed * orientation);
transform.Rotate(Vector3.right * Time.deltaTime * speed * orientation);
}
//此函数接口将会被赋予给Slider的On Value Changed事件
//Slider被滑动一下,此函数将会被触发,更新旋转速度
public void ChangeSpeed(float newSpeed)
{
speed = newSpeed;
}
//此函数接口将会被赋予给Toggle的On Value Changed事件
//(bool a)代表Toggle传过来的参数,虽然没用,但以免传接参数的时候有莫名其妙的错误
//还是循例写上了
public void ChangeOrientation(bool a)
{
if (orientation == 1f)
{
orientation = -1f;
}
else
{
orientation = 1f;
}
}
}
之后对Toggle组件设置使用Cube组件的ChangeOrientation函数,如下图:
最后对Slider组件的On Value Changed事件,设置使用Cube组件的ChangeSpeed函数,这里有个大坑,弄了我N久。如下图,大家注意到,这个选项有2个同名的ChangeSpeed函数。
具体有什么区别呢?请注意,如果你选择的ChangeSpeed后面不带参数的,意为,我要传当前Slider的值进public void ChangeSpeed(float newSpeed),也就是说Slider的值就是newSpeed的值,这也是我们这个程序需要的。
而,选择ChangeSpeed(float)的话,你会发现这sb的Unity3D非要你设置一个定值参数,如下图所示:
之后发现什么,大家对照着什么脚本想吧。这就意味着,传进public void ChangeSpeed(float newSpeed)的值永远是0,那么这个立方体永远不会动。
至此,整个程序做完了。Ctrl+S保存下这个场景。
三、发布时的部分调整
因为这里有两个场景,同时UGUI没有做自适应屏幕,所以发布之前我们要做如下的调整,固定程序的分辨率。