当前位置: 首页 > news >正文

玩家自助充值网站建设html网页代码完整代码

玩家自助充值网站建设,html网页代码完整代码,网站建设销售顾问开场白,淮安专业做网站前面的所有文章我们都在一个固定的游戏场景内进行开发#xff0c;在最开始介绍场景这个概念的时候就已经提及#xff0c;这个场景可以是一张地图#xff0c;或者是一个对战房间等等#xff0c;所以显然这个场景可以有多个#xff0c;并且可以从一个场景切换到另外一个场景…前面的所有文章我们都在一个固定的游戏场景内进行开发在最开始介绍场景这个概念的时候就已经提及这个场景可以是一张地图或者是一个对战房间等等所以显然这个场景可以有多个并且可以从一个场景切换到另外一个场景那么在Unity中如何进行场景切换以及如何处理好场景切换时的各个逻辑呢本章就会详细讲解。 新建第二个场景 还记得最早讲的如何创建场景资源吗 在Project窗口里面随便哪个你喜欢的位置右键Create-Scene就可以创建一个新的场景资源我们已经有了一个Demo场景那么我们创建一个新的场景叫AnotherDemo OK接下来我们需要编辑这个场景的内容那就是双击这个场景资源文件注意如果当前打开的场景比如你现在打开的是Demo然后你有一些修改没有保存比如Demo的Hierarchy窗口里面根节点是带星号的那么Unity会提示你要不要保存你自己决定要不要保存然后才会打开刚刚双击的场景文件。 双击过后我们就进入到了这个场景里面一切都回到了原点 唯独不同的是Hierarchy窗口的根节点换成了我们新创建的名字AnotherDemo。 ok这样就理解了如何创建新的场景并进去编辑内容我们先换回到Demo场景中因为我们接下来需要从Demo场景通过代码逻辑切换到AnotherDemo。 场景切换 既然我们要切换场景肯定是要有什么逻辑触发我们可以单独写个组件加到空的GameObject上组件就在Start触发后3秒进行场景切换而场景切换的API则是 https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadScene.html 我们让gpt帮我们写个 using UnityEngine; using UnityEngine.SceneManagement;public class SceneSwitcher : MonoBehaviour {public string sceneName;public float delay 3f;private float startTime 0f;private bool isSwitching false;private void Start(){startTime Time.time;}private void Update(){if (!isSwitching){float elapsedTime Time.time - startTime;if (elapsedTime delay){SceneManager.LoadScene(sceneName);isSwitching true;}}} }写的还不错delay表示物体开始跑起来后等待多少秒执行场景切换sceneName则是我们的场景资源文件的名字Unity相当于收集了我们所有场景文件资源所以可以通过直接传入名字来切换聪明的你肯定会想到如果重名了怎么办毕竟文件在不同的文件夹下可以拥有一样的名字Unity的API也给出了详细的说明 The given sceneNamecan either be the Scene name only, without the .unityextension, or the path as shown in the BuildSettings window still without the .unityextension. If only the Scene name is given this will load the first Scene in the list that matches. If you have multiple Scenes with the same name but different paths, you should use the full path. Note that sceneName is case insensitive, except when you load the Scene from an AssetBundle. 说的就比较清楚不要带文件名后缀我们知道场景资源文件实际在操作系统下的文件名后缀是.unity我们不需要传入这个后缀例如就是AnotherDemo不需要AnotherDemo.unity如果只传了个名字会使用第一个找到的如果传的是路径则按照路径去找而路径则是Assets文件夹下的路径例如Scenes/SampleScene当然我们创建的并没有在这个文件夹下面 最后注意这里的路径或者名字是大小写不敏感的除非是从资源包里面加载至于资源包是啥我们后面资源加载的篇章再来聊。 那么我们这里sceneName可以有两种填法 直接填AnotherDemo填路径AnotherDemo 这两个都没问题但是我们先创建一个物体把我们的组件挂上去 Ok我们跑起来看看哎为什么没切换呢不要着急有没有注意到编辑器界面底部有一条红色的错误信息打开Console窗口查看全部的输出 其实可以看到说的就是我们需要切换的场景AnotherDemo并没有加入到build settings中我们在游戏打包的那篇中有提到过如何将场景加入到我们的打包内容中其实就是这个操作。 我们从Unity编辑器窗口顶部的菜单File-Build Settings打开 我们确实没有把AnotherDemo加入进去那我们还是按照老办法打开AnotherDemo这个场景文件然后点击上面这个窗口的右边按钮Add Open Scenes把场景加进去 Ok我们重新打开Demo场景然后再跑一下等待3秒后确实切换到AnotherDemo中一篇虚无的世界了。 场景切换的物体保持 我们成功的切换了之后可以很显然的理解旧场景里面的所有GameObject都被自动销毁了这很好但是有一些GameObject我们是希望跨场景的最常见的就是UI很显然我们不能因为切换了一个场景就导致我们的UI全部消失。 那么我们需要将需要在场景切换后仍然保持存在的GameObject使用特殊API进行标记 Object.DontDestroyOnLoad​docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html 没错就是这么简单我们只需要用这个DontDestoryOnLoad来传入我们需要保持的GameObject即可。我们修改一下场景切换的脚本允许我们设置哪些GameObject可以被保持 using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;public class SceneSwitcher : MonoBehaviour {public string sceneName;public float delay 3f;public ListGameObject gameObjectToStayAlive;private float startTime 0f;private bool isSwitching false;private void Start(){startTime Time.time;}private void Update(){if (!isSwitching){float elapsedTime Time.time - startTime;if (elapsedTime delay){if (gameObjectToStayAlive ! null){foreach (GameObject go in gameObjectToStayAlive){DontDestroyOnLoad(go);}}SceneManager.LoadScene(sceneName);isSwitching true;}}} }可以看到我们新增了一个GameObject数组gameObjectToStayAlive来存放我们希望切换场景时会继续带到下个场景的GameObject在切换场景之前我们通过DontDestroyOnLoad来设置这些GameObject不要因为场景切换而销毁。 然后我们可以看到编辑器面板上就能通过点击数组的加减符号来新增一个数组元素 这其实是Unity编辑器默认给数组成员画的一个更方便一点的编辑方法如果用过更老一些版本的Unity应该能知道以前的编辑方法很落后不好用。 这里我们将UI显示所需的元素加进去注意父元素设置DontDestroyOnLoad对子元素也是生效的所以我们这里没必要将Canvas物体下的所有子元素都加进去。 Ok那我们跑起来看看 切换场景后我们看到UI还能生效并且可以观察到我们设置过的GameObject都跑到了一个奇怪的地方 他们都跑到了一个DontDestroyOnLoad下面这其实就是Unity实现DontDestroyOnLoad方案也就是我们实际打开了两个场景一个是AnotherDemo场景一个是DontDestroyOnLoad场景这两个场景同时生效而我们设置了DontDestroyOnLoad的GameObject会待在DontDestroyOnLoad场景内所以即使我们切换其他场景也不会影响在DontDestroyOnLoad场景内的物体的销毁逻辑。 不过现在我们发现了另外一个问题Console窗口里面疯狂报错 看起来都是同一个错误仔细看一下其实就能理解这个是我们的UI准心上挂了一个AimController组件这个组件有引用场景中的相机来确定我们开火的方向而我们切换场景了之前引用的Demo场景里面的相机已经不复存在那么我们继续引用的话肯定就报错了。同理的还有FireController组件的引用也是一样我们切换了场景后这个被引用的组件所在的GameObject也已经销毁了。 所以我们要解决这个问题的话就需要在切换场景的时候清理掉旧的引用并且做好判空的逻辑 using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;public class SceneSwitcher : MonoBehaviour {public string sceneName;public float delay 3f;public ListGameObject gameObjectToStayAlive;public AimController aimController;private float startTime 0f;private bool isSwitching false;private void Start(){startTime Time.time;}private void Update(){if (!isSwitching){float elapsedTime Time.time - startTime;if (elapsedTime delay){if (gameObjectToStayAlive ! null){foreach (GameObject go in gameObjectToStayAlive){DontDestroyOnLoad(go);}}if (aimController ! null){aimController.mainCamera null;aimController.fireController null;}SceneManager.LoadScene(sceneName);isSwitching true;}}} }我们朴素的加了一个aimController成员然后期望有人能在编辑器里面赋值好这个组件这样我们在场景切换的时候就能够顺利的清理掉带不走的引用。 同理我们在AimController脚本里面也需要对两个成员进行判空处理 using UnityEngine;public class AimController : MonoBehaviour {public Camera mainCamera;public FireController fireController;private RectTransform rectTransform;private void Start(){rectTransform GetComponentRectTransform();}private void Update(){rectTransform.anchoredPosition Input.mousePosition;if (mainCamera null || fireController null){return;}// 获取屏幕上当前鼠标位置也就是准心位置所在的3D空间位置Vector3 aimWorldPosition mainCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y, mainCamera.nearClipPlane));// 通过坐标相减可以得到方向向量Vector3 fireDirection aimWorldPosition - mainCamera.transform.position;// 归一化后传递给开火控制脚本fireController.SetDirection(fireDirection.normalized);} }Ok那我们在场景里面赋值一下aimController 再跑一下错误消失。 从这里我们就可以看到场景切换保持物体的存在虽然用起来很简单但是实际上我们仍然需要小心的管理所有对于旧场景的引用并且所有设置了DontDestroyOnLoad的物体已经不会因为切换场景而销毁所以理所当然的需要我们自己管理什么时候去Destroy它。 思考题 我们切换场景后抛弃了旧场景里面的相机和FireController但是我们在新场景里面肯定也是希望可以瞄准射击的新场景里面已经有了一个自带的Main Camera所以现在我们该怎么做来让切换场景后也能正常射击在上面代码里面我们简单的加入了一个AimController来实现清理旧引用的逻辑但是作为一个合格的程序员肯定第一时间想到的是职责单一的设计原则所以想想看一个合理的解耦写法应该是如何在切换场景的API的官方说明里面其实已经有明确的提示这个切换API是阻塞同步操作应该使用异步API那么如果使用异步API我们又应该如何改写代码呢 下一章 本章我们详细的了解了一下如何切换场景以及切换场景如果要保持GameObject存活要怎么做以及这么做了之后遇到的一些现实问题。 切换场景的时候其实已经从官方文档中开始了解到有AssetBundle这样的字眼其实这就是Unity在正式游戏包中的资源管理办法当我们需要动态加载资源而不是像现在都是引用来搞定的时候就需要动态加载资源了所以下一章我们将会讲解Unity内部动态加载资源的几种办法和适用场景。
http://www.dnsts.com.cn/news/170493.html

