在学习GAS系统之间需要准备的一些内容。
今天开始进入UE4的GAS系统学习,该系统是角色的技能系统,全称为Gameplay Abilities System。
首先我们需要开启GameplayAbilities和GameplayTagsEditor两个模块。
新建项目,在插件中找到这两个模块,并启用,重启客户端。

在UE4商城中下载红框资源(免费),添加到工程,并用C++创建一个Character文件。

打开xxx.Build.cs文件,增加以下两个模块。编译后重启。

为Character的C++文件添加模型,属性,动作映射,蒙太奇动画,动画融合,动画通知事件等内容。
1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "GameFramework/Character.h" 7 #include "GameFramework/CharacterMovementComponent.h" 8 #include "Components/CapsuleComponent.h" 9 #include "AbilitySystemInterface.h" 10 #include "AbilitySystemComponent.h" 11 #include "Abilities/GameplayAbility.h" 12 #include "GameplayAbilities/Public/GameplayAbilitySpec.h" 13 #include "Shinbi.generated.h" 14 15 UCLASS() 16 class SHIBI_API AShinbi : public ACharacter,public IAbilitySystemInterface 17 { 18 GENERATED_BODY() 19 20 public: 21 // Sets default values for this character's properties 22 AShinbi(); 23 24 protected: 25 // Called when the game starts or when spawned 26 virtual void BeginPlay() override; 27 28 public: 29 // Called every frame 30 virtual void Tick(float DeltaTime) override; 31 32 // Called to bind functionality to input 33 virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; 34 35 UPROPERTY(EditAnywhere,BlueprintReadWrite,Category="Shinbi | Properties") 36 float LookRate; 37 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Shinbi | Properties") 38 float LookUpRate; 39 40 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Shinbi | Properties") 41 float MoveSpeed; 42 43 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Shinbi | Properties") 44 FRotator mouseInput; 45 46 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Shinbi | Properties") 47 FVector keyInput; 48 49 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Shinbi | Properties") 50 class UCharacterMovementComponent* moveComponent; 51 52 public: 53 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Shinbi | Camera") 54 class USkeletalMeshComponent* shibiSkeletal; 55 56 UPROPERTY(VisibleAnywhere,BlueprintReadWrite, Category = "Shinbi | Camera") 57 class UCameraComponent* cameras; 58 59 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Shinbi | Camera") 60 class USpringArmComponent* springArm; 61 62 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Shinbi | Animation") 63 UAnimMontage* montageAttack; 64 65 UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Shinbi | AbilitiesComponent") 66 class UAbilitySystemComponent* AbilityComp; 67 68 virtual UAbilitySystemComponent* GetAbilitySystemComponent() const; 69 70 UFUNCTION(BlueprintCallable, Category = "Shinbi | UGameplayAbilities") 71 void AquireAbility(TSubclassOf<UGameplayAbility> listAblities); 72 73 void moveForward(float value); 74 void moveLeft(float value); 75 void lookUp(float value); 76 void lookRight(float value); 77 void Jump(); 78 void Attack(); 79 };
讯享网

