Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- public enum ScanType {
- ROTATING,
- RANDOM
- }
- public class TurretController : MonoBehaviour {
- public float rotateSpeed = 20;
- public float lookDistance = 3;
- public float FOV = 90;
- public ScanType ScanMode;
- float delayTime = 2;
- float elapsedTime = 0;
- Vector3 target = Vector3.forward;
- GameObject player;
- void Start () {
- player = GameObject.FindGameObjectWithTag("Player");
- }
- void Update ()
- {
- if( CanSeePlayer() && IsWithinFOV() )
- CenterOnPlayer();
- else
- ScanForPlayer();
- }
- void ScanForPlayer()
- {
- switch( ScanMode )
- {
- case ScanType.ROTATING:
- RotatingScan();
- break;
- case ScanType.RANDOM:
- RandomScan();
- break;
- default:
- RotatingScan();
- break;
- }
- }
- void RotatingScan()
- {
- Debug.DrawRay( transform.position, transform.forward * lookDistance, Color.green );
- transform.Rotate( Vector3.up * rotateSpeed * Time.deltaTime );
- }
- void RandomScan()
- {
- elapsedTime += Time.deltaTime;
- if( elapsedTime > delayTime ) {
- elapsedTime = 0;
- float x = Random.Range( -10, 10);
- float y = Random.Range( -10, 10 );
- this.target = new Vector3( x, 0, y );
- Debug.Log( string.Format("Getting new scan location, {0} {1}", x, y) );
- }
- CenterOnTarget( this.target );
- }
- private bool IsWithinFOV()
- {
- Vector3 playerLookAtVector = player.transform.position - transform.position;
- float angleBetween = Vector3.Angle( transform.forward, playerLookAtVector );
- var distance = Vector3.Distance( transform.position, player.transform.position );
- return (angleBetween < FOV && distance < lookDistance);
- }
- private void CenterOnPlayer()
- {
- Debug.DrawRay( transform.position, transform.forward * lookDistance, Color.red );
- var rotate = Quaternion.LookRotation( player.transform.position - transform.position );
- transform.rotation = Quaternion.Slerp( transform.rotation, rotate, 5 * Time.deltaTime );
- }
- private void CenterOnTarget( Vector3 target )
- {
- Debug.DrawRay( transform.position, transform.forward * lookDistance, Color.red );
- var rotate = Quaternion.LookRotation( target - transform.position );
- transform.rotation = Quaternion.Slerp( transform.rotation, rotate, 5 * Time.deltaTime );
- }
- private bool CanSeePlayer()
- {
- Vector3 playerLookAtVector = player.transform.position - transform.position;
- RaycastHit hit = new RaycastHit();
- if( Physics.Raycast( transform.position, playerLookAtVector, out hit, lookDistance ) )
- return hit.collider.gameObject.tag == "Player";
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement