_EagleOwle_

UnitNetwork

May 17th, 2020
1,032
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using GalaxyCoreLib;
  2. using GalaxyCoreLib.NetEntity;
  3. using GameServerCommon;
  4. using UnityEngine;
  5. using System.Collections.Generic;
  6.  
  7. public class UnitNetwork : Unit
  8. {
  9.     /// <summary>
  10.     /// Ссылка на сетевую сущность в ядре
  11.     /// </summary>
  12.     public ClientNetEntity netEntity = new ClientNetEntity();
  13.     /// <summary>
  14.     /// буфер дополнительный данных который можно приложить при инициализации
  15.     /// </summary>
  16.     [HideInInspector]
  17.     public byte[] data = null;
  18.     /// <summary>
  19.     /// Время инициализации объекта
  20.     /// </summary>
  21.     [HideInInspector]
  22.     public float initTime;
  23.  
  24.     private UnityEngine.Transform camTransform;
  25.     private ThirdPersonCharacter character;
  26.     private new CapsuleCollider collider;
  27.  
  28.     private Vector3 camForward;
  29.     private Vector3 velocity;
  30.     private bool jump;
  31.     private float directionX;
  32.     private float directionZ;
  33.     private bool crouch;
  34.     private RaycastHit hit;
  35.     private new Rigidbody rigidbody;
  36.  
  37.     protected override void Awake()
  38.     {
  39.         base.Awake();
  40.         rigidbody = GetComponent<Rigidbody>();
  41.         character = GetComponent<ThirdPersonCharacter>();
  42.         collider = GetComponent<CapsuleCollider>();
  43.         targetIndicator = GetComponentInChildren<TargetIndicator>();
  44.  
  45.         #region Подписываемся на сетевые события
  46.         netEntity.OnNetStart += OnNetStart;
  47.         netEntity.OnNetDestroy += OnNetDestroy;
  48.         netEntity.OnInMessage += OnInMessage;
  49.         #endregion
  50.     }
  51.  
  52.     protected override void Start()
  53.     {
  54.         Invoke("Initialise", Time.deltaTime);
  55.     }
  56.  
  57.     protected virtual void Initialise()
  58.     {
  59.         Debug.Log(name + ":Initialise isMy= " + netEntity.isMy);
  60.         DArts.DABug.Log(name + ":Initialise isMy= " + netEntity.isMy);
  61.  
  62.         if (netEntity.isMy)
  63.         {
  64.             Player.Unit = this;
  65.             CameraManager.Singleton.SetCamera(CameraType.Follow);
  66.             CameraFollow.Singleton.target = gameObject.transform;
  67.             camTransform = CameraFollow.Singleton.transform;
  68.  
  69.             foreach (var item in GetComponentsInChildren<UnityEngine.Transform>())
  70.             {
  71.                 item.gameObject.layer = 8;
  72.             }
  73.  
  74.             skills = new List<Skill>(3) { new Skill(1), new Skill(2), new Skill(3) };
  75.  
  76.             GetComponentInChildren<UnitUI>().gameObject.SetActive(false);
  77.         }
  78.         else
  79.         {
  80.             Destroy(character);
  81.             Destroy(rigidbody);
  82.         }
  83.     }
  84.  
  85.     protected virtual void Update()
  86.     {
  87.         if (netEntity.isMy)
  88.         {
  89.             if (jump == false)
  90.             {
  91.                 jump = Input.GetKeyDown(KeyCode.Space);
  92.             }
  93.  
  94.             if (Input.GetKeyDown(KeyCode.Alpha1))
  95.             {
  96.                 OnEnableSkill(0);
  97.             }
  98.  
  99.             if (Input.GetKeyDown(KeyCode.Alpha2))
  100.             {
  101.                 OnEnableSkill(1);
  102.             }
  103.  
  104.             if (Input.GetKeyDown(KeyCode.Alpha3))
  105.             {
  106.                 OnEnableSkill(2);
  107.             }
  108.  
  109.             if (Input.GetKeyDown(KeyCode.T))
  110.             {
  111.                 GetChangeTarget();
  112.             }
  113.         }
  114.     }
  115.  
  116.     protected virtual void FixedUpdate()
  117.     {
  118.         if (netEntity.isMy)
  119.         {
  120.             if (camTransform == null)
  121.                 return;
  122.  
  123.             directionX = Input.GetAxis("Horizontal");
  124.             directionZ = Input.GetAxis("Vertical");
  125.             crouch = Input.GetKey(KeyCode.C);
  126.  
  127.             camForward = Vector3.Scale(camTransform.forward, new Vector3(1, 0, 1)).normalized;
  128.             velocity = directionZ * camForward + directionX * camTransform.right;
  129.  
  130.             if (Input.GetKey(KeyCode.LeftShift))
  131.             {
  132.                 velocity *= 0.5f;
  133.             }
  134.  
  135.             character.Move(velocity, crouch, jump);
  136.             jump = false;
  137.         }
  138.     }
  139.  
  140.     #region Galaxy Event
  141.  
  142.     protected virtual void OnInMessage(byte code, byte[] data)
  143.     {
  144.         //Debug.Log(name + ": OnInMessage code = " + (EntityTypeMessage)code);
  145.         //DArts.DABug.Log(name + ": OnInMessage code = " + (EntityTypeMessage)code);
  146.  
  147.         switch ((EntityTypeMessage)code)
  148.         {
  149.             #region EntityTypeMessage.None
  150.             case EntityTypeMessage.None:
  151.                 break;
  152.             #endregion
  153.  
  154.             #region EntityTypeMessage.ValueUpdate
  155.             case EntityTypeMessage.ValueUpdate:
  156.                 MessageEntityUpdate messageUpdate = MessageEntityUpdate.Deserialize<MessageEntityUpdate>(data);
  157.  
  158.                 //Debug.Log(name + ": OnInMessage ValueUpdate");
  159.                 //DArts.DABug.Log(name + ": OnInMessage ValueUpdate");
  160.  
  161.                 Health = messageUpdate.health;
  162.                 UnitName = messageUpdate.name;
  163.                 OnChangeTarget(messageUpdate.targetId);
  164.                 break;
  165.             #endregion
  166.  
  167.             #region EntityTypeMessage.TransformUpdate
  168.             case EntityTypeMessage.TransformUpdate:
  169.  
  170.                 MessageTransform messageTransform = MessageTransform.Deserialize<MessageTransform>(data);
  171.  
  172.                 if (netEntity.isMy)
  173.                     break;
  174.  
  175.                 //Debug.Log(name + ": OnInMessage TransformUpdate");
  176.                 //DArts.DABug.Log(name + ": OnInMessage TransformUpdate");
  177.                 break;
  178.             #endregion
  179.  
  180.             #region EntityTypeMessage.Event
  181.  
  182.             case EntityTypeMessage.Event:
  183.  
  184.                 MessageEntityEvent message = MessageEntityEvent.Deserialize<MessageEntityEvent>(data);
  185.  
  186.                 //Debug.Log(name + ": OnInMessage Event " + (EntityEventEnum)message.eventType);
  187.                 //DArts.DABug.Log(name + ": OnInMessage Event " + (EntityEventEnum)message.eventType);
  188.  
  189.                 OnEntityEvent(message.eventType);
  190.                 break;
  191.  
  192.             #endregion
  193.  
  194.             #region  default
  195.             default:
  196.                 break;
  197.                 #endregion
  198.         }
  199.     }
  200.  
  201.     protected virtual void OnNetStart()
  202.     {
  203.         //Debug.Log(name + ": OnNetStart");
  204.         //DArts.DABug.Log(name + ": OnNetStart");
  205.         //задаем время инициализации
  206.         initTime = Time.time;
  207.  
  208.         #region Запрос на обновление данных о entity
  209.         MessageEntityUpdate message = new MessageEntityUpdate();
  210.         GalaxyApi.send.SendMessageToNetEntity
  211.             (
  212.             netEntity.netID,
  213.             (byte)EntityTypeMessage.ValueUpdate,
  214.             message,
  215.             GalaxyCoreCommon.GalaxyDeliveryType.reliable
  216.             );
  217.         #endregion
  218.     }
  219.  
  220.     protected virtual void OnNetDestroy()
  221.     {
  222.         //Debug.Log(name + ": OnNetDestroy");
  223.         //DArts.DABug.Log(name + ": OnNetDestroy");
  224.         //Удаляем объект согласно команде сервера
  225.         Destroy(gameObject);
  226.     }
  227.  
  228.     #endregion
  229.  
  230.     protected virtual void OnDestroy()
  231.     {
  232.         Debug.Log(name + ": PlayerNetEntity OnDestroy");
  233.         DArts.DABug.Log(name + ": PlayerNetEntity OnDestroy");
  234.  
  235.         netEntity.OnNetStart -= OnNetStart;
  236.         netEntity.OnNetDestroy -= OnNetDestroy;
  237.         netEntity.OnInMessage -= OnInMessage;
  238.  
  239.         // если же мы удаляем объект по своей инициативе то сообщяем об этом сетевой сущности
  240.         if (netEntity != null)
  241.         {
  242.             netEntity.Destroy();
  243.         }
  244.     }
  245.  
  246.     protected virtual void OnDisable()
  247.     {
  248.         netEntity.OnNetStart -= OnNetStart;
  249.         netEntity.OnNetDestroy -= OnNetDestroy;
  250.         netEntity.OnInMessage -= OnInMessage;
  251.     }
  252.  
  253.     /// <summary>
  254.     /// Начато воспроизведение анимации "подготовки к удару"
  255.     /// </summary>
  256.     public override void AnimatorCombatStart()
  257.     {
  258.         // Метод вызывается из класса обработчика анимации "CombatReady".
  259.         // После того, как определен тип анимации
  260.  
  261.         if (!netEntity.isMy)
  262.         {
  263.             nextSkill = 0;
  264.             animator.SetInteger("Action", nextSkill);
  265.             return;
  266.         }
  267.  
  268.         if (unitTarget == null)
  269.         {
  270.             nextSkill = 0;
  271.             animator.SetInteger("Action", nextSkill);
  272.             Debug.Log(name + ": Цель отсутствует");
  273.             DArts.DABug.Log(name + ": Цель отсутствует");
  274.             return;
  275.         }
  276.  
  277.         if (unitTarget.targetObj == null)
  278.         {
  279.             nextSkill = 0;
  280.             animator.SetInteger("Action", nextSkill);
  281.             Debug.Log(name + ": Цель обьект отсутствует");
  282.             DArts.DABug.Log(name + ": Цель обьект отсутствует");
  283.             return;
  284.         }
  285.  
  286.         transform.LookAt(unitTarget.targetObj.transform);
  287.  
  288.         if (Vector3.Distance(transform.position, unitTarget.targetObj.transform.position) > 2)
  289.         {
  290.             nextSkill = 0;
  291.             animator.SetInteger("Action", nextSkill);
  292.             Debug.Log(name + ": Цель далеко");
  293.             DArts.DABug.Log(name + ": Цель далеко");
  294.             return;
  295.         }
  296.        
  297.         //animator.CrossFade(GetNextSkill.config.animation, Time.deltaTime);//Воспроизвидим анимацию по названию
  298.         StartCoroutine(GetNextSkill.OnSkill());//Запускаем процесс работы/перезарядки скила
  299.  
  300.        
  301.     }
  302.  
  303.     /// <summary>
  304.     /// Выполняется скилл
  305.     /// Отправляем сообщение на сервер о выполнении скила
  306.     /// </summary>
  307.     public override void OnSkill()
  308.     {
  309.         //Вызывается из начала анимации скила
  310.         if (!netEntity.isMy)
  311.         return;
  312.  
  313.         #region Сообщение серверу (в комнату) о нанесении удара
  314.  
  315.         ClientNetEntity enemyEntity = unitTarget.targetObj.GetComponent<UnitNetwork>().netEntity;
  316.  
  317.         MessageHit message = new MessageHit();
  318.         message.actionId = nextSkill;
  319.         message.selfId = netEntity.netID;
  320.         message.targetId = enemyEntity.netID;
  321.         GalaxyApi.send.SendMessageToInstance((byte)InstanceEventEnum.Hit, message, GalaxyCoreCommon.GalaxyDeliveryType.reliableOrdered);
  322.  
  323.         Debug.Log(name + ": Отправлено сообщение на сервер MessageHit");
  324.         DArts.DABug.Log(name + ": Отправлено сообщение на сервер MessageHit");
  325.  
  326.         #endregion
  327.     }
  328.  
  329.     /// <summary>
  330.     /// Закончено воспроизведение анимации (выполнение скила)
  331.     /// </summary>
  332.     public override void AnimatorCombatEnd()
  333.     {
  334.         // Метод вызывается из класса обработчика анимации " AnimAction".
  335.  
  336.         if (netEntity.isMy)
  337.         {
  338.             nextSkill = 0;
  339.             animator.SetInteger("Action", nextSkill);
  340.         }
  341.     }
  342.  
  343.     protected virtual void OnEntityEvent(int eventId)
  344.     {
  345.         switch ((EntityEventEnum)eventId)
  346.         {
  347.             case EntityEventEnum.None:
  348.                 break;
  349.  
  350.             case EntityEventEnum.Hit:
  351.                 animator.CrossFade("Hit", Time.deltaTime);
  352.                 break;
  353.  
  354.             default:
  355.                 break;
  356.         }
  357.     }
  358.  
  359.     /// <summary>
  360.     /// Запрос на смену текущей цели
  361.     /// </summary>
  362.     public override void GetChangeTarget()
  363.     {
  364.         if (!netEntity.isMy)
  365.             return;
  366.  
  367.         #region Сообщение серверу (в комнату) о  запросе на смену цели
  368.  
  369.         MessageEntityEvent message = new MessageEntityEvent();
  370.         message.eventType = (int)EntityEventEnum.ChangeTarget;
  371.  
  372.         GalaxyApi.send.SendMessageToNetEntity(netEntity.netID, (byte)EntityTypeMessage.Event, message, GalaxyCoreCommon.GalaxyDeliveryType.reliableOrdered);
  373.  
  374.         //Debug.Log(name + ": Отправлено сообщение на сервер OnChangeTarget()");
  375.         //DArts.DABug.Log(name + ": Отправлено сообщение на сервер");
  376.  
  377.         #endregion
  378.     }
  379.  
  380.     protected virtual void OnChangeTarget(int targetId)
  381.     {
  382.         //Debug.Log(name + ": OnChangeTarget " + targetId);
  383.         //DArts.DABug.Log(name + ": OnChangeTarget " + targetId);
  384.  
  385.         foreach (var item in GameObject.FindObjectsOfType<UnitNetwork>())
  386.         {
  387.             if (item.netEntity.netID == targetId)
  388.             {
  389.                 SetTarget(item.gameObject);
  390.             }
  391.         }
  392.     }
  393.  
  394.     /// <summary>
  395.     /// Удар оп противнику.
  396.     /// </summary>
  397.     private void OnHit()
  398.     {
  399.         //метод вызыва из анимаций
  400.         unitTarget.targetObj.GetComponent<Animator>().CrossFade("Hit", Time.deltaTime);
  401.     }
  402. }
RAW Paste Data