Imagine que você está desenvolvendo um jogo onde inimigos devem seguir o player em um vasto mundo aberto. A forma como o NPC se movimenta pode ser essencial para proporcionar uma experiência de jogo mais  envolvente. Para isso, você decide utilizar um modelo de regressão linear para ajustar a velocidade dos inimigos conforme a distância ao alvo. Vamos ver como isso funciona?

O Cenário:

Seu inimigo, um caçador implacável, deve perseguir o player que está constantemente em movimento. Ele precisa ajustar sua velocidade de maneira inteligente para alcançar o player rapidamente quando ele estiver distante e desacelerar para ajustar sua precisão quando estiver mais próximo, evitando movimentos bruscos que possam atrapalhar sua perseguição.

A Regressão Linear:

A regressão linear entra em ação ao modelar a relação entre a distância (d) e a velocidade (v) do inimigo. Suponhamos que você coletou dados observando o comportamento do NPC em várias simulações:

Neste caso,  quanto maior a distancia maior a velocidade.

distance = [10, 8, 6, 4, 2, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30] # Distâncias (X)
speeds = [2, 1.9, 1.6, 1.3, 1, 2.1, 2.5, 2.7, 2.6, 2.8, 3, 3.1, 3.3, 3.2, 3.5]# Velocidades (Y)

Você percebe que existe uma relação linear entre a distância e a velocidade: à medida que a distância aumenta, a velocidade do NPC também aumenta. Esta relação pode ser expressa pela equação de uma linha reta:

A equação reduzida da reta é y = mx + b, onde  x e y são, respectivamente, a variável independente e a variável dependente; m é o coeficiente angular, e b é o coeficiente linear.

Em outras palavras, temos:

V=mD+b,

Onde V é a velocidade, D é a distância, m é a inclinação da linha (indicando a taxa de aumento de velocidade por unidade de distância) e b é o intercepto (a velocidade inicial quando a distância é zero).

Determinando os Parâmetros:

Usando a técnica de regressão linear, você calcula m e b com base nos dados coletados:

Regressao

Após calcular esses valores, você encontra a equação da linha que melhor se ajusta aos seus dados. Por exemplo, suponhamos que m=0.2   e b=. Assim, a equação seria:

V=0.2*D  

Analisando a Precisão: Compreendendo os Erros na Regressão Linear

Para avaliar a precisão do modelo de regressão linear, utilizamos algumas métricas de erro:

Erro Absoluto Médio (MAE): Mede a média das diferenças absolutas entre os valores previstos e os valores reais;

Erro Quadrático Médio (MSE): Mede a média dos quadrados das diferenças entre os valores previstos e os valores reais.

Essas métricas ajudam a entender o quão bem o modelo de regressão linear está ajustando os dados. O MAE é útil para interpretar o erro em termos das unidades originais dos dados, enquanto o MSE penaliza mais os erros maiores, sendo útil para identificar grandes discrepâncias entre os valores previstos e os valores reais.

Implementação no Jogo: Ajustando a Velocidade do NPC com Regressão Linear

Para o exemplo, utilizaremos Python com a biblioteca sklearn, mas é claro que é possível escrever o código em C# utilizando Unity. Desta forma, vamos ajustar a velocidade de um NPC (Inimigo) de acordo com a distância ao jogador. Este é um exemplo simples, mas que pode facilitar a compreensão dos conceitos de regressão linear aplicados ao desenvolvimento de jogos.

Desenvolvimento


import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error,mean_squared_error
import matplotlib.pyplot as plt# Dados de exemplo adicionais - quanto maior a distancia maior a velocidade
distance = np.array([[10], [8], [6], [4], [2], [12], [14], [16], [18], [20], [22], [24], [26], [28], [30]]) # Distâncias (X)
speeds = np.array([[2], [1.9], [1.6], [1.3], [1], [2.1], [2.5], [2.7], [2.6], [2.8], [3], [3.1], [3.3], [3.2], [3.5]]) # Velocidades (Y)

<strong># Criar e treinar o modelo de regressão linear</strong>
model = LinearRegression()
model.fit(distance, speeds)

<strong>#verificar o coeficientes b</strong>
model.intercept_
print(model.intercept_)

<strong>#verificar os coeficientes m - inclinacao da curva</strong>

model.coef_
print(model.coef_)

<strong># Prever a velocidade usando o modelo treinado</strong>
predicted_speeds = model.predict(distance)

<strong>Calcular os erros</strong>

#erros
resultado = abs(speeds - predicted_speeds).mean()

mae= mean_absolute_error(speeds,predicted_speeds)

mse = mean_squared_error(speeds,predicted_speeds)

plt.scatter(distance, speeds, color='blue', label='Dados de exemplo')
plt.plot(distance,predicted_speeds, color='red', label='Linha de Regressão')
plt.xlabel('Distância até o alvo')
plt.ylabel('Velocidade do NPC')
plt.title('Regressão Linear: Distância vs Velocidade')
plt.legend()
plt.show()

Após a execução do código, podemos visualizar o resultado na Figura 1.0.

Figura 1.0 – Velocidade x Deslocamento

É notório observar que, quanto mais distante o NPC estiver do jogador, maior será a sua velocidade. Em relação aos dados e à projeção, podemos analisar os erros para entender melhor a precisão do modelo.

Conclusão:

Ao usar regressão linear, seu inimigo agora se move de maneira mais suave, acelerando rapidamente quando está longe do jogador e desacelerando conforme se aproxima. Claro que outras técnicas também poderiam ser usadas. Essa abordagem pode ser útil em muitos casos, além de adicionar uma camada de desafio. Em suma, a regressão linear transforma uma simples relação matemática em uma ferramenta poderosa para criar movimentos de NPCs mais inteligentes, proporcionando uma experiência de jogo mais rica e envolvente para os jogadores.