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()。
另一种可能性是不要每帧都检查每个敌人的瞄准范围,而是将检查分散到多个帧中,每个敌人每隔几帧才检查一次。根据游戏的不同,不总是立即做出反应的敌人实际上可能更现实。