Guest

Untitled

By: a guest on Feb 13th, 2012  |  syntax: None  |  size: 3.65 KB  |  hits: 48  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. public var MoveSpeed : float = .1;
  2. public var AttackRange : float = 330;
  3. public var MinDistance : float = 40;
  4.  
  5. protected var players : GameObject[];
  6. protected var target : GameObject;
  7.  
  8. private var elapsedTime : float = 0;
  9. private var pos : Vector3;
  10. private var distance : float;
  11. private var transformRef : Transform;
  12. private var targetTransformRef : Transform;
  13.  
  14. function Start() {
  15.        
  16.         /* Cache transform */
  17.         transformRef = transform;
  18.        
  19.         /* Cache position */
  20.         pos = transformRef.position;
  21.        
  22.         /* Get all players in the game */
  23.         players = GameObject.FindGameObjectsWithTag("player");
  24.        
  25.         if(players.length > 0) {
  26.                
  27.                 if(players[0]) {
  28.                        
  29.                         target = players[0];
  30.                         distance = GetDistance(target);
  31.                         targetTransformRef = target.transform;
  32.                
  33.                 }
  34.                
  35.         }
  36.        
  37. }
  38.  
  39. function FixedUpdate () {
  40.  
  41.         /* Do I already have a target? */
  42.         if(target == null) {
  43.                
  44.                 FindTarget();
  45.                
  46.         }
  47.        
  48.        
  49.         if(target != null ) {
  50.                
  51.                 /* Target's current position */
  52.                 var targetPos : Vector3 = targetTransformRef.position;
  53.                 var lookRotation : Quaternion = Quaternion.LookRotation(
  54.                         Vector3(targetPos.x, 0, targetPos.z) - Vector3(pos.x, 0, pos.z)
  55.                 );
  56.                
  57.                 /* Look at the target */
  58.                 transformRef.rotation = Quaternion.Slerp(transformRef.rotation, lookRotation, Time.deltaTime * 10);
  59.                 transform.position.y = 1.5;
  60.                
  61.                 /* How many degrees from facing the target am I? */    
  62.                 var angle : float = Quaternion.Angle(transformRef.rotation, lookRotation);
  63.                
  64.                 var direction : Vector3 = (targetPos - pos);
  65.                 var dirSqrMag : float = direction.sqrMagnitude;
  66.                 var moveSpeedTmp : float = MoveSpeed;
  67.                
  68.                 /* Keep $x units away from target, back up if too close */
  69.                 if(dirSqrMag <= 16)
  70.                         moveSpeedTmp = MoveSpeed * (1 - Mathf.Clamp01(dirSqrMag / 16));
  71.                 else
  72.                         moveSpeedTmp = MoveSpeed * Mathf.Clamp01((dirSqrMag - 25) / (49-25));
  73.  
  74.                 var movementAmount : Vector3 = direction.normalized * Time.deltaTime * moveSpeedTmp ;
  75.        
  76.                 /* Reverse direction if too close */
  77.                 if(movementAmount.sqrMagnitude >= dirSqrMag) {
  78.  
  79.                         movementAmount = direction;
  80.  
  81.                 } else if(dirSqrMag < 16) {
  82.  
  83.                         movementAmount *= -1;
  84.  
  85.                 }
  86.        
  87.                 pos += movementAmount;
  88.                
  89.                 /* Cache the new position */
  90.                 pos.y = 1.5;
  91.                 rigidbody.MovePosition(pos);
  92.                 //transform.position.y = 1.5;
  93.                
  94.         }
  95.  
  96. }
  97.  
  98. function CanSeeTarget(target) : boolean {
  99.        
  100.         var hit : RaycastHit;
  101.        
  102.         if(target && Physics.Linecast(transform.position, target.transform.position, hit)) {
  103.                
  104.                 return hit.transform == target.transform;
  105.                
  106.         }
  107.        
  108.         return false;
  109.        
  110. }
  111.  
  112.  
  113. function GetDistance(target) {
  114.        
  115.         var distance = (target.transform.position - pos).sqrMagnitude;
  116.         return distance;
  117.        
  118. }
  119.  
  120. function TargetInRange(distance) {
  121.        
  122.         return distance < AttackRange ? true : false;
  123.        
  124. }
  125.  
  126. function FindTarget() {
  127.        
  128.         yield WaitForSeconds(1);
  129.        
  130.         /* Iterate over available players, get first target found */
  131.         for(var player : GameObject in players) {
  132.                
  133.                 if(player) {
  134.                        
  135.                         /* Cache distance calculation */
  136.                         var d = GetDistance(player);
  137.        
  138.                         /* Make sure target is in range and visible */
  139.                         if(TargetInRange(d) && CanSeeTarget(player)) {
  140.                        
  141.                                 /* Set target variables */
  142.                                 distance = d;
  143.                                 target = player;
  144.                                 targetTransformRef = target.transform;
  145.                
  146.                         } else {
  147.                        
  148.                                 /* No target found */
  149.                                 distance = 0;
  150.                                 target = null;
  151.                                 targetTransformRef = null;
  152.                        
  153.                         }
  154.                
  155.                 }
  156.                
  157.         }
  158.  
  159. }
  160.  
  161. function OnCollisionEnter(collision : Collision) {
  162.        
  163.         if(collision.gameObject.layer == 12) {
  164.                
  165.                 print("WALL");
  166.                
  167.         } else {
  168.                
  169.                 print(collision.gameObject.layer);
  170.        
  171.         }
  172.        
  173.         if(collision.gameObject.tag == gameObject.tag) {
  174.                
  175.                 Physics.IgnoreCollision(collision.collider, gameObject.collider);
  176.        
  177.         }
  178.        
  179. }