【Unity3D】场景切换、UGUI组件事件、开始游戏与关闭游戏
发表于2017-08-13
关于UGUI是怎么布置与使用的就不做介绍了,腾讯GAD上也有很多这方面的资料。下面这里要和大家介绍的是UGUI的事件设置,举个例子来说明,Unity3d中如何进行场景切换、UGUI组件事件、开始游戏与关闭游戏的。如下图所示:











我们将设置2个场景,其中一个场景极其简单,只有“开始游戏”这个按钮,点击之后能进到我们的主场景,在主场景里面我们将设置slider和toggle控制一个cube的旋转。具体如下图所示:

具体做法如下:
一、开始场景Start
1、这一个场景的UGUI布置没什么好说的,就一个Canvas和Button,自己利用矩形工具调好位置,设置好文字的大小之后。新建一个空物体,这物体之后用于附着脚本。

2、新建一个脚本StartScript,里面写下如下的代码,然后附着于空白物体GameObject上面。
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可能会报过时,写成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视角从来不好拖,我们直接设坐标算了,【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这个物体。
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没有做自适应屏幕,所以发布之前我们要做如下的调整,固定程序的分辨率。
