Przejdź do głównej zawartości
Szukaj

C++ Developer API

Używaj natywnego Developer API z wtyczki lub narzędzia C++ działającego wyłącznie w edytorze. Dodaj moduł Locus do zależności używającego go modułu edytora, dołącz Locus.h w celu uzyskania API oraz Developer/LocusDeveloperApi.h dla żądań i wyników.

GetLocusDeveloperApi() zwraca aktywne FLocusDeveloperApi albo nullptr poza zainicjalizowanym cyklem życia Locus Editor.

  • Uzyskuj API i wysyłaj żądania na Game Thread.
  • Nie zachowuj wskaźnika API przez zamknięcie podsystemu lub modułu.
  • Każde zakończenie działa dokładnie raz na Game Thread.
  • Przyjęta praca kończy się podczas późniejszego tyknięcia istniejącego wykonawcy Locus.
  • Błąd przyjęcia może zakończyć żądanie synchronicznie, zanim wywołanie wysyłające zwróci sterowanie.
  • Przygotuj stan należący do callbacku przed wysłaniem żądania.
  • Anulowanie jest kooperacyjne. Może zapobiec wykonaniu oczekującej pracy, ale nie może przerwać pracy repozytorium ani cofnąć zmutowanej operacji, która została zatwierdzona.
  • Nie dodawaj blokujących oczekiwań, uśpień, pompowania Game Thread ani Future.Get().

Zwrócony FLocusDeveloperRequestHandle udostępnia tożsamość żądania i bezpieczne wątkowo kooperacyjne Cancel().

#include "Locus.h"
#include "Developer/LocusDeveloperApi.h"
void CreateCombatDocument()
{
FLocusDeveloperApi* Locus = GetLocusDeveloperApi();
if (Locus == nullptr)
{
return;
}
FLocusDeveloperCreateDocumentRequest Request;
Request.Path = TEXT("Design/Combat.md");
Request.Markdown = TEXT("# Combat\n");
Request.PresentationRoot =
ELocusDeveloperDocumentPresentationRoot::LocusDocuments;
FLocusDeveloperRequestHandle Handle = Locus->CreateDocument(
MoveTemp(Request),
[](TLocusDeveloperResult<FLocusDeveloperDocumentSnapshot> Result)
{
if (!Result.IsSuccess())
{
UE_LOG(LogTemp, Error, TEXT("Locus: %s"), *Result.Error.Message);
return;
}
const FLocusDeveloperDocumentSnapshot& Document = Result.Value.GetValue();
UE_LOG(LogTemp, Display, TEXT("Created %s"),
*Document.Identity.RelativePath);
});
// Retain Handle only if this tool needs to offer cancellation.
}

Ścieżka wejściowa jest względna względem wybranego konkretnego korzenia prezentacji. Zwrócona tożsamość pozostaje autorytatywną ścieżką względem ProjectDocuments.

Nie ukrywaj obsługi rewizji. Użyj rewizji z wyniku odczytu jako warunku wstępnego mutacji:

FLocusDeveloperGetDocumentRequest GetRequest;
GetRequest.Identity.RelativePath = TEXT("Design/Combat.md");
Locus->GetDocument(
MoveTemp(GetRequest),
[Locus](TLocusDeveloperResult<FLocusDeveloperDocumentSnapshot> GetResult)
{
if (!GetResult.IsSuccess())
{
return;
}
const FLocusDeveloperDocumentSnapshot& Current = GetResult.Value.GetValue();
FLocusDeveloperUpdateDocumentRequest UpdateRequest;
UpdateRequest.Identity = Current.Identity;
UpdateRequest.ExpectedRevision = Current.Revision;
UpdateRequest.Markdown = Current.Markdown + TEXT("\n## Abilities\n");
Locus->UpdateDocument(
MoveTemp(UpdateRequest),
[](TLocusDeveloperResult<FLocusDeveloperDocumentSnapshot> Result)
{
if (Result.Error.Code ==
ELocusDeveloperErrorCode::StaleRevision)
{
// Reread before reconsidering the mutation.
}
});
});
FLocusDeveloperCreateNoteRequest Request;
Request.Scope = ELocusDeveloperScope::Private;
Request.Title = TEXT("Local investigation");
Request.Body = TEXT("Not shared with the project repository.");
Request.Tags = {TEXT("investigation")};
FLocusDeveloperRequestHandle Handle = Locus->CreateNote(
MoveTemp(Request),
[](TLocusDeveloperResult<FLocusDeveloperNoteSnapshot> Result)
{
if (Result.IsSuccess())
{
const FLocusDeveloperNoteIdentifier Identity =
Result.Value->Identity; // GUID + Private scope
}
});

Filtry zakresu są równie jawne. All obejmuje zawartość Prywatną; żądaj Shared, gdy narzędzie nie może uwzględnić jej w wyniku.

FLocusDeveloperCreatePinRequest Request;
Request.Scope = ELocusDeveloperScope::Shared;
Request.WorldAssetPath = TEXT("/Game/Maps/Main.Main");
Request.WorldLabel = TEXT("Main");
Request.Location = FVector(120.0, 40.0, 180.0);
Request.Title = TEXT("Check encounter cover");
Request.PinType = ELocusDeveloperPinType::Issue;
FLocusDeveloperRequestHandle Handle = Locus->CreatePin(
MoveTemp(Request),
[](TLocusDeveloperResult<FLocusDeveloperPinSnapshot> Result)
{
if (!Result.IsSuccess())
{
UE_LOG(LogTemp, Warning, TEXT("Pin create failed: %s"),
LexToString(Result.Error.Code));
}
});

Tworzenie Pinezki wymaga obsługiwanego zapisanego należącego do projektu świata. Aktualizacje metadanych zachowują położenie, świat, kotwicę, widok i zakres.

Zobacz Przegląd Developer API — znajdziesz tam macierz operacji, umowę tożsamości, taksonomię błędów, rewizje i stan operacji.