ue4-中模式设定

1、以观察者的视角(Spectator)

那么在Word Setting中Default Pawn和Spectator两者要设置为同一个类

img

1
2
3
4
5
6
7
8
9
10
11
12
13
class AMySpectator : public ASpectatorPawn
{
GENERATED_BODY()

public:
AMySpectator();
virtual ~AMySpectator();

// Begin ADefaultPawn interface 重写这几个方法
virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;
virtual void MoveForward(float Val) override;
virtual void MoveRight(float Val) override;
// End ADefaultPawn interface

实现部分

1
2
3
4
5
6
7
8
9
10
11
void AMySpectator::SetupPlayerInputComponent(class UInputComponent* InputComponent)
{
Super::SetupPlayerInputComponent(InputComponent);
check(InputComponent);

InputComponent->BindAction("ZoomOut", IE_Pressed, this, &AMySpectator::OnMouseScrollUp);
InputComponent->BindAction("ZoomIn", IE_Pressed, this, &AMySpectator::OnMouseScrollDown);

InputComponent->BindAxis("MoveForward", this, &AMySpectator::MoveForward);
InputComponent->BindAxis("MoveRight", this, &AMySpectator::MoveRight);
}

*此处有坑

使用观察这模式下,必须 禁止 引擎去生成默认的 SpectatorPawn 。反之, 以第三人称 或 第一人称 则 不能禁止

通过重写 AGameMode的一个方法
.h

1
2
3
4
5
6
7
8
9
10
class MYSLATE_API AMyGameMode : public AGameMode
{
GENERATED_BODY()
public:
/**
* Handle new player, skips pawn spawning.
* @param NewPlayer
*/
virtual void RestartPlayer(AController* NewPlayer) override;
};

.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void AMyGameMode::RestartPlayer(AController* NewPlayer)
{
AActor* const StartSpot = FindPlayerStart(NewPlayer);
if (StartSpot != nullptr)
{
// initialize and start it up
InitStartSpot(StartSpot, NewPlayer);

AMyPlayerCtrler* const NewPC = Cast<AMyPlayerCtrler>(NewPlayer);
if (NewPC != nullptr)
{
NewPC->SetInitialLocationAndRotation(StartSpot->GetActorLocation(), StartSpot->GetActorRotation());
}
}
else
{
UE_LOG(GameLogger, Warning, TEXT("Player start not found, failed to restart player"));
}
}

RestartPlayer

SpectatorPawn

SetSpectatorPawn(NULL);


2、以第三人称或第一人称视角

摄像机是绑定在一个实体Character上,测试Spectator Class是无效的

img

1
2
3
4
5
6
7
8
9
10
11
UCLASS()
class AMyPlayerChar : public AMyChar
{
GENERATED_BODY()

/** Top down camera */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
class UCameraComponent* TopDownCameraComponent;

/** Camera boom positioning the camera above the character */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))

​ class USpringArmComponent* CameraBoom;


3、c++接收不到绑定事件的原因

  • 在蓝图中由对应事件的实现,必须干掉,在c++才能接收到事件

img