- Documentazione
- Locus
- C++ Developer API
C++ Developer API
Usa la Developer API nativa da un plugin o strumento C++ solo Editor. Aggiungi il modulo Locus alle dipendenze del modulo editor che lo consuma, includi Locus.h per l’acquisizione e Developer/LocusDeveloperApi.h per richieste e risultati.
Contratto di durata e asincronia
Sezione intitolata “Contratto di durata e asincronia”GetLocusDeveloperApi() restituisce l’FLocusDeveloperApi attivo o nullptr fuori dalla durata inizializzata dell’Editor Locus.
- Acquisisci e invia sul Game Thread.
- Non conservare il puntatore API oltre lo shutdown del sottosistema o del modulo.
- Ogni completamento viene eseguito esattamente una volta sul Game Thread.
- Il lavoro accettato completa in un tick successivo dell’executor Locus esistente.
- Un errore di ammissione può completare inline prima del ritorno dell’invio.
- Prepara lo stato di proprietà del callback prima dell’invio.
- La cancellazione è cooperativa. Può impedire il lavoro accodato, ma non interrompere il lavoro del repository o annullare retroattivamente una mutazione già persistita.
- Non aggiungere attese bloccanti, sleep, pumping del Game Thread o
Future.Get().
Il FLocusDeveloperRequestHandle restituito espone identità della richiesta e Cancel() cooperativo thread-safe.
Crea un Documento
Sezione intitolata “Crea un Documento”#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.}Il percorso di input è relativo alla radice di presentazione concreta selezionata. L’identità restituita resta il percorso canonico relativo a ProjectDocuments.
Ottieni, quindi aggiorna
Sezione intitolata “Ottieni, quindi aggiorna”Non nascondere la gestione delle revisioni. Usa la revisione del risultato di lettura come precondizione della mutazione:
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. } }); });Ambito Nota esplicito
Sezione intitolata “Ambito Nota esplicito”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 } });I filtri di ambito sono altrettanto espliciti. All include contenuti Privati; richiedi Shared quando uno strumento non deve includerli.
Creazione base di un Pin
Sezione intitolata “Creazione base di un Pin”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)); } });La creazione del Pin richiede un mondo salvato supportato e di proprietà del progetto. Gli aggiornamenti dei metadati conservano posizione, mondo, ancora, vista e ambito.
Vedi la panoramica Developer API per matrice operativa, contratto d’identità, tassonomia degli errori, revisioni e stato dell’operazione.