十七、添加玩家模型与相机
UE4创建Component
CreateDefaultSubobject<T>() //仅在构造函数使用
NewObject<T> //在任何地方使用
UE4资源加载
UObject资源加载
ConstructorHelpers::FObjectFinder<T> //只能在构造函数使用
LoadObject<T> //可以在任何地方使用
蓝图资源加载
ConstructorHelpers::FClassFinder<T> //只能在构造函数使用
LoadClass<T> //可以在任何地方使用
蓝图加载路径最后一定要加_C
添加玩家模型与相机
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "SlAiPlayerCharacter.generated.h"
UCLASS()
class SLAICOURSE_API ASlAiPlayerCharacter : public ACharacter
{
GENERATED_BODY()
public:
// Sets default values for this character's properties
ASlAiPlayerCharacter();
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
public:
UPROPERTY(VisibleDefaultsOnly, Category = "SlAi")
class USpringArmComponent* CameraBoom;
UPROPERTY(VisibleDefaultsOnly, Category = "SlAi")
class UCameraComponent* ThirdCamera;
UPROPERTY(VisibleDefaultsOnly, Category = "SlAi")
UCameraComponent* FirstCamera;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
private:
//第一人称的骨骼模型
UPROPERTY(VisibleDefaultsOnly, Category = "SlAi")
class USkeletalMeshComponent* MeshFirst;
};
#include "SlAiPlayerCharacter.h"
#include"ConstructorHelpers.h"
#include"Engine/SkeletalMesh.h"
#include"Components/SkeletalMeshComponent.h"
#include"Components/CapsuleComponent.h"
#include"GameFramework/SPringArmComponent.h"
#include"Camera/CameraComponent.h"
// Sets default values
ASlAiPlayerCharacter::ASlAiPlayerCharacter()
{
// 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;
//添加第一人称骨骼模型
static ConstructorHelpers::FObjectFinder<USkeletalMesh> StaticMeshFirst(TEXT("SkeletalMesh'/Game/Res/PolygonAdventure/Mannequin/FirstPlayer/SkMesh/FirstPlayer.FirstPlayer'"));
MeshFirst = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("MeshFirst"));
MeshFirst->SetSkeletalMesh(StaticMeshFirst.Object);
MeshFirst->SetupAttachment((USceneComponent*)GetCapsuleComponent());
MeshFirst->bOnlyOwnerSee = true;
MeshFirst->bReceivesDecals = false;
MeshFirst->bCastDynamicShadow = false;
//更新频率衰落
//查一下
MeshFirst->MeshComponentUpdateFlag = EMeshComponentUpdateFlag::OnlyTickMontagesWhenNotRendered;
MeshFirst->PrimaryComponentTick.TickGroup = TG_PrePhysics;
//设置碰撞属性
MeshFirst->SetCollisionObjectType(ECC_Pawn);
MeshFirst->SetCollisionEnabled(ECollisionEnabled::NoCollision);
MeshFirst->SetCollisionResponseToAllChannels(ECR_Ignore);
//设置位移
MeshFirst->SetRelativeLocation(FVector(0.f, 0.f, -95.f));
MeshFirst->SetRelativeRotation(FQuat::MakeFromEuler(FVector(0.f, 0.f, -90.f)));
//给默认Mesh添加骨骼模型
static ConstructorHelpers::FObjectFinder<USkeletalMesh> StaticMeshThird(TEXT("SkeletalMesh'/Game/Res/PolygonAdventure/Mannequin/Player/SkMesh/Player.Player'"));
//USkeletalMesh* Mesh = StaticMeshThird.Object;
GetMesh()->SetSkeletalMesh(StaticMeshThird.Object);
GetMesh()->bOnlyOwnerSee = true;
GetMesh()->bReceivesDecals = false;
GetMesh()->SetCollisionObjectType(ECC_Pawn);
GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
GetMesh()->SetCollisionResponseToAllChannels(ECR_Ignore);
GetMesh()->SetRelativeLocation(FVector(0.f, 0.f, -95.f));
GetMesh()->SetRelativeRotation(FQuat::MakeFromEuler(FVector(0.f, 0.f, -90.f)));
//摄像机手臂
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
CameraBoom->SetupAttachment(RootComponent);
//设置距离
CameraBoom->TargetArmLength = 300.f;
//设置偏移
CameraBoom->TargetOffset = FVector(0.f, 0.f, 60.f);
//绑定Controller的旋转
CameraBoom->bUsePawnControlRotation = true;
//初始化第三人称摄像机
ThirdCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("ThirdCamera"));
ThirdCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);
//设置ThirdCamera不跟随控制器的旋转
ThirdCamera->bUsePawnControlRotation = false;
//初始化第一人称摄像机
FirstCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstCamera"));
FirstCamera->SetupAttachment((USceneComponent*)GetCapsuleComponent());
//设置跟随Controller的旋转
FirstCamera->bUsePawnControlRotation = true;
//设置位移
FirstCamera->AddLocalOffset(FVector(0.f, 0.f, 60.f));
}
// Called when the game starts or when spawned
void ASlAiPlayerCharacter::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void ASlAiPlayerCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// Called to bind functionality to input
void ASlAiPlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
}
创建继承SlAiPlayerCharacter的蓝图查看