【unity scenemanager】在Scene中构造好物体,Game中显示不出来

Unity 中场景切换 - 推酷
Unity 中场景切换
Unity游戏开发中,单个Scene解决所有问题似乎不可能,那么多个Scene之间的切换是必然存在。如果仅仅是切换,似乎什么都好说,但是在场景比较大的时候不想让玩家等待加载或者说场景与场景之间想通过一些画面、动画表现出一些让玩家期待的东西,大家就要去认真考虑。这篇文章主要介绍两种增加切换中如何播放画面或者动画等等,提高玩家的浸入感,当然你也可以做成
1 操作基础函数
Loads the level by its name or index.
加载场景,加载之前你需要把场景在 Build Settings添加,场景加载后,场景中的激活物体会调用MonoBehavior:OnLevelWasLoaded().使用该方法的时候,之前场景中的物体将会被直接删除。
LoadLevelAdditive
Loads a level additively. 该方法不销毁当前场景中的物体,新场景中的物体将会被添加进来,这个方法在一些连续加载的场景中非常有用哈。
LoadLevelAdditiveAsync
Loads the level additively and asynchronously in the background. 在后台异步记载场景 unity会在后台线程中加载所有的场景资源,这就允许你在加载新场景过程中播放一个进度条或者通过异步加载为玩家创造一个流程的世界 该方法会返回 AsyncOperation结构,结构中 isDone表示是否完成, progress给出当前的播放进度。注意的是在编辑器中后台线程的性能要低于游戏中。
LoadLevelAsync
Loads the level asynchronously in the background. 在后台异步记载场景 unity会在后台线程中加载所有的场景资源,这就允许你在加载新场景过程中播放一个进度条或者通过异步加载为玩家创造一个流程的世界 该方法会返回 AsyncOperation结构,结构中 isDone表示是否完成, progress给出当前的播放进度。注意的是在编辑器中后台线程的性能要低于游戏中。
LoadLevel和LoadLevelAsync,在加载完成后之后将会立刻销毁原先场景中的物体,而 LoadLevelAdditive和 LoadLevelAdditiveAsync 加载后将会保留原先的场景中的物体,这种方式可以实现无缝融合的场景,只需要你在适当的位置加载后面的场景,不过你还是要考虑资源的释放问题。
同步还是异步
&&&& 异步加载能够获得加载过程的进度和是否加载完成,通过这种方式你可以在切换中增减进度条或者其他表现,这种方式一般通过协程完成:
public class ExampleClass : MonoBehaviour
IEnumerator Start()
AsyncOperation async = Application.LoadLevelAsync(&MyBigLevel&);
yield return async;
Debug.Log(&Loading complete&);
需要注意的是:在使用之前需要在
Build Settings
中 添加Scene。
2 切换画面实现方法
场景切换中实现画面或者动画的方式有很多种,我现在看到的主要有两种,这里大致做下两种方式:
第一种方式:
增加新场景的方式可以参考雨松的博客:
,增加新场景的优点是增加了很多的灵活性,你在中间过渡场景中增加视频播放、图片或者是GUI,缺点就是如果你想在实现通用性,就需要顶层做一些数据辅助,比如加载前的场景中设置好切换时播放的图片到顶层数据管理模块中,在浸入切换场景后在获取这些数据,根据这些数据来切换播放的动画等等。
左图为测试工程中三个场景,Pre为当前场景,Middle为切换场景,Next是需要加载的场景。右图为middle场景中的存在的物体,挂有实现脚本。 案例逻辑:Pre场景中直接进入middle场景,在middle场景中预先加载Next场景,确保新场景加载完之后不会立刻显示Next的场景,而是等待用户的触摸或者点击操作
具体的操作过程:
(1)在Pre场景中使用同步加载方法直接进入middle场景,因为Middle场景非常小,所以这个过程会非常快
Application.LoadLevel(&Middle&);
(2)Middle场景的逻辑
public class NewBehaviourScript2 : MonoBehaviour
Texture BackImage = null;
private AsyncOperation async = null;
void Start ()
//此物体在下一个场景中不会被销毁
DontDestroyOnLoad(this);
//开始加载场景
StartCoroutine(&LoadScene&);
//异步加载
IEnumerator LoadScene()
async = Application.LoadLevelAsync(&Next&);
yield return async;
Debug.Log(&Complete!&);
void OnGUI()
//切换场景中的背景,可以是图片或者动画,或者~~
GUI.DrawTexture(new Rect( //加载过程中显示进度,也可以是进度条
if (async != null && async.isDone == false)
GUIStyle style = new GUIStyle();
style.fontSize = //在加载结束后,弹出是否下个场景,模拟手游中&触摸任意位置进入游戏&
if (async != null && async.isDone == true)
if (GUI.Button(new Rect( Destroy(this);
A 场景中添加一个占满全屏的背景图,当然也可以使用动画、视频等,场景加载后马上开始加载下一个场景(异步),根据异步加载进度进行进度条、动画等等进度控制
B 注意:MiddleObj物体被设置为
,也就是在新的场景中不销毁,即使在新场景加载后也会占满全屏的背景仍然存在,直到物体被销毁
C MiddleObj物体销毁的方式有两种,一种是手动方式,就像下面代码中使用的,点击Middle场景中的按钮销毁自己 ,另外一种自动方式是在新场景(Next场景)中的
MonoBehavior:OnLevelWasLoaded()函数中销毁该物体。
void OnLevelWasLoaded(int level)
GameObject obj = GameObject.Find(&MiddleObj&);
if (obj != null)
GameObject.Destroy(obj);
雨松在实现新加载场景中先将场景中的所有物体隐藏,场景切换之后再慢慢的显示出来,而不是通过
的方式,也是一种办法哈。如果想要把这种方式设计为通用模式,可以增加一个数据管理器,在加载前提前设置好需要的图片、动画资源等内容,OK ,就可以在多个场合使用啦。
第二种方式使用prefab
这种方式和第一种方式原理上其实类似,只不过不使用新的场景,而是在Pre场景中增加类似于上面Middle场景中的MiddleObj物体中的逻辑,并且设置为
。这种方式中可以参考的就是
场景管理插件,
的使用可以参考:
具体使用我就不多说了哈,咱先看看其实现的关键原理: SceneManger使用异步加载新场景,进入加载之后,就会根据选择使用不同的屏幕效果,并且这个效果是不会在新场景中消失的,直到需要的效果目标达到,就会显出出先场景。 SceneManger 提供了一些列的屏幕效果Prefab以及场景管理方式,很不错的插件哈。&&&&&&
测试代码下载:
l976 ,内带有SceneManager 插件(花15大洋买的)
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致3.1.5 Scene视图
本文所属图书&>&
本书结合Unity这种多平台的集成引擎和编辑器,介绍如何使用Unity创建游戏、添加交互性,以及修饰游戏并发布游戏的所有知识。本书分为五部分,每一章都介绍一个独立的概念,并且循序渐进地讲述新的概念,还使用一...&&
Scene视图是编辑器中最重要的视图之一&&它是游戏世界或是关卡的一个可视化表示(见图3-7)。在这里可以对Hierarchy视图中的所有物体进行移动、操纵和放置,创建供玩家进行探险和交互的物理空间。
正如你所看到的,在Hierarchy视图中列出的对象都会在Scene视图中显示出来。可以在Hierarchy视图中单击对象的名字来选中它,或是在Scene视图中手动单击它。在Scene视图或是Hierarchy视图中单击不同的对象,将会在Inspector视图中显示该对象所对应的数据。
注意 如果你在Hierarchy视图中可以看到对象列表,但是Scene视图看上去空空如也,可能是你的Scene视图缩得太小了,以至于无法看到各个资源。要修正这个问题,可以在Hierarchy视图中选中某个对象,移动鼠标指针并让它悬停在Scene视图上,随后按F键来放大显示。
注意,通过在Hierarchy视图中单击Primitives对象,你实际上在Scene视图中选择了它所有的子对象。在Scene视图中并不会显示一个单独的&Primitives&对象,所以,如果想要选择某个父节点之下的所有对象,必须在Hierarchy视图中这样做。
1. 摄像机导航
学会怎样在Scene视图中迅速移动,是使用编辑器时需要掌握的最重要的方面之一(如果你会使用Autodesk& Maya,很可能会熟悉这些控制方法)。你可以把Scene视图想象成为一个虚拟摄像机的输出或焦点。为了在场景中进行移动,你需要移动摄像机的视野,就好像你在看着不同的对象。
? Tumble(旋转,Alt+鼠标左键):摄像机会以任意轴为中心进行旋转,从而旋转视图。
? Track(移动,Alt+鼠标中键):在场景中把摄像机向左、向右、向上和向下移动。
? Zoom(缩放,Alt+鼠标右键或是鼠标滚轮):在场景中缩小或放大摄像机视角。
? Flythrough(穿越)模式(鼠标右键+WASD键):摄像机会进入&第一人称&模式,使得你可以在场景中迅速地移动和缩放。
? Center(居中,选择游戏对象并按F键):摄像机会放大并把选中的对象居中显示在视野中。鼠标光标必须位于Scene视图中,而不是在Hierarchy视图中的对象上方。
? Full& Screen(全屏)模式(空格键):按下空格键可以使得当前激活的视图占据编辑器所有可用的显示空间。再次按下它可以返回之前的布局。当前激活的视图就是鼠标所悬停的视图。
如果你的鼠标只有一个键(或者你只希望使用鼠标左键),也不会完全无法使用所有的功能;别担心。在工具栏中选择&手形&工具(或是在键盘上按Q键),让鼠标进入&移动&(Move)模式。
? Tumble(Alt+鼠标键):摄像机会以任意轴为中心进行旋转,从而旋转视图。
? Track(鼠标键):在场景中把摄像机向左、向右、向上和向下移动。
? Zoom(Ctrl+鼠标键):在场景中缩小或放大摄像机视角。
尝试不同的移动控制,直到越来越熟悉和习惯它们。能够在游戏场景中精确地迅速移动,这会使你的开发过程更为迅速并且更为愉快。
Scene视图还包含一个名为Scene gizmo的特殊工具,如图3-8所示。这一特殊工具使你可以迅速地获取场景摄像机的朝向,从而迅速地把摄像机视角切换到预设的视角上。
术语 gizmo就是一个图标或者记号,它通常用来表示那些在真实世界中没有可视化表示的东西。在3D程序(例如Unity)中,通常使用gizmo来表示移动和摄像机控制。
尝试单击Scene gizmo上的各个箭头来看看Scene视图如何更新。每个箭头改变摄像机的视角,使其沿着一个不同的正交(orthogonal)或是二维方向,例如,上、后、前、右(参见图3-9)。有时你想要切换到这些视角中的某一个,以便在场景中正确地排列一个对象。单击这一gizmo中的居中立方体图标,可以把Scene视图恢复到默认的透视(Perspective)视图。
注意 在某些侧视图中,Plane(平面)对象可能看上去就像是消失了,这是因为它是一个2D对象&&平面通常使用两条坐标轴来进行定义,并且没有高度。如果你的任何2D对象看上去像是消失了,请切换到一个不同的正交视图。
如果你按Shift并单击中间的立方体,会进入和透视视图类似的一个模式,它叫做等距(isometric)视图。透视视图模拟一个真实的三维空间,随着对象越来越远,它们会变得越来越小。然而,在等距视图中,随着对象越来越远,它们的大小和形状并不会改变,而是保持相同的大小;这个摄像机视角缺乏对透视的模拟。你可能在某些较老的游戏中见过它(参见图3-10)。
还需要注意,每个箭头的颜色和游戏世界中某条坐标轴的颜色是匹配的:红色对应于X轴,绿色对应于Y轴,蓝色对应于Z轴。Unity的工作区使用笛卡尔坐标系统,X和Z构建了地平面,Y轴定义了游戏世界的高度和深度。游戏世界的中心位于这三条轴的交点,也就是原点(0,0,0)。这通常用向量标记方式表示为x=0、y=0、z=0,或者更通用地表示为(x,y,z)。
注意 如果你更习惯于使用与默认颜色不同的颜色来表示游戏世界的坐标轴,可以单击Edit&Preferences&Colors,然后修改你喜欢的任何颜色。
图3-11中所显示的Scene视图的控制栏可以改变摄像机查看场景的方式。其默认设置可以使你对于场景在游戏中渲染后的样子有一个很好的认识,它还会显示一个网格以帮助你定位和移动对象。
第一个下拉列表(绘制模式)可以控制在游戏场景中对象是怎样绘制的。默认值为Textured(带有贴图的)&&即对象会使用你为其指定的颜色或贴图进行绘制。单击这个菜单把绘制模式修改为Wireframe(线框)&&这会显示对象的物理网格,而不带有任何贴图。最后的选项,Tex?Wire(带有贴图的线框)会把对象的贴图和它们的线框叠加在一起显示。这些选择中的任何一个都不会改变游戏的显示方式,它只会改变你在Scene视图中查看这些对象的方式。
2. 高级视图操作
如果想要通过对对象进行微调来优化你的游戏场景,那么Render Modes(渲染模式)下拉列表是非常有用的。默认值(RGB)会以通常情况下带有颜色的方式来显示所有的对象。
在下拉列表里面选择Alpha,会使用对象的Alpha值来显示场景中的所有对象&&完全不透明的对象会用白色渲染,完全透明的对象会用黑色渲染,半透明的对象会使用不同深度的灰色渲染。Overdraw模式会显示场景中有多少时间是消耗在重复绘制上。最后一个选项Mipmaps会试图显示对象所使用的最理想的贴图大小。使用蓝色绘制的对象的贴图太小了,而使用红色绘制的对象的贴图太大了。当然,这并不一定是完全正确的,它取决于游戏的分辨率。
Scene Lighting(场景光照)按钮可以在Scene视图是使用默认的内置光照还是使用你自己实现的光照之间来回切换。如果你没有在场景中放入任何光源,使用内置光照设置会比较有用。最后一个切换按钮Scene Overlay(场景叠加)可以对摄像机进行更新,使得场景的显示方式就像在游戏中一样&&网格隐藏了,其他的效果(如雾化效果、GUI元素以及天空盒)也会渲染。
尝试使用不同的选项来看看它们的效果。
3. 操作对象
除了把摄像机视角四处移动以外,还需要在场景中重新定位和移动对象。这些操作称为对象变换(object transform),它们可以处理任意选中对象的位置、旋转和大小(相对尺寸)。对象变换方式有以下两种方式:可以在Inspector视图中为这些变换输入新的值,也可以通过gizmo手动地移动和操作这些对象。
在Hierarchy视图或者Scene视图中单击Sphere对象,以使其信息显示在Inspector视图中,如图3?12所示。每个对象列出的第一个属性就是变换,它保存了该对象当前的位置、旋转和缩放。单击这些输入框中的任意一个进行输入,以修改里面的数字。Unity的基本单位是米,因此让y=2会把Sphere移动到空中两米。让y=-2会把Sphere对象移动到平面之下两米。
除了输入这些离散的值以外,你也可以在任何这些输入框中拖动这些值。在变换框中单击任何坐标轴的标签(X、Y或者Z)然后左右拖动鼠标。这个对象会随着你的改变而移动或是变形。这并不是一种精确地定位或操作对象的方法,但是,这是一种快速而粗糙的方法,可以将对象大致放置到位以便随后微调。
也可以通过Transform工具来对对象进行变换。你可以手动地在工具栏中选择一个工具,也可以使用下一节介绍的热键在工具之间快速切换(强烈推荐)。
图3-13中所示的Translate工具可以在场景中移动选中的对象的位置,可以沿着三条坐标轴中的某一条移动,也可以在整个空间自由移动。在Hierarchy视图中单击Sphere对象并且按W键来激活移动工具。
抓住其中的一个手柄,可以把对象沿着该坐标轴在游戏世界中移动(再强调一下,红色就是沿着X轴,绿色是沿着Y轴,蓝色是沿着Z轴)。注意,Inspector视图中的值会根据你的修改而进行更新。
也可以通过单击该工具的中心(或是这个对象自身)然后在场景中拖动,以将这个对象沿着所有三条坐标轴自由地移动。然而,这通常不是最好的方法,因为你不能精细地控制放置的位置。你会发现,在不同的正交视图(例如,前视、右视)中切换,对于精确地放置对象有很大的帮助。
图3-14中所示的Rotate工具可以把对象按照任何给定的坐标轴进行旋转。单击Cube对象并按E键来激活这一工具。
这个工具的手柄就好像三个带有颜色的环包着一个球体。拖动这些手柄或者直接拖动鼠标就可以旋转对对象。注意,这些环的颜色指明了这个对象会按照哪条轴来旋转。例如,如果拖动蓝色的手柄,这个盒子就会沿着Z轴旋转。这一工具还有一个简单的***环围绕在另外三个环的外侧。可以单击并拖动这个***的环来让对象按照所有的三条坐标轴进行旋转。
最后一个变换工具是Scale工具,可以在键盘上按R键来访问它。如图3-15所示,这个工具和Translate工具的用法很相似&&可以拖着一个手柄,把这个对象在这条坐标轴上缩放,或者使用中间的***方块来把对象在所有三条坐标轴上一致地缩放。
在场景中三个对象中的任意一个上尝试使用该工具。
使用这个工具对网格进行缩放是有风险的。这看上去像一个非常快速的方法,可以用来改变任何资源的大小,但是,如果使用太多缩放过的对象或是把贴图拉伸到完全不相称的地步,这可能会影响游戏的性能。调整缩放最好的方法就是,确保3D应用程序中的网格在最开始时其大小就是正确的。
注意 可以在Edit&Preferences&Keys中改变这些工具中任何一个的默认键。
4. 移动多个对象或是具有父子关系的对象
到目前为止,我们只是在移动单个对象,也就是Primitives对象的子对象。尝试在Hierarchy视图中选中Primitives对象并把它移动到点(0,-3?5,0)。整个Primitives对象组(包括其所有子对象)都会移动到新的位置。现在单击任何子对象并在Inspector视图中查看它们的信息。注意到了什么?这些子对象各自的位置变换并没有随着你把Primitives对象移动到新的位置而更新或改变,即使你清楚地看到它们的位置是改变了的。这是因为,子对象从它们的父对象那里继承了所有的变换数据;子对象的变换值实际上是相对于其父对象的相对值,而不是在世界坐标系中的值。
例如,在Inspector视图中查看Cube对象的位置数据。Y坐标的值并不意味着它位于y=1.5米的位置,而是意味着它位于其父对象上方1.5米。改变父对象在世界坐标系中的位置,并不会改变Cube对象在其上方1.5米处这一事实。子对象的位置在局部坐标系(local coordinate)中,而父对象的位置在全局坐标系(global coordinate)中。
由于这个原因,在你要把一个对象设置为父对象之前,先手动地把它放置到原点,然后再将其设置为其他子对象的父对象,这通常是一个比较好的做法。以后,一旦你需要放置成百上千个彼此相关的资源时,这会更为简单。
也可以在用鼠标左键选择不同的对象时按Shift键,以便在Scene视图中选择多个对象。如果你不小心选中了一个本不想选中的对象,可以按Ctrl键并且左击这个对象,将其从你的选择中去除。
5. 变换Gizmo切换按钮
还记得控制栏上的变换Gizmo切换按钮吗?它们决定了Transform工具的行为和功能。第一个切换按钮,Pivot(原点)/Center(中心),可以改变工具在空间中的位置。在Hierarchy视图中选择Primitives对象并激活Rotate工具。默认值Pivot,会把工具放在这个对象的原点(pivot point),也就是在空间中变换这个对象时的参照点。(原点通常是在创建这个对象时预先定义的,并且可以在3D应用程序中很容易地移动它。)把Scene视图切换到某个正交视图,例如正视图或者后视图,并且把这个对象绕着某条坐标轴旋转。注意,这个对象在旋转时和原点的相对距离总是不变的。
现在,按下原点切换按钮把它切换到中心方式&&Rotate工具跳到了选中的对象在局部坐标系中的中心位置。再一次尝试对这个对象进行旋转。此时,这个对象会围绕其中心进行旋转,而不是围绕空间中那个虚构的原点旋转。根据自己的需要来使用圆点或是中心模式,在把资源移动到某个位置时这会省去很多麻烦。
回到Perspective视图,这次选择Plane对象并把它沿着Y轴旋转45&。激活Translate工具。当局部坐标系(Local)切换按钮激活时,Translate工具的坐标轴保持与这个对象的位置的局部坐标系对应。按下局部坐标系切换按钮,切换到全局坐标系,并且看看该工具是怎样更新的,它现在更新为以世界坐标系为参考。能够将一个对象在其局部坐标系或是全局坐标系中移动是非常有用的,尤其是当这个对象以杂乱的角度进行旋转之后。图3-16~图3-19显示了当选中某个对象后,它在不同模式之间的位置和视觉效果。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

参考资料

 

随机推荐