UE5- c++ websocket客户端写法

这篇具有很好参考价值的文章主要介绍了UE5- c++ websocket客户端写法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

# 实现目标

  • ue5 c++ 实现socket客户端,读取服务端数据,并进行解析

#实现步骤

  1. {projectName}.Build.cs里增加 "WebSockets","JsonUtilities", "Json"配置信息,最终输出如下:
    using UnrealBuildTool;
    
    public class myue521 : ModuleRules
    {
    	public myue521(ReadOnlyTargetRules Target) : base(Target)
    	{
    		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
    
    		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore"
            , "HeadMountedDisplay", "EnhancedInput"
            , "WebSockets","JsonUtilities", "Json"});
    	}
    }

    说明,其中myue521是我的模块名,文件名为myue521.Build.cs。 新增的模块:"WebSockets","JsonUtilities", "Json"。

  2. 准备实现自己的webscoket_client。具体操作步骤如下:

    1. 在ue5中自定义类,父类设置为UGameInstance,我这命名为UUWebSocketGameInstanceUE5- c++ websocket客户端写法,ue5,socketclient

    2. 在UUWebSocketGameInstance.h里新增如下方法。UE5- c++ websocket客户端写法,ue5,socketclient

      1. 其中init和 Shutdown方法是在父类UGameInstance中定义的,我们这里覆盖它;

      2. WebSocket用来标识我们代码生成的socket,计划在init里初始化,在Shutdown里销毁

      3. OnConnected、OnConnectionError、OnClosed、OnMessage、OnMessageSent用来处理socket消息,具体看后买你的代码实现。

    3. 在UUWebSocketGameInstance.cpp里实现已经生命的方法。

      // Fill out your copyright notice in the Description page of Project Settings.
      
      
      #include "UWebSocketGameInstance.h"
      #include "WebSockets/Public/WebSocketsModule.h"
      #include "WebSockets/Public/IWebSocket.h"
      #include "Templates/SharedPointer.h"
      
      
      void UUWebSocketGameInstance::Init() {
      	Super::Init();
      
      	if (!FModuleManager::Get().IsModuleLoaded("WebSockets")) {
      		FModuleManager::Get().LoadModule("WebSockets");
      	}
      
      	WebSocket = FWebSocketsModule::Get().CreateWebSocket("ws://127.0.0.1:8081/webSocketServer/ue");
      	 
      	WebSocket->OnConnected().AddUObject(this, &UUWebSocketGameInstance::OnConnected);
      	WebSocket->OnConnectionError().AddUObject(this, &UUWebSocketGameInstance::OnConnectionError);
      	WebSocket->OnClosed().AddUObject(this, &UUWebSocketGameInstance::OnClosed);
      	WebSocket->OnMessage().AddUObject(this, &UUWebSocketGameInstance::OnMessage);
      	WebSocket->OnMessageSent().AddUObject(this, &UUWebSocketGameInstance::OnMessageSent);
      
      	WebSocket->Connect();
      
      }
       
      
      void UUWebSocketGameInstance::Shutdown() {
      
      	if (WebSocket->IsConnected()) {
      		WebSocket->Close();
      	} 
      	Super::Shutdown();
      }
      
      
      
      void UUWebSocketGameInstance::OnConnected()
      {
      	UE_LOG(LogTemp, Warning, TEXT("%s"), *FString(__FUNCTION__));
      
      	GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Green, "Successfully Connected");
      }
      
      void UUWebSocketGameInstance::OnConnectionError(const FString& Error)
      {
      	UE_LOG(LogTemp, Warning, TEXT("%s Error:%s"), *FString(__FUNCTION__), *Error);
      }
      
      void UUWebSocketGameInstance::OnClosed(int32 StatusCode, const FString& Reason, bool bWasClean)
      {
      	UE_LOG(LogTemp, Warning, TEXT("%s StatusCode:%d Reason:%s bWasClean:%d"),
      		*FString(__FUNCTION__), StatusCode, *Reason, bWasClean);
      }
      
      void UUWebSocketGameInstance::OnMessage(const FString& Message)
      {
      	GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, FString::Printf(TEXT("%s Message:%s"), *FString(__FUNCTION__), *Message) );
      
      	UE_LOG(LogTemp, Warning, TEXT("%s Message:%s"), *FString(__FUNCTION__), *Message);
      
      	TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(Message);
      	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");
      
      
      			GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, "Key: " + KeyField + ",Value:" + ValueField);
      		}
      		else {
      			GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, "解析json异常");
      		}
      	}
      }
      
      void UUWebSocketGameInstance::OnMessageSent(const FString& MessageString)
      {
      	UE_LOG(LogTemp, Warning, TEXT("%s MessageString:%s"), *FString(__FUNCTION__), *MessageString);
      }
      
      
      1. 其中UUWebSocketGameInstance::Init()里初始化了websocket,并配置监听方法

      2. UUWebSocketGameInstance::Shutdown()用来销毁生成的websocket

      3. UUWebSocketGameInstance::OnConnected(),UUWebSocketGameInstance::OnConnectionError,UUWebSocketGameInstance::OnClosed,UUWebSocketGameInstance::OnMessage,UUWebSocketGameInstance::OnMessageSent是用来处理绑定消息的。其中UUWebSocketGameInstance::OnMessage里的消息是json格式,具体格式见下面的备注1.

  3. 开始配置使用并调用方法。

    1. 自主调用可以在某个Character里通过如下代码进行调用。可以在自己的类里面调用。比如放到构造方法或者某个动作触发调用。

      void Amyue521Character::NotifyServer() {
      	UUWebSocketGameInstance* GameInstance = Cast<UUWebSocketGameInstance>(GetGameInstance());
      	if (GameInstance) {
      		if (GameInstance->WebSocket->IsConnected()) {
      			GameInstance->WebSocket->Send("FROM UnrealEngine 5");
      		}
      	}
      }
    2. 通过UE5的项目设置进行修改游戏实例。UE5- c++ websocket客户端写法,ue5,socketclient

  4. 备注

    1. 约定接收的json数据格式为

      {
          "Topic": "Unreal",
          "Data": {
              "Key": "mood",
              "Value": 1.0
          }
       }
  5. 总结

    1.  通过该例子我们学到了websocket,json的应用

    2. 还学到的两种打印log的方法

      GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Cyan, FString::Printf(TEXT("%s Message:%s"), *FString(__FUNCTION__), *Message) );
      
      UE_LOG(LogTemp, Warning, TEXT("%s Message:%s"), *FString(__FUNCTION__), *Message);
  6. 待解决的问题

    1. 为什么使用UGameInstance, UGameInstance在UE5中充当什么角色

    2. ULog 的使用,参考文档:http://www.bimant.com/blog/ue_log-crash-course/文章来源地址https://www.toymoban.com/news/detail-687991.html

