虚幻引擎5 GAS开发俯视角RPG游戏 P02-08 初始化能力演员信息

初始化GAS的OwnerActorAvatarActor

虚幻引擎5 GAS开发俯视角RPG游戏 P02-08 初始化能力演员信息_第1张图片

现在,玩家角色CCCharater里ASC和AS的指针还是空的。对于玩家角色,两个系统的有效指针在PlayerState里。这里我们就要想办法他们关联上。PlayerState要知道谁实际构建了这两个系统。

我们将调用函数来设置拥有者角色和Avatar角色。这是在能力系统组件上的一个函数,称为InitAbilityActorInfo

/**初始化了能力的ActorInfo结构,该结构包含有关我们正在对谁采取行动以及谁控制我们的信息。
*OwnerActor是逻辑上拥有此组件的参与者。
*AvatarActor是我们在世界上扮演的物理演员。通常是爪子,但也可能是塔、建筑、炮塔等,可能与主人相同
**/
UAbilitySystemComponent::InitAbilityActorInfo(AActor* InOwnerActor, AActor* InAvatarActor);

一、为敌人类初始化演员能力信息:

1.重写BeginPlay()函数

void ACCEnemyCharacter::BeginPlay()
{
	Super::BeginPlay();
	// 为敌人类初始化演员能力信息
	AbilitySystemComponent->InitAbilityActorInfo(this,this);
}

好了!

二、为玩家类初始化演员能力信息:

1.重写2个虚函数:

	//服务器端初始化ASC
	virtual void PossessedBy(AController* NewController) override;;
	//客户端初始化ASC
	virtual void OnRep_PlayerState() override;
	

整体代码:

CCHeroCharacter.h

// 版权归陈超所有

#pragma once

#include "CoreMinimal.h"
#include "Characters/CCCharacterBase.h"
#include "CCHeroCharacter.generated.h"

class UCameraComponent;
class USpringArmComponent;
/**
 * 
 */
UCLASS()
class CC_AURA_API ACCHeroCharacter : public ACCCharacterBase
{
	GENERATED_BODY()

public:
	//构造函数
	ACCHeroCharacter();

	//服务器端初始化ASC
	virtual void PossessedBy(AController* NewController) override;;
	//客户端初始化ASC
	virtual void OnRep_PlayerState() override;
	
	
protected:
private:
	//初始化演员能力信息
	void InitAbilityActorInfo();

#pragma region Components
	//弹簧臂组件
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))
	TObjectPtr SpringArm;
	
	//跟随摄像机组件
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))
	TObjectPtr FollowCamera;
	
#pragma endregion
	
};

CCHeroCharacter.cpp:

// 版权归陈超所有


#include "Characters/CCHeroCharacter.h"

#include "AbilitySystemComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "Player/CCPlayerState.h"

ACCHeroCharacter::ACCHeroCharacter()
{
	//角色本身的设置(俯视角游戏)
	GetCharacterMovement()->bOrientRotationToMovement = true; //设置为true,角色将朝移动的方向旋转
	GetCharacterMovement()->RotationRate = FRotator(0.f, 400.f, 0.f); //旋转速率
	GetCharacterMovement()->bConstrainToPlane = true; //约束到平面
	GetCharacterMovement()->bSnapToPlaneAtStart = true; //设置了上面一项为true,且此项设置为true,则在开始时与地面对齐

	bUseControllerRotationPitch = false;	//同时需要确保角色本身不跟随控制器旋转:
	bUseControllerRotationYaw = false;
	bUseControllerRotationRoll = false;
	
	//弹簧臂组件
	SpringArm = CreateDefaultSubobject(TEXT("SpringArm"));
	SpringArm->SetupAttachment(RootComponent);	//设置附着点(跟组件)
	SpringArm->TargetArmLength = 900;
	SpringArm->SetRelativeRotation(FRotator(-45.f, 0, 0));	//设置相对旋转 设置俯视角度(Pitch负值)
	SpringArm->bUsePawnControlRotation = false;	//确保不随角色转向而转动
	SpringArm->bInheritPitch = false;	//取消继承俯仰
	SpringArm->bInheritRoll = false;	//取消继承翻滚
	SpringArm->bInheritYaw = false;		//取消继承摇摆
	SpringArm->bEnableCameraLag = true;	//相机延迟效果
		
	//跟随摄像机组件
	FollowCamera = CreateDefaultSubobject(TEXT("FollowCamera"));
	FollowCamera->SetupAttachment(SpringArm, USpringArmComponent::SocketName); //设置附着点(弹簧臂组件接口名称)
	FollowCamera->bUsePawnControlRotation = false;
	

	
}

void ACCHeroCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);
	//服务器端初始化ASC
	InitAbilityActorInfo();
}

void ACCHeroCharacter::OnRep_PlayerState()
{
	Super::OnRep_PlayerState();
	//客户端初始化ASC
	InitAbilityActorInfo();
}

void ACCHeroCharacter::InitAbilityActorInfo()
{
	ACCPlayerState* CCPlayerState = GetPlayerState();	//获取玩家状态
	check(CCPlayerState);
	//初始化ASC
	CCPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(CCPlayerState, this);
	//获取玩家角色的ASC、AS
	AbilitySystemComponent = CCPlayerState->GetAbilitySystemComponent();
	AttributeSet = CCPlayerState->GetAttributeSet();
}

你可能感兴趣的:(Aura开发文档,ue5,游戏,c++,虚幻)