用Toggle控件切换背景.docx
- 文档编号:11875007
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:18
- 大小:1.43MB
用Toggle控件切换背景.docx
《用Toggle控件切换背景.docx》由会员分享,可在线阅读,更多相关《用Toggle控件切换背景.docx(18页珍藏版)》请在冰豆网上搜索。
用Toggle控件切换背景
用Toggle控件切换背景
该工程运行时,显示第一张背景:
当单击Toggle控件“背景2”时,会关闭第一个背景,显示出第二个背景:
余下的背景3、背景4、背景5依此类推,下面我们来详细地介绍怎样用Unity来实现。
启动Unity(本文Unity版本为5.0),在Hierarchy视图中单击Create按钮创建2DObject的Sprite(图像精灵),如下图:
创建后,从其SpriteRenderer属性可看出,其Sprite图像精灵的类型为Sprite:
下面我们为其准备图像。
先创建一些文件夹:
把事先准备好的几张图片导入Images文件夹中:
不过这些图片还是普通的纹理图片,我们全选这些图片,在其Inspector视图中,单击TextureType,将其纹理类型设为Sprite(2DandUI):
然后单击“Apply”,应用后,这5张图片就转换成Sprite了:
接着,我们把第一张图片拖到
中即为我们刚才所创建的2DObject对象赋了源图像了,接着,我们把此对象更名为bg1,同时将摄像机MainCamera拖到bg1下,使其成为bg1的子物体,并同时调整摄像机的位置以及其FieldofView的值,使摄像机显示的图像充满整个屏幕:
以同样的方法再创建4个(也可按Ctrl+D复制后更换不同的图片精灵):
然后创建一个空对象,并命名为bg,将bg1至bg5做为它的子物体:
不过,因此时有多个摄像机,而每个摄像机里都有
组件,所以会出现警示:
有5个音频侦听器在现场,请确保总有一个音频侦听器在现场
打个比方,一个人不可能长5对耳朵,所以一个场景里不能有5个音频侦听器。
我们去掉其中4个摄像机上的音频侦听组件,保留一个摄像机上的侦听器即可。
此时运行,显示的是bg5背景,因bg5排在最上边
,而我们的设计思想是通过Toggle来控制,程序运行的起初,应显示bg1,隐藏其余4个,当我们单击某个Toggle时,就显示对应的背景,隐藏先前的背景。
所以这里要做一设置,把bg2至bg5的控制其显示的属性的对勾去掉,这样在程序运行的起初,就会只显示bg1,隐藏其余4个了。
接下来,创建画布Canvas,在画布上创建一空物体GameObject,在空物体下创建5个Toggle子物体Toggle1、Toggle2、Toggle3、Toggle5、Toggle5:
Toggle控件默认是复选,现在我们要把它们变成单选。
选中GameObject父控件,在其Inspector视图中单击AddComponent按钮,在弹出的菜单中选择并单击UI后选择ToggleGroup:
这样就为此父控件添加上了ToggleGroup组件了。
然后全选Toggle1至Toggle5:
将已经添加上了ToggleGroup组件的父控件GameObject拖至它们的Inspector视图中的Group属性里,这样这5个Toggle控件就成了一组单选控件了:
接下来,编写代码,以达到单击Toggle控件时,出现对应背景的功能:
usingUnityEngine;
usingSystem.Collections;
usingUnityEngine.UI;
usingUnityEngine.EventSystems;
publicclassswith:
MonoBehaviour{
privateGameObjectroot;
privateGameObjectoldobj=null;
privateGameObjectnewobj=null;
//Usethisforinitialization
voidStart(){
root=GameObject.Find("bg");
oldobj=root.transform.Find("bg1").gameObject;
}
publicvoidgh(){
strings=EventSystem.current.currentSelectedGameObject.name;
switch(s){
case"Toggle1":
newobj=root.transform.Find("bg1").gameObject;
oldobj.SetActive(false);
oldobj=newobj;
oldobj.SetActive(true);
break;
case"Toggle2":
newobj=root.transform.Find("bg2").gameObject;
oldobj.SetActive(false);
oldobj=newobj;
oldobj.SetActive(true);
break;
case"Toggle3":
newobj=root.transform.Find("bg3").gameObject;
oldobj.SetActive(false);
oldobj=newobj;
oldobj.SetActive(true);
break;
case"Toggle4":
newobj=root.transform.Find("bg4").gameObject;
oldobj.SetActive(false);
oldobj=newobj;
oldobj.SetActive(true);
break;
case"Toggle5":
newobj=root.transform.Find("bg5").gameObject;
oldobj.SetActive(false);
oldobj=newobj;
oldobj.SetActive(true);
break;
}
}
}
下面我们着重对阴影底纹部分的代码加以解释。
usingUnityEngine.UI;
usingUnityEngine.EventSystems;
因我们要使用UI,所以要引用其命名空间usingUnityEngine.UI。
同时程序中还有如单击等事件出现,所以我们还要引用事件系统的命名空间usingUnityEngine.EventSystems。
root=GameObject.Find("bg");
oldobj=root.transform.Find("bg1").gameObject;
这部分正好体现了Find()函数的两种主要使用方式:
GameObject.Find与Transform.Find
下面是Unity中文API参考手册里的一些相关内容
GameObject.Find查找
staticfunctionFind(name:
string):
GameObject
找到并返回一个名字为name的游戏物体。
如果以name为名字的游戏物体没有被找到,则返回空.如果name中包含'/'字符,这个名称将被视作一个hierarchy中的路径名.这个函数只返回活动的游戏物体。
除非迫不得已,建议不要在每一帧中使用这个函数。
可以在开始的时候用一个成员变量来缓存结果或者使用GameObject.FindWithTag函数。
Transform.Find查找
functionFind(name:
string):
Transform
通过名字查找子物体并返回它。
如果没有查找到子物体名字,将返回null。
如果名字包含“/”字符它将向路径一样穿越层次。
GameObject.Find返回的是GameObject,所以可以root=GameObject.Find("bg")直接赋给GameObject对象root。
Transform.Find返回的不是GameObject而是Transform,所以不能直接赋给GameObject类型的oldobj。
而Transform中有一继承的成员变量gameObject如下:
Inheritedmembers继承成员
InheritedVariables继承变量
……
∙particleEmitter
TheParticleEmitterattachedtothisGameObject(nullifthereisnoneattached).
ParticleEmitter附加到GameObject(游戏物体)(如无附加则为空)。
∙gameObject
Thegameobjectthiscomponentisattachedto.Acomponentisalwaysattachedtoagameobject.
组件附加的游戏物体。
一个组件总是被附加到一个游戏物体。
∙tag
Thetagofthisgameobject.
游戏物体的标签。
……
所以我们要通过oldobj=root.transform.Find("bg1").gameObject;这种形式来给oldobj赋值。
我们把这句分解一下,root.transform意思是root(这里就是bg这个父物体)的transform,root.transform.Find("bg1")意思是在bg中查找名为bg1的子物体的transform组件,root.transform.Find("bg1").gameObject意思是在bg中找出名为bg1的子物体的transform组件并取出它的gameObject游戏物体出来。
strings=EventSystem.current.currentSelectedGameObject.name;整句的大概意思是把当前选中的游戏物体的名字赋给变量s
在面向对象程序设计里,一切皆对象。
在Unity里,一切皆游戏物体。
所以象Toggle这样的控件也是游戏物体。
所以当我们单击了Toggle1时,该句代码就会取出它的名字出来赋给变量s,那么在接下来的代码中:
case"Toggle1":
newobj=root.transform.Find("bg1").gameObject;
oldobj.SetActive(false);
oldobj=newobj;
oldobj.SetActive(true);
break;
如果s的值为”Toggle1”,首先会在bg中找出名为bg1的子物体的transform组件并取出它的gameObject游戏物体赋给newobj:
newobj=root.transform.Find("bg1").gameObject
newobj代表新的游戏物体,即要显示出来的背景。
oldobj.SetActive(false);oldobj代表是旧的游戏物体,即先前显示的背景,SetActive(false)的功能就是设置其活动状态为假,即不显示出来,隐藏起来,相当于在编辑状态下将其Inspector中的对勾去掉:
oldobj=newobj;将新的游戏物赋给旧的游戏物体,因针对下一次来说,现在的新就是下一次的旧。
oldobj.SetActive(true);设置当前游戏物体处于显示状态。
余于代码的原理与此相似,大家可自行推想。
剩下的工作就是关联事件了。
首先我们要把脚本挂在游戏对象上,它才能正常运行,我们就把它附在父物体GameObject上吧,挂上的方法很简单,先选中GameObject,然后把脚本文件拖到的Inspector面板的空白处即可,如下图的示:
然后同时选中Toggle1至Toggle5,将挂上了脚本的GameObject物体拖至它们的事件委托对象上,如下图:
接下来为它们指定事件处理方法,单击方法添加框,选择我们自己编写的脚本swith中的gh()方法,如下图:
这样就为这些Toggle控件指定了事件处理功能了。
至此,我们想要的功能就算全部达到了,可运行起来看效果了。
不过,如果想做得比较完美的话,这里还有一个关于Toggle控件的完善问题。
请看下图:
默认情况下,Toggle是复选,怎样变成单选已在前面叙述了。
然而,虽然是单选,其中被选中后的图像仍是一个对勾,如图中下边的背景5所示,我们应像背景1那样,手工变成一个圆点。
下面介绍一下怎样更改。
首先我们先来看一下Toggle的结构:
它有两个子物体Background与Label和一个孙物体Checkmark,我们分别选中它们后把它们移开,分解后的情况如下图所示:
Background与Checkmark都是Image组件,这里我们只需将Checkmark的
源图像属性值变为一个点的图像即可达到要求了,因Chemcmark代表的是控件被选中后显示的图片。
单击后面的小圆圈,在弹出的窗口中选择系统自带的Knob,如下图:
然后将
中的Color设成除白色之外的其他你想要的颜色(因背景图色是白色)即可。
不过,这个圆点也许很大,可能与背景一样大,而且位置也有可能变了,我们再利用调整工具把它调小一些,并调整其位置,使其在背景的中心,就可达到要求了。
hf662820151011
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Toggle 控件 切换 背景