一、定义与功能
Subsystem是自动实例化的类,其生命周期由引擎进行管理,并且与指定的类型(如Engine、Editor、GameInstance、World、LocalPlayer等)的生命周期一致。这些类提供了易于使用的扩展点,使得程序员可以在不修改或继承引擎类的情况下,轻松地添加新的功能,并通过蓝图和Python进行访问。
二、主要特点
- 生命周期管理:Subsystem的生命周期由引擎自动管理,开发者无需手动处理创建和销毁的逻辑。这大大简化了开发过程,并减少了因生命周期管理不当而导致的错误。
- 易于扩展:Subsystem的设计使用了类似组合的设计模式,没有复杂的继承关系,因此易于扩展和理解。开发者可以通过继承USubsystem类或其子类来创建自己的Subsystem。
- 蓝图和Python访问:Subsystem能够原生地暴露接口给蓝图和Python使用,这使得开发者可以在这些环境中轻松地调用Subsystem的功能。
- 模块化:Subsystem使得代码更加模块化,方便开发者将功能拆分成独立的模块进行管理和维护。同时,这也使得Subsystem可以轻松地迁移到其他游戏项目中使用。
三、类型与生命周期
UE目前支持的Subsystem类型有以下五种,每种类型对应不同的Outer对象和生命周期:
- Engine类:UEngineSubsystem,其Outer对象为GEngine,生命周期为引擎启动期间或游戏进程期间。
- Editor类:UEditorSubsystem,其Outer对象为GEditor,生命周期为编辑器启动期间。
- GameInstance类:UGameInstanceSubsystem,其Outer对象为GameInstance,生命周期为游戏运行期间。
- World类:UWorldSubsystem,其Outer对象为World,生命周期为关卡运行期间。一个游戏可能会有多个关卡,编辑器下看到的场景也是一个World。
- LocalPlayer类:ULocalPlayerSubsystem,其Outer对象为LocalPlayer,生命周期为本地玩家存在期间。实际上,它的生命周期通常与GameInstance相近,但可能因多个本地玩家或游戏过程中的添加/减少本地玩家而有所不同。
四、使用场景与案例
- 游戏开发中的工具类:在UE4.22之前,开发者通常需要自己编写单例来管理游戏开发中的工具类。但随着Subsystem的引入,开发者可以将这些工具类编写在Subsystem中,由引擎自动管理其生命周期。
- 插件开发:UE官方和第三方开发者可以使用Subsystem来开发插件,以扩展引擎或游戏的功能。这些插件可以轻松地集成到项目中,并通过蓝图或Python进行访问。
- 统计系统:一个典型的Subsystem使用案例是统计系统。开发者可以创建一个继承自UGameInstanceSubsystem的子系统来管理游戏中的分数、统计信息等。这个子系统可以暴露接口给蓝图使用,以便在游戏中实时更新和显示这些信息。
五、注意事项
- 空指针检查:当通过接口获取Subsystem指针时,一定要进行空指针检查,以避免因指针无效而导致的崩溃。
- 动态加载与卸载:UDynamicSubsystem提供了一种动态加载和卸载Subsystem的机制。但需要注意的是,只有UEngineSubsystem和UEditorSubsystem可以被动态加载。
- 蓝图中的使用:Subsystem在蓝图中会自动公开带有智能节点的接口,无需进行Cast转型。开发者可以利用标准UFUNCTION()标记和规则来控制蓝图可用的API。
实战:
一、定义一个继承自UGameInstanceSubsystem的类
#include "CoreMinimal.h" #include "Subsystems/GameInstanceSubsystem.h" #include "MySimpleSubsystem.generated.h" class TESTCPP_API UMySimpleSubsystem : public UGameInstanceSubsystem
二、可以进行重写subsystem里的一些基础函数
virtual bool ShouldCreateSubsystem(UObject* Outer) const override; virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override;
三、自定义一些函数与变量
public: UFUNCTION(BlueprintCallable,Category="My") void AddHealth (int32 InhealthToAdd); UFUNCTION(BlueprintCallable,Category="My") int32 GetHealth(); private: int32 CurrentHealth=100;
在蓝图中就可以全局访问到
今天的文章 UEC++ Subsystem简单使用分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/100294.html