Ir al contenido
Buscar

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.

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.

#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.

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.
}
});
});
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.

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.