有没有办法统一优化敌人 AI 控制器的这种方法?
Is there a way to optimise this method for an Enemy AI Controller in unity?
private void Update()
{
//Check for sight and attack range
playerInSightRange = Physics.CheckSphere(transform.position, sightRange, whatIsPlayer);
if (!playerInSightRange)
{
Patroling();
Debug.Log("Patroling");
}
if (playerInSightRange)
{
ChasePlayer();
Debug.Log("Chasing");
}
}
private void Patroling()
{
if (!walkPointSet)
{
SearchWalkPoint();
}
if (walkPointSet)
{
agent.SetDestination(walkPoint);
}
Vector3 distanceToWalkPoint = transform.position - walkPoint;
//Walkpoint reached
if (distanceToWalkPoint.magnitude < 1f)
walkPointSet = false;
}
private void SearchWalkPoint()
{
//Calculate random point in range
float randomZ = Random.Range(-walkPointRange, walkPointRange);
float randomX = Random.Range(-walkPointRange, walkPointRange);
walkPoint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ);
if (Physics.Raycast(walkPoint, -transform.up, 2f, whatIsGround))
walkPointSet = true;
}
private void ChasePlayer()
{
agent.SetDestination(player.position);
}
上面的第一个方法检查玩家是否在给定的视线范围内,然后根据视线范围执行另外两个方法。到目前为止,这个脚本使用了所有其他脚本中最多的资源,我不完全确定如何(或者即使有办法)让它使用更少 CPU,如果有人能找到优化的方法脚本将不胜感激。
目前巡逻这条线每帧都会执行:
agent.SetDestination(walkPoint);
我猜它只需要在目的地(walkPoint)改变时调用。如果是这样,您应该可以将其移至 SearchWalkPoint()
.
的底部
从问题中无法知道脚本的哪些部分最慢,但很可能这可能是其中之一:playerInSightRange = Physics.CheckSphere(transform.position, sightRange, whatIsPlayer);
.
目前它似乎只是检查敌人周围球体中的玩家——如果是这样,假设只有一个玩家对象,它可能更简单地完成同样的事情,只检查玩家和敌人之间的距离使用 Vector3.Distance().
的敌人位置
另一种可能性是不在每一帧检查每个敌人的视线范围,而是将检查分散到多个帧,每个敌人仅每隔几帧检查一次。根据游戏的不同,并非总是立即做出反应的敌人实际上可能更逼真。
private void Update()
{
//Check for sight and attack range
playerInSightRange = Physics.CheckSphere(transform.position, sightRange, whatIsPlayer);
if (!playerInSightRange)
{
Patroling();
Debug.Log("Patroling");
}
if (playerInSightRange)
{
ChasePlayer();
Debug.Log("Chasing");
}
}
private void Patroling()
{
if (!walkPointSet)
{
SearchWalkPoint();
}
if (walkPointSet)
{
agent.SetDestination(walkPoint);
}
Vector3 distanceToWalkPoint = transform.position - walkPoint;
//Walkpoint reached
if (distanceToWalkPoint.magnitude < 1f)
walkPointSet = false;
}
private void SearchWalkPoint()
{
//Calculate random point in range
float randomZ = Random.Range(-walkPointRange, walkPointRange);
float randomX = Random.Range(-walkPointRange, walkPointRange);
walkPoint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ);
if (Physics.Raycast(walkPoint, -transform.up, 2f, whatIsGround))
walkPointSet = true;
}
private void ChasePlayer()
{
agent.SetDestination(player.position);
}
上面的第一个方法检查玩家是否在给定的视线范围内,然后根据视线范围执行另外两个方法。到目前为止,这个脚本使用了所有其他脚本中最多的资源,我不完全确定如何(或者即使有办法)让它使用更少 CPU,如果有人能找到优化的方法脚本将不胜感激。
目前巡逻这条线每帧都会执行:
agent.SetDestination(walkPoint);
我猜它只需要在目的地(walkPoint)改变时调用。如果是这样,您应该可以将其移至 SearchWalkPoint()
.
从问题中无法知道脚本的哪些部分最慢,但很可能这可能是其中之一:playerInSightRange = Physics.CheckSphere(transform.position, sightRange, whatIsPlayer);
.
目前它似乎只是检查敌人周围球体中的玩家——如果是这样,假设只有一个玩家对象,它可能更简单地完成同样的事情,只检查玩家和敌人之间的距离使用 Vector3.Distance().
的敌人位置另一种可能性是不在每一帧检查每个敌人的视线范围,而是将检查分散到多个帧,每个敌人仅每隔几帧检查一次。根据游戏的不同,并非总是立即做出反应的敌人实际上可能更逼真。