C07_Override.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "C07_Override.generated.h"
UCLASS()
class U2110_03_API AC07_Override : public AActor
{
GENERATED_BODY()
private:
UPROPERTY(VisibleDefaultsOnly)
class USceneComponent* Root;
UPROPERTY(VisibleDefaultsOnly)
class UBoxComponent* Box;
UPROPERTY(VisibleDefaultsOnly)
class UTextRenderComponent* Text;
public:
AC07_Override();
protected:
virtual void BeginPlay() override;
private:
UFUNCTION()
void OnBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);
UFUNCTION()
void OnEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
protected: //자식에 접근 하기 위해서,
UFUNCTION(BlueprintImplementableEvent) //블루프린트에 적용 할 수 있게 해준다.
void ChangeColorRed();
UFUNCTION(BlueprintNativeEvent)
void ChangeColorWhite(); //이건 기본을 만들어 줘야한다.
void ChangeColorWhite_Implementation(); //해당 정의 (C에서 자식에서 재정의 이 줄을 선언부가 없어도 실행이 된다.
//cpp에서 선언부가 되기 때문에. 써주는 이유는 인텔리센스 지원이 안되서
};
BlueprintImplementableEvent : C에서 함수를 호출해 줄 것인데. 이 함수가 어떤 역할을 할지 모른다. 자신이 직접 필요한 때 호출해 줄테니까. 마음대로 만들어서 쓰라는 것
BlueprintNativeEvent : C에서 기본으로 어떤 행동을 정의 해놓는 다면 필요하면 재정의 해서 사용할 수 있다
BlueprintPure : 블루프린트 내에서 Pure 퓨어 적용하는 것 ,
플레이어 에서 Material를 바꿔 줄 수 있도록
메터리얼을 변경할려면 다이나믹 메터리얼을 가지고 있어야 한다.
CPlayer.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "CPlayer.generated.h"
UCLASS()
class U2110_03_API ACPlayer : public ACharacter
{
GENERATED_BODY()
private:
UPROPERTY(VisibleDefaultsOnly)
class USpringArmComponent* SpringArm;
UPROPERTY(VisibleDefaultsOnly)
class UCameraComponent* Camera;
public:
ACPlayer();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
private:
void OnMoveForward(float InAxisValue);
void OnMoveRight(float InAxisValue);
void OnVerticalLook(float InAxisValue);
void OnHorizontalLook(float InAxisValue);
void OnRun();
void OffRun();
public: //외부에서도 블루프린트에서도 접근 가능하도록
UFUNCTION(BlueprintCallable, Category = "Color") // 블루프린트에서도 접근가능하다는 것
void ChangeColor(FLinearColor InColor);
private:
class UMaterialInstanceDynamic* Materials[2];
};
BlueprintCallable : 블루프린트에서도 접근 가능한
CPlayer.cpp
#include "CPlayer.h"
#include "Global.h"
#include "CAnimInstance.h"
#include "GameFramework/SpringArmComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "Components/SkeletalMeshComponent.h"
#include "Components/InputComponent.h"
#include "Materials/MaterialInstanceDynamic.h" //메터리얼을 가져오기위함
ACPlayer::ACPlayer()
{
PrimaryActorTick.bCanEverTick = true;
CHelpers::CreateComponent<USpringArmComponent>(this, &SpringArm, "SpringArm", GetCapsuleComponent());
CHelpers::CreateComponent<UCameraComponent>(this, &Camera, "Camera", SpringArm);
bUseControllerRotationYaw = false;
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->MaxWalkSpeed = 400;
USkeletalMesh* mesh;
CHelpers::GetAsset<USkeletalMesh>(&mesh, "SkeletalMesh'/Game/Character/Mesh/SK_Mannequin.SK_Mannequin'");
GetMesh()->SetSkeletalMesh(mesh);
GetMesh()->SetRelativeLocation(FVector(0, 0, -90));
GetMesh()->SetRelativeRotation(FRotator(0, -90, 0));
TSubclassOf<UCAnimInstance> animInstance;
CHelpers::GetClass<UCAnimInstance>(&animInstance, "AnimBlueprint'/Game/ABP_Character.ABP_Character_C'");
GetMesh()->SetAnimClass(animInstance);
SpringArm->SetRelativeLocation(FVector(0, 0, 60));
SpringArm->TargetArmLength = 200;
SpringArm->bDoCollisionTest = false;
SpringArm->bUsePawnControlRotation = true;
SpringArm->SocketOffset = FVector(0, 60, 0);
SpringArm->bEnableCameraLag = true;
}
void ACPlayer::BeginPlay()
{
Super::BeginPlay();
TArray<UMaterialInterface*> materials = GetMesh()->GetMaterials();
for (int32 i = 0; i < materials.Num(); i++)
{
Materials[i] = UMaterialInstanceDynamic::Create(materials[i], this);
GetMesh()->SetMaterial(i, Materials[i]);
}
}
void ACPlayer::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void ACPlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAxis("MoveForward", this, &ACPlayer::OnMoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &ACPlayer::OnMoveRight);
PlayerInputComponent->BindAxis("VerticalLook", this, &ACPlayer::OnVerticalLook);
PlayerInputComponent->BindAxis("HorizontalLook", this, &ACPlayer::OnHorizontalLook);
PlayerInputComponent->BindAction("Run", EInputEvent::IE_Pressed, this, &ACPlayer::OnRun);
PlayerInputComponent->BindAction("Run", EInputEvent::IE_Released, this, &ACPlayer::OffRun);
}
void ACPlayer::OnMoveForward(float InAxisValue)
{
FRotator rotator = FRotator(0, GetControlRotation().Yaw, 0);
FVector direction = FQuat(rotator).GetForwardVector().GetSafeNormal2D();
AddMovementInput(direction, InAxisValue);
}
void ACPlayer::OnMoveRight(float InAxisValue)
{
FRotator rotator = FRotator(0, GetControlRotation().Yaw, 0);
FVector direction = FQuat(rotator).GetRightVector().GetSafeNormal2D();
AddMovementInput(direction, InAxisValue);
}
void ACPlayer::OnVerticalLook(float InAxisValue)
{
AddControllerPitchInput(InAxisValue);
}
void ACPlayer::OnHorizontalLook(float InAxisValue)
{
AddControllerYawInput(InAxisValue);
}
void ACPlayer::OnRun()
{
GetCharacterMovement()->MaxWalkSpeed = 600;
}
void ACPlayer::OffRun()
{
GetCharacterMovement()->MaxWalkSpeed = 400;
}
void ACPlayer::ChangeColor(FLinearColor InColor)
{
for (UMaterialInstanceDynamic* material : Materials)
material->SetVectorParameterValue("BodyColor", InColor);
}
C07_Override.cpp
#include "C07_Override.h"
#include "Global.h"
#include "CPlayer.h"
#include "Components/BoxComponent.h"
#include "Components/TextRenderComponent.h"
AC07_Override::AC07_Override()
{
CHelpers::CreateComponent<USceneComponent>(this, &Root, "Root");
CHelpers::CreateComponent<UBoxComponent>(this, &Box, "Box", Root);
CHelpers::CreateComponent<UTextRenderComponent>(this, &Text, "Text", Root);
Box->SetRelativeScale3D(FVector(3));
Box->bHiddenInGame = false;
Text->SetRelativeLocation(FVector(0, 0, 100));
Text->SetRelativeRotation(FRotator(0, 180, 0));
Text->SetRelativeScale3D(FVector(2));
Text->TextRenderColor = FColor::Red;
Text->HorizontalAlignment = EHorizTextAligment::EHTA_Center;
Text->Text = FText::FromString(GetName().Replace(L"Default__", L""));
}
void AC07_Override::BeginPlay()
{
Super::BeginPlay();
Box->OnComponentBeginOverlap.AddDynamic(this, &AC07_Override::OnBeginOverlap);
Box->OnComponentEndOverlap.AddDynamic(this, &AC07_Override::OnEndOverlap);
}
void AC07_Override::OnBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
ChangeColorRed();
}
void AC07_Override::OnEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
ChangeColorWhite(); //Color콜
}
void AC07_Override::ChangeColorWhite_Implementation()
{
//cast 형변환
ACPlayer* player = Cast<ACPlayer>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
CheckNull(player);
player->ChangeColor(FLinearColor::White);
}
블루프린트 -
공개한 것 중에 ChangeColorRed

player cast해준 것

ACPlayer* player = Cast<ACPlayer>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
CheckNull(player);
ChangeColorRed

실행


블루프린트 Native로 한것도 재정의가 가능하다. 위 까지는 C에서 우선권을 가졌기 때문에, white가 생겼는데. 이게 블프에 생기면서 재정의를 하면 우선권을 가진다.

실행

2)들어가면 빨간색 콜


필요하다면 부모를 호출해 올 수도 있다.


실행

2)삘간색

3)나오면 파란색을 콜이 안되고 우선권이였던 하얀색이 콜이 된다.
