Advertisement
Guest User

EnermyAI.cs

a guest
Aug 26th, 2013
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 36.33 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using SmoothMoves;
  4.  
  5. [RequireComponent (typeof (PlatformInputController_NPC))]
  6.  
  7. public class EnermyAI : MonoBehaviour
  8. {
  9.    
  10.     public BoneAnimation character;
  11.    
  12.     public GameObject mainTarget;
  13.     public int alertLevel=1;
  14.     public int stateLevel=1;
  15.     public float alertLevelOneSeeDistance=100.0F;
  16.     public float alertLevelTwoSeeDistance=200.0F;
  17.     public float alertLevelThreeSeeDistance=300.0F;
  18.     public float alertLevelFourSeeDistance=400.0F;
  19.     public float alertLevelFiveSeeDistance=500.0F;
  20.     public float alertLevelTwoFadeTimePeriod=6.0f;
  21.     public int alertFadeDistance=120;
  22.     public float attackRange=180f;
  23.     public float attackDelay=2f;
  24.     public float movingLimitOnLeftX;
  25.     public float movingLimitOnRightX;
  26.     public float seekAreaRange=200f;
  27.     public string seekAnimation;
  28.     public float seekWaitingTime=5f;
  29.     //time that enemy igores Player's behaviour
  30.     public float alertCooldownTime=8f;
  31.     public bool noChat;
  32.     public float[] waypointXValue;
  33.     public float[] waypointWaitingTime;
  34.     public string[] waypointAnimation;
  35.     public bool playerSneak;
  36.     public bool playerCrawl;
  37.     public bool interactWithPlayer;
  38.     public bool playAnimation;
  39.     public bool playSound;
  40.     public float runSpeed=7f;
  41.     public float walkSpeed=4f;
  42.     public bool facingRight;
  43.    
  44.     public string walkingStyleAnimation;
  45.     public string idleStyleAnimation;
  46.     public string alertAnimation;
  47.     public string attackAnimation;
  48.     public GameObject bullet;
  49.     public float bulletVelocity;
  50.    
  51.     private enum NPCBehaviour
  52.     {
  53.         Guard,
  54.         Patrol,
  55.         InteractWithPlayer,
  56.         SeekPlayer,
  57.         AttackPlayer,
  58.         Shocked,
  59.         AlertHit,
  60.         AlertPatrol
  61.     };
  62.     private NPCBehaviour myBehaviour;
  63.    
  64.     private enum NPCMovingStyle
  65.     {
  66.         Walk,
  67.         Run
  68.     };
  69.     private NPCMovingStyle myMovingStyle;
  70.    
  71.     private int NoOfWaypoint;
  72.     private int currentWaypoint;
  73.     private float waitingStartTime;
  74.     private float positionGap;
  75.     private int previousWaypoint;
  76.     private float moveSpeed;
  77.     private float distanceToTarget;
  78.     private bool ifTargetInHideZone;
  79.     private bool ifTargetSneaking;
  80.     private bool ifTargetCrawling;
  81.     private bool ifTargetRunning;
  82.     private bool ifTargetIdling;
  83.     private int raycastDistance;
  84.    
  85.     private Vector3 raycastHeightOne;
  86.     private Vector3 raycastHeightTwo;
  87.     private Vector3 raycastHeightThree;
  88.     private Vector3 raycastHeightFour;
  89.     private Vector3 raycastHeightFive;
  90.     private Vector3 raycastHeightSix ;
  91.    
  92.     private bool alertLevelTwoFadeActivation;
  93.     private float alertLevelTwoFadeStartingTime;
  94.     private NPCBehaviour previousBehaviour;
  95.     private float previousAlertLocation;
  96.     private bool alertHitted;
  97.     private bool alertPatrolled;
  98.     private float targetPreviousPosition;
  99.     private NPCBehaviour tempBehaviour;
  100.     private float alertCooldownStartingTime;
  101.     private bool alertReaction;
  102.    
  103.     private float lastPlayerPosition;
  104.     private const int threeSeekPosition = 3;
  105.     private int currentSeekOrder;
  106.     private float[] seekPositions;
  107.     private float seekingStartingTime;
  108.    
  109.     private bool isAttacking;
  110.     private float attackStartingTime;
  111.     private const float attackPeriod = 1.0f;
  112.     private const float pullGunPeriod = 0.9f;
  113.     private float pullGunStartingTime;
  114.     private bool hasPulledGun;
  115.    
  116.     // Use this for initialization
  117.     void Start ()
  118.     {
  119.         bool waypointCheck = false;
  120.         //Error check
  121.         if (alertLevel < 1 || alertLevel > 5)
  122.             Debug.LogError("Alert Level has to be 1, 2, 3, 4 or 5");
  123.         if (stateLevel < 1 || stateLevel > 4)
  124.             Debug.LogError("State Level has to be 1, 2, 3 or 4");
  125.         if (waypointXValue.Length == waypointWaitingTime.Length &&
  126.             waypointXValue.Length == waypointAnimation.Length)
  127.         {
  128.             NoOfWaypoint = waypointXValue.Length;  
  129.         }
  130.         else
  131.         {
  132.             Debug.LogError ("Setup of waypoint is wrong"); 
  133.         }
  134.         foreach (float waypointX in waypointXValue)
  135.         {
  136.             if (waypointX <= movingLimitOnLeftX ||
  137.                 waypointX >= movingLimitOnRightX)
  138.                 waypointCheck = true;
  139.         }
  140.         if (movingLimitOnLeftX >= movingLimitOnRightX ||
  141.             transform.position.x <= movingLimitOnLeftX ||
  142.             transform.position.x >= movingLimitOnRightX ||
  143.             waypointCheck)
  144.         {
  145.             Debug.LogError ("movingLimit Error");
  146.         }
  147.            
  148.        
  149.         myBehaviour = NPCBehaviour.Patrol;
  150.         myMovingStyle = NPCMovingStyle.Walk;
  151.         tempBehaviour = myBehaviour;
  152.        
  153.         //set speed for different style
  154.         if (myMovingStyle == NPCMovingStyle.Walk)
  155.         {
  156.             moveSpeed = walkSpeed; 
  157.         }
  158.         else
  159.         {
  160.             moveSpeed = runSpeed;  
  161.         }
  162.         positionGap = 1.0f;
  163.         waitingStartTime = -100.0f;
  164.         distanceToTarget = Mathf.Abs(mainTarget.transform.position.x - transform.position.x);
  165.         ifTargetInHideZone = mainTarget.GetComponent <PlayerStatus> ().ifInHideZone ();
  166.         ifTargetSneaking = mainTarget.GetComponent <PlayerStatus> ().ifSneaking ();
  167.         ifTargetCrawling = mainTarget.GetComponent <PlayerStatus> ().ifCrawling ();
  168.         ifTargetRunning = mainTarget.GetComponent <PlayerStatus> ().ifRunning ();
  169.         ifTargetIdling = mainTarget.GetComponent <PlayerStatus> ().ifIdlling ();
  170.        
  171.         if (facingRight)
  172.             raycastDistance = 10000;
  173.         else
  174.             raycastDistance = -10000;
  175.        
  176.         raycastHeightOne= new Vector3 (transform.position.x, transform.position.y + 25, transform.position.z);
  177.         raycastHeightTwo = new Vector3 (transform.position.x, transform.position.y + 50, transform.position.z);
  178.         raycastHeightThree = new Vector3 (transform.position.x, transform.position.y + 75, transform.position.z);
  179.         raycastHeightFour = new Vector3 (transform.position.x, transform.position.y + 100, transform.position.z);
  180.         raycastHeightFive = new Vector3 (transform.position.x, transform.position.y + 125, transform.position.z);
  181.         raycastHeightSix = new Vector3 (transform.position.x, transform.position.y + 150, transform.position.z);
  182.        
  183.         alertLevelTwoFadeStartingTime = -999;
  184.         alertCooldownStartingTime = -999;
  185.         alertReaction = true;
  186.         seekingStartingTime = -999;
  187.         lastPlayerPosition = 0.001f;
  188.         seekPositions = new float[3];
  189.     }
  190.    
  191.     // Update is called once per frame
  192.     void Update ()
  193.     {
  194. //      Debug.Log (myBehaviour + " " + tempBehaviour + " " + previousBehaviour);
  195. //      Debug.Log (ifTargetSneaking + " " + ifTargetCrawling + " " + ifTargetRunning + " " + ifTargetIdling);
  196.         //Calculate the distance between target and enermy
  197.         distanceToTarget = Mathf.Abs(mainTarget.transform.position.x - transform.position.x);
  198.         //Debug.Log(distanceToTarget);
  199.        
  200.         //Check if target is in hide zone
  201.         ifTargetInHideZone = mainTarget.GetComponent <PlayerStatus> ().ifInHideZone ();
  202.         //Debug.Log(ifTargetInHideZone);
  203.         ifTargetSneaking = mainTarget.GetComponent <PlayerStatus> ().ifSneaking ();
  204.         ifTargetCrawling = mainTarget.GetComponent <PlayerStatus> ().ifCrawling ();
  205.         ifTargetRunning = mainTarget.GetComponent <PlayerStatus> ().ifRunning ();
  206.         ifTargetIdling = mainTarget.GetComponent <PlayerStatus> ().ifIdlling ();
  207.        
  208.         //Set speed for different style
  209.         if (myMovingStyle == NPCMovingStyle.Walk)
  210.         {
  211.             moveSpeed = walkSpeed; 
  212.         }
  213.         else
  214.         {
  215.             moveSpeed = runSpeed;  
  216.         }
  217.        
  218.         //Back to first waypoint
  219.         if (currentWaypoint >= NoOfWaypoint)
  220.         {
  221.             currentWaypoint = 0;   
  222.         }
  223.        
  224.         //Going out of Limit area
  225.         if (outOfLimitZone ())
  226.         {
  227. //          Debug.Log (myBehaviour + " " + tempBehaviour);
  228.             myBehaviour = tempBehaviour;
  229.             if (myBehaviour == NPCBehaviour.AlertPatrol)
  230.                 myBehaviour = previousBehaviour;
  231.             alertCooldownStartingTime = Time.time;
  232.             currentSeekOrder = 0;
  233.         }
  234.        
  235.         //The Alert Cooldown time has passed
  236.         if (Time.time <= alertCooldownStartingTime + alertCooldownTime)
  237.         {
  238.             alertReaction = false;
  239.         }
  240.         else
  241.         {
  242.             alertReaction = true;  
  243.         }
  244.        
  245.         //If player just Make Noise for state level 1
  246.         if (alertLevelTwoFadeActivation)
  247.         {
  248.             if (Time.time >= alertLevelTwoFadeStartingTime + alertLevelTwoFadeTimePeriod)
  249.             {
  250.                 decreaseAggressive ();
  251.                 alertLevelTwoFadeStartingTime = -999;
  252.                 myBehaviour = previousBehaviour;
  253.                 alertLevelTwoFadeActivation = false;
  254.             }
  255.         }
  256.        
  257.         switch (alertLevel)
  258.         {
  259.             case 1:
  260.                 break;
  261.             case 2:
  262. //              Debug.Log ("GO");
  263.                 if (SeesPlayer (alertLevelTwoSeeDistance))
  264.                 {
  265. //                  Debug.Log ("Distance: " + Mathf.Abs(transform.position.x - mainTarget.transform.position.x));
  266. //                  Debug.Log (ifTargetSneaking + " " + ifTargetCrawling + " " + ifTargetRunning + " " + ifTargetIdling);
  267.                 }
  268.                 break;
  269.             case 3:
  270.                 if (SeesPlayer (alertLevelThreeSeeDistance) &&
  271.                     alertReaction &&
  272.                     (myBehaviour != NPCBehaviour.AlertHit) &&
  273.                     (myBehaviour != NPCBehaviour.AttackPlayer))
  274.                 {
  275.                     alertCooldownStartingTime = Time.time;
  276.                     tempBehaviour = myBehaviour;
  277.                     myBehaviour = NPCBehaviour.AttackPlayer;
  278. //                  Debug.Log ("my " + myBehaviour);
  279.                 }
  280.                 break;
  281.             case 4:
  282.                 if (SeesPlayer (alertLevelFourSeeDistance))
  283.                 {
  284.                
  285.                 }
  286.                 break;
  287.             case 5:
  288.                 if (SeesPlayer (alertLevelFiveSeeDistance))
  289.                 {
  290.                
  291.                 }
  292.                 break;
  293.         }
  294.        
  295.         switch (stateLevel)
  296.         {
  297.             case 1:
  298.                 break;
  299.             case 2:
  300.                 break;
  301.             case 3:
  302.                 break;
  303.             case 4:
  304.                 break;
  305.         }
  306.        
  307.         switch (myBehaviour)
  308.         {
  309.             case NPCBehaviour.Guard:
  310.                 Guard ();
  311.                 break;
  312.             case NPCBehaviour.Patrol:
  313.                 Patrol ();
  314.                 break;
  315.             case NPCBehaviour.InteractWithPlayer:
  316.                 InteractWithPlayer ();
  317.                 break;
  318.             case NPCBehaviour.SeekPlayer:
  319.                 SeekPlayer ();
  320.                 break;
  321.             case NPCBehaviour.AttackPlayer:
  322.                 if (alertLevel == 1 ||
  323.                     alertLevel == 2)
  324.                     AttackPlayer ();
  325.                 else
  326.                     rangeAttackPlayer ();
  327.                 break; 
  328.             case NPCBehaviour.Shocked:
  329.                 Shocked ();
  330.                 break;
  331.             case NPCBehaviour.AlertHit:
  332.                 AlertHit ();
  333.                 break;
  334.             case NPCBehaviour.AlertPatrol:
  335.                 alertPatrol ();
  336.                 break;
  337.         }
  338.        
  339.         raycastHeightOne= new Vector3 (transform.position.x, transform.position.y + 25, transform.position.z);
  340.         raycastHeightTwo = new Vector3 (transform.position.x, transform.position.y + 50, transform.position.z);
  341.         raycastHeightThree = new Vector3 (transform.position.x, transform.position.y + 75, transform.position.z);
  342.         raycastHeightFour = new Vector3 (transform.position.x, transform.position.y + 100, transform.position.z);
  343.         raycastHeightFive = new Vector3 (transform.position.x, transform.position.y + 125, transform.position.z);
  344.         raycastHeightSix = new Vector3 (transform.position.x, transform.position.y + 150, transform.position.z);
  345.  
  346.     }
  347.    
  348.     bool outOfLimitZone ()
  349.     {
  350. //      Debug.Log ("tell: " + transform.position.x + " " + movingLimitOnRightX + " " + myBehaviour + " " + tempBehaviour);
  351.         if (transform.position.x >= movingLimitOnRightX ||
  352.             transform.position.x <= movingLimitOnLeftX)
  353.             return true;
  354.         else
  355.             return false;
  356.     }
  357.    
  358.     bool SeesPlayer (float seeDistance)
  359.     {
  360.         if (isOnFront ())
  361.         {
  362.             if (ifTargetRunning)
  363.             {
  364.                 //Simple Running
  365.                 if (!ifTargetSneaking && !ifTargetCrawling)
  366.                 {
  367.                     if (isInSeeRange (seeDistance))
  368.                     {
  369.                         lastPlayerPosition = mainTarget.transform.position.x;
  370.                         return true;
  371.                     }
  372.                     return false;
  373.                 }
  374.                 //Sneak Running
  375.                 else if (ifTargetSneaking)
  376.                 {
  377.                     if (isInSeeRange (seeDistance * 0.85f))
  378.                     {
  379.                         lastPlayerPosition = mainTarget.transform.position.x;
  380.                         return true;
  381.                     }
  382.                     return false;
  383.                 }
  384.                 //Crawl Running
  385.                 else if (ifTargetCrawling)
  386.                 {
  387.                     if (isInSeeRange (seeDistance * 0.7f))
  388.                     {
  389.                         lastPlayerPosition = mainTarget.transform.position.x;
  390.                         return true;
  391.                     }
  392.                     return false;
  393.                 }
  394.                 else
  395.                 {
  396.                     Debug.Log ("Player Running Status Error"); 
  397.                 }
  398.             }
  399.             else if (ifTargetIdling)
  400.             {
  401.                 //Simple Idling
  402.                 if (!ifTargetSneaking && !ifTargetCrawling)
  403.                 {
  404.                     if (isInSeeRange (seeDistance))
  405.                     {
  406.                         lastPlayerPosition = mainTarget.transform.position.x;
  407.                         return true;
  408.                     }
  409.                     return false;
  410.                 }
  411.                 //Sneak Idling
  412.                 else if (ifTargetSneaking)
  413.                 {
  414.                     if (isInSeeRange (seeDistance * 0.7f))
  415.                     {
  416.                         lastPlayerPosition = mainTarget.transform.position.x;
  417.                         return true;
  418.                     }
  419.                     return false;
  420.                 }
  421.                 //Crawl Idling
  422.                 else if (ifTargetCrawling)
  423.                 {
  424.                     if (isInSeeRange (seeDistance * 0.55f))
  425.                     {
  426.                         lastPlayerPosition = mainTarget.transform.position.x;
  427.                         return true;
  428.                     }
  429.                     return false;
  430.                 }
  431.                 else
  432.                 {
  433.                     Debug.Log ("Player Idling Status Error");  
  434.                 }          
  435.             }
  436.             else
  437.             {
  438.                 Debug.Log ("Player Status Error"); 
  439.             }
  440.         }
  441.         else
  442.         {
  443.             if (ifTargetRunning)
  444.             {
  445.                 //Simple Running
  446.                 if (!ifTargetSneaking && !ifTargetCrawling)
  447.                 {
  448.                     if (isInSeeRange (seeDistance * 0.7f))
  449.                     {
  450.                         lastPlayerPosition = mainTarget.transform.position.x;
  451.                         return true;
  452.                     }
  453.                     return false;
  454.                 }
  455.                 //Sneak Running
  456.                 else if (ifTargetSneaking)
  457.                 {
  458.                     return false;
  459.                 }
  460.                 //Crawl Running
  461.                 else if (ifTargetCrawling)
  462.                 {
  463.                     return false;
  464.                 }
  465.                 else
  466.                 {
  467.                     Debug.Log ("Player Running Status Error"); 
  468.                 }
  469.             }
  470.             else if (ifTargetIdling)
  471.             {
  472.                 //Simple Idling
  473.                 if (!ifTargetSneaking && !ifTargetCrawling)
  474.                 {
  475.                     return false;
  476.                 }
  477.                 //Sneak Idling
  478.                 else if (ifTargetSneaking)
  479.                 {
  480.                     return false;
  481.                 }
  482.                 //Crawl Idling
  483.                 else if (ifTargetCrawling)
  484.                 {
  485.                     return false;
  486.                 }
  487.                 else
  488.                 {
  489.                     Debug.Log ("Player Idling Status Error");  
  490.                 }          
  491.             }
  492.             else
  493.             {
  494.                 Debug.Log ("Player Status Error"); 
  495.             }          
  496.         }
  497.         return false;
  498.     }
  499.    
  500.     //MainTarget is on the front of the enemy
  501.     bool isOnFront ()
  502.     {
  503.         if ((facingRight &&
  504.             mainTarget.transform.position.x >= transform.position.x) ||
  505.             (!facingRight &&
  506.             mainTarget.transform.position.x <= transform.position.x))
  507.         {
  508.             return true;
  509.         }
  510.         return false;
  511.     }
  512.                    
  513.     bool isInSeeRange (float seeDistance)
  514.     {
  515.         if ((mainTarget.transform.position.x >= transform.position.x &&
  516.             mainTarget.transform.position.x <= transform.position.x + seeDistance) ||
  517.             (mainTarget.transform.position.x <= transform.position.x &&
  518.             mainTarget.transform.position.x >= transform.position.x - seeDistance))
  519.         {
  520.             return true;   
  521.         }
  522.         return false;
  523.     }
  524.    
  525.     void Guard ()
  526.     {
  527.         if (alertLevel == 1 ||
  528.             alertLevel == 2 ||
  529.             alertLevel == 3)
  530.         {
  531.            
  532.         }
  533.         else
  534.         {
  535.            
  536.         }
  537.         hasPulledGun = false;
  538.     }
  539.    
  540.     void Patrol ()
  541.     {
  542.         //calculate previous waypoint waiting time
  543.         if (currentWaypoint == 0)
  544.         {
  545.             previousWaypoint = waypointWaitingTime.Length - 1;
  546.         }
  547.         else
  548.         {
  549.             previousWaypoint = currentWaypoint - 1;
  550.         }
  551.         //Waiting time has finished
  552.         if (Time.time >= waitingStartTime + waypointWaitingTime[previousWaypoint])
  553.         {
  554.             //Arrive new Waypoint
  555.             if (transform.position.x <= waypointXValue[currentWaypoint] + positionGap &&
  556.                 transform.position.x >= waypointXValue[currentWaypoint] - positionGap)
  557.             {
  558.                 waitingStartTime = Time.time;
  559.                 BroadcastMessage ("NoMove");
  560.                 character.CrossFade (waypointAnimation[currentWaypoint]);
  561.                 currentWaypoint++;
  562.             }
  563.             //Waypoint is on left
  564.             else if (transform.position.x <= waypointXValue[currentWaypoint])
  565.             {
  566.                 BroadcastMessage ("RightMove", moveSpeed);
  567.                 character.CrossFade (walkingStyleAnimation);
  568.                 //Flip animation
  569.                 if (!facingRight)
  570.                 {
  571.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  572.                     facingRight = true;
  573.                     raycastDistance *= -1;
  574.                 }
  575.             }
  576.             //Waypoint is on Right
  577.             else
  578.             {
  579.                 BroadcastMessage ("LeftMove", moveSpeed);
  580.                 character.CrossFade (walkingStyleAnimation);
  581.                 //Flip animation
  582.                 if (facingRight)
  583.                 {
  584.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  585.                     facingRight = false;
  586.                     raycastDistance *= -1;
  587.                 }
  588.             }
  589.         }
  590.         //waiting
  591.         else
  592.         {
  593.         }
  594. //        Debug.DrawRay(transform.position, new Vector3 (raycastDistance, 0, 0), Color.red);
  595.         ifCanSeeTargetByRaycast ();
  596.        
  597.         hasPulledGun = false;
  598.     }
  599.    
  600.     void InteractWithPlayer ()
  601.     {
  602.        
  603.         hasPulledGun = false;
  604.     }
  605.    
  606.     void SeekPlayer ()
  607.     {
  608.         if (alertLevel == 1 ||
  609.             alertLevel == 2)
  610.         {
  611.             myBehaviour = NPCBehaviour.Patrol; 
  612.         }
  613.        
  614.         if (Time.time >= seekingStartingTime + seekWaitingTime)
  615.         {
  616.             //When all three seek position has been walked to
  617.             if (currentSeekOrder >= threeSeekPosition)
  618.             {
  619.                 myBehaviour = tempBehaviour;
  620.                 currentSeekOrder = 0;
  621.             }
  622.        
  623.             //Arrive new Seekpoint
  624.             if (transform.position.x <= seekPositions[currentSeekOrder] + positionGap &&
  625.                 transform.position.x >= seekPositions[currentSeekOrder] - positionGap)
  626.             {
  627.                 seekingStartingTime = Time.time;
  628.                 currentSeekOrder++;
  629.                 BroadcastMessage ("NoMove");
  630.                 character.CrossFade (seekAnimation);
  631.             }  
  632.             //Seekpoint is on left
  633.             else if (transform.position.x <= seekPositions[currentSeekOrder])
  634.             {
  635.                 BroadcastMessage ("RightMove", moveSpeed);
  636.                 character.CrossFade (walkingStyleAnimation);
  637.                 //Flip animation
  638.                 if (!facingRight)
  639.                 {
  640.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  641.                     facingRight = true;
  642.                     raycastDistance *= -1;
  643.                 }
  644.             }
  645.             //Seekpoint is on Right
  646.             else
  647.             {
  648.                 BroadcastMessage ("LeftMove", moveSpeed);
  649.                 character.CrossFade (walkingStyleAnimation);
  650.                 //Flip animation
  651.                 if (facingRight)
  652.                 {
  653.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  654.                     facingRight = false;
  655.                     raycastDistance *= -1;
  656.                 }
  657.             }
  658.         }
  659.        
  660.     }
  661.    
  662.     void AttackPlayer ()
  663.     {
  664.         //Switch moving style
  665.         if (alertLevel == 1 ||
  666.             alertLevel == 2)
  667.         {
  668.             myMovingStyle = NPCMovingStyle.Walk;
  669.         }
  670.         else
  671.         {
  672.             myMovingStyle = NPCMovingStyle.Run;
  673.         }
  674.        
  675.         //If target is in hidezone or blocked by something
  676.         if ((ifTargetInHideZone && distanceToTarget >= alertFadeDistance) ||
  677.             (ifTargetInHideZone && !ifCanSeeTargetByRaycast ()))
  678.         {
  679.             Debug.Log (ifTargetInHideZone + " " + distanceToTarget + " " + alertFadeDistance + " " +
  680.             ifTargetInHideZone + " " + ifCanSeeTargetByRaycast ());
  681.             myBehaviour = NPCBehaviour.SeekPlayer; 
  682.             currentSeekOrder = 0;
  683.             seekingStartingTime = Time.time;
  684.             BroadcastMessage ("NoMove");
  685.             character.CrossFade (seekAnimation);
  686.             if (lastPlayerPosition == 0.001f)
  687.             {
  688.                 lastPlayerPosition = transform.position.x;
  689.             }
  690.             seekPositions[0] = lastPlayerPosition - 0.5f * seekAreaRange;
  691.             seekPositions[1] = lastPlayerPosition + seekAreaRange;
  692.             seekPositions[2] = lastPlayerPosition - seekAreaRange;
  693.         }
  694.        
  695.         //if is in attacking animation
  696.         if (Time.time >= attackStartingTime + attackPeriod)
  697.             isAttacking = false;
  698.        
  699.         //When target is in the attack range!
  700.         if (((mainTarget.transform.position.x >= transform.position.x &&
  701.             mainTarget.transform.position.x <= transform.position.x + attackRange) ||
  702.             (mainTarget.transform.position.x <= transform.position.x &&
  703.             mainTarget.transform.position.x >= transform.position.x - attackRange))
  704.             && !isAttacking)
  705.         {
  706.             if (transform.position.x < mainTarget.transform.position.x &&
  707.                 !facingRight)
  708.             {
  709.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  710.                 facingRight = true;
  711.                 raycastDistance *= -1;                 
  712.             }
  713.             else if (transform.position.x > mainTarget.transform.position.x &&
  714.                     facingRight)
  715.             {
  716.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  717.                 facingRight = false;
  718.                 raycastDistance *= -1;             
  719.             }
  720.             if (Time.time >= attackStartingTime + attackDelay)
  721.             {
  722.                 //Start Attack
  723.                 BroadcastMessage ("NoMove", moveSpeed);
  724.                 character.CrossFade (attackAnimation);
  725.                 attackStartingTime = Time.time;
  726.                 isAttacking = true;
  727.             }
  728.             else
  729.             {
  730.                 character.CrossFade (idleStyleAnimation);  
  731.             }
  732.         }
  733.         else if (mainTarget.transform.position.x > transform.position.x && !isAttacking)
  734.         {
  735.             if (!facingRight)
  736.             {
  737.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  738.                 facingRight = true;
  739.                 raycastDistance *= -1;             
  740.             }
  741.             BroadcastMessage ("RightMove", moveSpeed);
  742.             character.CrossFade (walkingStyleAnimation);
  743.         }
  744.         else if (mainTarget.transform.position.x < transform.position.x && !isAttacking)
  745.         {
  746.             if (facingRight)
  747.             {
  748.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  749.                 facingRight = false;
  750.                 raycastDistance *= -1;
  751.             }
  752.             BroadcastMessage ("LeftMove", moveSpeed);
  753.             character.CrossFade (walkingStyleAnimation);
  754.         }
  755.        
  756.        
  757.     }
  758.    
  759.     void rangeAttackPlayer ()
  760.     {
  761.         //Switch moving style ALERT level 1, 2 (WALK) Alert level 3, 4 (RUN)
  762.         if (alertLevel == 1 ||
  763.             alertLevel == 2)
  764.         {
  765.             myMovingStyle = NPCMovingStyle.Walk;
  766.         }
  767.         else
  768.         {
  769.             myMovingStyle = NPCMovingStyle.Run;
  770.         }
  771.        
  772.         //If target is in hidezone or blocked by something
  773.         if ((ifTargetInHideZone && distanceToTarget >= alertFadeDistance) ||
  774.             (ifTargetInHideZone && !ifCanSeeTargetByRaycast ()))
  775.         {
  776.             Debug.Log (ifTargetInHideZone + " " + distanceToTarget + " " + alertFadeDistance + " " +
  777.             ifTargetInHideZone + " " + ifCanSeeTargetByRaycast ());
  778.             myBehaviour = NPCBehaviour.SeekPlayer; 
  779.             currentSeekOrder = 0;
  780.             seekingStartingTime = Time.time;
  781.             BroadcastMessage ("NoMove");
  782.             character.CrossFade (seekAnimation);
  783.             if (lastPlayerPosition == 0.001f)
  784.             {
  785.                 lastPlayerPosition = transform.position.x;
  786.             }
  787.             seekPositions[0] = lastPlayerPosition - 0.5f * seekAreaRange;
  788.             seekPositions[1] = lastPlayerPosition + seekAreaRange;
  789.             seekPositions[2] = lastPlayerPosition - seekAreaRange;
  790.         }
  791.        
  792.         //if is in attacking animation
  793.         if (Time.time >= attackStartingTime + attackPeriod)
  794.             isAttacking = false;
  795.        
  796.         //When target is in the attack range!
  797.         if (((mainTarget.transform.position.x >= transform.position.x &&
  798.             mainTarget.transform.position.x <= transform.position.x + attackRange) ||
  799.             (mainTarget.transform.position.x <= transform.position.x &&
  800.             mainTarget.transform.position.x >= transform.position.x - attackRange))
  801.             && !isAttacking)
  802.         {
  803.             //facing to target
  804.             if (transform.position.x < mainTarget.transform.position.x &&
  805.                 !facingRight)
  806.             {
  807.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  808.                 facingRight = true;
  809.                 raycastDistance *= -1;                 
  810.             }
  811.             else if (transform.position.x > mainTarget.transform.position.x &&
  812.                     facingRight)
  813.             {
  814.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  815.                 facingRight = false;
  816.                 raycastDistance *= -1;             
  817.             }
  818.             //Check if have the Ranged animation playing
  819.             if (!hasPulledGun)
  820.             {
  821.                 hasPulledGun = true;
  822.                 pullGunStartingTime = Time.time;
  823.             }
  824.            
  825.             //Display the SwitchRanged Animation First
  826.             if (Time.time < pullGunStartingTime + pullGunPeriod)
  827.             {
  828.                 BroadcastMessage ("NoMove", moveSpeed);
  829.                 isAttacking = true;
  830.                 character.CrossFade ("SwitchRanged");
  831.             }
  832.             else if (Time.time >= attackStartingTime + attackDelay)
  833.             {
  834.                 //Start Attack
  835.                 BroadcastMessage ("NoMove", moveSpeed);
  836.                 character.CrossFade (attackAnimation);
  837.                 attackStartingTime = Time.time;
  838.                 isAttacking = true;
  839.                 Transform gunPos = transform.Find ("Root/Main/Abdomen/Chest/RightShoulder/RightArm/RightHand/Weapon/Weapon_Sprite");
  840.                 GameObject instBullet = (GameObject) Instantiate (bullet, gunPos.position, bullet.transform.rotation);
  841.                 Vector2 speed = new Vector2 (mainTarget.transform.position.x - gunPos.position.x,
  842.                                             mainTarget.transform.position.y - gunPos.position.y);
  843.                 speed.Normalize ();
  844.                 Vector2 origin = new Vector2 (1, 0);
  845.                 Vector2 newDir = new Vector2 (mainTarget.transform.position.x - gunPos.position.x,
  846.                                                 mainTarget.transform.position.y - gunPos.position.y);
  847.                 float degree = Vector2.Angle (origin, newDir);
  848.                 Debug.Log ("Tell " + degree + " " + origin + " " + newDir);
  849.                 instBullet.rigidbody.velocity = speed * bulletVelocity;
  850.                 if (gunPos.position.x < mainTarget.transform.position.x)
  851.                 {
  852.                     instBullet.transform.Rotate (new Vector3 (degree, 0, 0));
  853.                 }
  854.                 else
  855.                 {
  856.                     instBullet.transform.Rotate (new Vector3 (degree, 0, 0));  
  857.                 }
  858.             }
  859.             else
  860.             {
  861.                 character.CrossFade ("RangedIDLE");
  862.             }
  863.         }
  864.         else if (mainTarget.transform.position.x > transform.position.x && !isAttacking)
  865.         {
  866.             if (!facingRight)
  867.             {
  868.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  869.                 facingRight = true;
  870.                 raycastDistance *= -1;             
  871.             }
  872.             BroadcastMessage ("RightMove", moveSpeed);
  873.             character.CrossFade (walkingStyleAnimation);
  874.         }
  875.         else if (mainTarget.transform.position.x < transform.position.x && !isAttacking)
  876.         {
  877.             if (facingRight)
  878.             {
  879.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  880.                 facingRight = false;
  881.                 raycastDistance *= -1;
  882.             }
  883.             BroadcastMessage ("LeftMove", moveSpeed);
  884.             character.CrossFade (walkingStyleAnimation);
  885.         }
  886.        
  887.     }
  888.    
  889.     void Shocked ()
  890.     {
  891.         BroadcastMessage ("NoMove", moveSpeed);
  892.         character.CrossFade (alertAnimation);  
  893.     }
  894.    
  895.     void AlertHit ()
  896.     {
  897.        
  898.         //if is in attacking animation
  899.         if (Time.time >= attackStartingTime + attackPeriod)
  900.             isAttacking = false;
  901.        
  902.         //Going to attack
  903.         if (!alertHitted)
  904.         {
  905.             //When target is in the attack range!
  906.             if ((mainTarget.transform.position.x >= transform.position.x &&
  907.                 mainTarget.transform.position.x <= transform.position.x + attackRange) ||
  908.                 (mainTarget.transform.position.x <= transform.position.x &&
  909.                 mainTarget.transform.position.x >= transform.position.x - attackRange))
  910.             {
  911.                 //Start Attack
  912.                 BroadcastMessage ("NoMove", moveSpeed);
  913.                 character.CrossFade (attackAnimation);
  914.                 alertHitted = true;
  915.                 attackStartingTime = Time.time;
  916.                 isAttacking = true;
  917.             }
  918.             else if (mainTarget.transform.position.x > transform.position.x)
  919.             {
  920.                 if (!facingRight)
  921.                 {
  922.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  923.                     facingRight = true;
  924.                     raycastDistance *= -1;             
  925.                 }
  926.                 BroadcastMessage ("RightMove", moveSpeed);
  927.                 character.CrossFade (walkingStyleAnimation);
  928.             }
  929.             else if (mainTarget.transform.position.x < transform.position.x)
  930.             {
  931.                 if (facingRight)
  932.                 {
  933.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  934.                     facingRight = false;
  935.                     raycastDistance *= -1;
  936.                 }
  937.                 BroadcastMessage ("LeftMove", moveSpeed);
  938.                 character.CrossFade (walkingStyleAnimation);
  939.             }      
  940.         }
  941.         //On the way back
  942.         else
  943.         {
  944.             Debug.Log ("WayBack");
  945.             //When back to position
  946.             if ((previousAlertLocation >= transform.position.x &&
  947.                 previousAlertLocation <= transform.position.x + 5) ||
  948.                 (previousAlertLocation <= transform.position.x &&
  949.                 previousAlertLocation >= transform.position.x - 5))
  950.             {
  951.                 Debug.Log ("AllDone " + myBehaviour + previousBehaviour);
  952.                 BroadcastMessage ("NoMove", moveSpeed);
  953.                 character.CrossFade (idleStyleAnimation);
  954.                 alertHitted = false;
  955.                 myBehaviour = previousBehaviour;
  956.                 decreaseAggressive ();
  957.             }
  958.             else if (previousAlertLocation > transform.position.x)
  959.             {
  960.                 if (!facingRight)
  961.                 {
  962.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  963.                     facingRight = true;
  964.                     raycastDistance *= -1;             
  965.                 }
  966.                 BroadcastMessage ("RightMove", moveSpeed);
  967.                 character.CrossFade (walkingStyleAnimation);
  968.             }
  969.             else if (previousAlertLocation < transform.position.x)
  970.             {
  971.                 if (facingRight)
  972.                 {
  973.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  974.                     facingRight = false;
  975.                     raycastDistance *= -1;
  976.                 }
  977.                 BroadcastMessage ("LeftMove", moveSpeed);
  978.                 character.CrossFade (walkingStyleAnimation);
  979.             }
  980.         }
  981.     }
  982.    
  983.     void alertPatrol ()
  984.     {
  985.         //On the way going to patrol the point
  986.         if (!alertPatrolled)
  987.         {
  988.             //When in the alert position
  989.             if ((targetPreviousPosition >= transform.position.x &&
  990.                 targetPreviousPosition <= transform.position.x + 5) ||
  991.                 (targetPreviousPosition <= transform.position.x &&
  992.                 targetPreviousPosition >= transform.position.x - 5))
  993.             {
  994.                 //Start Attack
  995.                 BroadcastMessage ("NoMove", moveSpeed);
  996.                 alertPatrolled = true;
  997.                 myBehaviour = NPCBehaviour.SeekPlayer;
  998.                 currentSeekOrder = 0;
  999.                 seekingStartingTime = Time.time;
  1000.                 character.CrossFade (idleStyleAnimation);
  1001.                 if (lastPlayerPosition == 0.001f)
  1002.                 {
  1003.                     lastPlayerPosition = transform.position.x;
  1004.                 }
  1005.                 seekPositions[0] = lastPlayerPosition - 0.5f * seekAreaRange;
  1006.                 seekPositions[1] = lastPlayerPosition + seekAreaRange;
  1007.                 seekPositions[2] = lastPlayerPosition - seekAreaRange;
  1008.            
  1009.             }
  1010.             else if (targetPreviousPosition > transform.position.x)
  1011.             {
  1012.                 if (!facingRight)
  1013.                 {
  1014.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  1015.                     facingRight = true;
  1016.                     raycastDistance *= -1;             
  1017.                 }
  1018.                 BroadcastMessage ("RightMove", moveSpeed);
  1019.                 character.CrossFade (walkingStyleAnimation);
  1020.             }
  1021.             else if (targetPreviousPosition < transform.position.x)
  1022.             {
  1023.                 if (facingRight)
  1024.                 {
  1025.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  1026.                     facingRight = false;
  1027.                     raycastDistance *= -1;
  1028.                 }
  1029.                 BroadcastMessage ("LeftMove", moveSpeed);
  1030.                 character.CrossFade (walkingStyleAnimation);
  1031.             }              
  1032.         }
  1033.         else
  1034.         {
  1035.             //When back to position
  1036.             if ((previousAlertLocation >= transform.position.x &&
  1037.                 previousAlertLocation <= transform.position.x + 5) ||
  1038.                 (previousAlertLocation <= transform.position.x &&
  1039.                 previousAlertLocation >= transform.position.x - 5))
  1040.             {
  1041.                 BroadcastMessage ("NoMove", moveSpeed);
  1042.                 character.CrossFade (idleStyleAnimation);
  1043.                 alertPatrolled = false;
  1044.                 myBehaviour = previousBehaviour;
  1045.             }
  1046.             else if (previousAlertLocation > transform.position.x)
  1047.             {
  1048.                 if (!facingRight)
  1049.                 {
  1050.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  1051.                     facingRight = true;
  1052.                     raycastDistance *= -1;             
  1053.                 }
  1054.                 BroadcastMessage ("RightMove", moveSpeed);
  1055.                 character.CrossFade (walkingStyleAnimation);
  1056.             }
  1057.             else if (previousAlertLocation < transform.position.x)
  1058.             {
  1059.                 if (facingRight)
  1060.                 {
  1061.                     transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  1062.                     facingRight = false;
  1063.                     raycastDistance *= -1;
  1064.                 }
  1065.                 BroadcastMessage ("LeftMove", moveSpeed);
  1066.                 character.CrossFade (walkingStyleAnimation);
  1067.             }
  1068.         }
  1069.     }
  1070.    
  1071.     bool ifCanSeeTargetByRaycast ()
  1072.     {
  1073.         RaycastHit hitOne;
  1074.         RaycastHit hitTwo;
  1075.         RaycastHit hitThree;
  1076.         RaycastHit hitFour;
  1077.         RaycastHit hitFive;
  1078.         RaycastHit hitSix;
  1079.         RaycastHit hitSeven;
  1080.        
  1081.         int layermask = 1 << 8;
  1082.        
  1083.         bool detectedPlayerOne = false;
  1084.         bool detectedPlayerTwo = false;
  1085.         bool detectedPlayerThree = false;
  1086.         bool detectedPlayerFour = false;
  1087.         bool detectedPlayerFive = false;
  1088.         bool detectedPlayerSix = false;
  1089.         bool detectedPlayerSeven = false;
  1090.        
  1091. //      Test
  1092. //      Debug.Log (raycastHeightOne + " " + new Vector3 (raycastDistance, 0, 0));
  1093. //     
  1094. //      Debug.DrawRay(transform.position, new Vector3 (raycastDistance, 0, 0), Color.green);
  1095. //      Debug.DrawRay(raycastHeightOne, new Vector3 (raycastDistance, 0, 0), Color.red);
  1096. //      Debug.DrawRay(raycastHeightTwo, new Vector3 (raycastDistance, 0, 0), Color.blue);
  1097.        
  1098.         if (Physics.Raycast(transform.position, new Vector3 (raycastDistance, 0, 0), out hitOne, Mathf.Infinity, layermask))
  1099.         {
  1100. //          Debug.DrawLine(transform.position, hitOne.point);
  1101. //          Debug.Log ("One " + hitOne.collider.name + " " + hitOne.collider.gameObject.layer);
  1102.             detectedPlayerOne = true;
  1103.         }
  1104.        
  1105.         if (Physics.Raycast(raycastHeightOne, new Vector3 (raycastDistance, 0, 0), out hitTwo, Mathf.Infinity, layermask))
  1106.         {
  1107. //          Debug.DrawLine(raycastHeightOne, hitTwo.point);
  1108. //          Debug.Log ("Two " + hitTwo.collider.name + " " + hitTwo.collider.gameObject.layer);
  1109.             detectedPlayerTwo = true;
  1110.         }
  1111.        
  1112.         if (Physics.Raycast(raycastHeightTwo, new Vector3 (raycastDistance, 0, 0), out hitThree, Mathf.Infinity, layermask))
  1113.         {
  1114. //          Debug.DrawLine(raycastHeightTwo, hitThree.point);
  1115. //          Debug.Log ("Three " + hitThree.collider.name + " " + hitThree.collider.gameObject.layer);
  1116.             detectedPlayerThree = true;
  1117.         }
  1118.        
  1119.         if (Physics.Raycast(raycastHeightThree, new Vector3 (raycastDistance, 0, 0), out hitFour, Mathf.Infinity, layermask))
  1120.         {
  1121. //          Debug.DrawLine(raycastHeightThree, hitFour.point);
  1122. //          Debug.Log ("One " + hitFour.collider.name);
  1123.             detectedPlayerFour = true;
  1124.         }
  1125.        
  1126.         if (Physics.Raycast(raycastHeightFour, new Vector3 (raycastDistance, 0, 0), out hitFive, Mathf.Infinity, layermask))
  1127.         {
  1128. //          Debug.DrawLine(raycastHeightFour, hitFive.point);
  1129. //          Debug.Log ("Two " + hitFive.collider.name);
  1130.             detectedPlayerFive = true;
  1131.         }
  1132.        
  1133.         if (Physics.Raycast(raycastHeightFive, new Vector3 (raycastDistance, 0, 0), out hitSix, Mathf.Infinity, layermask))
  1134.         {
  1135. //          Debug.DrawLine(raycastHeightFive, hitSix.point);
  1136. //          Debug.Log ("Three " + hitSix.collider.name);
  1137.             detectedPlayerSix = true;
  1138.         }
  1139.        
  1140.         if (Physics.Raycast(raycastHeightSix, new Vector3 (raycastDistance, 0, 0), out hitSeven, Mathf.Infinity, layermask))
  1141.         {
  1142. //          Debug.DrawLine(raycastHeightSix, hitSeven.point);
  1143. //          Debug.Log ("Three " + hitSeven.collider.name);
  1144.             detectedPlayerSeven = true;
  1145.         }
  1146.        
  1147.         if (detectedPlayerOne ||
  1148.             detectedPlayerTwo ||
  1149.             detectedPlayerThree ||
  1150.             detectedPlayerFour ||
  1151.             detectedPlayerFive ||
  1152.             detectedPlayerSix ||
  1153.             detectedPlayerSeven)
  1154.         {
  1155.             return true;   
  1156.         }
  1157.        
  1158.         return false;
  1159.     }
  1160.    
  1161.     public void HearPlayer (float targetPosition)
  1162.     {
  1163.         if (alertLevel == 1)
  1164.         {
  1165.             if (stateLevel == 1)
  1166.             {
  1167.                 increaseAggressive ();
  1168.                 //Facing to Player
  1169.                 FaceTarget ();
  1170.                 alertLevelTwoFadeActivation = true;
  1171.                 alertLevelTwoFadeStartingTime = Time.time;
  1172.                 previousBehaviour = myBehaviour;
  1173.                 myBehaviour = NPCBehaviour.Shocked;
  1174.             }
  1175.             else if (stateLevel == 2)
  1176.             {
  1177.                
  1178.                 Debug.Log ("InSecond Stage");
  1179.                 if (myBehaviour != NPCBehaviour.AlertHit)
  1180.                 {
  1181.                     alertLevelTwoFadeActivation = false;
  1182.                     alertLevelTwoFadeStartingTime = -999;
  1183.                     previousAlertLocation = transform.position.x;
  1184.                     alertHitted = false;
  1185.     //              previousBehaviour = myBehaviour;
  1186.                     myBehaviour = NPCBehaviour.AlertHit;
  1187.                 }
  1188.             }
  1189.             else
  1190.             {
  1191.                 Debug.Log ("AlertHit Bug?");   
  1192.             }
  1193.         }
  1194.         else if (alertLevel == 3)
  1195.         {
  1196.             if (myBehaviour != NPCBehaviour.AlertPatrol &&
  1197.                 myBehaviour != NPCBehaviour.AttackPlayer)
  1198.             {
  1199.                 FaceTarget ();
  1200.                 previousBehaviour = myBehaviour;
  1201.                 previousAlertLocation = transform.position.x;
  1202.                 targetPreviousPosition = targetPosition;
  1203.                 myBehaviour = NPCBehaviour.AlertPatrol;
  1204.             }
  1205.         }
  1206.         else if (alertLevel == 4)
  1207.         {
  1208.             if (myBehaviour != NPCBehaviour.AlertPatrol &&
  1209.                 myBehaviour != NPCBehaviour.AttackPlayer)
  1210.             {
  1211.                 FaceTarget ();
  1212.                 previousBehaviour = myBehaviour;
  1213.                 previousAlertLocation = transform.position.x;
  1214.                 targetPreviousPosition = targetPosition;
  1215.                 myBehaviour = NPCBehaviour.AlertPatrol;
  1216.             }
  1217.         }
  1218.         else if (alertLevel == 5)
  1219.         {
  1220.             if (myBehaviour != NPCBehaviour.AlertPatrol &&
  1221.                 myBehaviour != NPCBehaviour.AttackPlayer)
  1222.             {
  1223.                 FaceTarget ();
  1224.                 previousBehaviour = myBehaviour;
  1225.                 previousAlertLocation = transform.position.x;
  1226.                 targetPreviousPosition = targetPosition;
  1227.                 myBehaviour = NPCBehaviour.AlertPatrol;
  1228.             }
  1229.         }
  1230.     }
  1231.    
  1232.     public void FaceTarget ()
  1233.     {
  1234.         if (facingRight)
  1235.         {
  1236.             if (mainTarget.transform.position.x < transform.position.x)
  1237.             {
  1238.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  1239.                 facingRight = false;
  1240.                 raycastDistance *= -1;
  1241.             }
  1242.         }
  1243.         else
  1244.         {
  1245.             if (mainTarget.transform.position.x > transform.position.x)
  1246.             {
  1247.                 transform.localScale = new Vector3(-1 * transform.localScale.x, 1 * transform.localScale.y, 1 * transform.localScale.z);
  1248.                 facingRight = true;
  1249.                 raycastDistance *= -1; 
  1250.             }
  1251.         }      
  1252.     }
  1253.    
  1254.     public void increaseAggressive ()
  1255.     {
  1256.         if (stateLevel < 4)
  1257.             stateLevel ++;
  1258.     }
  1259.    
  1260.     public void decreaseAggressive ()
  1261.     {
  1262.         if (stateLevel > 0)
  1263.             stateLevel --;
  1264.     }
  1265.  
  1266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement