- Documentação
- Locus
- C++ Developer API
C++ Developer API
Use a Developer API nativa a partir de um plugin ou ferramenta C++ exclusivo do Editor. Adicione o módulo Locus às dependências do módulo de Editor consumidor, inclua Locus.h para aquisição e Developer/LocusDeveloperApi.h para requisições e resultados.
Contrato de ciclo de vida e assíncrono
Seção intitulada “Contrato de ciclo de vida e assíncrono”GetLocusDeveloperApi() retorna o FLocusDeveloperApi ativo ou nullptr fora do ciclo de vida inicializado do Editor Locus.
- Adquira e envie no Game Thread.
- Não mantenha o ponteiro da API após o desligamento do subsistema ou módulo.
- Toda conclusão é executada exatamente uma vez no Game Thread.
- O trabalho aceito é concluído em um tick posterior do executor existente do Locus.
- Uma falha de admissão pode ser concluída inline antes do retorno do envio.
- Prepare o estado pertencente ao callback antes de enviar.
- O cancelamento é cooperativo. Ele pode impedir trabalho enfileirado, mas não interrompe o trabalho do repositório nem cancela retroativamente uma mutação já confirmada.
- Não adicione esperas bloqueantes, sleeps, bombeamento do Game Thread ou
Future.Get().
O FLocusDeveloperRequestHandle retornado expõe a identidade da requisição e Cancel() cooperativo e seguro para threads.
Criar um Documento
Seção intitulada “Criar um 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.}O caminho de entrada é relativo à raiz de apresentação concreta selecionada. A identidade retornada continua sendo o caminho autoritativo relativo a ProjectDocuments.
Obter e depois atualizar
Seção intitulada “Obter e depois atualizar”Não esconda o tratamento de revisões. Use a revisão do resultado de leitura como pré-condição da mutação:
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. } }); });Escopo explícito de Nota
Seção intitulada “Escopo 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 } });Filtros de escopo são igualmente explícitos. All inclui conteúdo Privado; solicite Shared quando uma ferramenta não puder incluí-lo.
Criação básica de um Pin
Seção intitulada “Criação básica de um 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)); } });A criação de Pin exige um mundo salvo compatível e pertencente ao projeto. Atualizações de metadados preservam posição, mundo, âncora, visualização e escopo.
Consulte a visão geral da Developer API para matriz de operações, contrato de identidade, taxonomia de erros, revisões e status da operação.