有没有办法统一优化敌人 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().

的敌人位置

另一种可能性是不在每一帧检查每个敌人的视线范围,而是将检查分散到多个帧,每个敌人仅每隔几帧检查一次。根据游戏的不同,并非总是立即做出反应的敌人实际上可能更逼真。