_EagleOwle_

UnitController

Dec 8th, 2018
107
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using GalaxyLib;
  6. using UnityEngine.Events;
  7. using System.Reflection;
  8. using System.Linq;
  9.  
  10. public class UnitController : Unit
  11. {
  12.     #region Компоненты
  13.     [HideInInspector]
  14.     public GalaxyNetID netId;
  15.     //private CharacterController characterController;
  16.     private Animator animator;
  17.     #endregion
  18.  
  19.     #region Здоровье
  20.     public override float Health
  21.     {
  22.         get { return health; }
  23.         set
  24.         {
  25.             base.Health = value;
  26.  
  27.             if (initUnit != InitUnit.Local)
  28.               return;
  29.  
  30.             netId.CallRPC("RpcSyncHealth", value);
  31.  
  32.         }
  33.     }
  34.     #endregion
  35.    
  36.     #region NetVar Для синхронизации анимации движения
  37.     [HideInInspector]
  38.     [NetVar]
  39.     public float _motionX;
  40.     [HideInInspector]
  41.     [NetVar]
  42.     public int _motionY;
  43.     [HideInInspector]
  44.     [NetVar]
  45.     public float _motionZ;
  46.  
  47.     [HideInInspector]
  48.     [NetVar]
  49.     public float _lookDirectionX;
  50.     [HideInInspector]
  51.     [NetVar]
  52.     public float _lookDirectionY;
  53.     [HideInInspector]
  54.     [NetVar]
  55.     public float _lookDirectionZ;
  56.     [HideInInspector]
  57.     [NetVar]
  58.     public bool _unitOff;
  59.     [HideInInspector]
  60.     [NetVar]
  61.     public string _unitName;
  62.     #endregion
  63.  
  64.     #region Список всех дочерних модулей
  65.     [SerializeField]
  66.     private List<ModulBase> moduls;
  67.     #endregion
  68.  
  69.     #region Список действий
  70.     public List<UnitAction> actions = new List<UnitAction>();
  71.     #endregion
  72.  
  73.     Vector3 moveDirection;//Вектор движения
  74.  
  75.     #region Debug
  76.     Vector3 dbMotion;
  77.     Vector3 dbLookDirection;
  78.     #endregion
  79.  
  80.     protected void Start()
  81.     {
  82.         netId = GetComponent<GalaxyNetID>();
  83.         animator = GetComponent<Animator>();
  84.  
  85.         tag = "Unit";
  86.         gameObject.layer = 9;
  87.  
  88.         Invoke("ConnectToNet", 1);
  89.     }
  90.  
  91.     private void ConnectToNet()
  92.     {
  93.         if (!netId.inited)
  94.         {
  95.             Invoke("ConnectToNet", 1);
  96.             return;
  97.         }
  98.  
  99.         if (netId.isMy)
  100.         {
  101.             initUnit = InitUnit.Local;
  102.  
  103.             #region Создаем элементы действий
  104.             UnitAction action = new UnitAction("Enable Unit");
  105.             action.OnUnitAction.AddListener(EnableBot);
  106.             actions.Add(action);
  107.  
  108.             action = new UnitAction("Disable Unit");
  109.             action.OnUnitAction.AddListener(DisableBot);
  110.             actions.Add(action);
  111.  
  112.             action = new UnitAction("Destroy Unit");
  113.             action.OnUnitAction.AddListener(SelfDestroyBot);
  114.             actions.Add(action);
  115.             #endregion
  116.  
  117.             #region Имя юнита
  118.             _unitName = GalaxyNetwork.Connection.clientNikName;
  119.             OnNetEvent("UnitName");
  120.             #endregion
  121.  
  122.             _unitOff = animator.GetBool("Off");
  123.         }
  124.         else
  125.         {
  126.             initUnit = InitUnit.NetClient;
  127.         }
  128.  
  129.         Invoke("Initialise", 1);
  130.     }
  131.  
  132.     private void Initialise()
  133.     {
  134.         AddModuls();
  135.  
  136.         if (initUnit == InitUnit.NetClient)
  137.         {
  138.             name = _unitName + " Client";
  139.             OnNetEvent("UnitName");
  140.             animator.applyRootMotion = false;
  141.             netId.CallRPC("RpcGetHealth");
  142.             SyncModulStatus();
  143.         }
  144.  
  145.         if (initUnit == InitUnit.Local)
  146.         {
  147.             name = _unitName + " Local";
  148.         }
  149.  
  150.         GameEvents.Singleton.OnEventInitUnit(gameObject, netId.isMy);
  151.     }
  152.  
  153.     public override void GetUnitName(MessageArgsString args)
  154.     {
  155.         args.stringArg = _unitName;
  156.     }
  157.  
  158.     public bool LocalUnit
  159.     {
  160.         get
  161.         {
  162.             return netId.isMy;
  163.         }
  164.     }
  165.  
  166.     private void SyncModulStatus()
  167.     {
  168.         foreach (ModulBase modul in moduls)
  169.         {
  170.            
  171.         }
  172.     }
  173.  
  174.     protected void Update()
  175.     {
  176.         if (initUnit == InitUnit.Local)
  177.         {
  178.             GetInput();
  179.  
  180.             if (_unitOff == true)
  181.                 return;
  182.  
  183.             //Получаем направление взгляда из модуля оптики
  184.              Vector3 dir = Vector3.zero;
  185.             foreach (ModulBase modul in moduls)
  186.             {
  187.                 if (modul is IGetLookDirection)
  188.                 {
  189.                     dir = (modul as IGetLookDirection).GetDirection();
  190.                     break;
  191.                 }
  192.             }
  193.  
  194.             //Назначаем направление взгляда
  195.             SetLookDirection(dir);
  196.             //SetLookDirection(CameraController.Singleton.hitForwardCollision.point);
  197.  
  198.             #region Сохраняем координаты точки в пространстве в переменные lookDirection для их синхронизации по сети
  199.  
  200.             if (dbLookDirection != dir)
  201.             {
  202.                 dbLookDirection = dir;
  203.                 OnNetEvent("LookDirection");
  204.             }
  205.  
  206.             _lookDirectionX = dir.x;
  207.             _lookDirectionY = dir.y;
  208.             _lookDirectionZ = dir.z;
  209.             #endregion
  210.  
  211.             #region  Сохраняем данные аниматора для их синхронизации по сети
  212.  
  213.             Vector3 tmp = new Vector3(animator.GetFloat("Side"), animator.GetInteger("Straif"), animator.GetFloat("Front"));
  214.             if(dbMotion != tmp)
  215.             {
  216.                 dbMotion = tmp;
  217.                 OnNetEvent("Motion");
  218.             }
  219.  
  220.             _motionZ = animator.GetFloat("Front");
  221.             _motionX = animator.GetFloat("Side");
  222.             _motionY = animator.GetInteger("Straif");
  223.             #endregion
  224.  
  225.         }
  226.  
  227.         if (initUnit == InitUnit.NetClient)
  228.         {
  229.             //Если не нашь, то для назначения направления взгляда используем синхронизируемые переменные lookDirection
  230.  
  231.             Vector3 tmp = new Vector3(_lookDirectionX, _lookDirectionY, _lookDirectionZ);
  232.             if (dbLookDirection != tmp)
  233.             {
  234.                 dbLookDirection = tmp;
  235.                 OnNetEvent("LookDirection");
  236.             }
  237.  
  238.             SetLookDirection(new Vector3(_lookDirectionX, _lookDirectionY, _lookDirectionZ));
  239.  
  240.             #region Синхронизируем аниматор
  241.  
  242.             animator.SetBool("Off", _unitOff);
  243.  
  244.             tmp = new Vector3(_motionX, _motionY, _motionZ);
  245.  
  246.             if (dbMotion != tmp)
  247.             {
  248.                 dbMotion = tmp;
  249.                 OnNetEvent("Motion");
  250.             }
  251.  
  252.             animator.SetInteger("Straif", _motionY);
  253.             animator.SetFloat("Front", _motionZ);//, 0.1f, Time.deltaTime);
  254.             animator.SetFloat("Side", _motionX);//, 0.1f, Time.deltaTime);
  255.  
  256.             #endregion
  257.  
  258.             #region Синхронизируем имя юнита
  259.  
  260.             if (name != _unitName)
  261.             {
  262.                 name = _unitName;
  263.             }
  264.  
  265.             #endregion
  266.  
  267.            
  268.         }
  269.     }
  270.  
  271.     protected void FixedUpdate()
  272.     {
  273.         SetMove(moveDirection);
  274.     }
  275.  
  276.     #region Действия робота
  277.  
  278.     private void SetMove(Vector3 moveDirection)
  279.     {
  280.         if (initUnit != InitUnit.Local)
  281.             return;
  282.  
  283.         foreach (ModulBase modul in moduls)
  284.         {
  285.             if (modul is ISetMoveDirection)
  286.             {
  287.                 (modul as ISetMoveDirection).SetDirection(moveDirection);
  288.             }
  289.         }
  290.     }
  291.  
  292.     private void SetLookDirection(Vector3 value)
  293.     {
  294.         #region Сообщаем модулям точку в пространстве, куда нужно смотреть
  295.         foreach (ModulBase modul in moduls)
  296.         {
  297.             if (modul is ISetLookDirection)
  298.             {
  299.                 (modul as ISetLookDirection).SetDirection(value);
  300.             }
  301.         }
  302.         #endregion
  303.     }
  304.  
  305.     private void Shoot()
  306.     {
  307.         foreach (ModulBase modul in moduls)
  308.         {
  309.             if (modul is IShoot)
  310.             {
  311.                 bool shoot = false;
  312.                 (modul as IShoot).Shoot(out shoot);
  313.  
  314.                 if(shoot == true)
  315.                 {
  316.                     netId.CallRPC("RpcShoot", moduls.IndexOf(modul));
  317.                 }
  318.             }
  319.         }
  320.     }
  321.  
  322.     private void SelfDestroyBot()
  323.     {
  324.         Health = 0;
  325.     }
  326.  
  327.     #endregion
  328.  
  329.     private void GetInput()
  330.     {
  331.         moveDirection = Vector3.zero;
  332.  
  333.         if (Cursor.visible == false)
  334.         {
  335.             moveDirection += PlayerInput.Singletone.input;
  336.             moveDirection = new Vector3(moveDirection.x, -moveDirection.y, moveDirection.z);//Инвертируем стрейф
  337.  
  338.             if (CustomInput.Singleton.GetButtonDown("Mouse0"))
  339.             {
  340.                 Shoot();
  341.             }
  342.  
  343.             if (CustomInput.Singleton.GetButtonDown("Mouse1"))
  344.             {
  345.                 foreach (ModulBase modul in moduls)
  346.                 {
  347.                     if (modul is IOpticCamera)
  348.                     {
  349.                         (modul as IOpticCamera).EnableCamera();
  350.                     }
  351.                 }
  352.             }
  353.  
  354.             if (CustomInput.Singleton.GetButton("Weapon2"))
  355.             {
  356.                 Health -= 1;
  357.             }
  358.  
  359.             if (CustomInput.Singleton.GetButton("Weapon3"))
  360.             {
  361.                 Health += 1;
  362.             }
  363.         }
  364.     }
  365.  
  366.     #region События
  367.  
  368.     #region События Аниматора Вкл/Откл робота
  369.     public void UnitEnable()
  370.     {
  371.         if (initUnit == InitUnit.Local)
  372.         {
  373.             EnableAllModul();
  374.         }
  375.     }
  376.  
  377.     public void UnitDisable()
  378.     {
  379.         if (initUnit == InitUnit.Local)
  380.         {
  381.             DisableAllModul();
  382.         }
  383.     }
  384.     #endregion
  385.  
  386.     #region Подписанное Событие Вкл/Откл робота
  387.     protected override void EnableBot()
  388.     {
  389.         animator.SetBool("Off", false);
  390.         _unitOff = false;
  391.     }
  392.  
  393.     protected override void DisableBot()
  394.     {
  395.         animator.SetBool("Off", true);
  396.         _unitOff = true;
  397.     }
  398.     #endregion
  399.  
  400.     protected override void DestroyBot()
  401.     {
  402.         base.DestroyBot();
  403.         foreach (ModulBase modul in moduls)
  404.         {
  405.             modul.ModulDestroy();
  406.         }
  407.     }
  408.  
  409.     #region Добавляем модули в массив
  410.     private void RecheckModuls()
  411.     {
  412.         DisableBot();
  413.         Invoke("AddModuls", 1);
  414.     }
  415.  
  416.     private void AddModuls()
  417.     {
  418.         moduls = new List<ModulBase>();
  419.         foreach (var item in GetComponentsInChildren<ModulBase>())
  420.         {
  421.             moduls.Add(item);
  422.             item.UnitInitialise(this);
  423.         }
  424.     }
  425.     #endregion
  426.  
  427.     #region Вкл/Откл всех модулей
  428.     //Вкл. все модули
  429.     private void EnableAllModul()
  430.     {
  431.         foreach (ModulBase modul in moduls)
  432.         {
  433.             modul.ModulEnable();
  434.         }
  435.     }
  436.  
  437.     //Вкл. все модули
  438.     private void DisableAllModul()
  439.     {
  440.         foreach (ModulBase modul in moduls)
  441.         {
  442.             modul.ModulDisable();
  443.         }
  444.     }
  445.     #endregion
  446.  
  447.     #endregion
  448.  
  449.     void GetUnitActions(MessageArgsActions args)
  450.     {
  451.         args.actions = actions;
  452.     }
  453.  
  454.     #region Обмен данными робота
  455.  
  456.     [NetRPC]
  457.     public void RpcSyncHealth(float value)
  458.     {
  459.         OnNetEvent("RpcSyncHealth");
  460.  
  461.         if (initUnit != InitUnit.NetClient)
  462.             return;
  463.  
  464.         Health = value;
  465.     }
  466.  
  467.     #region Синхронизация здоровья модуля. Вызывается из модуля
  468.     [NetRPC]
  469.     public void RpcSyncModulHealth(float currentHealth, int modulId)
  470.     {
  471.         OnNetEvent("RpcSyncModulHealth");
  472.         CSMessage.Message("RpcSyncModulHealth " + modulId);
  473.  
  474.         if (initUnit == InitUnit.NetClient)
  475.         {
  476.             foreach (ModulBase modul in moduls)
  477.             {
  478.                 if (modul.modulId == modulId)
  479.                 {
  480.                     modul.Health = currentHealth;
  481.                 }
  482.             }
  483.         }
  484.     }
  485.     #endregion
  486.  
  487.     #region Синхронизация состояния модуля. Вызывается из модуля
  488.  
  489.     [NetRPC]
  490.     public void RpcGetModulState(int modulId)
  491.     {
  492.         if (initUnit == InitUnit.Local)
  493.         {
  494.             foreach (ModulBase modul in moduls)
  495.             {
  496.                 if (modul.modulId == modulId)
  497.                 {
  498.                     netId.CallRPC("RpcSyncModulState", (int)modul.ModulStatus, modul.modulId);
  499.                     return;
  500.                 }
  501.             }
  502.         }
  503.     }
  504.  
  505.     [NetRPC]
  506.     public void RpcSyncModulState(int state, int modulId)
  507.     {
  508.         if (initUnit == InitUnit.NetClient)
  509.         {
  510.             foreach (ModulBase modul in moduls)
  511.             {
  512.                 if (modul.modulId == modulId)
  513.                 {
  514.                     modul.ModulStatus = (ModulStatus)state;
  515.                     return;
  516.                 }
  517.             }
  518.         }
  519.     }
  520.     #endregion
  521.  
  522.     [NetRPC]
  523.     public void RpcGetHealth()
  524.     {
  525.         OnNetEvent("RpcGetHealth");
  526.  
  527.         if (initUnit != InitUnit.Local)
  528.             return;
  529.  
  530.         netId.CallRPC("RpcSyncHealth", Health);
  531.     }
  532.  
  533.     [NetRPC]
  534.     public void RpcShoot(int modulIndex)
  535.     {
  536.         if (initUnit != InitUnit.NetClient)
  537.             return;
  538.  
  539.         //DArts.DABug.Log("RpcShoot modul " + modulIndex);
  540.  
  541.         bool shoot = false;
  542.         (moduls[modulIndex] as IShoot).Shoot(out shoot);
  543.  
  544.         //DArts.DABug.Log("Shoot = " + shoot);
  545.  
  546.     }
  547.  
  548.     #region Создаем UI обьекты индикации на удаленных экземплярах. Логика удаленного экземпляра
  549.     [NetRPC]
  550.     public void RpcCreateHudIndicator()
  551.     {
  552.         OnNetEvent("RpcCreateHudIndicator");
  553.  
  554.         if (initUnit != InitUnit.NetClient)
  555.             return;
  556.  
  557.         GameObject tmpUi = Instantiate(GameConfig.Singleton.prefabs.onHeadIndicator);
  558.         tmpUi.SendMessage("SetIndicatorTarget", gameObject);
  559.  
  560.         DArts.DABug.Log("RpcCreateHudIndicator " + _unitName);
  561.     }
  562.     #endregion
  563.  
  564.     #region Мониторинг обмена данными
  565.     private void OnNetEvent(string nameEvent)
  566.     {
  567.         if (NetEventMonitoring.Singleton != null)
  568.         {
  569.             NetEventMonitoring.Singleton.OnEvent(nameEvent);
  570.         }
  571.     }
  572.     #endregion
  573.  
  574.     #endregion
  575.  
  576. }
RAW Paste Data