赞
踩
在蓝图中c++类新创建一个BlueprintFunctionLibrary类,类名可以自己取,我这个去的类名为
UDPSocketServer.h,UDPSocketServer.cpp(源码放在下面了),网上代码基本上都是差不多的
源码(在我的源码中我通过udp测试软件实现了发送zoom:***%百分比数据控制角色大小缩放)
- // Fill out your copyright notice in the Description page of Project Settings.
-
- #pragma once
-
- #include "CoreMinimal.h"
- #include "Kismet/BlueprintFunctionLibrary.h"
- #include "Runtime/Networking/Public/Networking.h"
- #include "Engine.h"
- #include "UDPSocketServer.generated.h"
-
- /**
- *
- */
- UCLASS(Blueprintable)
- // 这里需要注意一下DEMO_3D_API ,这个API是项目名字的API
- class DEMO_3D_API UUDPSocketServer : public UBlueprintFunctionLibrary
- {
- GENERATED_BODY()
-
- public:
-
- static void ScreenMsg(const FString& Msg);
- static void ScreenMsg(const FString& Msg, const float Value);
- static void ScreenMsg(const FString& Msg, const FString& Msg2);
-
- UFUNCTION(BlueprintCallable, Category = "UDP")
- //新建初始化Receiver函数
- static void StartUDPReceiver(const FString& YourChosenSocketName, const FString& TheIP, const int32 ThePort, bool& success);
- UFUNCTION(BlueprintCallable, Category = "UDP")
- static bool StartUDPSender(const FString& YourChosenSocketName, const FString& TheIP, const int32 ThePort);
- UFUNCTION(BlueprintCallable, Category = "UDP")
- static void CloseUDPReceiver();
- UFUNCTION(BlueprintCallable, Category = "UDP")
- static void CloseUDPSender();
-
- UFUNCTION(BlueprintCallable, Category = "UDP")
- static bool RamaUDPSender_SendString(FString ToSend);
-
- UFUNCTION(BlueprintCallable, Category = "UDP")
- static FVector SetScale(FString Data);
-
- UFUNCTION(BlueprintPure, Category = "UDP")
- //DataRecv返回函数
- static FString DataRecv(FString& str, bool& success);
-
- };
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- // Fill out your copyright notice in the Description page of Project Settings.
-
- #include "UDPSocketServer.h"
-
- TSharedPtr<FInternetAddr> RemoteAddr;
- FSocket* SenderSocket;
-
-
-
- FSocket* ListenSocket;
- FUdpSocketReceiver* UDPReceiver = nullptr;
-
-
-
- //ScreenMsg 把数据打印到屏幕
- void UUDPSocketServer::ScreenMsg(const FString& Msg)
- {
- GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, *Msg);
- }
- void UUDPSocketServer::ScreenMsg(const FString& Msg, const float Value)
- {
- GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("%s %f"), *Msg, Value));
- }
- void UUDPSocketServer::ScreenMsg(const FString& Msg, const FString& Msg2)
- {
- GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, *Msg);
- GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, *Msg2);
- }
-
-
- void UUDPSocketServer::CloseUDPSender()
- {
-
- if (SenderSocket) //Clear all sockets!
- {
- SenderSocket->Close();
- ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(SenderSocket);
- }
- }
-
- // 发送并打印到屏幕中
- bool UUDPSocketServer::RamaUDPSender_SendString(FString ToSend) //发送消息处理
- {
- if (!SenderSocket)
- {
- ScreenMsg("No sender socket");
- return false;
- }
- //~~~~~~~~~~~~~~~~
- //发送消息
- int32 BytesSent = 0;
- FString serialized = ToSend;
- TCHAR* serializedChar = serialized.GetCharArray().GetData();
- int32 size = FCString::Strlen(serializedChar);
- int32 sent = 0;
- //SenderSocket->SendTo(Writer.GetData(), Writer.Num(), BytesSent, *RemoteAddr);
- SenderSocket->SendTo((uint8*)TCHAR_TO_UTF8(serializedChar), size, BytesSent, *RemoteAddr);//发送给远端地址
-
- if (BytesSent <= 0)
- {
- const FString Str = "Socket is valid but the receiver received 0 bytes, make sure it is listening properly!";
- UE_LOG(LogTemp, Error, TEXT("%s"), *Str);
- ScreenMsg(Str);
- return false;
- }
-
- ScreenMsg("UDP Send Succcess! INFO Sent = ", ToSend);
-
- return true;
- }
-
- // 设置人物角色缩放
- FVector UUDPSocketServer::SetScale(FString Data)
- {
-
- FVector ScaleValue;
- if (Data.StartsWith(TEXT("zoom:")))
- {
- FString PercentageData = Data.Mid(5); // 获取第五为后的数据
- float Zoom = FCString::Atof(*PercentageData) / 100.0f;
- float value = (1 + Zoom) * 0.8; // 缩放值:0.8 --- 1.6
- ScaleValue = FVector(value, value, value);
- }
- return ScaleValue;
- }
-
- // 接收到的数据
- FString UUDPSocketServer::DataRecv(FString& str, bool& success)
- {
- if (!ListenSocket)
- {
- ScreenMsg("No sender socket");
- success = false;
- //return success;
- }
- TSharedRef<FInternetAddr> targetAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
- TArray<uint8> ReceivedData;//定义一个接收器
- uint32 Size;
- if (ListenSocket->HasPendingData(Size))
- {
- success = true;
- str = "";
- uint8* Recv = new uint8[Size];
- int32 BytesRead = 0;
-
- ReceivedData.SetNumUninitialized(FMath::Min(Size, 65507u));
- ListenSocket->RecvFrom(ReceivedData.GetData(), ReceivedData.Num(), BytesRead, *targetAddr);//创建远程接收地址
- char ansiiData[1024];
- memcpy(ansiiData, ReceivedData.GetData(), BytesRead);//拷贝数据到接收器
- ansiiData[BytesRead] = 0; //判断数据结束
- FString debugData = ANSI_TO_TCHAR(ansiiData); //字符串转换
- str = debugData;
- // memset(ansiiData,0,1024);//清空
-
- }
- else
- {
- success = false;
- }
-
- return str;
- }
-
-
- // 创建udp发送端
- bool UUDPSocketServer::StartUDPSender(const FString& YourChosenSocketName, const FString& TheIP, const int32 ThePort)///初始化远端IP 发送信息前
- {
- //FIPv4Endpoint Endpoint(FIPv4Address::Any, 6789);
- //Create Remote Address.
- RemoteAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
-
- bool bIsValid;
- RemoteAddr->SetIp(*TheIP, bIsValid);
- RemoteAddr->SetPort(ThePort);
-
- if (!bIsValid)
- {
- ScreenMsg("Rama UDP Sender>> IP address was not valid!", TheIP);
- return false;
- }
-
-
- SenderSocket = FUdpSocketBuilder(*YourChosenSocketName)
- .AsReusable()
- .WithBroadcast() // 广播
- .WithSendBufferSize(2 * 1024 * 1024)
- //.BoundToEndpoint(Endpoint)
- ;
-
-
- //check(SenderSocket->GetSocketType() == SOCKTYPE_Datagram);
-
- //Set Send Buffer Size
- int32 SendSize = 2 * 1024 * 1024;
- SenderSocket->SetSendBufferSize(SendSize, SendSize);
- SenderSocket->SetReceiveBufferSize(SendSize, SendSize);
- if (bIsValid)
- {
- bIsValid = true;
- }
- return bIsValid;
-
- }
-
- // 关闭udp接收
- void UUDPSocketServer::CloseUDPReceiver()
- {
- delete UDPReceiver;
- UDPReceiver = nullptr;
-
- //Clear all sockets!
- // makes sure repeat plays in Editor dont hold on to old sockets!
- if (ListenSocket)
- {
- ListenSocket->Close();
- ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(ListenSocket);
- }
- }
-
- // 创建udp接收端
- void UUDPSocketServer::StartUDPReceiver(const FString& YourChosenSocketName, const FString& TheIP, const int32 ThePort, bool& success)
- {
- TSharedRef<FInternetAddr> targetAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
- FIPv4Address Addr;
- FIPv4Address::Parse(TheIP, Addr);
-
- //Create Socket
- FIPv4Endpoint Endpoint(FIPv4Address::Any, ThePort); //所有ip地址本地
- //FIPv4Endpoint Endpoint(Addr, ThePort); //指定ip地址
- ListenSocket = FUdpSocketBuilder(*YourChosenSocketName)
- .AsNonBlocking()
- .AsReusable()
- .BoundToEndpoint(Endpoint)
- .WithReceiveBufferSize(2 * 1024 * 1024);
- //BUFFER SIZE
- int32 BufferSize = 2 * 1024 * 1024;
- ListenSocket->SetSendBufferSize(BufferSize, BufferSize);
- ListenSocket->SetReceiveBufferSize(BufferSize, BufferSize);
-
- if (!ListenSocket)
- {
- ScreenMsg("No socket");
- success = false;
-
- }
- if (ListenSocket)
- {
- ScreenMsg("The receiver is initialized");
- success = true;
- }
-
- //return true;
-
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
location为设置当前角色位置
rotation为设置当前角色旋转
如果不设置上述那么角色在设置缩放后位置为0,0,0
这里最重要的逻辑是使用data recv接收到数据,返回值(return value)传递给set scale判断是否为zoom:百分比数据,如果是那么返回值(return value),将FVector类型传递给(set actor transform)从而设置角色缩放
本篇文章为自己总结,如果网友发现不够细微之处,麻烦在评论区指出,我尽力做到最好
如需转载请说明出处UE中蓝图,C++结合UDP通信-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。