- Dokumentacja
- Locus
- C++ Developer API
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.
Kontrakt cyklu życia i asynchroniczności
Dział zatytułowany „Kontrakt cyklu życia i asynchroniczności”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().
Tworzenie Dokumentu
Dział zatytułowany „Tworzenie Dokumentu”#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.
Pobierz, a następnie zaktualizuj
Dział zatytułowany „Pobierz, a następnie zaktualizuj”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. } }); });Jawny zakres Notatki
Dział zatytułowany „Jawny zakres Notatki”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.
Podstawowe tworzenie Pinezki
Dział zatytułowany „Podstawowe tworzenie Pinezki”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.