Oculus Motion Controller 无法通过Replicated进行更新

本文介绍了一种在 Unreal Engine 4 中实现控制器位置与旋转同步的方法。通过自定义的 ACustomMotionController 类,实现了对左右手控制器的位置和旋转数据获取,并通过服务器函数更新这些数据,确保了多玩家游戏中的控制器数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决方法就是 通过代码获得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];

if (IsLocalController() && motionController)
{
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个变量控制手就可以了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值