Unity Artificial Intelligence Programming
上QQ阅读APP看书,第一时间看更新

The Attack state

If the player tank is close enough to attack our AI tank, we will rotate the turret object to face the player tank, and then start shooting. Then, if the player tank goes out of range, the tank goes back to the Patrol state:

    protected void UpdateAttackState() 
    { 
      //Set the target position as the player position 
      destPos = playerTransform.position; 
 
      //Check the distance with the player tank 
      float dist = Vector3.Distance(transform.position,  
      playerTransform.position); 
 
      if (dist >= 200.0f && dist < 300.0f) 
      { 
        //Rotate to the target point 
        Quaternion targetRotation =  
        Quaternion.LookRotation(destPos -  
        transform.position); 
        transform.rotation = Quaternion.Slerp( 
        transform.rotation, targetRotation,  
        Time.deltaTime * curRotSpeed);   
 
        //Go Forward 
        transform.Translate(Vector3.forward *  
        Time.deltaTime * curSpeed); 
 
        curState = FSMState.Attack; 
      } 
      //Transition to patrol is the tank become too far 
      else if (dist >= 300.0f) 
      { 
        curState = FSMState.Patrol; 
      } 
 
      //Always turn the turret toward the player 
      Quaternion turretRotation =  
      Quaternion.LookRotation(destPos  
      - turret.position); 
 
      turret.rotation =  
      Quaternion.Slerp(turret.rotation, turretRotation,  
      Time.deltaTime * curRotSpeed);  
 
      //Shoot the bullets 
      ShootBullet(); 
    } 
    private void ShootBullet() 
    { 
      if (elapsedTime >= shootRate) 
      { 
        //Shoot the bullet 
        Instantiate(Bullet, bulletSpawnPoint.position,  
        bulletSpawnPoint.rotation); 
        elapsedTime = 0.0f; 
      } 
    }