到了这里,关于UE5- c++ websocket客户端写法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE5加载websocket模块为空

    今天测试UE 发现工程启动不了,后来看到原来是websocket模块无法加载。 解决的它的方法很简单,这种问题一般会出现在源码版本的引擎或者是停电了,导致UElaunch版本损坏,解决方法是来到源码版本的引擎 这个目录下: D:UnrealEngine-5.2EngineBinariesWin64 找到下面这两个,删除

    2024年02月06日
    浏览(44)
  • Ue5 websocket控制Character前后左右动作

    2024年02月10日
    浏览(39)
  • Ue5 C++ metahuman

    参考官网: 创建MetaHuman | Epic Developer Community (epicgames.com) 参考: Quixel Bridge中的MetaHuman | Epic Developer Community (epicgames.com) 参考:导出到虚幻引擎5 | Epic Developer Community (epicgames.com) 参考:在Sequencer中使用MetaHuman | Epic Developer Community (epicgames.com) 待补充

    2024年02月10日
    浏览(49)
  • UE5 C++(十七)— 射线检测

    射线检测简单来说就是通过相机发射一条射线,用来检测对象的一种检测机制。 官网介绍:使用射线进行命中判定 这里主要介绍4种常用的射线检测方式。 关键API: LineTraceSingleByChannel 声明变量 MyCharacter.h 在Tick中实现通道进行射线检测 MyCharacter.cpp 编译 之后,在场景中添加

    2024年01月18日
    浏览(93)
  • ue5 c++ interface 接口

    https://docs.unrealengine.com/5.2/en-US/interfaces-in-unreal-engine/ 1 纯c++ 接口  没有ufunction 2 纯c++ 有ufunction

    2024年02月10日
    浏览(45)
  • UE5 C++ UObject实例化

    一.创建UObject C++类  在MyObject中声明结构体FMyDataTableStruct 在MyPawn里面,先将头文件里包含 MyObject.h 在MyPawn中声明一个UMyObject类型的指针 TSubclassOf  是提供 UClass 类型安全性的模板类。例如您在创建一个投射物类,允许设计者指定伤害类型。您可只创建一个 UClass 类型的 UPROPER

    2024年02月21日
    浏览(44)
  • UE5创建C++项目里报错

    UE5创建C++项目里报错: Running C:/Program Files/Epic Games/UE_5.0/Engine/Binaries/DotNET/UnrealBuildTool/UnrealBuildTool.exe  -projectfiles -project=\\\"F:/zhanting6.30/PAK/ReadWriteTxtProject/ReadWriteTxtProject.uproject\\\" -game -rocket -progress You must install or update .NET to run this application. App: C:Program FilesEpic GamesUE_5.0EngineBin

    2024年02月05日
    浏览(46)
  • UE5 C++ UENUM 和 USTRUCT

    一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间: 还有是继承uint8: 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异: 首先要有GENERATED_USTRUCT_BODY()这个函数 并且参数要有 宏定义UPRPERTY 二.在 AMyPawn 里定义 En

    2024年02月22日
    浏览(41)
  • UE5 C++ 静态加载资源和类

    一.上篇文章创建组件并绑定之后 在Actor中加载初始化了组件,现在在组件中赋值。使用static ConstructorHelpers::FObjectFinderTTempName(TEXT(\\\"Copy Reference\\\"));再用TempName.Object 里面的资源都来自StarterContent   效果如下: 二.静态加载类 1.在Actor中再声明一个AActor类  2.在静态加载类时使用

    2024年02月21日
    浏览(51)
  • Ue5.1创建C++项目(Rider)

    1、下载地址 2、选择左侧“Visual Studio Community 2019” 3、选择这两个 4、单体里添加这几个: 注意最后一个选下边这个 5、下载完成后到这个目录 将原来的14.29.30133文件夹重复名,改成14.29.30136,否则报错 整整baidu、google了1天,网上都没有解决办法 Unable to find valid 14.29.30136 too

    2024年02月02日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包