《迷失岛2》实现场景切换

发布时间:2026/7/16 14:46:45

《迷失岛2》实现场景切换 一项目介绍实现以下操作实现游戏解谜游戏一共五个场景H1-H之间的场景切换H2A是一个小游戏每个目录均有该场景的介绍进入为H1场景由鼠标或者触摸屏幕点击进行操作都是点出操作主页面两个按钮新游戏继续游戏还有其他的道具UI部分的功能二场景切换实现1.先将素材导入到Assets当中2.场景结构处理把当前的场景包括摄像机以及所有控制的manager类型放在一个单独的scene当中而这个场景是不会被切换掉的会长久持续首先将SamepleScene的名字改为Persistent持久化的在这里面我们添加的所有控制类都放在这个场景当中每一个实际的地图实际的图片我们都把它单独额外再创建一个场景1在scene中我们先来创建第一个场景H1直接用图片素材对于的名字来进行命名将此场景拖拽添加到我们的Hierarchy窗口当中这里面实现的就是我们SceneManagement加载场景的方法就是additive我们用这种叠加的方式启动他那么场景当中我们只有一个main camera就可以了那么场景当中我们只有一个main camera就可以了删掉H1当中的main camera接下来先激活H1场景找到素材场景H1在其中添加图片将素材中H1的背景图片拖拽进去然后也可以在我们的game窗口中看到这个画面适配这个图片的尺寸是1920*1080我们调整一个合适的摄像机的尺寸找到mian camera在Scene的窗口上可以看到它的边框在将size调成5.4这样就可以完美的适配这个图片完整的显示出来将图片H1改个名字后面加上Background方便我们看出这是一个背景图片先把H1场景卸载掉Unload再创建H2场景内容和H1一致图片换为H2每个场景当中都有箭头鼠标点击箭头的时候来实现场景的切换在H2场景当中有多个切换通道左侧箭头右侧箭头楼梯我们需要创建一些代码挂载在这些位置上当鼠标点击的时候可以跳转到下一个场景我们接下来创建一个叫做Teleport的代码帮助我们呼叫Transition Manager通知从哪一个场景去到另外的场景在Assets创建文件夹Scripts保存我们的所有的代码在Scrpits下创建Transitions文件夹在此文件夹下创建C#脚本命名为Teleport接下来我们要在场景当中来创建这些物体目前我们并没有这些箭头的单独的素材我们需要鼠标判断点击的位置使用physic 2D的判断方法判断物理检测碰撞我们需要在箭头和楼梯的位置上装上碰撞体这样就可以检测到了接下来我们来创建这个空物体我们将我们的H2场景激活在中国场景当中创建一个空物体命名为Teleport to H1将这个空物体的坐标设置为初始值为这个空物体添加组件Box Collider 2D勾选Is Trigger将范围放在左上角的箭头鼠标接触到这个范围点击就可以触发他里面的方法了我们将写好的代码挂载在这个物体上如果认为触碰范围较大可以适当调整将这个范围缩小2接下来补全代码Teleport打开Teleport首先我们要知道它的最基本的两个变量一个是当前场景一个是我们的下一个场景我们创建两个String类型的变量using System.Collections; using System.Collections.Generic; using UnityEngine; public class Teleport : MonoBehaviour { public string sceneFrom; public string sceneToGO; }保存代码返回到unity现在我们就有了两个string类型的变量我们希望在场景的时候使用场景的名字的方式进行加载在这里例如我们当前场景是H2要去到H1我们要创建另外一个代码TransitionManager来实现场景的转换接下来我们在我们的持久化场景当中创建一个空物体也起名为Transition Manager将Transition Manager这个代码挂载上去3我们希望点击Teleport之后可以将它身上的两个变量传递给我们的Transition Manager然后实现我们场景的转移用熟悉的方法就是把它直接设置成一个单例模式另外我们留意到如果传递的场景我们都用String类型的话很容易会出现错误我们可以手写一个attribute的一个特性把这个特性加在这儿的时候可以直接调取所有在Bulid Settings当中的场景名字生成一个pop窗口可以在这里面进行选择避免我们手输的错误首先我们打开Bulid Settings然后将这两个我们已经创建的场景都添加进去点击Bulid Settings窗口中的Add Open Scenes可以看到我们创建的两个场景H1H2都被添加进去了接下来我们来现实这个工具还有我们刚才说到Transition Manager要用单例模式我们肯定会用泛型单例我们需要导入一个工具具体看M_Studio的视频《迷失岛2》将那个.unitypackage文件导入到unity当中可以看到已经把它封装好了一个.dll文件了可以直接进行使用点击import导入导入之后就可以看到我们的这个MTool4打开我们的Teleport代码我们可以在这个代码当中添加上这个特性[SceneName]目前我们就可以直接来调用因为我们已经添加好了这个代码库保存返回unityusing System.Collections; using System.Collections.Generic; using UnityEngine; public class Teleport : MonoBehaviour { [SceneName] public string sceneFrom; [SceneName] public string sceneToGO; }目前我们就可以看到他出现了这个pop pop的弹出式菜单我们可以在这里选择从哪个场景切换到哪个场景这样就会非常方便这个工具也可以去运用到其他的各种项目当中去4接下来我们打开Transition Manager代码将他设置为单例模式不需要继承我们的 MonoBehaviour直接继承Singleton这样我们就实现好了我们的单例using System.Collections; using System.Collections.Generic; using UnityEngine; public class TransitionManager : SingletonTransitionManager { }我们会在Teleport当中去执行TransitionManager当中的一个场景的切换的方法我们继续在TransitionManager当中来创建方法添加了两个参数from和to从哪里到哪里using System.Collections; using System.Collections.Generic; using UnityEngine; public class TransitionManager : SingletonTransitionManager { public void Transition(string from,string to) { } }我们去到Teleport代码当中来执行这个方法在这里我们触发一个点击事件点击的时候我们希望执行Teleport里面的函数方法起名为TeleportToScene将sceneFrom, sceneToGO加进去using System.Collections; using System.Collections.Generic; using UnityEngine; public class Teleport : MonoBehaviour { [SceneName] public string sceneFrom; [SceneName] public string sceneToGO; public void TeleportToScene() { TransitionManager.Instance.Transition(sceneFrom, sceneToGO); } }在TransitionManager代码当中我们会用协程的方法卸载当前的场景因为他有一个from然后重新加载我们要去到的那个场景并且将它设置为active接下来子啊TransitionManager代码当中来写一个协程的方法同样的两个变量首先我们要卸载我们的from场景在这里面我们要调用我们的场景加载和卸载需要先调用这个命名空间using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;//调用命名空间异步的用UnloadSceneAsync和LoadSceneAsync场景加载有六个重载的方法这里面我们使用名字的方法直接写toLoadSceneMode.Additive添加模式处于Additive的时候才会把这个场景叠加到我的PPersis的这个场景之上using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;//调用命名空间 public class TransitionManager : SingletonTransitionManager { public void Transition(string from,string to) { } private IEnumerator TransitionToScene(string from,string to) { yield return SceneManager.UnloadSceneAsync(from);//卸载掉from的场景 yield return SceneManager.LoadSceneAsync(to,LoadSceneMode.Additive);//加载to场景 } }我们要保证这个场景当前是激活的我们可以留意到如果我们把它additive上去之后那么场景当中一共有多少哥场景也就是在Hierarchy窗口里面我们有两个场景所以它的序号就是0和1但是数量是2那么我们可以通过它的数量减去1就找到我们对应新加载的这个场景然后将他设置为激活的场景就可以了。所以我们可以找场景我们创建这个类型怎么找他刚才我们说到了我们在整体的数量减一去找他那我们可以找到Gets括号里边我们要填入的变量就是它的index序号刚才我们说了场景里一共有两个但是它的序号是从零开始的吗零一所以我们就可以用SceneManager.sceneCount-1就可以拿到新加载上去的这个场景对应的序号了通过这样的方法来实现找到你最后加载上去的那个场景。然后我们找到这个场景之后就可以使用SceneManager将他active。using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;//调用命名空间 public class TransitionManager : SingletonTransitionManager { public void Transition(string from,string to) { } private IEnumerator TransitionToScene(string from,string to) { yield return SceneManager.UnloadSceneAsync(from);//卸载掉from的场景 yield return SceneManager.LoadSceneAsync(to,LoadSceneMode.Additive);//加载to场景 //设置新场景为激活场景 Scene newScene SceneManager.GetSceneAt(SceneManager.sceneCount - 1); SceneManager.SetActiveScene(newScene); } }这样我们就暂时写好了我们的这个协程所以在上面我们可以来执行一下using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;//调用命名空间 public class TransitionManager : SingletonTransitionManager { public void Transition(string from,string to) { StartCoroutine(TransitionToScene(from, to)); } private IEnumerator TransitionToScene(string from,string to) { yield return SceneManager.UnloadSceneAsync(from);//卸载掉from的场景 yield return SceneManager.LoadSceneAsync(to,LoadSceneMode.Additive);//加载to场景 //设置新场景为激活场景 Scene newScene SceneManager.GetSceneAt(SceneManager.sceneCount - 1); SceneManager.SetActiveScene(newScene); } }这样携程的方法就写好了函数的调用我们也写好了如何判断我们点击到这个位置用鼠标点击检测碰撞体应该通过什么方法来判断点击的是谁呢我们选择使用标签的方法接下来我们在unity当中添加标签添加第一个标签Teleport接下来用鼠标点击来判断标签接下来写另一端代码在Scripts文件夹下创建一个新的文件夹起名为Cursor因为选择到物品的时候鼠标要变化样式变化成手的样子正常情况下要判断点击创建脚本CursorManager接下来在Persistent Scene当中创建CursorManager然后将脚本添加上去打开脚本进行编写在此脚本当中我们首先要实现第一个很重要的方法就是我们是否点击到了某个东西首先创建一个返回碰撞体的类型

相关新闻