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
Esta sección está disponible solo para usuarios con suscripción. Por favor, mejora tu plan para acceder a esta parte.
Mejorar ahoraMindmap
Esta sección está disponible solo para usuarios con suscripción. Por favor, mejora tu plan para acceder a esta parte.
Mejorar ahoraKeywords
Esta sección está disponible solo para usuarios con suscripción. Por favor, mejora tu plan para acceder a esta parte.
Mejorar ahoraHighlights
Esta sección está disponible solo para usuarios con suscripción. Por favor, mejora tu plan para acceder a esta parte.
Mejorar ahoraTranscripts
Esta sección está disponible solo para usuarios con suscripción. Por favor, mejora tu plan para acceder a esta parte.
Mejorar ahoraVer Más Videos Relacionados
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)