相关文章:

  • 房产中介网站排名建筑单位资质
  • 网站后台怎么添加代码郑州模板建站平台
  • 新东方研学网站那家公司做的企业网站建设案例分析
  • 上海网站建设优化公司上海做网站去哪里
  • 人防工程做资料的网站网站没有做伪静态是什么样子
  • 网站开发不满意网站打开为建设中
  • 12306网站是学生做的wordpress 优酷通用代码自适应
  • 新闻稿件东莞关键字排名优化
  • 可商用图片素材网站网站首页图片代码
  • 建设网站商品怎么弄网站页面设计 颜色 背景 要求
  • 做网站卖仿品用户体验的重要性
  • 新手初做网站微信官网网站模板
  • 网站排名数据平面设计师工资现状
  • 哪个平台推广效果好柳州做网站seo哪家好
  • 设计云网站wordpress 标题 截断
  • 做自己视频教程的网站专注于seo顾问
  • 永久免费域名注册网站wordpress同类
  • 别人建的网站怎么修改代码厦门建设局招聘
  • 仿做国外产品网站出路做代理需要交钱吗
  • 做网站怎么赚钱的wordpress+防爬虫
  • 宁乡住房和城乡建设局网站湖南电商平台网站建设
  • 做网站那个公司wordpress注册弹出框
  • 博客网站开发毕设云应用开发
  • 移动网站建站视频安卓开发技术
  • 做的比较好的企业网站网站建设多少钱比较合适
  • 炫酷的网站设计wordpress 分类图像描述
  • 西安网站建设地址教师进修学校网站建设方案
  • flash网站什么意思下载小程序到微信
  • 烟台网站建设技术托管手机营销推广方案
  • 文库网站建设写作网站5秒不写就删除