讯享网1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 4 #include "Shinbi.h" 5 #include "UObject/ConstructorHelpers.h" 6 #include "Components/SkeletalMeshComponent.h" 7 #include "Camera\CameraComponent.h" 8 #include "GameFramework/SpringArmComponent.h" 9 #include "Components/InputComponent.h" 10 11 // Sets default values 12 AShinbi::AShinbi() 13 { 14 // Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it. 15 PrimaryActorTick.bCanEverTick = true; 16 //找到父类中的Skeletal组件加载资源 17 shibiSkeletal = FindComponentByClass<USkeletalMeshComponent>(); 18 19 //shibiSkeletal = GetMesh(); 20 21 AbilityComp = CreateDefaultSubobject<UAbilitySystemComponent>("AbilityComp"); 22 23 24 //创建相机与摇臂 25 cameras = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera")); 26 springArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("springArm")); 27 moveComponent = FindComponentByClass<UCharacterMovementComponent>(); 28 springArm->SetupAttachment(shibiSkeletal); 29 cameras->SetupAttachment(springArm); 30 31 moveComponent->JumpZVelocity = 840.0f; 32 33 auto shibiSkeletalAsset = ConstructorHelpers::FObjectFinder<USkeletalMesh>(TEXT("SkeletalMesh'/Game/ParagonShinbi/Characters/Heroes/Shinbi/Meshes/Shinbi.Shinbi'")); 34 35 36 AutoPossessPlayer = EAutoReceiveInput::Player0; 37 38 //设置模型基本属性 39 if (shibiSkeletalAsset.Succeeded()) { 40 shibiSkeletal->SetSkeletalMesh(shibiSkeletalAsset.Object); 41 shibiSkeletal->SetRelativeLocation(FVector(0, 0, -90)); 42 shibiSkeletal->SetRelativeRotation(FRotator(0, -90, 0)); 43 shibiSkeletal->SetCollisionResponseToAllChannels(ECR_Block); 44 shibiSkeletal->SetCollisionObjectType(ECC_Pawn); 45 springArm->CameraLagSpeed = 100.0f; 46 springArm->TargetArmLength = 300.0f; 47 springArm->bEnableCameraLag = true; 48 springArm->SetRelativeRotation(FRotator(-10, 90, 0)); 49 springArm->SetRelativeLocation(FVector(0, 0, 150)); 50 51 } 52 MoveSpeed = 20.0f; 53 LookRate = 5.0f; 54 LookUpRate = 5.0f; 55 } 56 57 // Called when the game starts or when spawned 58 void AShinbi::BeginPlay() 59 { 60 Super::BeginPlay(); 61 UClass* anim = LoadClass<UAnimInstance>(NULL,TEXT("AnimBlueprint'/Game/BP/Anim_BP_Shibi.Anim_BP_Shibi_C'")); 62 shibiSkeletal->SetAnimInstanceClass(anim); 63 64 //加载蒙太奇攻击动画资源 65 montageAttack = LoadObject<UAnimMontage>(NULL, TEXT("AnimMontage'/Game/BP/Anim_Attack.Anim_Attack'")); 66 67 } 68 69 // Called every frame 70 void AShinbi::Tick(float DeltaTime) 71 { 72 Super::Tick(DeltaTime); 73 //设置人物移动 74 75 76 //设置人物UP视角 77 78 FRotator springArmRotator = springArm->GetRelativeRotation(); 79 mouseInput.Pitch *= LookUpRate; 80 springArmRotator.Pitch += mouseInput.Pitch; 81 springArmRotator.Pitch = FMath::Clamp(springArmRotator.Pitch, -30.0f, 30.0f); 82 springArm->SetRelativeRotation(springArmRotator); 83 84 //设置人物YAW视角 85 FRotator cameraRotation = cameras->GetRelativeRotation(); 86 mouseInput.Yaw *= LookRate; 87 cameraRotation.Yaw += mouseInput.Yaw; 88 cameraRotation.Yaw = FMath::Clamp(cameraRotation.Yaw, -180.0f, 180.0f); 89 shibiSkeletal->AddRelativeRotation(cameraRotation); 90 91 92 //设置人物跟随视角移动,改变移动方向。 93 94 FVector left = shibiSkeletal->GetForwardVector(); 95 FVector forward = shibiSkeletal->GetRightVector(); 96 97 if (keyInput.Y == 20) { 98 keyInput= forward * MoveSpeed; 99 } 100 else if (keyInput.Y == -20) { 101 keyInput = -(forward * MoveSpeed); 102 } 103 104 if (keyInput.X == 20) { 105 keyInput = left * MoveSpeed; 106 } 107 else if(keyInput.X == -20) { 108 keyInput = -(left * MoveSpeed); 109 } 110 111 AddActorLocalOffset(keyInput); 112 113 } 114 115 116 // Called to bind functionality to input 117 void AShinbi::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) 118 { 119 Super::SetupPlayerInputComponent(PlayerInputComponent); 120 121 PlayerInputComponent->BindAxis("moveForward", this, &AShinbi::moveForward); 122 PlayerInputComponent->BindAxis("moveLeft", this, &AShinbi::moveLeft); 123 PlayerInputComponent->BindAxis("lookUp", this, &AShinbi::lookUp); 124 PlayerInputComponent->BindAxis("lookRight", this, &AShinbi::lookRight); 125 PlayerInputComponent->BindAction("Jump",IE_Pressed, this, &AShinbi::Jump); 126 PlayerInputComponent->BindAction("Attack",IE_Pressed, this, &AShinbi::Attack); 127 128 } 129 130 void AShinbi::moveLeft(float value) 131 { 132 //DA控制的时候 133 keyInput.X = FMath::Clamp(value,-1.0f,1.0f) * MoveSpeed; 134 } 135 136 UAbilitySystemComponent* AShinbi::GetAbilitySystemComponent() const 137 { 138 return AbilityComp; 139 } 140 141 //调用这个方法,给主角增加一个游戏技能,选择游戏技能是从UGameplayAbility的子类中选取 142 void AShinbi::AquireAbility(TSubclassOf<UGameplayAbility> listAblities) 143 { 144 if (AbilityComp) { 145 if (HasAuthority() && listAblities) { 146 //为主角添加技能,FGameplayAbilitySpec是从菜单中选取的具体的技能,并将技能的各项属性打包到FGameplayAbilitySpec结构体中 147 //通过AbilityComp添加技能。而AbilityComp组件是属于主角的,所以主角可以拥有该技能。 148 AbilityComp->GiveAbility(FGameplayAbilitySpec(listAblities,1,0)); 149 } 150 //初始化主角技能,填入技能的拥有者和发起者。 151 AbilityComp->InitAbilityActorInfo(this, this); 152 } 153 } 154 155 void AShinbi::moveForward(float value) 156 { 157 //WS控制的时候 158 keyInput.Y = FMath::Clamp(value, -1.0f, 1.0f) * MoveSpeed; 159 160 } 161 162 void AShinbi::lookUp(float value) 163 { 164 mouseInput.Pitch = value; 165 mouseInput.Yaw = 0; 166 mouseInput.Roll = 0; 167 168 } 169 170 void AShinbi::lookRight(float value) 171 { 172 mouseInput.Yaw = value; 173 mouseInput.Pitch = 0; 174 mouseInput.Roll = 0; 175 176 } 177 178 void AShinbi::Jump() 179 { 180 Super::Jump(); 181 } 182 183 void AShinbi::Attack() 184 { 185 //播放蒙太奇动画 186 PlayAnimMontage(montageAttack); 187 }
动画混合空间

动画蓝图,状态机等设置

攻击动画蒙太奇及通知事件


一切准备就绪。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/54816.html