Game architecture with ScriptableObjects | Open Projects Devlog
Summary
TLDR本期开发日志介绍了Unity首个“开放项目”游戏架构的设计,使用了ScriptableObjects来创建灵活、模块化和可扩展的游戏架构。通过避免硬编码和Singleton模式的问题,项目利用ScriptableObjects作为数据容器和事件通信的中间点,实现了跨场景的全局访问和一致性。同时,项目鼓励社区贡献和学习,提供了GitHub链接和相关资源,以促进项目的持续发展和功能的丰富。
Takeaways
- 📝 这是Unity首个“开放项目”的开发日志,名为'Chop Chop',是一个经典动作冒险游戏,允许社区成员自由协作并贡献于整个游戏开发过程。
- 🔗 项目链接和相关信息可以在视频描述中找到,鼓励开发者根据专长贡献代码或学习新知识。
- 💻 游戏开发使用Unity 2019.4 LTS版本以确保稳定性,但为了与最新Unity版本兼容,项目已升级至Unity 2020.2版本。
- 🎯 开放项目的目标是展示有价值的开发模式和技术,分享有用的工具,并创建一个灵活、模块化、可扩展的游戏架构。
- 🔗 硬编码连接在项目初期可能方便,但随着项目扩大,会导致可扩展性问题和难以追踪的错误。
- 🔄 单例模式是一种常用解决方案,它使用一个全局可访问的类实例,适用于全局管理器,但大型项目中会引入依赖问题。
- 📦 ScriptableObjects是数据容器,类似于材料或3D模型,它们不依赖于播放模式,数据全局可访问且与场景无关。
- 🗣️ ScriptableObjects用于存储对话行、声音预设和库存项目等数据,易于设计师修改,并且所有脚本都可以访问。
- 🎮 ScriptableObjects还可以作为Unity功能的扩展层,以重用通用功能和连接系统,例如InputReader用于集中处理玩家输入。
- 📡 使用ScriptableObjects作为通信的中间点,创建了灵活的事件系统,避免了场景内对象之间的依赖。
- 🔊 通过ScriptableObjects实现的音频系统允许在不同场景中播放声音,AudioManager脚本根据请求激活AudioSources。
- 🔄 加载系统使用ScriptableObjects实现场景切换,通过LocationExit脚本触发事件,而LocationLoader管理器负责加载所有场景。
- 🛠️ 项目正在开发自定义检查器和编辑器窗口,以更舒适地创建和管理ScriptableObjects,避免手动插入场景名称的错误。
- 🌟 鼓励社区成员参与开发,下载项目进行实验,提出新特性,或在自己的游戏中重用部分代码。
Q & A
什么是'Open Project',它有什么特点?
-‘Open Project’是一种开放源代码的游戏项目,允许创作者社区自由地协作并积极参与整个游戏开发过程。参与者可以根据自己的专长做出贡献,或者学习新知识。
Unity 'Open Project'的第一个项目叫什么名字,它属于哪种游戏类型?
-Unity 'Open Project'的第一个项目名为'Chop Chop',它属于经典的动作冒险游戏类型。
为什么Unity 2019.4 LTS版本被选为开发'Chop Chop'的主要版本?
-Unity 2019.4 LTS版本被选为开发'Chop Chop'的主要版本,因为它能提供最佳的开发稳定性。
ScriptableObject和MonoBehaviour有什么区别?
-ScriptableObject是数据容器,它们像材质或3D模型一样是资源,不依赖于应用程序的播放状态,可以存储在播放模式之外的值。而MonoBehaviour通常被称为脚本,是附加到GameObject上的组件,它们的值在退出播放模式时会被重置。
为什么在游戏开发中使用硬编码连接可能会导致问题?
-硬编码连接在项目规模扩大时可能导致严重的可扩展性问题,并引入难以追踪的意外错误。
Singleton模式是什么,它在Unity中通常用于解决什么问题?
-Singleton模式是一种编程模式,它使用一个类的唯一、全局可访问的实例,始终可用。这在创建全局管理器以持有全局可访问的变量和函数、实现跨多个场景的持久状态以及快速实现方面非常有用。
ScriptableObject在'Chop Chop'项目中扮演了什么角色?
-在'Chop Chop'项目中,ScriptableObject被用作数据容器,用于存储对话行、声音预设和库存项等。它们还可以作为创建Unity功能层的强大工具,以公开和重用公共功能并桥接系统。
如何使用ScriptableObject创建灵活的事件系统?
-通过使用ScriptableObject作为通信的中间点,可以创建灵活的事件系统。这些ScriptableObject被称为'channels',它们像广播电台一样,可以广播事件并监听它们,从而在两个或多个通信部分之间建立连接。
为什么使用ScriptableObject作为事件通信的中间点可以提高模块化和项目可维护性?
-使用ScriptableObject作为事件通信的中间点可以提高模块化和项目可维护性,因为事件的发送者和接收者不需要事先知道对方的存在,它们可以在隔离的层中独立存在,代表单一的入口点。
如何使用ScriptableObject来改进游戏的音频系统?
-通过创建一个名为'AudioCueEventChannelSO'的ScriptableObject类,可以将UnityAction包含在其中,请求三个参数:两个ScriptableObject引用和一个Vector3。这使得音频系统模块化,并且可以在不同的场景中播放声音。
如何使用ScriptableObject来实现游戏的加载系统?
-通过使用名为'LoadEventChannelSO'的ScriptableObject类,它包含一个接受GameSceneSO数组和布尔值的UnityAction。这允许从任何地方、任何时间请求场景变换。
为什么在所有channel脚本中在引发事件之前检查空值很重要?
-在所有channel脚本中在引发事件之前检查空值很重要,因为如果没有活动订阅者,会引发空引用异常。检查空值可以确保在没有监听器的情况下在控制台中显示通知,避免程序崩溃。
如何通过自定义检查器来改善ScriptableObject的工作流程?
-通过创建自定义检查器,可以以更舒适的方式编写ScriptableObject,有时还可以创建自定义编辑器窗口,将它们聚集在一个地方,减少设置不同资产中存储的值所需的繁琐来回操作。
如何避免在ScriptableObject中手动插入场景名称时出现的错误?
-通过使用自定义检查器,例如GameSceneSOEditor脚本中的例子,可以从真实场景引用的列表中选择场景名称,避免手动插入,这样可以减少错误并防止在更新场景时破坏ScriptableObject中使用的引用。
Outlines
This section is available to paid users only. Please upgrade to access this part.
Upgrade NowMindmap
This section is available to paid users only. Please upgrade to access this part.
Upgrade NowKeywords
This section is available to paid users only. Please upgrade to access this part.
Upgrade NowHighlights
This section is available to paid users only. Please upgrade to access this part.
Upgrade NowTranscripts
This section is available to paid users only. Please upgrade to access this part.
Upgrade NowBrowse More Related Video
Why I Love Odoo as a Developer | Multiple Reasons
[UE5] Episode 08 - Modular Gameplay Features (Abilities) | Gameplay Ability System Basics
How I built 21 startups in 2 years
I made these 23 websites (and earned $562,943)
How to use Microsoft Azure AI Studio and Azure OpenAI models
Create a List of Todo items in SwiftUI | Todo List #1
5.0 / 5 (0 votes)