我感觉我最近有点睡得不安稳,总是半夜突然就惊醒了。然后起来看一眼手机,凌晨3点。 接着我发现游戏体力满了,花费了10分钟把体力清空然后什么东西都没掉落。 我用这十分钟换取了一夜未眠,我也不知道赚不赚。 这导致我有的时候下午补觉会梦到一些奇怪的场景,例如游戏里的男角色抱着我的大腿说能不能别只抽女角色你这个老色皮。 又或者是打游戏玩到了超神结果网断了,唰一下给我惊醒了,困意一下子给我干没了。 难怪医生会说适当的午觉有助于人体身心健康,我今天愣是一把游戏没敢打就怕现实重演,时间全用在学习上了。 为了能让其他人感觉到我的痛苦,我打算等我学会做RPG游戏的时候把这些场景通通加到玩家角色身上。 言归正传,今天要讲的内容是有关于场景类的知识。 话不多说直接出发! 一、场景类(P27) 一个游戏由很多的场景组成,例如开始页面、游戏页面、商店页面等等。最典型的新手村也是一个场景,每一个场景里面也由很多游戏物体组成。每个游戏物体由各种组件(脚本)组成 以上就是一个大概的游戏框架了,之前都是在默认的游戏场景中添加组件和脚本,其实也可以通过代码或者组件来创建新的游戏场景。 在Unity的层级视图下可以看到有一个叫做SampleScene的东西,下面包含了两个游戏对象 这个SampleScene就是一个默认的游戏场景,同时SampleScene在项目视图中的Scenes文件夹中,所以可以在Scenes文件夹创建(鼠标右键) 一个新的游戏场景。 双击打开之后就是新创建的场景了 1-1.通过代码加载场景(从Sample加载到My)-场景跳转 在SampleScence中打开文件→项目-生成和设置(Ctrl+Shift+B) →将场景都拖进到build中的场景(0和1就是场景的索引号) 接下来创建一个空对象,再创建一个脚本文件并挂载打开。 首先在代码的顶部导入:using UnityEngine.SceneManagement. 同步加载场景代码(索引):SceneManager.LoadScene (1); 回到Unity后运行,系统会自动打开1号场景(MyScene) 除了索引的方式也可以用名称的方式,将数字改为"场景名称" SceneManager.LoadScene ("MyScene" ); 1-2.获取当前场景(当前激活的场景) Scene scene = SceneManager.GetActiveScene (); 代码中的scene 也就是当前的SampleScene(当前的场景) 为了验证是否获取成功,用打印的方式来验证: Debug.Log (scene .name); 在这里的scene 就是场景类,对于一些场景类而言有一些属性需要了解下。 除了上面所提到的场景名称Debug.Log (scene .name); 1-3.场景是否被加载 Debug.Log (scene .isLoaded); 1-4.场景路径 Debug.Log (scene .path); 1-5.场景索引(得到在Build场景面板中的索引号) Debug.Log (scene .buildIndex); 1-6.得到所有根游戏物体 scene .GetRootGameObjects (); 这里会返回一个宿主: GameObject[] gos = scene .GetRootGameObjects (); 可以打印出来看一下宿主里有什么东西(打印长度): Debug.Log (gos .Length); 在下面的图中可以详细看到控制台的返回内容 第一个是场景名称第二个是场景已经加载(ture)第三个是场景所存放的路径第四个是表示当前场景为0号场景第五个是表示当前场景内有3样物品 二、场景管理类(P27) 2-1.场景管理类(当前已加载的场景数量) Debug.Log (SceneManager.sceneCount); 2-2.直接创建新场景(括号内自定义场景名称) SceneManager.CreateScene ("newScene" ); 当然也可以设定一个返回: Scene newScene = SceneManager.CreateScene ("newScene" ); 可以看到这里直接多出了一个新的名为NewScene 的空场景 如果把上述俩个行代码顺序进行颠倒的话,会发现当前已加载场景会从1变为2。 2-3.卸载场景(异步销毁)括号内放入想要销毁的场景 SceneManager.UnloadSceneAsync (newScene ); 异步销毁:该函数并不是立即 销毁 物体而是给物体加了一个标识符,物体还在内存中,在下一帧时才 销毁 并从内存中移除 在这里运行后可以看到,左下角的激活场景仍然为2但是没有出现newScene这个场景。 因为是在创建出来之后被直接删除了。 2-4.加载场景(多参数) SceneManager.LoadScene ("MyScene" ,LoadSceneModel.Single); 这里的Single是以简单的替换加载存在,运行以后会直接加载为MyScene顶替掉原本的SampleScene。 如果将Single换为另一种: SceneManager.LoadScene ("MyScene" ,LoadSceneModel.Additive); 可以看到两个场景的内容会叠加在一起 但是这种方式在加载复杂场景或者大型游戏的场景时会很容易造成卡顿 关于如何加载复杂场景的异步加载将放在下篇笔记中进行讲解。 今天的内容就到此为止了! 每次写完文章都是十点多,感觉一天天也没干啥事时间净霍霍了。 今天的我游戏还没打就先学习了,我要好好去奖励一下自己。 大伙下篇笔记见,拜了个拜 原教程链接: https://www.bilibili.com/video/BV1gQ4y1e7SS/?spm_id_from=333.337.search-card.all.click&vd_source=24f33eddf5587fb40e947798abce6715