Pular para o conteúdo

Tomada de Decisao de NPC

Visao Geral

Arquivos de condicao de tomada de decisao definem funcoes de pontuacao reutilizaveis que a IA do NPC avalia para decidir o que fazer em seguida. Cada condicao tem um Type que nomeia a metrica sendo medida, um Stat especificando qual atributo do jogo ler (quando aplicavel) e uma Curve controlando como valores brutos sao mapeados para pontuacoes de utilidade entre 0 e 1. Essas condicoes aparecem tanto em arquivos standalone de DecisionMaking/Conditions/ quanto inline dentro de definicoes de acoes do Combat Action Evaluator.

Localizacao dos Arquivos

Assets/Server/NPC/DecisionMaking/Conditions/*.json

Condicoes tambem sao usadas inline dentro dos arrays AvailableActions[*].Conditions em arquivos de balanceamento. Veja NPC Combat Balancing.

Schema

Objeto de condicao

FieldTypeRequiredDefaultDescricao
TypestringSimO tipo de condicao (veja a tabela abaixo).
StatstringNaoO atributo a ser lido. Usado por tipos de condicao baseados em atributo.
Curvestring | objectNaoComo mapear o valor bruto para uma pontuacao de utilidade de 0 a 1. Pode ser uma string de curva nomeada ou um objeto de curva inline.
MinValuenumberNaoValor minimo de clamp para o valor bruto (usado por Randomiser).
MaxValuenumberNaoValor maximo de clamp para o valor bruto (usado por Randomiser).

Tipos de Condicao

TypeDescricaoCampos Principais
OwnStatPercentPontua com base no atributo proprio do NPC como porcentagem do maximo.Stat, Curve
TargetStatPercentPontua com base no atributo do NPC alvo como porcentagem do maximo.Stat, Curve
TargetDistancePontua com base na distancia ate o alvo atual.Curve
TimeSinceLastUsedPontua com base em quanto tempo atras essa acao foi usada pela ultima vez.Curve
RandomiserAdiciona um componente de pontuacao aleatoria entre MinValue e MaxValue.MinValue, MaxValue

Valores de Stat

StatDescricao
HealthPontos de vida atuais.

Valores de Curve

Uma Curve pode ser um atalho de string nomeada ou um objeto inline:

Atalho de string nomeada:

ValorFormaCaso de uso
"Linear"Aumenta linearmente de 0 a 1 conforme o atributo aumenta.Preferir acoes quando o atributo esta alto.
"ReverseLinear"Diminui linearmente de 1 a 0 conforme o atributo aumenta.Preferir acoes quando o atributo esta baixo (ex: curar quando ferido).

Objeto de curva inline:

FieldTypeDescricao
ResponseCurvestringForma de curva de resposta nomeada (veja abaixo).
XRange[number, number]A faixa de entrada [min, max] para o valor bruto. Valores fora dessa faixa sao limitados.
Type"Switch"Forma inline alternativa para um limiar rigido.
SwitchPointnumberPara Type: "Switch" — o valor bruto no qual a pontuacao muda de 0 para 1.

Curvas de resposta nomeadas (ResponseCurve):

ValorForma
"Linear"Linha reta de 0 a 1 ao longo de XRange.
"SimpleLogistic"Curva S crescendo em direcao a 1. Util para “preferir quando perto”.
"SimpleDescendingLogistic"Curva S decrescendo em direcao a 0. Util para “preferir quando longe”.

Como a Tomada de Decisao do NPC Funciona

flowchart TD;
A[NPC Idle] --> B{Scan for Threats};
B -->|"No threat"| C{Check Needs};
B -->|"Threat detected"| D[Evaluate Combat Actions];
C -->|"Health low"| E[Seek Healing];
C -->|"Hungry"| F[Seek Food];
C -->|"All good"| A;
D --> G[Score Each Action];
G --> H["OwnStatPercent<br>Health check"];
G --> I["TargetDistance<br>Range check"];
G --> J["TimeSinceLastUsed<br>Cooldown check"];
G --> K["Randomiser<br>Noise factor"];
H --> L[Multiply Scores];
I --> L;
J --> L;
K --> L;
L --> M["Pick Highest<br>Utility Score"];
M -->|"Melee wins"| N[Move to Target → Attack];
M -->|"Ranged wins"| O[Keep Distance → Shoot];
M -->|"Flee wins"| P[Run Away];
M -->|"Heal wins"| E;
N --> Q{Target Dead?};
O --> Q;
Q -->|"Yes"| A;
Q -->|"No"| D;
P --> R{Safe Distance?};
R -->|"Yes"| A;
R -->|"No"| P;
style A fill:darkgreen,color:white;
style D fill:darkred,color:white;
style M fill:rebeccapurple,color:white;
style E fill:steelblue,color:white;

Como a Pontuacao de Utilidade Funciona

Cada acao disponivel tem uma lista de Conditions. O NPC avalia cada condicao para produzir uma pontuacao entre 0 e 1, e entao multiplica todas as pontuacoes. A acao com a maior pontuacao final vence.

flowchart LR;
A[Action: Melee Attack] --> B["Condition 1<br>TargetDistance<br>Score: 0.9"];
A --> C["Condition 2<br>OwnHealth<br>Score: 0.7"];
A --> D["Condition 3<br>TimeSinceUsed<br>Score: 0.5"];
B --> E["0.9 × 0.7 × 0.5<br>= 0.315"];
C --> E;
D --> E;
F[Action: Flee] --> G["Condition 1<br>OwnHealth<br>Score: 0.9"];
F --> H["Condition 2<br>Randomiser<br>Score: 0.95"];
G --> I["0.9 × 0.95<br>= 0.855"];
H --> I;
E --> J{Compare};
I --> J;
J -->|"0.855 > 0.315"| K[Flee wins!];
style K fill:darkred,color:white;

Exemplos

Arquivo de condicao standalone — HP Linear

Pontua a vida propria do NPC linearmente: vida cheia = pontuacao 1, morto = pontuacao 0.

{
"Type": "OwnStatPercent",
"Stat": "Health",
"Curve": "Linear"
}

Condicao inline — distancia do alvo (descendente)

Prefere esta acao quando o alvo esta perto; a pontuacao cai conforme a distancia aumenta ate 15 blocos.

{
"Type": "TargetDistance",
"Curve": {
"ResponseCurve": "SimpleDescendingLogistic",
"XRange": [0, 15]
}
}

Condicao inline — tempo desde o ultimo uso

Pontua uma acao mais alto quanto mais tempo se passou desde que foi usada, em uma janela de 10 segundos.

{
"Type": "TimeSinceLastUsed",
"Curve": {
"ResponseCurve": "Linear",
"XRange": [0, 10]
}
}

Condicao inline — limiar switch

Pontua 1 apos 10 segundos terem passado, 0 antes disso (bloqueio rigido).

{
"Type": "TimeSinceLastUsed",
"Curve": {
"Type": "Switch",
"SwitchPoint": 10
}
}

Condicao inline — randomiser

Adiciona um componente de ruido aleatorio entre 0.9 e 1.0 a pontuacao de utilidade da acao.

{
"Type": "Randomiser",
"MinValue": 0.9,
"MaxValue": 1
}

Condicao inline — HP linear reverso (curar quando ferido)

Pontua mais alto quando a vida esta baixa, para que o NPC prefira acoes de cura quando danificado.

{
"Type": "OwnStatPercent",
"Stat": "Health",
"Curve": "ReverseLinear"
}

Paginas Relacionadas

  • NPC Combat Balancing — Onde as condicoes aparecem dentro de AvailableActions[*].Conditions e RunConditions
  • NPC Roles — Arquivos de role que referenciam tomada de decisao pela arvore Instructions
  • NPC Templates — Templates que embutem comportamento guiado por essas condicoes