Kurtav

Untitled

Nov 26th, 2020 (edited)
783
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using UnityEngine;
  2. using Spine;
  3. using Spine.Unity.AttachmentTools;
  4. using Spine.Unity;
  5. using System;
  6.  
  7. public class Sword : MonoBehaviour
  8. {
  9.     public static Sword In;
  10.  
  11.     [SpineSlot] [SerializeField] private string slotName = default;
  12.     [SerializeField] private SpineAtlasAsset atlasAssetK = default;
  13.     private Atlas atlasK;
  14.     private SkeletonRenderer skeletonRenderer;
  15.     private float scale;
  16.     private Attachment originalAttachment;
  17.     private Slot slot;
  18.     private Sword sword;
  19.     private bool activated;
  20.     private TrackEntry trackK;
  21.  
  22.     protected float newRegionAttachmentX;
  23.     protected float newRegionAttachmentY;
  24.     protected Material material;
  25.     protected Sprite sprite;
  26.     protected GameObject particles;
  27.  
  28.     public Sword Get()
  29.     {
  30.         return sword;
  31.     }
  32.  
  33.     public void Set(string nameSword) // -> UIData - PressButtonAttackNewWeapon() = кнопка активировании меча.)
  34.     {
  35.         sword = (Sword)GetComponent(Type.GetType(nameSword));
  36.         SetupAttack();
  37.     }
  38.  
  39.     private void SetupAttack()
  40.     {
  41.         Time.timeScale = 0.3f / GameData.In.knight.timeScale; // чтобы всегда было ровное одинаковое замедление при любых скоростях анимации
  42.         GameData.In.knight.state.SetAnimation(0, GameData.In.attackK, false);
  43.         TrackEntry te = GameData.In.knight.state.GetCurrent(0);  // изначально у неё должно быть  timeScale = 0;
  44.         te.AnimationStart = 0.36f;
  45.         Change(true);
  46.     }
  47.  
  48.     private void ReturnBasicSword()
  49.     {
  50.         Change(false); // поменять на обратный базовый меч
  51.         GameFieldRules.In.ParryShield = false;
  52.         GameData.In.zombie.GetComponent<Zombie>().LaunchAttackAgain();
  53.     }
  54.  
  55.     private void Awake()
  56.     {
  57.         print("Awake");  
  58.         In = this;
  59.         skeletonRenderer = GetComponent<SkeletonRenderer>();
  60.         atlasK = atlasAssetK.GetAtlas();
  61.         slot = skeletonRenderer.Skeleton.FindSlot(slotName);
  62.         originalAttachment = slot.Attachment;
  63.         gameObject.AddComponent<AdrenalinSword>(); // после выполнения этой строчки вызывается Awake производного типа класса - AdrenalinSword.
  64.         gameObject.AddComponent<FreezeSword>(); // после выполнения этой строчки вызывается Awake производного типа класса - FreezeSword.    
  65.     }
  66.  
  67.     protected void InitDerivedObject() // это инициализация не нужна базовому классу. У базового класса эти поля null. Этот метод в базовом классе потому что он одинакого обобщённый для всех производных классов
  68.     {
  69.         string nameSword = GetType().ToString();
  70.         material = Resources.Load<Material>(nameSword);
  71.         sprite = Resources.Load<Sprite>(nameSword);
  72.         particles = Instantiate(Resources.Load<GameObject>(nameSword), transform);
  73.         particles.GetComponent<BoneFollower>().SkeletonRenderer = GetComponent<SkeletonRenderer>();
  74.     }
  75.  
  76.     private void Change(bool newSword)
  77.     {
  78.         if (!skeletonRenderer.valid) return;
  79.  
  80.         AtlasRegion region;
  81.         if (newSword)
  82.         {
  83.             Adrenalin.In.OffAllParticlesBasicSword();
  84.             sword.particles.SetActive(true);
  85.             scale = skeletonRenderer.skeletonDataAsset.scale;
  86.             var newRegionAttachment = sword.sprite.ToRegionAttachment(sword.material); // Instantiates a Spine.RegionAttachment based on UnityEngine.Sprite data.
  87.             newRegionAttachment.X = sword.newRegionAttachmentX;
  88.             newRegionAttachment.Y = sword.newRegionAttachmentY;
  89.             newRegionAttachment.UpdateOffset();
  90.             slot.Attachment = newRegionAttachment;
  91.  
  92.             /// если мы заменяем старый меч на новый таким вариантом -
  93.             // slot.Attachment = originalAttachment.GetRemappedClone(region, true, false, scale); // меч будет в плохих пропорциях по скейлам. Не ровное соотношение высоты и ширины будет увеличиваться
  94.             /// короткий вариант установки в слот другой регион
  95.             //skeletonRenderer.skeleton.SetAttachment("sword", regionAttachmentFromSprite);
  96.  
  97.         }
  98.         else // стандратное базовое оружие
  99.         {
  100.             Adrenalin.In.ResetParticlesBasicSword();
  101.             sword.particles.SetActive(false);
  102.             scale = skeletonRenderer.skeletonDataAsset.scale;
  103.             region = atlasK.FindRegion("sword");
  104.             var newRegionAttachment = region.ToRegionAttachment(region.name, scale);
  105.             slot.Attachment = originalAttachment.GetRemappedClone(region, true, false, scale);
  106.  
  107.             /// если мы возвращаем меч вариантом  -
  108.             //var newRegionAttachment = region.ToRegionAttachment(region.name, scale);        
  109.             //slot.Attachment = newRegionAttachment;
  110.             /// тогда меч будет в неправильных позициях в руке.
  111.         }
  112.     }
  113.  
  114.     public virtual void Activate() // -> Knight - ивент анимации атаки.Кадр попадания мечом.
  115.     { // вызываем одинаковое поведение для всех мечей
  116.         if(sword == null) // ударяем базовым мечом(не исп. джойстик мечей)
  117.             GameData.In.zombie.GetComponent<Zombie>().ChangeHp(-1);
  118.         else
  119.         {
  120.             sword.Activate(); // вызываем поведение меча
  121.             GameData.In.zombie.GetComponent<Zombie>().ChangeHp(-6);
  122.             Time.timeScale = 1f;
  123.             trackK = GameData.In.knight.state.GetCurrent(0);
  124.             activated = true;
  125.         }
  126.     }
  127.  
  128.     private void Update()
  129.     {
  130.         if(activated)
  131.         {
  132.             if(trackK.AnimationTime > 0.99f)
  133.             {
  134.                 ReturnBasicSword();
  135.                 GameData.In.knight.state.SetAnimation(0, GameData.In.idleK, true);
  136.                 activated = false;
  137.                 sword = null;
  138.             }
  139.         }
  140.     }
  141. }
  142.  
  143. public class AdrenalinSword : Sword
  144. {
  145.     private void Awake()
  146.     {
  147.         InitDerivedObject();
  148.         newRegionAttachmentX = 1.9f;
  149.         newRegionAttachmentY = 0;
  150.     }
  151.  
  152.     public override void Activate()
  153.     {
  154.         Adrenalin.In.SetMaxLvl();
  155.     }
  156. }
  157.  
  158. public class FreezeSword : Sword
  159. {
  160.     private MaterialPropertyBlock block;
  161.     private Color newTintColor;
  162.     private Color newDarkColor;
  163.  
  164.     private void Awake()
  165.     {
  166.         InitDerivedObject();
  167.         newRegionAttachmentX = 1.9f;
  168.         newRegionAttachmentY = 0;
  169.         block = new MaterialPropertyBlock();
  170.     }
  171.  
  172.     public override void Activate()
  173.     {
  174.         particles.transform.GetChild(0).gameObject.SetActive(true);
  175.         GameData.In.zombie.GetComponent<Zombie>().enabled = false;
  176.         ColorUtility.TryParseHtmlString("#008FFF", out newTintColor);
  177.         ColorUtility.TryParseHtmlString("#83F9FF", out newDarkColor);
  178.         block.SetColor("_Color", newTintColor);
  179.         block.SetColor("_Black", newDarkColor);
  180.         GameData.In.zombie.GetComponent<MeshRenderer>().SetPropertyBlock(block);
  181.         GameData.In.zombie.timeScale = 0;
  182.         Invoke("UnActivate", 2);
  183.     }
  184.  
  185.     private void UnActivate()
  186.     {
  187.         particles.transform.GetChild(0).gameObject.SetActive(false);
  188.         GameData.In.zombie.GetComponent<Zombie>().enabled = true;
  189.         block.SetColor("_Color", Color.white);
  190.         block.SetColor("_Black", Color.black);
  191.         GameData.In.zombie.GetComponent<MeshRenderer>().SetPropertyBlock(block);
  192.         GameData.In.zombie.timeScale = 0.5f;
  193.     }
  194. }
RAW Paste Data