UE4 GEngine->GetWorld() == NULL

在Dedicated Server模式下,load玩Map后我想在我的C++代码中想获取GameInstance,通过

GEngine->GetWorld()->GetGameInstance()

语句获取,但是程序运行到这,出现段错误。

 

然后尝试获取World,

GEngine->GetWorld()

发现程序运行出现段错误,也就是说GEngine->GetWorld() == NULL。

 

经过一段搜索,在这篇文章(https://zhuanlan.zhihu.com/p/23167068)上得到启发:

一般就来说,对于独立运行的游戏(两种:game和server),WorldContext只有唯一个;而对于编辑器模式,则是一个WorldContext给编辑器,一个WorldContext给PIE(Play In Editor【一种模式,点击Play后运行的world】)的World。一般来说我们不需要直接操作到这个WorldContext类,引擎内部已经处理好各种World的协作。
Standlone Game:会使用UGameEngine来创建出唯一的一个GameWorld,因为也只有一个,所以为了方便起见,就直接保存了GameInstance指针。
而对于编辑器来说:Editor World其实只是用来预览,所以并不拥有OwningGameInstance,而PlayWorld里的OwningGameInstance才是间接保存了GameInstance。

所以,在我们Dedicated Server模式下,可以通过

GEngine->GetWorldContexts()[0]   获取World

GEngine->GetWorldContexts()[0].OwningGameInstance  获取GameInstance

 

然后在别人讨论中,又发现,有一种更简单的方式获取World,直接通过

World.h文件中的GWorld全局变量直接获取,通过上面的启发我们知道,这个World应该就是当前的World,引擎自动切换好。

通过GWorld->GetGameInstance() 获取GameInstance。

 

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是使用虚幻引擎API进行组播的详细案例: 1. 首先,您需要创建一个新的虚幻引擎项目,并打开C++代码编辑器。 2. 在您的项目中创建一个新的Actor类,例如MyUDPActor。 3. 在MyUDPActor.h文件中,添加以下代码: ```cpp #include "MyUDPActor.generated.h" UCLASS() class MYPROJECT_API AMyUDPActor : public AActor { GENERATED_BODY() public: AMyUDPActor(); virtual void BeginPlay() override; void StartUDPReceiver(const FString& YourChosenSocketName, const FString& TheIP, const int32 ThePort); bool StartUDPReceiver(const FString& YourChosenSocketName, const FString& TheIP, const int32 ThePort); void StopUDPReceiver(const FString& YourChosenSocketName); bool StopUDPReceiver(const FString& YourChosenSocketName); bool UDPSocketSender(FString YourMessage, const FString& TheIP, const int32 ThePort); FSockAddr RemoteAddr; FUdpSocketReceiver* UDPReceiver = nullptr; }; ``` 4. 在MyUDPActor.cpp文件中,添加以下代码: ```cpp #include "MyUDPActor.h" #include "Networking/Public/Networking.h" AMyUDPActor::AMyUDPActor() { } void AMyUDPActor::BeginPlay() { Super::BeginPlay(); FString IP = TEXT("127.0.0.1"); int32 Port = 10001; FString SocketName = TEXT("MySocket"); StartUDPReceiver(SocketName, IP, Port); } bool AMyUDPActor::StartUDPReceiver(const FString& YourChosenSocketName, const FString& TheIP, const int32 ThePort) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, TEXT("UDP Receiver started!")); UDPReceiver = new FUdpSocketReceiver(); FIPv4Endpoint Endpoint(FIPv4Address(0, 0, 0, 0), ThePort); TSharedRef<FInternetAddr> Addr = Endpoint.ToInternetAddr(); Addr->SetIp(*TheIP, true); int32 BufferSize = 2 * 1024 * 1024; // 2MB buffer size UDPReceiver->Init(BufferSize); UDPReceiver->Start(); UDPReceiver->OnDataReceived().BindUObject(this, &AMyUDPActor::UDPSocketListener); return true; } void AMyUDPActor::UDPSocketListener(const FArrayReaderPtr& ArrayReaderPtr, const FIPv4Endpoint& EndPt) { FString ReceivedData = FString(UTF8_TO_TCHAR((const char*)ArrayReaderPtr->GetData())); GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, ReceivedData); } void AMyUDPActor::StopUDPReceiver(const FString& YourChosenSocketName) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, TEXT("UDP Receiver stopped!")); if (UDPReceiver) { UDPReceiver->Stop(); delete UDPReceiver; UDPReceiver = nullptr; } } bool AMyUDPActor::UDPSocketSender(FString YourMessage, const FString& TheIP, const int32 ThePort) { TSharedRef<FInternetAddr> Destination = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr(); bool bIsValid; Destination->SetIp(*TheIP, bIsValid); Destination->SetPort(ThePort); if (!bIsValid) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("UDP Send: Invalid IP address %s"), *TheIP)); return false; } int32 BytesSent = 0; FString Message = YourMessage + TEXT("\n"); TArray<uint8> Data = TArray<uint8>((const uint8*)TCHAR_TO_UTF8(*Message), Message.Len()); FSocket* SenderSocket = FUdpSocketBuilder(*YourChosenSocketName).AsReusable().WithBroadcast(); bool bDidSend = SenderSocket->SendTo(Data.GetData(), Data.Num(), BytesSent, *Destination); if (bDidSend) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("UDP Send: Sent %d bytes to %s:%d"), BytesSent, *TheIP, ThePort)); } else { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("UDP Send: Unable to send packet to %s:%d"), *TheIP, ThePort)); } SenderSocket->Close(); delete SenderSocket; return bDidSend; } ``` 5. 现在,您可以在其他Actor类中使用MyUDPActor的实例来发送和接收UDP数据包。例如: ```cpp AMyUDPActor* MyUDPActor = GetWorld()->SpawnActor<AMyUDPActor>(); MyUDPActor->UDPSocketSender(TEXT("Hello World!"), TEXT("127.0.0.1"), 10001); ``` 这将向IP地址为127.0.0.1,端口号为10001的地址发送“Hello World!”消息,并在MyUDPActor的屏幕上显示该消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值