1. 어빌리티 액터 정보(Ability Actor Info)

어빌리티 시스템 컴포넌트(Ability System Component)가 어빌리티 액터 정보를 통해 해당 컴포넌트의 주인 액터의 정보를 알 수 있다.

(1) 소유자 액터(Owner Actor)

물리적으로 실제 작동하는 액터.

 

(2) 아바타 액터(Avatar Actor)

어빌리티 시스템 컴포넌트 세계에서 표현되는 액터.

어빌리티 시스템을 사용하여 어빌리티를 발동함.

 

소유자 액터와 아바타 액터는 동일일 수도 있고 아닐 수도 있다.

 

2. 유의점

- 컨트롤러 빙의(Possess) 이후에 어빌리티 액터 정보를 초기화 한다.

(1) 플레이어 캐릭터

(1-1) 어빌리티 시스템 컴포넌트가 폰에 정의된 경우

- 서버에서는 PossessedBy 함수에서 초기화

- 클라이언트에서는 AcknowledgePossession 함수에서 초기화

 

(1-2) 어빌리티 시스템 컴포넌트가 플레이어 스테이트에 정의된 경우

- 서버에서는 PossessedBy 함수에서 초기화

-> 클라이언트에서는 OnRep_PlayerState (Rep Notify)에서 초기화

UCLASS()
class AURA_API AAuraCharacter : public AAuraCharacterBase
{
	GENERATED_BODY()
	
public:
	AAuraCharacter();

	virtual void PossessedBy(AController* NewController) override;
	virtual void OnRep_PlayerState() override;

private:
	UPROPERTY(VisibleAnywhere, Category="Camera")
	TObjectPtr<class USpringArmComponent> SpringArm;

	UPROPERTY(VisibleAnywhere, Category="Camera")
	TObjectPtr<class UCameraComponent> Camera;

private:
	void InitAbilityActorInfo();
};

 

void AAuraCharacter::PossessedBy(AController* NewController)
{
    Super::PossessedBy(NewController);

    // 서버를 위해 어빌리티 액터 정보 초기화
    InitAbilityActorInfo();
}

void AAuraCharacter::OnRep_PlayerState()
{
    Super::OnRep_PlayerState();

    // 클라이언트를 위해 어빌리티 액터 정보 초기화
    InitAbilityActorInfo();
}

void AAuraCharacter::InitAbilityActorInfo()
{
    AAuraPlayerState* AuraPlayerState = <AAuraPlayerState>()
    check(AuraPlayerState);
    
    // 소유자 액터, 아바타 액터
    AuraPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(AuraPlayerState, this);
    
    // ASC와 특성 세트를 가져와서 할당
    AbilitySystemComponent = AuraPlayerState->GetAbilitySystemComponent();
    AttributeSet = AuraPlayerState->GetAttributeSet();
}

 

(2) AI 캐릭터

- 서버와 클라이언트 모두 BeginPlay에서 초기화

void AAuraEnemy::BeginPlay()
{
    Super::BeginPlay();

    AbilitySystemComponent->InitAbilityActorInfo(this, this);
}

 

 

3. 복제 모드의 유의점 - Mixed

- 소유자 액터(Owner Actor)의 소유자는 컨트롤러이어야 한다.

-> 폰이라면 PossessedBy 함수에서 자동으로 소유자가 컨트롤러가 된다.


- 플래이어 스테이트의 소유자(Owner)는 자동으로 컨트롤러가 된다.

 

- OwnerActor가 플레이어 스테이트가 아니며 Mixed 모드를 사용한다면

-> 소유자 액터의 SetOwner 함수를 사용하여 컨트롤러를 소유자로 만들어야 한다.