Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using GalaxyCoreLib;
- using GalaxyCoreLib.NetEntity;
- using GameServerCommon;
- using UnityEngine;
- using System.Collections.Generic;
- public class UnitNetwork : Unit
- {
- /// <summary>
- /// Ссылка на сетевую сущность в ядре
- /// </summary>
- public ClientNetEntity netEntity = new ClientNetEntity();
- /// <summary>
- /// буфер дополнительный данных который можно приложить при инициализации
- /// </summary>
- [HideInInspector]
- public byte[] data = null;
- /// <summary>
- /// Время инициализации объекта
- /// </summary>
- [HideInInspector]
- public float initTime;
- private UnityEngine.Transform camTransform;
- private ThirdPersonCharacter character;
- private new CapsuleCollider collider;
- private Vector3 camForward;
- private Vector3 velocity;
- private bool jump;
- private float directionX;
- private float directionZ;
- private bool crouch;
- private RaycastHit hit;
- private new Rigidbody rigidbody;
- protected override void Awake()
- {
- base.Awake();
- rigidbody = GetComponent<Rigidbody>();
- character = GetComponent<ThirdPersonCharacter>();
- collider = GetComponent<CapsuleCollider>();
- targetIndicator = GetComponentInChildren<TargetIndicator>();
- #region Подписываемся на сетевые события
- netEntity.OnNetStart += OnNetStart;
- netEntity.OnNetDestroy += OnNetDestroy;
- netEntity.OnInMessage += OnInMessage;
- #endregion
- }
- protected override void Start()
- {
- Invoke("Initialise", Time.deltaTime);
- }
- protected virtual void Initialise()
- {
- Debug.Log(name + ":Initialise isMy= " + netEntity.isMy);
- DArts.DABug.Log(name + ":Initialise isMy= " + netEntity.isMy);
- if (netEntity.isMy)
- {
- Player.Unit = this;
- CameraManager.Singleton.SetCamera(CameraType.Follow);
- CameraFollow.Singleton.target = gameObject.transform;
- camTransform = CameraFollow.Singleton.transform;
- foreach (var item in GetComponentsInChildren<UnityEngine.Transform>())
- {
- item.gameObject.layer = 8;
- }
- skills = new List<Skill>(3) { new Skill(1), new Skill(2), new Skill(3) };
- GetComponentInChildren<UnitUI>().gameObject.SetActive(false);
- }
- else
- {
- Destroy(character);
- Destroy(rigidbody);
- }
- }
- protected virtual void Update()
- {
- if (netEntity.isMy)
- {
- if (jump == false)
- {
- jump = Input.GetKeyDown(KeyCode.Space);
- }
- if (Input.GetKeyDown(KeyCode.Alpha1))
- {
- OnEnableSkill(0);
- }
- if (Input.GetKeyDown(KeyCode.Alpha2))
- {
- OnEnableSkill(1);
- }
- if (Input.GetKeyDown(KeyCode.Alpha3))
- {
- OnEnableSkill(2);
- }
- if (Input.GetKeyDown(KeyCode.T))
- {
- GetChangeTarget();
- }
- }
- }
- protected virtual void FixedUpdate()
- {
- if (netEntity.isMy)
- {
- if (camTransform == null)
- return;
- directionX = Input.GetAxis("Horizontal");
- directionZ = Input.GetAxis("Vertical");
- crouch = Input.GetKey(KeyCode.C);
- camForward = Vector3.Scale(camTransform.forward, new Vector3(1, 0, 1)).normalized;
- velocity = directionZ * camForward + directionX * camTransform.right;
- if (Input.GetKey(KeyCode.LeftShift))
- {
- velocity *= 0.5f;
- }
- character.Move(velocity, crouch, jump);
- jump = false;
- }
- }
- #region Galaxy Event
- protected virtual void OnInMessage(byte code, byte[] data)
- {
- //Debug.Log(name + ": OnInMessage code = " + (EntityTypeMessage)code);
- //DArts.DABug.Log(name + ": OnInMessage code = " + (EntityTypeMessage)code);
- switch ((EntityTypeMessage)code)
- {
- #region EntityTypeMessage.None
- case EntityTypeMessage.None:
- break;
- #endregion
- #region EntityTypeMessage.ValueUpdate
- case EntityTypeMessage.ValueUpdate:
- MessageEntityUpdate messageUpdate = MessageEntityUpdate.Deserialize<MessageEntityUpdate>(data);
- //Debug.Log(name + ": OnInMessage ValueUpdate");
- //DArts.DABug.Log(name + ": OnInMessage ValueUpdate");
- Health = messageUpdate.health;
- UnitName = messageUpdate.name;
- OnChangeTarget(messageUpdate.targetId);
- break;
- #endregion
- #region EntityTypeMessage.TransformUpdate
- case EntityTypeMessage.TransformUpdate:
- MessageTransform messageTransform = MessageTransform.Deserialize<MessageTransform>(data);
- if (netEntity.isMy)
- break;
- //Debug.Log(name + ": OnInMessage TransformUpdate");
- //DArts.DABug.Log(name + ": OnInMessage TransformUpdate");
- break;
- #endregion
- #region EntityTypeMessage.Event
- case EntityTypeMessage.Event:
- MessageEntityEvent message = MessageEntityEvent.Deserialize<MessageEntityEvent>(data);
- //Debug.Log(name + ": OnInMessage Event " + (EntityEventEnum)message.eventType);
- //DArts.DABug.Log(name + ": OnInMessage Event " + (EntityEventEnum)message.eventType);
- OnEntityEvent(message.eventType);
- break;
- #endregion
- #region default
- default:
- break;
- #endregion
- }
- }
- protected virtual void OnNetStart()
- {
- //Debug.Log(name + ": OnNetStart");
- //DArts.DABug.Log(name + ": OnNetStart");
- //задаем время инициализации
- initTime = Time.time;
- #region Запрос на обновление данных о entity
- MessageEntityUpdate message = new MessageEntityUpdate();
- GalaxyApi.send.SendMessageToNetEntity
- (
- netEntity.netID,
- (byte)EntityTypeMessage.ValueUpdate,
- message,
- GalaxyCoreCommon.GalaxyDeliveryType.reliable
- );
- #endregion
- }
- protected virtual void OnNetDestroy()
- {
- //Debug.Log(name + ": OnNetDestroy");
- //DArts.DABug.Log(name + ": OnNetDestroy");
- //Удаляем объект согласно команде сервера
- Destroy(gameObject);
- }
- #endregion
- protected virtual void OnDestroy()
- {
- Debug.Log(name + ": PlayerNetEntity OnDestroy");
- DArts.DABug.Log(name + ": PlayerNetEntity OnDestroy");
- netEntity.OnNetStart -= OnNetStart;
- netEntity.OnNetDestroy -= OnNetDestroy;
- netEntity.OnInMessage -= OnInMessage;
- // если же мы удаляем объект по своей инициативе то сообщяем об этом сетевой сущности
- if (netEntity != null)
- {
- netEntity.Destroy();
- }
- }
- protected virtual void OnDisable()
- {
- netEntity.OnNetStart -= OnNetStart;
- netEntity.OnNetDestroy -= OnNetDestroy;
- netEntity.OnInMessage -= OnInMessage;
- }
- /// <summary>
- /// Начато воспроизведение анимации "подготовки к удару"
- /// </summary>
- public override void AnimatorCombatStart()
- {
- // Метод вызывается из класса обработчика анимации "CombatReady".
- // После того, как определен тип анимации
- if (!netEntity.isMy)
- {
- nextSkill = 0;
- animator.SetInteger("Action", nextSkill);
- return;
- }
- if (unitTarget == null)
- {
- nextSkill = 0;
- animator.SetInteger("Action", nextSkill);
- Debug.Log(name + ": Цель отсутствует");
- DArts.DABug.Log(name + ": Цель отсутствует");
- return;
- }
- if (unitTarget.targetObj == null)
- {
- nextSkill = 0;
- animator.SetInteger("Action", nextSkill);
- Debug.Log(name + ": Цель обьект отсутствует");
- DArts.DABug.Log(name + ": Цель обьект отсутствует");
- return;
- }
- transform.LookAt(unitTarget.targetObj.transform);
- if (Vector3.Distance(transform.position, unitTarget.targetObj.transform.position) > 2)
- {
- nextSkill = 0;
- animator.SetInteger("Action", nextSkill);
- Debug.Log(name + ": Цель далеко");
- DArts.DABug.Log(name + ": Цель далеко");
- return;
- }
- //animator.CrossFade(GetNextSkill.config.animation, Time.deltaTime);//Воспроизвидим анимацию по названию
- StartCoroutine(GetNextSkill.OnSkill());//Запускаем процесс работы/перезарядки скила
- }
- /// <summary>
- /// Выполняется скилл
- /// Отправляем сообщение на сервер о выполнении скила
- /// </summary>
- public override void OnSkill()
- {
- //Вызывается из начала анимации скила
- if (!netEntity.isMy)
- return;
- #region Сообщение серверу (в комнату) о нанесении удара
- ClientNetEntity enemyEntity = unitTarget.targetObj.GetComponent<UnitNetwork>().netEntity;
- MessageHit message = new MessageHit();
- message.actionId = nextSkill;
- message.selfId = netEntity.netID;
- message.targetId = enemyEntity.netID;
- GalaxyApi.send.SendMessageToInstance((byte)InstanceEventEnum.Hit, message, GalaxyCoreCommon.GalaxyDeliveryType.reliableOrdered);
- Debug.Log(name + ": Отправлено сообщение на сервер MessageHit");
- DArts.DABug.Log(name + ": Отправлено сообщение на сервер MessageHit");
- #endregion
- }
- /// <summary>
- /// Закончено воспроизведение анимации (выполнение скила)
- /// </summary>
- public override void AnimatorCombatEnd()
- {
- // Метод вызывается из класса обработчика анимации " AnimAction".
- if (netEntity.isMy)
- {
- nextSkill = 0;
- animator.SetInteger("Action", nextSkill);
- }
- }
- protected virtual void OnEntityEvent(int eventId)
- {
- switch ((EntityEventEnum)eventId)
- {
- case EntityEventEnum.None:
- break;
- case EntityEventEnum.Hit:
- animator.CrossFade("Hit", Time.deltaTime);
- break;
- default:
- break;
- }
- }
- /// <summary>
- /// Запрос на смену текущей цели
- /// </summary>
- public override void GetChangeTarget()
- {
- if (!netEntity.isMy)
- return;
- #region Сообщение серверу (в комнату) о запросе на смену цели
- MessageEntityEvent message = new MessageEntityEvent();
- message.eventType = (int)EntityEventEnum.ChangeTarget;
- GalaxyApi.send.SendMessageToNetEntity(netEntity.netID, (byte)EntityTypeMessage.Event, message, GalaxyCoreCommon.GalaxyDeliveryType.reliableOrdered);
- //Debug.Log(name + ": Отправлено сообщение на сервер OnChangeTarget()");
- //DArts.DABug.Log(name + ": Отправлено сообщение на сервер");
- #endregion
- }
- protected virtual void OnChangeTarget(int targetId)
- {
- //Debug.Log(name + ": OnChangeTarget " + targetId);
- //DArts.DABug.Log(name + ": OnChangeTarget " + targetId);
- foreach (var item in GameObject.FindObjectsOfType<UnitNetwork>())
- {
- if (item.netEntity.netID == targetId)
- {
- SetTarget(item.gameObject);
- }
- }
- }
- /// <summary>
- /// Удар оп противнику.
- /// </summary>
- private void OnHit()
- {
- //метод вызыва из анимаций
- unitTarget.targetObj.GetComponent<Animator>().CrossFade("Hit", Time.deltaTime);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement