- Documentación
- Locus
- C++ Developer API
C++ Developer API
Usa la Developer API nativa desde un plugin o herramienta C++ exclusiva del Editor. Añade el módulo Locus a las dependencias del módulo de Editor consumidor, incluye Locus.h para adquirirlo y Developer/LocusDeveloperApi.h para solicitudes y resultados.
Contrato de ciclo de vida y asincronía
Sección titulada «Contrato de ciclo de vida y asincronía»GetLocusDeveloperApi() devuelve el FLocusDeveloperApi activo o nullptr fuera del ciclo de vida inicializado de Locus en el Editor.
- Adquiere y envía en el Game Thread.
- No conserves el puntero de la API después del apagado del subsistema o módulo.
- Cada finalización se ejecuta exactamente una vez en el Game Thread.
- El trabajo aceptado termina en un tick posterior del ejecutor existente de Locus.
- Un fallo de admisión puede completarse en línea antes de que la solicitud devuelva.
- Prepara el estado propiedad del callback antes de enviar.
- La cancelación es cooperativa. Puede impedir trabajo en cola, pero no interrumpir el trabajo del repositorio ni cancelar retroactivamente una mutación ya persistida.
- No añadas esperas bloqueantes, sleeps, bombeo del Game Thread ni
Future.Get().
El FLocusDeveloperRequestHandle devuelto expone identidad de solicitud y Cancel() cooperativo y seguro para hilos.
Crear un Documento
Sección titulada «Crear 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.}La ruta de entrada es relativa a la raíz de presentación concreta seleccionada. La identidad devuelta sigue siendo la ruta autoritativa relativa a ProjectDocuments.
Obtener y actualizar
Sección titulada «Obtener y actualizar»No ocultes el manejo de revisiones. Usa la revisión del resultado de lectura como condición previa de la mutación:
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. } }); });Ámbito explícito de Nota
Sección titulada «Ámbito explícito de Nota»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 } });Los filtros de ámbito son igualmente explícitos. All incluye contenido Privado; solicita Shared cuando una herramienta no deba incluirlo.
Creación básica de un Pin
Sección titulada «Creación básica de 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)); } });Crear un Pin requiere un mundo guardado, propiedad del proyecto y compatible. Las actualizaciones de metadatos conservan posición, mundo, anclaje, vista y ámbito.
Consulta la descripción general de Developer API para la matriz de operaciones, el contrato de identidad, la taxonomía de errores, las revisiones y el estado de operación.