Ue5 websocket控制Character前后左右动作

# myue521Character.h

cpp 复制代码
// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once


#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "InputActionValue.h"
#include "myue521Character.generated.h"

UCLASS(config=Game)
class Amyue521Character : public ACharacter
{
	 
public:

	void NotifyServer();
	virtual void myJump();

public: 
	FString Str = TEXT("walawala");
	FString topicLogKey = TEXT("log");
	FString walkLogKey = TEXT("walk");
	FString Forward = TEXT("Forward");
	FString Right = TEXT("Right");
	void TriggeredBySocketMsg(FString jsonString);

	void doMyForward(int f);// 1或者-1

	void doMyRight(int r);// 1或者-1
};

# myue521Character.cpp

cpp 复制代码
// Copyright Epic Games, Inc. All Rights Reserved.

#include "myue521Character.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "Components/InputComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/Controller.h"
#include "GameFramework/SpringArmComponent.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "UObject/ConstructorHelpers.h"  
#include "UWebSocketGameInstance.h"
//
// Amyue521Character


void Amyue521Character::myJump()
{
	bPressedJump = true;
	JumpKeyHoldTime = 0.0f;

	this->NotifyServer();


} 

void Amyue521Character::Look(const FInputActionValue& Value)
{
	// input is a Vector2D
	FVector2D LookAxisVector = Value.Get<FVector2D>();

	if (Controller != nullptr)
	{
		// add yaw and pitch input to controller
		AddControllerYawInput(LookAxisVector.X);
		AddControllerPitchInput(LookAxisVector.Y);
	}
}

void Amyue521Character::NotifyServer() {

	//从Character里获取UGameInstance的例子
	UUWebSocketGameInstance* GameInstance = Cast<UUWebSocketGameInstance>(GetGameInstance());
	if (GameInstance) {
		if (GameInstance->WebSocket->IsConnected()) {
			GameInstance->WebSocket->Send("FROM UnrealEngine 5");
		}
	}
} 

void Amyue521Character::TriggeredBySocketMsg(FString jsonString)
{
	
	//UE_LOG(LogTemp, Warning, TEXT("%s 事件触发调用了我的函数CallBackFunMul。%s-%s"), *FString(__FUNCTION__), *(this->Str), *jsonString);
	//GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, FString::Printf(TEXT("事件触发调用了我的函数CallBackFunMul,%s-%s"), *(this->Str), *jsonString));

	TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(jsonString);
	TSharedPtr<FJsonObject> Root;

	if (FJsonSerializer::Deserialize(Reader, Root))
	{
		if (Root->HasField(TEXT("Topic"))) {
			FString Topic = Root->GetStringField(TEXT("Topic"));
			TSharedPtr<FJsonObject, ESPMode::ThreadSafe> Data = Root->GetObjectField(TEXT("Data"));

			// TSharedPtr<FJsonObject, ESPMode::ThreadSafe> ObjectField = Object->GetObjectField(TEXT("realtime"));
			FString KeyField = Data->GetStringField("Key");
			FString ValueField = Data->GetStringField("Value");

			// log类型打印log
			if (this->topicLogKey.Equals(KeyField, ESearchCase::IgnoreCase)) {
				GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, ValueField);
			}else if (this->walkLogKey.Equals(KeyField, ESearchCase::IgnoreCase)) {
				FString DirectionField = Data->GetStringField("Direction");
				if (this->Forward.Equals(DirectionField, ESearchCase::IgnoreCase)) {
					this->doMyForward(FCString::Atoi(*ValueField));

				}else if (this->Right.Equals(Right, ESearchCase::IgnoreCase)) {
					this->doMyRight(FCString::Atoi(*ValueField));
				}

			}
			else {
				GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, "1-Key: " + KeyField + ",Value:" + ValueField);
			}

		}
		else {
			GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, "解析json异常");
		}
	}
}

void Amyue521Character::doMyForward(int f) // 1或者-1
{
	FVector2D MovementVector = FInputActionValue::Axis2D(0, f);

	 
	if (Controller != nullptr)
	{
		// find out which way is forward
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);

		// get forward vector
		const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);

		// get right vector 
		const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);

		// add movement 
		AddMovementInput(ForwardDirection, MovementVector.Y);
		AddMovementInput(RightDirection, MovementVector.X);
	}
}

void Amyue521Character::doMyRight(int r)// 1或者-1
{
	FVector2D MovementVector = FInputActionValue::Axis2D(r, 0);


	if (Controller != nullptr)
	{
		// find out which way is forward
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);

		// get forward vector
		const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);

		// get right vector 
		const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);

		// add movement 
		AddMovementInput(ForwardDirection, MovementVector.Y);
		AddMovementInput(RightDirection, MovementVector.X);
	}
}
相关推荐
福尔摩斯张8 分钟前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
橘颂TA17 分钟前
【剑斩OFFER】算法的暴力美学——两整数之和
算法·leetcode·职场和发展
xxxxxxllllllshi1 小时前
【LeetCode Hot100----14-贪心算法(01-05),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
java·数据结构·算法·leetcode·贪心算法
前端小L1 小时前
图论专题(二十二):并查集的“逻辑审判”——判断「等式方程的可满足性」
算法·矩阵·深度优先·图论·宽度优先
铁手飞鹰1 小时前
二叉树(C语言,手撕)
c语言·数据结构·算法·二叉树·深度优先·广度优先
专业抄代码选手3 小时前
【Leetcode】1930. 长度为 3 的不同回文子序列
javascript·算法·面试
[J] 一坚3 小时前
深入浅出理解冒泡、插入排序和归并、快速排序递归调用过程
c语言·数据结构·算法·排序算法
czlczl200209253 小时前
算法:二叉搜索树的最近公共祖先
算法
司铭鸿3 小时前
祖先关系的数学重构:从家谱到算法的思维跃迁
开发语言·数据结构·人工智能·算法·重构·c#·哈希算法
SoleMotive.4 小时前
redis实现漏桶算法--https://blog.csdn.net/m0_74908430/article/details/155076710
redis·算法·junit