《炉石传说》架构设计赏析(2):Scene管理

欢迎来的我的酒馆,快来火炉旁暖暖你的靴子。哈哈,我们继续欣赏炉石的代码。欢迎转载,请注明作者【燕良@游戏开发】及原文地址:http://blog.csdn.net/neil3d/article/details/39231541

上篇文章我们分析到SceneMgr处理了Scene的加载工作,今天我们主要分析一下炉石这款游戏中一共有哪些Scene,他们各自负责什么,以及它内部的逻辑、UI的处理方式。

在正式开始之前,我来对前文中提到的Scene切换再做一些补充分析。前文中我们看到SceneMgr是调用了“ Application.LoadLevelAdditiveAsync(this.sceneName);”,那内存中的东西岂不是越搞越多吗?我们再仔细看一下SceneMgr:SwitchMode()函数,它是一个Coroutine,他主要进行了下面这几个步骤的操作:

  1. 调用当前Scene的Scene:PreUnload()函数;
    发送FireScenePreUnloadEvent事件;
    等待直到Unload过程走完(通过检测LoadingScreen的阶段);
  2. 调用Scene:Unload()函数;
    发送FireScenePreUnloadEvent事件;
    调用成员函数PostUnloadCleanup()函数,它调用了两个关键的函数:
    • 首先是成员函数:DestroyAllObjectsOnModeSwitch(),这个函数查找到所有的GameObject(Object.FindObjectsOfType(typeof(GameObject))),然后进行了筛选(通过成员函数ShouldDestroyOnModeSwitch),除了一些全局对象之外(主要是SceneMgr、PegUI、Box、DefLoader),全都删除了(通过调用Object.DestroyImmediate())。
    • 然后调用了:Resources.UnloadUnusedAssets();
  3. 然后是调用前文提到过的成员函数:LoadModeFromModeSwitch(),进行了LoadLevelAdditiveAsync()操作;
综上所述,炉石的Scene切换主要是包含两步:1删除所有非全局对象,卸载未引用的Asset;2加载新的Scene。(我倒是想到另外一个土鳖一点的替代方案:创建一个完全空的scene,调用LoadLevel加载它,那么所有没有设置"DontDestroyOnLoad"的对象就都被删除了。)

除了前文提到的Login,我们可以看到Scene还有很多派生类,详见下图:


这是我猜测的这些类和游戏内容的对应关系,没有太仔细分析,可能有些对应是错误的:


下面我们就挑选一个简单的Scene来分析一下它的内部运作机制,我们来看一下AdventureScene吧。Adventure相关的Class很多,我们只做一个粗略的分析,只涉及到下面这几个类和接口:


首先我推测,在Hub屏幕中点击中间的【Solo Adventure】(冒险模式)按钮之后,通过我们前文分析的LoadScene流程,加载了一个冒险模式相关的Scene。它里面有一个GameObject绑定了“AdventureScene”这个脚本,我们可以看到AdventureScene:Awake()方法中主要是注册了很多事件的回调。
我们可以看到有一个“AdventrueSubScenes”枚举,它基本上对应了下图中的按钮:
public enum AdventureSubScenes
{Chooser,Practice,MissionDeckPicker,NormalHeroic,ClassChallenge
}


接下来还有一个"AdventureSubScene"是处理子场景对应的一些逻辑的。

我们看到有“AdventureChooserTray”这个类:

  • 我推测这个类就是用来处理上面这个游戏画面的UI交互操作的;
  • 这个类在Awake时,通过调用“CreateAdventureChooserButton()”方法创建了上图中的上部分那几个冒险游戏内容模式相关的按钮;
  • 这些按钮都绑定了事件回调:AdventureChooserTray.ButtonModeSelected();当这些按钮被点击时,主要是调用:
    • AdventureConfig:SetSelectedAdventureMode(),此函数修改内部数据之后触发事件:FireSelectedModeChangeEvent()
    • AdventureChooserTray通过OnSelectedModeChange()响应此事件,这也就是点击上面那几个按钮之后要做的一些处理:包括更新左侧的画面、设置Choose按钮状态等等;
      其中调用了PlayMakerFSM,主要是向其发送事件“Burst”;通过这里,我们可以确定炉石使用了PlayerMaker插件。
    • AdventureScene也通过OnSelectedModeChanged()相应了此事件;
  • 它里面还有一个“PlayButton m_ChooseButton”成员变量,并把为它添加了EventListener,用来调用ChangeSubScene()方法。这就和游戏实际的操作对应上来:在上面选择模式,然后点击下面的【Choose】按钮,就进行到下一步的选择了。
  • AdventureChooserTray:ChangeSubScene()通过Coroutine的方式调用了AdventureConfig:ChangeSubSceneToSelectedAdventure(),然后调用了AdventureConfig:ChangeSubScene();它主要触发两个事件:
    • FireSubSceneChangeEvent:AdventureScene通过OnSubSceneChange()函数响应它,主要是调用AdventureScene:LoadSubScene(),内部主要是调用AssetLoader.LoadUIScreen();
    • FireAdventureModeChangeEvent:AdventureScene通过OnAdventureModeChanged()响应它。
