Присоединиться к сеансу в ue5 с помощью cpp не работаетC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Присоединиться к сеансу в ue5 с помощью cpp не работает

Сообщение Anonymous »

Я пытаюсь добавить многопользовательскую игру в игру в UE5.5 и VS2022 v17.12.3, используя C ++ Я могу создавать и уничтожить сеанс, но когда я пытаюсь найти сеанс, я получаю ошибку в журнале вывода: «Результаты поиска нулевой» (Ue_log в строке 98 в многопользовательской br /> Спасибо за все ответы < /p>
код: < /p>
cpp файл < /p>
// Fill out your copyright notice in the Description page of Project Settings.

#include "MultiplayerWidget.h"

bool UMultiplayerWidget::Initialize()
{
Super::Initialize();

EditableTextBox_369->OnTextChanged.AddDynamic(this, &UMultiplayerWidget::GetMaxPlayers); //Přidává funkci GetMaxPlayers do callu OnTextChanged

CreateSessionButton->OnClicked.AddDynamic(this, &UMultiplayerWidget::CreateSession); //Přidává funkci CreateSession do callu OnClicked
FindSessionButton->OnClicked.AddDynamic(this, &UMultiplayerWidget::FindJoinSession); //Přidává funkci FindJoinSession do callu OnClicked
DestroySessionButton->OnClicked.AddDynamic(this, &UMultiplayerWidget::DestroySession); //Přidává funkci FindJoinSession do callu OnClicked

return true;
}

//Vytvoří session snad :(
void UMultiplayerWidget::CreateSession()
{
UE_LOG(LogTemp, Warning, TEXT("Creating session")); //vypisuje do konzole Creating session

IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get(); // získá subsystem

if (OnlineSubsystem) //Kontroluje zda se získal subsystem
{
IOnlineSessionPtr SessionPtrRef = OnlineSubsystem->GetSessionInterface(); //Získá rozhraní subsystému
if (SessionPtrRef)
{
FOnlineSessionSettings SessionInfo; //settings pro session
SessionInfo.bIsDedicated = false;
SessionInfo.bAllowInvites = true;
SessionInfo.bIsLANMatch = true;
SessionInfo.NumPublicConnections = maxPlayers;
SessionInfo.bUseLobbiesIfAvailable = false;
SessionInfo.bUsesPresence = false;
SessionInfo.bShouldAdvertise = true;
SessionInfo.Set(TEXT("SEARCH_SESSION"), FString("Test"), EOnlineDataAdvertisementType::ViaOnlineService);

SessionPtrRef->OnCreateSessionCompleteDelegates.AddUObject(this, &UMultiplayerWidget::OnCreatedSessionCompleted); //nastavení, že po dkončení vytváření session se spustí funce created s hodnotou true||false podle toho zda se session vytvořila úspěšně

SessionPtrRef->CreateSession(0, FName("MainSession"), SessionInfo);
}
}
}

//Kontrolní funkce zda se vytvořila session nebo ne
void UMultiplayerWidget::OnCreatedSessionCompleted(FName sessionName, bool succesful) {
FString sessionNamestring = sessionName.ToString();
UE_LOG(LogTemp, Warning, TEXT("Was session: %s created successfully?: %s"), *sessionNamestring, (succesful ? TEXT("true") : TEXT("false"))); //vypisuje do konzole zda se session vytvořila či ne
}
//Získá číslo z EditableTextBox_369, to se poté použije jako maximální hranice pro hráčů na session
void UMultiplayerWidget::GetMaxPlayers(const FText& ftext)
{
FString text = ftext.ToString(); //FText na FString
maxPlayers = FCString::Atoi(*text); //Convert FString na int
}

//Najidí a připojení se k session
void UMultiplayerWidget::FindJoinSession() {
IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get(); // získá subsystem

if (OnlineSubsystem) //Kontroluje zda se získal subsystem
{
IOnlineSessionPtr SessionPtrRef = OnlineSubsystem->GetSessionInterface(); //Získá rozhraní subsystému
if (SessionPtrRef) //Kontroluje zda se získal rozhraní
{
sessionSearch = MakeShareable(new FOnlineSessionSearch());
sessionSearch->QuerySettings.Set(TEXT("SEARCH_SESSION"), true, EOnlineComparisonOp::Equals);
sessionSearch->MaxSearchResults = 20;
sessionSearch->bIsLanQuery = true;

SessionPtrRef->OnFindSessionsCompleteDelegates.AddUObject(this, &UMultiplayerWidget::OnFindSessionCompleted);

SessionPtrRef->FindSessions(0, sessionSearch.ToSharedRef());
}
}
}
void UMultiplayerWidget::OnFindSessionCompleted(bool successful) {
if (successful) {
UE_LOG(LogTemp, Warning, TEXT("Finding session was succesful"));

IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get(); // získá subsystem

if (OnlineSubsystem) //Kontroluje zda se získal subsystem
{
IOnlineSessionPtr SessionPtrRef = OnlineSubsystem->GetSessionInterface(); //Získá rozhraní subsystému
if (SessionPtrRef) //Kontroluje zda se získal rozhraní
{
if (sessionSearch->SearchResults.Num() > 0 && sessionSearch->SearchResults[0].IsValid()) {
SessionPtrRef->OnJoinSessionCompleteDelegates.AddUObject(this, &UMultiplayerWidget::OnJoinSessionCompleted);
SessionPtrRef->JoinSession(0, FName("MainSession"), sessionSearch->SearchResults[0]);
}
else {
UE_LOG(LogTemp, Error, TEXT("search result is zero"));
}
}
}
}
}
void UMultiplayerWidget::OnJoinSessionCompleted(FName sessionName, EOnJoinSessionCompleteResult::Type result) {
if (result == EOnJoinSessionCompleteResult::Success) {
if (APlayerController* playerControllerRef = UGameplayStatics::GetPlayerController(GetWorld(), 0)) {
FString JoinAddress;
IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();
if (OnlineSubsystem) {
IOnlineSessionPtr SessionPtrRef = OnlineSubsystem->GetSessionInterface();
if (SessionPtrRef) {
if (SessionPtrRef->GetResolvedConnectString(FName("MainSession"), JoinAddress)) {
UE_LOG(LogTemp, Warning, TEXT("Address: %s"), *JoinAddress);
playerControllerRef->ClientTravel(JoinAddress, ETravelType::TRAVEL_Absolute);
}
}
}
}
}
}

void UMultiplayerWidget::DestroySession() {
IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get(); // získá subsystem

if (OnlineSubsystem) //Kontroluje zda se získal subsystem
{
IOnlineSessionPtr SessionPtrRef = OnlineSubsystem->GetSessionInterface(); //Získá rozhraní subsystému
if (SessionPtrRef) //Kontroluje zda se získal rozhraní
{
SessionPtrRef->OnDestroySessionCompleteDelegates.AddUObject(this, &UMultiplayerWidget::OnDestroyedSessionCompleted);
SessionPtrRef->DestroySession(FName("MainSession"));
}
}
}
void UMultiplayerWidget::OnDestroyedSessionCompleted(FName sessionName, bool succesful) {
FString sessionNamestring = sessionName.ToString();
UE_LOG(LogTemp, Warning, TEXT("Was session: %s destroyed successfully?: %s"), *sessionNamestring, (succesful ? TEXT("true") : TEXT("false"))); //vypisuje do konzole zda se session zničila či ne
}

файл заголовка
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"

#include "Components/Button.h"
#include "Components/EditableTextBox.h"
#include "Components/CheckBox.h"

#include "OnlineSubsystem.h"
#include "OnlineSessionSettings.h"
#include "Interfaces/OnlineSessionInterface.h"
#include "OnlineSubsystemUtils.h"

#include "Kismet/GameplayStatics.h"

#include "Engine/Player.h"

#include "MultiplayerWidget.generated.h"

/**
*
*/
UCLASS()
class NOXVIRIDUS_API UMultiplayerWidget : public UUserWidget
{
GENERATED_BODY()

virtual bool Initialize();

//Deklarace UI prvků
UPROPERTY(meta = (BindWidget))
class UButton* CreateSessionButton;

UPROPERTY(meta = (BindWidget))
UButton* FindSessionButton;

UPROPERTY(meta = (BindWidget))
UButton* DestroySessionButton;

UPROPERTY(meta = (BindWidget))
class UEditableTextBox* EditableTextBox_369;

UPROPERTY(meta = (BindWidget))
class UCheckBox* CheckBox_146;

//Deklarace funkcí
UFUNCTION()
void CreateSession();
UFUNCTION()
void OnCreatedSessionCompleted(FName sessionName, bool successful);

UFUNCTION()
void FindJoinSession();
UFUNCTION()
void OnFindSessionCompleted(bool successful);

void OnJoinSessionCompleted(FName sessionName, EOnJoinSessionCompleteResult::Type result);

UFUNCTION()
void DestroySession();
UFUNCTION()
void OnDestroyedSessionCompleted(FName sessionName, bool successful);

UFUNCTION()
void GetMaxPlayers(const FText& ftext);

private:
int maxPlayers;
TSharedPtr sessionSearch;
};


Подробнее здесь: https://stackoverflow.com/questions/793 ... oesnt-work
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»