Когда мой игрок находится на расстоянии от ИИ, ИИ меняет свое состояние на Беглое и вызывает эту функцию:
void Flee()
{
inTransit = false; //this makes sure he gets to his destination before rerouting
if(IsPlayerBlockingPath() && DistanceToTarget(player.position) < 10f)
{
PerpendicularMovement(HorizontalNormalToTarget(player.position));
}
else
{
MoveTowardsTarget(enemyBase.position);
}
}
Я использую скалярное произведение (как я полагаю) единицы вектор от ай до его «врага» и вектор от ай до игрока. если это значение между, возможно, 0,5 и 1, то эти два вектора движутся в одинаковых направлениях, поэтому нам нужно ориентироваться вокруг игрока. Однако мой ИИ движется только вокруг игрока в определенных частях карты, а не в других
float DistanceToTarget(Vector3 location)
{
return (transform.position - location).magnitude;
}
bool IsPlayerBlockingPath()
{
Vector3 AIToPlayer = HorizontalNormalToTarget(player.position);
Vector3 AIToEnemyBase = HorizontalNormalToTarget(enemyBase.position);
float dotP = Vector3.Dot(AIToPlayer, AIToEnemyBase);
if (dotP > blockTollerance) //blockTollerance is set to 0.1f
{
return true;
}
return false;
}
void PerpendicularMovement(Vector3 perpToThis)
{
Vector3 perpDirection = Quaternion.Euler(0, 90, 0) * perpToThis;
MoveTowardsTarget(perpDirection * perpMovementIncrement);
//I need him to move in this direction a bit further than he currently will
}