通过上面的分析,我们大致了解了上面这个游戏截图中的操作实现逻辑。
这次的分析算是一次热身,接下来重点分析有两个方面:
  • 游戏逻辑的组织,特别是技能的数据、逻辑组织;这可能需要经过多次尝试,慢慢接近;
  • 游戏的Asset资源管理、加载机制;
OK,今天的分析就到这里,欢迎大家拍砖。后续分析敬请期待!
顺便来秀一下我的鱼人部队,别看这些1点学的小东西,加在一起还蛮欢乐的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28373.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPG游戏《黑暗之光》流程介绍与代码分析之(六):背包系统的实现(下)

接着(上)部分的内容,本节关注物品栏中一些功能的实现,及 拾取操作的模拟背包的显示与隐藏物品提示信息 5.4 拾取模拟 有了(上)部分的铺垫,本节的目标是实现物品拾取功能。 物品拾取功能的逻辑分…

Unity3d开发MOBA游戏类《王者荣耀》记录(一)

由于最近工作忙,之前一直想写的王者荣耀教程直接就忘记了,最新才记起来,现在继续更新~。 上一篇起始大概介绍了一下我对这个工程的简单思路现在开始一步步实现,首先先创建一个Unity3d工程,这里我先用5.4.0吧&#xff…

《炉石传说》架构设计赏析(3):Gameplay初探

经过前面两篇文章的分析,我们对炉石的代码已经不陌生了,接下来我初步尝试分析其游戏逻辑代码。欢迎转载,请注明作者【燕良游戏开发】及原文地址:http://blog.csdn.net/neil3d/article/details/39453291 经过前面的分析&#xff0…

RPG游戏《黑暗之光》流程介绍与代码分析之(四):任务系统的实现

第四章:任务系统 这部分主要对任务系统进行设计,游戏的关键因素之一就是任务系统与玩家的交互,但在代码实现中并不算复杂。本篇博客主要通过一下几个方面实现任务系统。 任务模型的导入与任务UI界面的创建任务的接受与完成针对不同对象的指针…

RPG游戏《黑暗之光》流程介绍与代码分析之(二):角色创建界面的实现

第二章 角色创建 上一章中完成了初始化的场景界面的创建,本章就接着上一篇博客的内容,介绍角色创建的方法。 2.1 角色创建的UI界面 角色创建的背景采用与加载界面所用背景相同,并且Camera不需要移动。 创建的UI界面与之前类似,其中…

【游戏开发渲染】Unity ShaderGraph使用教程与各种特效案例:Unity2022(持续更新)

