Advertisement
Guest User

Untitled

a guest
Feb 11th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 15.62 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5.  
  6. [AddComponentMenu("Scripts/Control/Player Controller")]
  7. public class SpaceshipAI : Controller
  8. {
  9.     // Distanz, die er zum Target einnimmt, vermeidet Collission
  10.     public float magnitudeDistance;
  11.     public float maxSpeed;
  12.     public Vector3 target;
  13.     public float rotationSpeed;
  14.     public float attackRange = 200;
  15.     public float normalRaycastLength;
  16.     public float attackRaycastLength;
  17.     public float secondaryFireRate;
  18.     public float dogFightSearchTime = 1;
  19.     public string enemyTagName;
  20.     public float enemySearchDistance;
  21.     public int primaryFireSalve;
  22.     public float primaryFireRate;
  23.  
  24.  
  25.     public float evadeDistance;
  26.     public float wingSpan;
  27.  
  28.     // Speed Variables, maxSpeed is used for the actual velocity,
  29.     // normalSpeed and attackSpeed defines the new targetSpeed in each state (without boost)
  30.     // targetSpeed = normalSpeed; || targetSpeed = attackSpeed;
  31.     public float normalSpeed;
  32.     public float attackSpeed;
  33.     private float targetSpeed;
  34.  
  35.     // Factor in which the spaceship accelerates from the current maxSpeed to the targetSpeed
  36.     public float accelerationFactor;
  37.  
  38.     private int closest_i;
  39.     private Vector3 storeTarget;
  40.     private Vector3 newTargetPos;
  41.     private Transform obstaclePos;
  42.     private Vector3 accelerationDir;
  43.     private Vector3 velocity;
  44.     private Rigidbody rigidBody;
  45.     private bool savePos;
  46.     private bool overrideTarget;
  47.     private float raycastLength;
  48.     private LayerMask ignoreLayer;
  49.     private float secondaryFireTimer;
  50.     private DamageCalc healthPoints;
  51.     private bool b_dogFight;
  52.     private float dogFightTimer;
  53.     private DamageCalc enemyHealth;
  54.     private GameObject dogFight;
  55.     private float primaryFireTimer;
  56.     private bool activatePrimaryFire;
  57.     private int primaryFireSalveCount;
  58.     private bool ignoreEnemy;
  59.     private bool isEvading;
  60.  
  61.  
  62.     private float timer;
  63.  
  64.     public WeaponSystem weaponSystem = null;
  65.  
  66.     protected override void Initialise()
  67.     {
  68.     }
  69.     public override void FetchInput()
  70.     {
  71.     }
  72.     public enum AIStates
  73.     {
  74.         AI_normal,
  75.         AI_attack
  76.     }
  77.  
  78.     public AIStates aiState;
  79.  
  80.     public List<Vector3> EscapeDirections = new List<Vector3>();
  81.  
  82.     // Use this for initialization
  83.     void Start ()
  84.     {
  85.         rigidBody = GetComponent<Rigidbody>();
  86.         savePos = false;
  87.  
  88.         target = GameObject.FindGameObjectWithTag("Target").transform.position;
  89.         storeTarget = target;
  90.  
  91.         secondaryFireTimer = secondaryFireRate;
  92.         activatePrimaryFire = true;
  93.         b_dogFight = false;
  94.  
  95.     }
  96.    
  97.  
  98.  
  99.     // Update is called once per frame
  100.     void FixedUpdate ()
  101.     {
  102.         // Assign new Target
  103.  
  104.         //Debug.DrawLine(transform.position, target.position);
  105.         ManageSpeed();
  106.  
  107.         /**************************************************************************************************************/
  108.         /////////////////
  109.         // Statechange //
  110.         /////////////////
  111.  
  112.         switch (aiState)
  113.         {
  114.             case AIStates.AI_normal:
  115.                 raycastLength = normalRaycastLength;
  116.                 targetSpeed = normalSpeed;
  117.                 break;
  118.  
  119.             case AIStates.AI_attack:
  120.                 raycastLength = attackRaycastLength;
  121.                 targetSpeed = attackSpeed;
  122.                 break;
  123.         }
  124.  
  125.         /**************************************************************************************************************/
  126.  
  127.         /**************************************************************************************************************/
  128.         //////////////////
  129.         // Search Enemy //
  130.         //////////////////
  131.  
  132.         if (b_dogFight == false)
  133.         {
  134.             dogFightTimer += Time.deltaTime;
  135.  
  136.             // Enemy Searcher, if one enemy is in his radius, he'll change his target
  137.  
  138.             if (dogFightTimer > dogFightSearchTime)
  139.             {
  140.                 target = storeTarget;
  141.  
  142.                 if (isEvading == false)
  143.                 {
  144.                     if (dogFight == null)
  145.                     {
  146.                         dogFight = dogFightSearch();
  147.                         Debug.Log("fightsearch ausgeführt");
  148.  
  149.                         if (dogFight != null)
  150.                         {
  151.  
  152.                             if (Physics.Linecast(transform.position, dogFight.transform.position))
  153.                             {
  154.                                 if (dogFight.transform.gameObject.CompareTag("Enemy"))
  155.                                 {
  156.                                     target = dogFight.transform.position;
  157.                                     enemyHealth = dogFight.transform.GetComponent<DamageCalc>();
  158.                                     b_dogFight = true;
  159.                                 }
  160.                             }
  161.                         }
  162.                     }
  163.                 }
  164.  
  165.                 dogFightTimer = 0;
  166.             }
  167.         }
  168.  
  169.         else
  170.         {
  171.             // Switch to old target, when enemy is dead
  172.             if (enemyHealth == null)
  173.             {
  174.                 target = storeTarget;
  175.                 b_dogFight = false;
  176.                 dogFight = null;
  177.                 Debug.Log("enemydestroy");
  178.             }
  179.  
  180.             // Follow enemy
  181.             else
  182.             {
  183.                 if (dogFight != null)
  184.                 {
  185.                     target = dogFight.transform.position;
  186.                 }
  187.             }
  188.         }
  189.  
  190.         /**************************************************************************************************************/
  191.  
  192.  
  193.         Debug.DrawRay(transform.position + new Vector3(0.5f, 0, 0), transform.forward * 200, Color.blue);
  194.         Debug.DrawRay(transform.position - new Vector3(0.5f, 0, 0), transform.forward * 200, Color.red);
  195.  
  196.         // Attacking
  197.  
  198.  
  199.         RaycastHit attackRay;
  200.  
  201.         if (Physics.Raycast(transform.position, transform.forward, out attackRay, attackRange))
  202.         {
  203.             if (attackRay.transform.CompareTag("Enemy"))
  204.             {
  205.                 ignoreEnemy = true;
  206.             }
  207.  
  208.             else
  209.             {
  210.                 ignoreEnemy = false;
  211.             }
  212.  
  213.             if (attackRay.transform.GetComponent<DamageCalc>() != null)
  214.             {
  215.  
  216.                 secondaryFireTimer += Time.deltaTime;
  217.                 primaryFireTimer += Time.deltaTime;
  218.  
  219.                 if (secondaryFireRate < secondaryFireTimer)
  220.                 {
  221.                     if (attackRay.transform.CompareTag("Target") || attackRay.transform.CompareTag(enemyTagName))
  222.                     {
  223.                         weaponSystem.FireSecondaryWeapon();
  224.                         secondaryFireTimer = 0;
  225.  
  226.                         Debug.Log("Missile pew.");
  227.                     }
  228.                 }
  229.  
  230.                 // Fire the primary weapon in a salve
  231.                 if (primaryFireRate < primaryFireTimer && activatePrimaryFire)
  232.                 {
  233.                     weaponSystem.FirePrimaryWeapon();
  234.                     primaryFireSalveCount++;
  235.                     primaryFireTimer = 0;
  236.  
  237.                     if (primaryFireSalveCount == primaryFireSalve)
  238.                     {
  239.                         activatePrimaryFire = false;
  240.                     }
  241.                 }
  242.  
  243.                 // Pause between the salves
  244.                 if (primaryFireTimer > 1 && activatePrimaryFire == false && primaryFireSalveCount == primaryFireSalve)
  245.                 {
  246.                     activatePrimaryFire = true;
  247.                     primaryFireTimer = 0;
  248.                     primaryFireSalveCount = 0;
  249.                 }
  250.  
  251.             }
  252.         }
  253.  
  254.         /**************************************************************************************************************/
  255.         //////////////
  256.         // Movement //
  257.         //////////////
  258.  
  259.         Vector3 forces = MoveTowardsTarget(target);
  260.  
  261.         accelerationDir = forces;
  262.  
  263.         if (accelerationDir != Vector3.zero)
  264.         {
  265.             velocity += rotationSpeed * accelerationDir * Time.deltaTime;
  266.  
  267.  
  268.             if (velocity.magnitude > maxSpeed)
  269.             {
  270.                 velocity = velocity.normalized * maxSpeed;
  271.             }
  272.         }
  273.  
  274.             rigidBody.velocity = velocity;
  275.        
  276.  
  277.         Quaternion desiredRotation = Quaternion.LookRotation(velocity);
  278.         transform.rotation = Quaternion.Slerp(transform.rotation, desiredRotation, Time.deltaTime * 5);
  279.  
  280.         /**************************************************************************************************************/
  281.  
  282.         timer += Time.deltaTime;
  283.  
  284.  
  285.  
  286.         // Looks for Obstacles
  287.         if (timer < 0.5f)
  288.         {
  289.             //    if (!ignoreEnemy)
  290.             //    {
  291.             ObstacleAvoidance(velocity, 0);
  292.  
  293.             if (overrideTarget)
  294.             {
  295.                 target = newTargetPos;
  296.                 isEvading = true;
  297.             }
  298.  
  299.             timer = 0;
  300.             //  }
  301.  
  302.         }
  303.     }
  304.  
  305.     Vector3 MoveTowardsTarget (Vector3 _target)
  306.     {
  307.         Vector3 distance = _target - transform.position;
  308.  
  309.         if (distance.magnitude < magnitudeDistance)
  310.         {
  311.             return distance.normalized * -maxSpeed;
  312.         }
  313.  
  314.         else
  315.         {
  316.             return distance.normalized * maxSpeed;
  317.         }
  318.     }
  319.  
  320.     void ObstacleAvoidance(Vector3 direction, float offsetX)
  321.     {
  322.        RaycastHit hit =  Rays(direction, offsetX);
  323.  
  324.         if (hit.transform != null && hit.transform.gameObject != this.gameObject)
  325.         {
  326.             if(!savePos && dogFight == null)
  327.             {
  328.                 storeTarget = target;
  329.                 savePos = true;
  330.             }
  331.          
  332.  
  333.             FindEscapeDirections(hit.collider);
  334.         }
  335.  
  336.         if (EscapeDirections.Count > 0)
  337.         {
  338.             if (!overrideTarget)
  339.             {
  340.                 newTargetPos = getClosests();
  341.                 overrideTarget = true;
  342.             }
  343.         }
  344.  
  345.  
  346.             float distance = Vector3.Distance(transform.position, target);
  347.  
  348.             if (distance < wingSpan)
  349.             {
  350.                 if (savePos)
  351.                 {
  352.                     target = storeTarget;
  353.                     savePos = false;
  354.                 }
  355.  
  356.                 isEvading = false;
  357.  
  358.                 overrideTarget = false;
  359.  
  360.                 EscapeDirections.Clear();
  361.             }
  362.  
  363.     }
  364.  
  365.     Vector3 getClosests()
  366.     {
  367.         Vector3 clos = EscapeDirections[0];
  368.         float distance = Vector3.Distance(transform.position, EscapeDirections[0]);
  369.  
  370.         // Calculates the shortest distance
  371.         for (int i = 0; i < EscapeDirections.Count; i++)
  372.         {
  373.             float tempDistance = Vector3.Distance(transform.position, EscapeDirections[i]);
  374.             //Debug.DrawRay(transform.position , -(transform.position + EscapeDirections[i]) * tempDistance, Color.red, 100);
  375.  
  376.             if (!Physics.Linecast(transform.position, EscapeDirections[i]))
  377.             {
  378.                 if (tempDistance < distance)
  379.                 {
  380.                     distance = tempDistance;
  381.                     clos = EscapeDirections[i];
  382.                 }
  383.             }
  384.         }
  385.  
  386.  
  387.         return clos;
  388.     }
  389.  
  390.     void FindEscapeDirections(Collider col)
  391.     {
  392.         // Hitting up
  393.         RaycastHit hitUp;
  394.  
  395.         if (Physics.Raycast(col.transform.position, Vector3.up, out hitUp, col.bounds.extents.y + evadeDistance + wingSpan))
  396.         { }
  397.  
  398.         else
  399.         {
  400.             Vector3 dir = col.transform.position + new Vector3(0, (col.bounds.extents.y + evadeDistance + wingSpan), 0);
  401.  
  402.             if (!EscapeDirections.Contains(dir))
  403.             {
  404.                 EscapeDirections.Add(dir);
  405.             }
  406.         }
  407.  
  408.  
  409.         // Hitting down
  410.         RaycastHit hitDown;
  411.  
  412.         if (Physics.Raycast(col.transform.position, Vector3.down, out hitDown, col.bounds.extents.y + evadeDistance + wingSpan))
  413.         { }
  414.  
  415.         else
  416.         {
  417.             Vector3 dir = col.transform.position + new Vector3(0, -(col.bounds.extents.y + evadeDistance + wingSpan), 0);
  418.  
  419.             if (!EscapeDirections.Contains(dir))
  420.             {
  421.                 EscapeDirections.Add(dir);
  422.             }
  423.         }
  424.  
  425.         // Hitting right
  426.         RaycastHit hitRight;
  427.  
  428.         if (Physics.Raycast(col.transform.position, Vector3.right, out hitRight, col.bounds.extents.x + evadeDistance + wingSpan))
  429.         { }
  430.  
  431.         else
  432.         {
  433.             Vector3 dir = col.transform.position + new Vector3((col.bounds.extents.x + evadeDistance + wingSpan), 0, 0);
  434.  
  435.             if (!EscapeDirections.Contains(dir))
  436.             {
  437.                 EscapeDirections.Add(dir);
  438.             }
  439.         }
  440.  
  441.         // Hitting left
  442.         RaycastHit hitLeft;
  443.  
  444.         if (Physics.Raycast(col.transform.position, Vector3.left, out hitLeft, col.bounds.extents.x + evadeDistance + wingSpan))
  445.         { }
  446.  
  447.         else
  448.         {
  449.             Vector3 dir = col.transform.position + new Vector3(-(col.bounds.extents.x + evadeDistance + wingSpan), 0, 0);
  450.  
  451.             if (!EscapeDirections.Contains(dir))
  452.             {
  453.                 EscapeDirections.Add(dir);
  454.             }
  455.         }
  456.  
  457.         //// Hitting forward
  458.         //RaycastHit hitForward;
  459.  
  460.         //if (Physics.Raycast(col.transform.position, Vector3.forward, out hitForward, col.bounds.extents.x + evadeDistance + wingSpan))
  461.         //{ }
  462.  
  463.         //else
  464.         //{
  465.         //    Vector3 dir = col.transform.position + new Vector3((col.bounds.extents.x + evadeDistance + wingSpan), 0, 0);
  466.  
  467.         //    if (!EscapeDirections.Contains(dir))
  468.         //    {
  469.         //        EscapeDirections.Add(dir);
  470.         //    }
  471.         //}
  472.  
  473.         //// Hitting backward
  474.         //RaycastHit hitBackward;
  475.  
  476.         //if (Physics.Raycast(col.transform.position, Vector3.back, out hitBackward, col.bounds.extents.x + evadeDistance + wingSpan))
  477.         //{ }
  478.  
  479.         //else
  480.         //{
  481.         //    Vector3 dir = col.transform.position + new Vector3(-(col.bounds.extents.x + evadeDistance + wingSpan), 0, 0);
  482.  
  483.         //    if (!EscapeDirections.Contains(dir))
  484.         //    {
  485.         //        EscapeDirections.Add(dir);
  486.         //    }
  487.         //}
  488.     }
  489.  
  490.  
  491.     RaycastHit Rays(Vector3 direction, float offsetX)
  492.     {
  493.         Ray ray = new Ray(transform.position + new Vector3(offsetX, 0, 0), direction);
  494.         RaycastHit rayHit;
  495.         Physics.Raycast(ray, out rayHit, maxSpeed * raycastLength);
  496.  
  497.         return rayHit;
  498.     }
  499.  
  500.     void ManageSpeed()
  501.     {
  502.         maxSpeed = Mathf.MoveTowards(maxSpeed, targetSpeed, Time.deltaTime * accelerationFactor);
  503.     }
  504.  
  505.     GameObject dogFightSearch()
  506.     {
  507.        GameObject dogfightEnemy = null;
  508.  
  509.         if (b_dogFight == false)
  510.         {
  511.             GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyTagName);
  512.             float closestDistance = Mathf.Infinity;
  513.  
  514.             foreach (GameObject enemy in enemies)
  515.             {              
  516.                 float enemyDistance = Vector3.Distance(enemy.transform.position, transform.position);
  517.  
  518.                 if (enemyDistance <= enemySearchDistance)
  519.                 {
  520.                     if (Vector3.Angle(transform.position, enemy.transform.position) < 5)
  521.                     {
  522.                         if (enemyDistance < closestDistance)
  523.                         {
  524.                             dogfightEnemy = enemy;
  525.                             closestDistance = enemyDistance;
  526.  
  527.                         }
  528.                     }
  529.                 }
  530.  
  531.             }
  532.         }
  533.  
  534.  
  535.         return dogfightEnemy;
  536.  
  537.     }
  538.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement