Advertisement
EagleOwle

ModulGunController

May 14th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.64 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class ModulGunController : ModulBasys
  5. {
  6.     private ModulGunControllerConfig modulConfig;
  7.  
  8.     //[SerializeField]
  9.     //Transform gunTransform;
  10.  
  11.     [Header("Ось вращения")]
  12.     [SerializeField]
  13.     rotateAxis rotationAxis;
  14.  
  15.     [Header("Обьекты вращения")]
  16.     [Tooltip("Обьект вращения по оси Х")]
  17.     public Transform transformRotationX;
  18.     [Tooltip("Обьект вращения по оси Y")]
  19.     public Transform transformRotationY;
  20.  
  21.     private float tempAngle = 0;
  22.     private Vector3 gunTarget;
  23.     private float oldRotationY;
  24.  
  25.     public override UsedEnergy NextUsedEnergy
  26.     {
  27.         get { return currentUsedEnergy; }
  28.         set
  29.         {
  30.             currentUsedEnergy = value;
  31.  
  32.             switch (value)
  33.             {
  34.  
  35.                 case UsedEnergy.Default:
  36.                     {
  37.                         eRQ_Current = modulConfig.eRQ_Default;
  38.                         break;
  39.                     }
  40.  
  41.                 case UsedEnergy.Armore:
  42.                     {
  43.                         eRQ_Current = modulConfig.eRQ_Armore;
  44.                         break;
  45.                     }
  46.  
  47.                 case UsedEnergy.Speed:
  48.                     {
  49.                         eRQ_Current = modulConfig.eRQ_Speed;
  50.                         break;
  51.                     }
  52.  
  53.                 case UsedEnergy.Weapon:
  54.                     {
  55.                         eRQ_Current = modulConfig.eRQ_Weapon;
  56.                         break;
  57.                     }
  58.  
  59.                 case UsedEnergy.Custom:
  60.                     {
  61.                         eRQ_Current = modulConfig.eRQ_Custom;
  62.                         break;
  63.                     }
  64.  
  65.                 case UsedEnergy.None:
  66.                     {
  67.                         eRQ_Current = 0;
  68.                         break;
  69.                     }
  70.             }
  71.         }
  72.     }
  73.  
  74.     protected override float EnergyPower
  75.     {
  76.         get { return energyPower; }
  77.  
  78.         set
  79.         {
  80.             energyPower = Mathf.Clamp(value, 0, modulConfig.maxUsedEnergy);
  81.         }
  82.     }
  83.  
  84.     //Через данный метод назначаем новый конфиг модулю
  85.     public override void SetNewModul(int value, ModulType type)
  86.     {
  87.         ListModulConfig config = Resources.Load("Config/ModulConfig") as ListModulConfig;
  88.         modulConfig = config.GetGunControllerConfig(type, value);
  89.         InstanceNewModul(modulConfig);
  90.     }
  91.  
  92.     protected override void InstanceNewModul(ModulBasysConfig modulConfig)
  93.     {
  94.         //Создаем обьект - мешь данного модуля
  95.         if (loadMesh == true)
  96.         {
  97.             if (modulConfig.modulMesh == null)
  98.             {
  99.                 Debug.LogError("Dont set mesh in modul config");
  100.                 return;
  101.             }
  102.  
  103.             GameObject tmp = Instantiate(modulConfig.modulMesh);
  104.             tmp.transform.SetParent(thisTransform);
  105.             tmp.transform.localPosition = Vector3.zero;
  106.             tmp.transform.localRotation = Quaternion.identity;
  107.  
  108.             transformRotationY = tmp.transform;
  109.             transformRotationX = tmp.transform.GetChild(0);
  110.         }
  111.     }
  112.  
  113.     public override float ReloadEnergy(float reloadEnergy)
  114.     {
  115.         if (EnergyPower < (reloadEnergy / 100) * eRQ_Current)
  116.         {
  117.             EnergyPower = (reloadEnergy / 100) * eRQ_Current;
  118.             return EnergyPower;
  119.         }
  120.  
  121.         return 0;
  122.     }
  123.  
  124.     protected override void OnEnable()
  125.     {
  126.         base.OnEnable();
  127.  
  128.         gunTarget = transform.TransformPoint(Vector3.forward * 500);
  129.     }
  130.  
  131.     void LateUpdate()
  132.     {
  133.         if (ModulStatus == ModulStatus.On)
  134.         {
  135.             if (rotationAxis == rotateAxis.AxisX || rotationAxis == rotateAxis.AxisXY)
  136.             {
  137.                 if (transformRotationX != null)
  138.                 {
  139.                     transformRotationX.localEulerAngles = RotationAxisX(transformRotationX);
  140.                 }
  141.                 else
  142.                 {
  143.                     //Debug.LogError("Dont set transformRotationX");
  144.                 }
  145.             }
  146.  
  147.             if (rotationAxis == rotateAxis.AxisY || rotationAxis == rotateAxis.AxisXY)
  148.             {
  149.                 if (transformRotationY != null)
  150.                 {
  151.                     transformRotationY.localEulerAngles = RotationAxisY(transformRotationY);
  152.                 }
  153.                 else
  154.                 {
  155.                     // Debug.LogError("Dont set transformRotationY");
  156.                 }
  157.             }
  158.         }
  159.     }
  160.  
  161.     private Quaternion GetDirection(Transform tempTransform)
  162.     {
  163.         //вектор, куда нужно вращать башню
  164.         return Quaternion.LookRotation(gunTarget - tempTransform.position);
  165.     }
  166.  
  167.     float SpeedRotation()
  168.     {
  169.         return (EnergyPower * modulConfig.speedRotateDefault) * Time.deltaTime;
  170.     }
  171.  
  172.     public override void SetLookDirection(Vector3 pointTarget)
  173.     {
  174.         gunTarget = pointTarget;
  175.     }
  176.  
  177.     private Vector3 RotationAxisY(Transform rotateTransform)
  178.     {
  179.         rotateTransform.rotation = Quaternion.RotateTowards(rotateTransform.rotation, GetDirection(rotateTransform), SpeedRotation());
  180.  
  181.         //Debug.DrawLine(gunTarget, rotateTransform.position, Color.yellow);
  182.         //Debug.DrawLine(rotateTransform.position, rotateTransform.TransformPoint(Vector3.forward * 100), Color.blue);
  183.  
  184.         tempAngle = 0;
  185.  
  186.         tempAngle = rotateTransform.localEulerAngles.y;
  187.  
  188.         if (rotateTransform.localEulerAngles.y > 180f)
  189.         {
  190.             //если значение Y больше 180, то используем ограничение между 360 и максимальним ограничением
  191.             tempAngle = Mathf.Clamp(tempAngle, 360f - modulConfig.rangeAngleGun, 360f);
  192.         }
  193.         else
  194.         {
  195.             if (transformRotationY.localEulerAngles.y < 180f)
  196.             {
  197.                 //если значение Y меньше 180, то ограничение используем между 0 и минимальным ограничением
  198.                 tempAngle = Mathf.Clamp(tempAngle, 0f, modulConfig.rangeAngleGun);
  199.             }
  200.         }
  201.  
  202.         return new Vector3(0, tempAngle, 0);
  203.     }
  204.  
  205.     private Vector3 RotationAxisX(Transform rotateTransform)
  206.     {
  207.         rotateTransform.rotation = Quaternion.RotateTowards(rotateTransform.rotation, GetDirection(rotateTransform), SpeedRotation());
  208.  
  209.         //Debug.DrawLine(gunTarget, rotateTransform.position, Color.yellow);
  210.         //Debug.DrawLine(rotateTransform.position, rotateTransform.TransformPoint(Vector3.forward * 100), Color.blue);
  211.  
  212.         tempAngle = 0;
  213.  
  214.         tempAngle = rotateTransform.localEulerAngles.x;
  215.  
  216.         if (rotateTransform.localEulerAngles.x > 180f)
  217.         {
  218.             tempAngle = Mathf.Clamp(tempAngle, 360f - modulConfig.rangeAngleGun, 360f);
  219.         }
  220.         else
  221.         {
  222.             if (rotateTransform.localEulerAngles.x < 180f)
  223.             {
  224.                 tempAngle = Mathf.Clamp(tempAngle, 0f, modulConfig.rangeAngleGun);
  225.             }
  226.         }
  227.  
  228.         return new Vector3(tempAngle, 0, 0);
  229.     }
  230.  
  231.     private void Action(Transform rotateTransform)
  232.     {
  233.         if (oldRotationY != Mathf.RoundToInt(rotateTransform.localEulerAngles.y))
  234.         {
  235.             oldRotationY = Mathf.RoundToInt(rotateTransform.localEulerAngles.y);
  236.             ActionModul(EnergyPower);
  237.         }
  238.     }
  239.  
  240.     //Вызывается из метода включеия данного модуля (SetModulStatus) и вызывает делегат,
  241.     //назначающий данный модуль в класс UI_BotAimController
  242.     protected override void CallDelegate(bool call)
  243.     {
  244.         if (call == true)
  245.         {
  246.             if (botController.GameStatus == GameStatus.PlayerControl)
  247.             {
  248.                 //Debug.Log("AddDelegate " + name + "  " + botController.gameStatus.ToString());
  249.  
  250.                 if (EventController.Singleton.d_SetNewModul != null)
  251.                 {
  252.                     EventController.Singleton.d_SetNewModul(this);
  253.                 }
  254.             }
  255.         }
  256.         else
  257.         {
  258.             //Вызываем делегат, на который подписан класс UI_BotAimController
  259.             if (EventController.Singleton != null && EventController.Singleton.d_ModulClear != null)
  260.             {
  261.                 //Debug.Log("ModulClear " + this + " " + botController.name);
  262.                 EventController.Singleton.d_ModulClear(this);
  263.             }
  264.         }
  265.     }
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement