• 13.1 GAS基本框架搭建及第一个GA


    1. 模板和插件布置

    这里以第三人称模板(C++版)为基础进行开发。

    并且启用GAS插件:

    在这里插入图片描述

    勾选插件后,关闭引擎编辑器。

    注意: 默认要求重启,这里直接关闭,待进行完后续代码编辑操作后通过编译器启动项目。

    2. 添加模块引用

    在引擎内启用插件只是允许在编辑器内创建基本的GA、GE,但只是这样并无法对其进行使用,而且在代码层面的使用也需要直接进入到代码中对相应的模块进行依赖性的添加。

    在项目的build.cs文件中(项目名.build.cs),添加模块的引用:

    PrivateDependencyModuleNames.AddRange(new string[]
    {
    	"GameplayAbilities",
    	"GameplayTasks",
    	"GameplayTags"
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3. 创建可以使用GA的Character代码

    创建角色基类GASCharacterBase(完成GAS组件在服务器的初始化):

    #pragma once
    
    #include "CoreMinimal.h"
    #include "AbilitySystemInterface.h"
    #include "GameFramework/Character.h"
    #include "GASCharacterBase.generated.h"
    
    UCLASS()
    class INSIDEGAS_API AGASCharacterBase : public ACharacter, public IAbilitySystemInterface
    {
    	GENERATED_BODY()
    
    public:
    	// Sets default values for this character's properties
    	AGASCharacterBase();
    	virtual void PossessedBy(AController* NewController) override;
    public:
    	FORCEINLINE virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override
    	{
    		return AbilitySystemComponent;
    	}
    
    protected:
    	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
    	UAbilitySystemComponent* AbilitySystemComponent;
    
    	static FName AbilitySystemComponentName;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    #include "GASCharacterBase.h"
    #include "AbilitySystemComponent.h"
    
    FName AGASCharacterBase::AbilitySystemComponentName(TEXT("AbilitySystemComponent"));
    
    // Sets default values
    AGASCharacterBase::AGASCharacterBase()
    {
    	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    	PrimaryActorTick.bCanEverTick = true;
    
    	AbilitySystemComponent = CreateDefaultSubobject(
    		AGASCharacterBase::AbilitySystemComponentName);
    }
    
    void AGASCharacterBase::PossessedBy(AController* NewController)
    {
    	Super::PossessedBy(NewController);
    
    	if (IsValid(AbilitySystemComponent))
    	{
    		AbilitySystemComponent->InitAbilityActorInfo(this, this);
    	}
    
    	SetOwner(NewController);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    创建控制器基类GASPlayerControllerBase(完成GAS组件在客户端的初始化,单机游戏可以忽略这里的操作):

    #pragma once
    
    #include "CoreMinimal.h"
    #include "GASPlayerControllerBase.generated.h"
    
    UCLASS()
    class INSIDEGAS_API AGASPlayerControllerBase : public APlayerController
    {
    	GENERATED_BODY()
    
    public:
    	// Sets default values for this actor's properties
    	AGASPlayerControllerBase();
    
    	virtual void AcknowledgePossession(APawn* P) override;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    #include "GASPlayerControllerBase.h"
    #include "AbilitySystemComponent.h"
    #include "GASCharacterBase.h"
    
    
    // Sets default values
    AGASPlayerControllerBase::AGASPlayerControllerBase()
    {
    	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    	PrimaryActorTick.bCanEverTick = true;
    }
    
    void AGASPlayerControllerBase::AcknowledgePossession(APawn* P)
    {
    	Super::AcknowledgePossession(P);
    	AGASCharacterBase* PossessedCharacter = Cast(P);
    
    	if (IsValid(PossessedCharacter))
    	{
    		PossessedCharacter->GetAbilitySystemComponent()->InitAbilityActorInfo(PossessedCharacter, PossessedCharacter);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    将系统创建的角色类的基类(主要包含移动,输入,还有相机相关的代码,后续这部分也需要改造,这里暂时使用默认的代码),修改为我们创建的角色类GASCharacterBase,如:

    class AInsideGASCharacter : public AGASCharacterBase
    
    • 1

    完成后,编译并启动项目。

    4. 创建和使用第一个GA

    在content里创建GA的蓝图GA_FirstAbility

    在这里插入图片描述

    在其中构建简单的测试逻辑:

    在这里插入图片描述

    此外,设置技能的Net Execution PolicyServer Initiated(默认为Local Predicted)。

    在这里插入图片描述

    在第三人称蓝图中进行技能的赋予,以及技能通过输入的触发:

    在这里插入图片描述

    运行并按下T键进行测试,结果:

    在这里插入图片描述

    参考:

    技能系统组件

  • 相关阅读:
    redis详细教程
    【数据结构】线性表的链式存储结构
    图像倾斜角度求取-Radon变换
    算法——动态规划(新)
    每日一个设计模式之【装饰器模式】
    基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的稻田虫害检测系统详解(深度学习+Python代码+UI界面+训练数据集)
    用户权限数据转换为用户组列表(3/3) - Excel PY公式
    在https页面,通过iframe实现http跨域访问(解决iframe页面点击浏览器刷新按钮后返回首页问题)
    红队隧道应用篇之Netsh端口转发
    售后服务管理升级要怎么做?如何用好售后工单管理系统?
  • 原文地址:https://blog.csdn.net/xcinkey/article/details/127695772