解决方法就是 通过代码获得controller的位置 和旋转进行保存 将保存的变亮进行复制
代码如下
controller.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "IMotionController.h"
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "CustomMotionController.generated.h"
/**
*
*/
UCLASS()
class CHARIOTGAME_API ACustomMotionController : public APlayerController
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ACustomMotionController();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps);
UFUNCTION(Server, Unreliable, WithValidation)
void Server_UpdateMotionControllers(FVector LocR, FRotator RotR, FVector LocL, FRotator RotL);
bool Server_UpdateMotionControllers_Validate(FVector LocR, FRotator RotR, FVector LocL, FRotator RotL);
void Server_UpdateMotionControllers_Implementation(FVector LocR, FRotator RotR, FVector LocL, FRotator RotL);
IMotionController* motionController;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Motion Data", Replicated)
FVector Location_Right;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Motion Data", Replicated)
FVector Location_Left;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Motion Data", Replicated)
FRotator Rotation_Right;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Motion Data", Replicated)
FRotator Rotation_Left;
};
controller.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "CustomMotionController.h"
#include "Net/UnrealNetwork.h"
ACustomMotionController::ACustomMotionController()
{
PrimaryActorTick.bCanEverTick = true;
}
void ACustomMotionController::BeginPlay()
{
Super::BeginPlay();
bReplicates = true;
}
void ACustomMotionController::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps)
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(ACustomMotionController, Location_Right);
DOREPLIFETIME(ACustomMotionController, Location_Left);
DOREPLIFETIME(ACustomMotionController, Rotation_Left);
DOREPLIFETIME(ACustomMotionController, Rotation_Right);
}
// Called every frame
void ACustomMotionController::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
//这步一定要放在tick中运行 否则在editor模式下可以 打包出来就会有问题
TArray<IMotionController*> controllers = IModularFeatures::Get()
.GetModularFeatureImplementations<IMotionController>(IMotionController::GetModularFeatureName());
if (controllers.Num() > 0)
motionController = controllers[0];
{
const float WorldToMeters = 100.0f;
motionController->GetControllerOrientationAndPosition(0, FName(TEXT("Right")), Rotation_Right, Location_Right, WorldToMeters);
motionController->GetControllerOrientationAndPosition(0, FName(TEXT("Left")), Rotation_Left, Location_Left, WorldToMeters);
Server_UpdateMotionControllers(Location_Right, Rotation_Right, Location_Left, Rotation_Left);
}
}
bool ACustomMotionController::Server_UpdateMotionControllers_Validate(FVector LocR, FRotator RotR, FVector LocL, FRotator RotL)
{
return true;
}
void ACustomMotionController::Server_UpdateMotionControllers_Implementation(FVector LocR, FRotator RotR, FVector LocL, FRotator RotL)
{
Location_Right = LocR;
Rotation_Right = RotR;
Location_Left = LocL;
Rotation_Left = RotL;
}
在蓝图中 使用这4个变量控制手就可以了