虚幻GameAbilitySystem源码与设计解析-AbilityAsync的实现

// Copyright Epic Games, Inc. All Rights Reserved.
// 版权所有 (c) Epic Games, Inc. 保留所有权利。

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "GameplayEffectTypes.h"
#include "Abilities/GameplayAbilityTypes.h"
#include "Engine/CancellableAsyncAction.h"
#include "AbilityAsync.generated.h"

class UAbilitySystemComponent;

/**
 * AbilityAsync 是特定于技能的蓝图异步操作的基类。
 * 这些操作类似于技能任务,但它们可以从任何蓝图(如 Actor 蓝图)中执行,并且不与特定技能的生命周期绑定。
 * 默认情况下,这些操作仅由生成它们的蓝图图保持活动状态,如果蓝图图实例被删除或生成了替代实例,它们最终会被销毁。
 * 当一次性操作成功或失败时,应该调用 EndAction 方法;但对于具有多个触发点的长期操作,可以从蓝图中调用该方法。
 */
UCLASS(Abstract, meta = (ExposedAsyncProxy = AsyncAction))
class GAMEPLAYABILITIES_API UAbilityAsync : public UCancellableAsyncAction
{
    GENERATED_BODY()
public:

    // 重写 Cancel 方法,用于取消异步操作
    virtual void Cancel() override;

    /**
     * 显式结束操作,这将禁用任何回调并允许操作被销毁。
     */
    UFUNCTION(BlueprintCallable, Category = "Ability|Async")
    virtual void EndAction();

    /**
     * 在将委托广播回事件图之前,应该调用此方法,这确保操作和技能系统组件仍然有效。
     */
    virtual bool ShouldBroadcastDelegates() const;

    /**
     * 返回此操作绑定的技能系统组件。
     */
    virtual UAbilitySystemComponent* GetAbilitySystemComponent() const;

    /**
     * 设置绑定的技能系统组件。
     */
    virtual void SetAbilitySystemComponent(UAbilitySystemComponent* InAbilitySystemComponent);

    /**
     * 通过在 Actor 中查找技能系统组件来设置绑定的组件。
     */
    virtual void SetAbilityActor(AActor* InActor);

private:
    // 弱对象指针,指向绑定的技能系统组件
    TWeakObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;
};

 

posted @ 2025-02-23 23:57  mcwhirr  阅读(54)  评论(0)    收藏  举报