当前位置:   article > 正文

【Unity3D】场景切换、UGUI组件事件、开始游戏与关闭游戏_unitly按钮链接不到主页面

unitly按钮链接不到主页面

在《【Unity3D】公告栏与开始界面的布置》(点击打开链接)我曾经简单地提到UGUI是怎么布置与使用的,但这根本不完整,就像单身狗缺个另一半永远只能被喂狗粮似的,组件也因为事件的存在才能够精彩。因此,UGUI的事件设置也是很重要的,下面举个例子来说明,Unity3D中如何进行场景切换、UGUI组件事件、开始游戏与关闭游戏的。如下图所示:


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


具体做法如下。

一、开始场景Start

1、这一个场景的UGUI布置没什么好说的,就一个Canvas和Button,可以参详《【Unity3D】公告栏与开始界面的布置》(点击打开链接),自己利用矩形工具调好位置,设置好文字的大小之后。新建一个空物体,这物体之后用于附着脚本。


2、新建一个脚本StartScript,里面写下如下的代码,然后附着于空白物体GameObject上面,至于Unity3D的脚本具体怎么弄,可以参考《【Unity3D】Helloworld》(点击打开链接)。

  1. using UnityEngine;
  2. using System.Collections;
  3. public class StartScript : MonoBehaviour
  4. {
  5. // Use this for initialization
  6. void Start()
  7. {
  8. }
  9. // Update is called once per frame
  10. void Update()
  11. {
  12. }
  13. //之所以要如此复杂写一个函数接口,是因为UGUI事件函数需要。
  14. //理论上是可以直接写 public void OnStartGame(){Application.LoadLevel("Game");}
  15. //但这样一、不规范,二、脚本的复用性大大降低,如果这里有N个地方要实现场景撤换,那么则会有N个脚本
  16. //所以要这样写,我也不想弄这样的函数接口!-_-!
  17. public void OnStartGame(string sceneName)
  18. {
  19. Application.LoadLevel(sceneName);
  20. }
  21. }
另外再提一句,如果是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事件而已,不再赘述。

  1. using UnityEngine;
  2. using System.Collections;
  3. public class CloseScript : MonoBehaviour
  4. {
  5. // Use this for initialization
  6. void Start()
  7. {
  8. }
  9. // Update is called once per frame
  10. void Update()
  11. {
  12. }
  13. //这里还是无参数的,因为关闭游戏本身就不需要任何参数,好嘛-_-!
  14. public void OnCloseGame()
  15. {
  16. Application.Quit();
  17. }
  18. }
4、最后就是我们的重中之重,也就是这个游戏的最后一步了。编写RotationScript脚本如下,直接赋予给Cube这个物体。至于物体为甚可以旋转,请参考《【Unity3D】物体、材质的设置、物体位移与旋转》( 点击打开链接)。

  1. using UnityEngine;
  2. using System.Collections;
  3. public class RotationScript : MonoBehaviour
  4. {
  5. public float speed = 0f;//旋转的速度,循例初始化而已,其实这个值没任何意义,后面通过slider当前值赋予
  6. public float orientation = 1f;//旋转的方向,故意写成float而不是bool,省得类型转换了
  7. // Use this for initialization
  8. void Start()
  9. {
  10. }
  11. //如英文缩写的,这个函数里面的内容将会被每帧执行,也就是说,此乃死循环函数,永远被执行
  12. // Update is called once per frame
  13. void Update()
  14. {
  15. //让脚本被赋予者,用Vector3表示,永远在旋转
  16. transform.Rotate(Vector3.forward * Time.deltaTime * speed * orientation);
  17. transform.Rotate(Vector3.right * Time.deltaTime * speed * orientation);
  18. }
  19. //此函数接口将会被赋予给Slider的On Value Changed事件
  20. //Slider被滑动一下,此函数将会被触发,更新旋转速度
  21. public void ChangeSpeed(float newSpeed)
  22. {
  23. speed = newSpeed;
  24. }
  25. //此函数接口将会被赋予给Toggle的On Value Changed事件
  26. //(bool a)代表Toggle传过来的参数,虽然没用,但以免传接参数的时候有莫名其妙的错误
  27. //还是循例写上了
  28. public void ChangeOrientation(bool a)
  29. {
  30. if (orientation == 1f)
  31. {
  32. orientation = -1f;
  33. }
  34. else
  35. {
  36. orientation = 1f;
  37. }
  38. }
  39. }

之后对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没有做自适应屏幕,所以发布之前我们要做如下的调整,固定程序的分辨率。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/122409
推荐阅读
相关标签
  

闽ICP备14008679号