Pular para o conteúdo
Pesquisar

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.

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.

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

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

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.