文章目录 一、ShaderGraph前言二、ShaderGraph科普1、渲染管线(Render Pipline)2、可编程渲染管线,SRP(Scriptable Render Pipline)3、高清渲染管线,HDRP(High Definition Render Pipleline&…

RPG游戏《黑暗之光》流程介绍与代码分析之(十五):主角受攻击效果以及场景切换

十五章:主角受攻击效果以及场景切换 本篇博客将《黑暗之光》开发的最后工作做完,包括之前未实现的主角被击效果,以及实际运行中的场景切换。 15.1 主角的受攻击效果 我们参照WolfBaby中的受攻击效果( 链接)&#xff0c…

Unity实现王者荣耀登陆界面动画背景

我呢,特别爱打王者荣耀。 而最近几个版本的更新中,王者荣耀的登录背景变成了动画背景,看着很有动感炫酷,这里来看下王者荣耀是怎么个效果。 这里找的一个B站UP主的视频,因为现在官方不知道为啥换了换背景,虽然他这个不是官方自制的吧,是自己修改的游戏…

Unity 之 ShaderGraph 实现火焰效果入门级教程

Unity 之 ShaderGraph 实现火焰效果入门级教程 前言一,效果展示二,原理介绍三,实现效果四,使用示例五,完整图示 前言 若你的工程还没有进行基础配置,请查看我的博文Unity 之 ShaderGraph入门使用详解&#…

Unity RPG 黑暗之光 问题记录 下(64-110 技能、装备商店、头像栏、快捷栏、敌人攻击系统、玩家攻击系统)

黑暗之光 64-73技能系统 数据读取 数据 表 黄色枚举,红色没有的 数据 文本 数据 读取 背包时是itemList,读取属性时各有不同,无法统一, 这种方式是为了方便读取,所有需要的数据表都可以在DataHub上读取到&#x…

Unity官方案例噩梦射手开发总结<一> 角色的攻击功能实现

愉悦的寒假生活总是会猝不及防地迎来尾声,这也意味着我大一生活的进度条已经过半了。幸运的是,在我某位优秀的学长的带领下,我完整地开发出来了unity的官方案例噩梦射手并基本实现所有功能,也是让我这个大一的苟蒻积攒了不少的新知…

GAMES202-Shadow总结概括

截图均来自于闫令琪老师的GMAES202-Shadow,本文在于对课程内容进行总结以及加上自己的理解,希望帮助同学们加深对课程内容的理解,如有谬误请各位指正 复习本节需要的基本知识 1. Shadow Mapping 为了获得一张Shadow Mapping,需要…

暗黑破坏神:不朽 unity mmo arpg资源分包精讲

unity大型游戏资源管理——分包 视频讲解:点击观看 unity mmo arpg 暗黑破坏神:不朽 是一个大型的重度游戏,该游戏资源已经超过10G 所以它用了资源分包技术减少下载时间。 首包只包含基础资源,在玩家玩第一关的时候,后…

股票卖出技巧及原则,你了解哪些

股票卖出技巧及原则,你了解哪些?有句股谚说,“会买的是徒弟,会卖的是师傅,会空仓的是祖师爷”。以前都是把大部分精力放在了选股和如何买股上面,而对如何卖股票太忽视了。难怪总是出不了师,小学…

通达信破底翻选股公式,用缠论底分型进行优化

上次在写《通达信破底翻形态选股公式,选出破底之后再翻回的股票》这篇文章时,编写破底翻选股公式就考虑使用缠论底分型,但是底分型的包含关系较为复杂,不容易处理,只能暂时搁置,采用了一种简单的方式&#…

股票大作手操盘术[图解]

目录 第一章:投机是一项挑战 第二章 何时入场才是好时机 第三章 追随领头羊 第四章 手里的钱财 第五章 关键点 第六章 百万美元的大错 第七章 三百万美元的盈利 第八章 利弗莫尔市场要决 杰西•利弗莫尔为什么能在投机事业中取得巨大成功,这…

【通达信指标公式】主力博弈分时指标,分时图抓日内弱转强牛股

GHYJKU:BETWEEN((CLOSE*1)/(SUM(AMOUNT,BARSCOUNT((CLOSE*1)))/SUM(VOL*100,BARSCOUNT((CLOSE*1)))),1.05,0.95); VBNH:IF(GHYJKU0,MA((CLOSE*1),BARSCOUNT((CLOSE*1))),(SUM(AMOUNT,BARSCOUNT((CLOSE*1)))/SUM(VOL*100,BARSCOUNT((CLOSE*1))))); 紫色跟风:EXPMA((CLOSE/VBNH),…

ChatGPT写代码之——CodeWhisperer在VS Code下如何安装

一、安装 1. 在VS Code扩展中搜索AWS 点安装就安装好了 #二、配置 1. 点击状态栏出现的AWS 选择add New Connection 选择Use a personal email to sign up and sign in with AWS Builder ID 选择Copy Code for AWS builder ID 跳转到浏览器 2. 在浏览器上一步步用自己的邮…

计算机程序设计类论文,计算机编程论文

计算机编程论文 介绍:本栏目是计算机和编程和论文相关的论文例文,免费教你怎么写关于计算机编程的论文提供相关文献资料。 【摘 要】本探究经过问卷调查、现场采访、走访调查、查阅文献资料等方法对河南省各大高校计算机专业大学生的学习情况(特别是编程能力)进行了调查和研。 …

爱丁堡计算机专业硕士世界排名,爱丁堡大学计算机世界排名

导读:,伴随着科技与经济的高速发展,计算机技术专业成为一门热门的专业,越来越受到人们的欢迎,学校的师资力量和教育水平,也直接成为影响我们选择高校的原因之一。 伴随着科技与经济的高速发展,计算机技术专…