Advertisement
Guest User

Untitled

a guest
Apr 11th, 2012
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.62 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public enum ScanType {
  5.     ROTATING,
  6.     RANDOM
  7. }
  8.  
  9. public class TurretController : MonoBehaviour {
  10.  
  11.     public float rotateSpeed = 20;
  12.     public float lookDistance = 3;
  13.     public float FOV = 90;
  14.     public ScanType ScanMode;  
  15.     float delayTime = 2;
  16.     float elapsedTime = 0;
  17.    
  18.     Vector3 target = Vector3.forward;
  19.     GameObject player;
  20.    
  21.     void Start () {
  22.         player = GameObject.FindGameObjectWithTag("Player");   
  23.     }
  24.    
  25.     void Update ()
  26.     {  
  27.         if( CanSeePlayer() && IsWithinFOV() )
  28.             CenterOnPlayer();
  29.         else
  30.             ScanForPlayer();
  31.     }
  32.    
  33.     void ScanForPlayer()
  34.     {
  35.         switch( ScanMode )
  36.         {
  37.         case ScanType.ROTATING:
  38.             RotatingScan();
  39.             break;
  40.            
  41.         case ScanType.RANDOM:
  42.             RandomScan();          
  43.             break;
  44.            
  45.         default:
  46.             RotatingScan();
  47.             break;
  48.         }
  49.     }
  50.    
  51.     void RotatingScan()
  52.     {
  53.         Debug.DrawRay( transform.position, transform.forward * lookDistance, Color.green );
  54.         transform.Rotate( Vector3.up * rotateSpeed * Time.deltaTime );
  55.     }
  56.    
  57.     void RandomScan()
  58.     {
  59.         elapsedTime += Time.deltaTime;
  60.        
  61.         if( elapsedTime > delayTime ) {
  62.             elapsedTime = 0;
  63.            
  64.             float x = Random.Range( -10, 10);
  65.             float y = Random.Range( -10, 10 );
  66.            
  67.             this.target = new Vector3( x, 0, y );
  68.        
  69.             Debug.Log( string.Format("Getting new scan location, {0} {1}", x, y) );
  70.         }
  71.        
  72.         CenterOnTarget( this.target );
  73.     }
  74.  
  75.     private bool IsWithinFOV()
  76.     {
  77.         Vector3 playerLookAtVector = player.transform.position - transform.position;
  78.         float angleBetween = Vector3.Angle( transform.forward, playerLookAtVector );
  79.        
  80.         var distance = Vector3.Distance( transform.position, player.transform.position );
  81.        
  82.         return (angleBetween < FOV && distance < lookDistance);
  83.     }
  84.    
  85.     private void CenterOnPlayer()
  86.     {
  87.         Debug.DrawRay( transform.position, transform.forward * lookDistance, Color.red );
  88.        
  89.         var rotate = Quaternion.LookRotation( player.transform.position - transform.position );
  90.         transform.rotation = Quaternion.Slerp( transform.rotation, rotate, 5 * Time.deltaTime );
  91.     }
  92.    
  93.     private void CenterOnTarget( Vector3 target )
  94.     {
  95.         Debug.DrawRay( transform.position, transform.forward * lookDistance, Color.red );
  96.        
  97.         var rotate = Quaternion.LookRotation( target - transform.position );
  98.         transform.rotation = Quaternion.Slerp( transform.rotation, rotate, 5 * Time.deltaTime );
  99.     }
  100.    
  101.     private bool CanSeePlayer()
  102.     {
  103.         Vector3 playerLookAtVector = player.transform.position - transform.position;
  104.         RaycastHit hit = new RaycastHit();
  105.        
  106.         if( Physics.Raycast( transform.position, playerLookAtVector, out hit, lookDistance ) )
  107.             return hit.collider.gameObject.tag == "Player";
  108.        
  109.         return false;
  110.     }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement