UE4_子系统(SubSystem)应用案例

参考来源见《InsideUE4》GamePlay架构(十一)Subsystems
案例来源油管官方视频

为什么要用子系统这个模块,往往在开发中我们要维护某一个类型(类别)的集群的一个生成,添加,业务处理,销毁等逻辑,一般情况下会写一个Manager的东西。 官方推出这个子系统这个概念,个人理解是方便开发者去更好地、方便地实现上述陈述的东西。

在开发中经常使用的官方插件VaRest(用来处理http)就是把它设计成了一个子系统的样子。

以下代码摘自油管的官方视频,记录下来,以便日后学习使用。

.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "ScoreSubsystem.generated.h"

/**
 * 
 */
UCLASS()
class MULTITASKTEST_API UScoreSubsystem : public UGameInstanceSubsystem
{

	GENERATED_BODY()
public:
	
	// begin USubsystem
	void Initialize(FSubsystemCollectionBase& Collection) override;

	// end USubsystem
	void Deinitialize() override;

	UFUNCTION(BlueprintCallable, Category="ScoreSystem")
		void IncrementMultiplier(int32 Amout=1);

	UFUNCTION(BlueprintCallable,Category="ScoreSystem")
		int32 GetMultiplier();

	UFUNCTION(BlueprintCallable,Category="ScoreSystem")
		void AddScore(int32 BaseScore);

	UFUNCTION(BlueprintCallable, Category = "ScoreSystem")
		int32 GetTotalScore(int32 BaseScore);

	DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FScoreAdded, int32, UnmultipleAddScore);
	DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FScoreChanged, int32, TotalNewScore);

	UPROPERTY(BlueprintAssignable,Category="ScoreSubsystem")
		FScoreAdded OnScoreAdd;

	UPROPERTY(BlueprintAssignable,Category="ScoreSubsystem")
		FScoreChanged OnScoreChanged;

private:

	int32 CurrentMultiplier;
	int32 CurentScore;

};

.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "Core/ScoreSubsystem.h"

void UScoreSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
	CurrentMultiplier = 1;
	CurentScore = 0;
}

void UScoreSubsystem::Deinitialize()
{
	OnScoreAdd.Clear();
	OnScoreChanged.Clear();
}

void UScoreSubsystem::IncrementMultiplier(int32 Amout/*=1*/)
{
	CurrentMultiplier = FMath::Max(CurrentMultiplier + Amout, 1);
}

int32 UScoreSubsystem::GetMultiplier()
{
	return CurrentMultiplier;
}

void UScoreSubsystem::AddScore(int32 BaseScore)
{
	CurentScore = FMath::Max(CurentScore + (CurrentMultiplier * BaseScore), 0);
	OnScoreAdd.Broadcast(BaseScore);
	OnScoreChanged.Broadcast(CurentScore);
}

int32 UScoreSubsystem::GetTotalScore(int32 BaseScore)
{
	return CurentScore;
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`udev_monitor_filter_add_match_subsystem_devtype()`是一个函数,它用于添加udev监视器的过滤规则,以匹配指定的子系统和设备类型。 在Linux系统中,udev(即用户空间设备管理器)用于动态地管理设备节点,它负责在设备插入或移除时进行相应的操作。udev监视器用于监视udev事件,并可以根据用户定义的过滤规则来筛选感兴趣的事件。 `udev_monitor_filter_add_match_subsystem_devtype()`函数可以将子系统和设备类型作为参数,以便过滤出特定类型的设备。该函数的具体用法可能因不同的编程语言和库而有所差异,通常需要在使用udev库的程序中进行调用。 下面是一个示例代码片段,展示了如何使用`udev_monitor_filter_add_match_subsystem_devtype()`函数添加过滤规则: ```c #include <libudev.h> int main() { struct udev_monitor *monitor; struct udev *udev; int ret; // 初始化udev udev = udev_new(); if (!udev) { // 错误处理 return 1; } // 创建udev监视器 monitor = udev_monitor_new_from_netlink(udev, "udev"); if (!monitor) { // 错误处理 udev_unref(udev); return 1; } // 添加过滤规则 ret = udev_monitor_filter_add_match_subsystem_devtype(monitor, "block", NULL); if (ret < 0) { // 错误处理 udev_monitor_unref(monitor); udev_unref(udev); return 1; } // 启动监视器 ret = udev_monitor_enable_receiving(monitor); if (ret < 0) { // 错误处理 udev_monitor_unref(monitor); udev_unref(udev); return 1; } // 监视udev事件并处理 // ... // 释放资源 udev_monitor_unref(monitor); udev_unref(udev); return 0; } ``` 上述示例代码中,通过调用`udev_monitor_filter_add_match_subsystem_devtype()`函数,将过滤规则设置为匹配"block"子系统的所有设备类型。然后,通过`udev_monitor_enable_receiving()`函数启动监视器,并可继续处理接收到的udev事件。 请注意,上述示例代码仅用于说明函数的用法,实际使用时需要根据具体需求进行适当的修改和错误处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值