Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using Spine;
- using Spine.Unity.AttachmentTools;
- using Spine.Unity;
- using System;
- public class Sword : MonoBehaviour
- {
- public static Sword In;
- [SpineSlot] [SerializeField] private string slotName = default;
- [SerializeField] private SpineAtlasAsset atlasAssetK = default;
- private Atlas atlasK;
- private SkeletonRenderer skeletonRenderer;
- private float scale;
- private Attachment originalAttachment;
- private Slot slot;
- private Sword sword;
- private bool activated;
- private TrackEntry trackK;
- protected float newRegionAttachmentX;
- protected float newRegionAttachmentY;
- protected Material material;
- protected Sprite sprite;
- protected GameObject particles;
- public Sword Get()
- {
- return sword;
- }
- public void Set(string nameSword) // -> UIData - PressButtonAttackNewWeapon() = кнопка активировании меча.)
- {
- sword = (Sword)GetComponent(Type.GetType(nameSword));
- SetupAttack();
- }
- private void SetupAttack()
- {
- Time.timeScale = 0.3f / GameData.In.knight.timeScale; // чтобы всегда было ровное одинаковое замедление при любых скоростях анимации
- GameData.In.knight.state.SetAnimation(0, GameData.In.attackK, false);
- TrackEntry te = GameData.In.knight.state.GetCurrent(0); // изначально у неё должно быть timeScale = 0;
- te.AnimationStart = 0.36f;
- Change(true);
- }
- private void ReturnBasicSword()
- {
- Change(false); // поменять на обратный базовый меч
- GameFieldRules.In.ParryShield = false;
- GameData.In.zombie.GetComponent<Zombie>().LaunchAttackAgain();
- }
- private void Awake()
- {
- print("Awake");
- In = this;
- skeletonRenderer = GetComponent<SkeletonRenderer>();
- atlasK = atlasAssetK.GetAtlas();
- slot = skeletonRenderer.Skeleton.FindSlot(slotName);
- originalAttachment = slot.Attachment;
- gameObject.AddComponent<AdrenalinSword>(); // после выполнения этой строчки вызывается Awake производного типа класса - AdrenalinSword.
- gameObject.AddComponent<FreezeSword>(); // после выполнения этой строчки вызывается Awake производного типа класса - FreezeSword.
- }
- protected void InitDerivedObject() // это инициализация не нужна базовому классу. У базового класса эти поля null. Этот метод в базовом классе потому что он одинакого обобщённый для всех производных классов
- {
- string nameSword = GetType().ToString();
- material = Resources.Load<Material>(nameSword);
- sprite = Resources.Load<Sprite>(nameSword);
- particles = Instantiate(Resources.Load<GameObject>(nameSword), transform);
- particles.GetComponent<BoneFollower>().SkeletonRenderer = GetComponent<SkeletonRenderer>();
- }
- private void Change(bool newSword)
- {
- if (!skeletonRenderer.valid) return;
- AtlasRegion region;
- if (newSword)
- {
- Adrenalin.In.OffAllParticlesBasicSword();
- sword.particles.SetActive(true);
- scale = skeletonRenderer.skeletonDataAsset.scale;
- var newRegionAttachment = sword.sprite.ToRegionAttachment(sword.material); // Instantiates a Spine.RegionAttachment based on UnityEngine.Sprite data.
- newRegionAttachment.X = sword.newRegionAttachmentX;
- newRegionAttachment.Y = sword.newRegionAttachmentY;
- newRegionAttachment.UpdateOffset();
- slot.Attachment = newRegionAttachment;
- /// если мы заменяем старый меч на новый таким вариантом -
- // slot.Attachment = originalAttachment.GetRemappedClone(region, true, false, scale); // меч будет в плохих пропорциях по скейлам. Не ровное соотношение высоты и ширины будет увеличиваться
- /// короткий вариант установки в слот другой регион
- //skeletonRenderer.skeleton.SetAttachment("sword", regionAttachmentFromSprite);
- }
- else // стандратное базовое оружие
- {
- Adrenalin.In.ResetParticlesBasicSword();
- sword.particles.SetActive(false);
- scale = skeletonRenderer.skeletonDataAsset.scale;
- region = atlasK.FindRegion("sword");
- var newRegionAttachment = region.ToRegionAttachment(region.name, scale);
- slot.Attachment = originalAttachment.GetRemappedClone(region, true, false, scale);
- /// если мы возвращаем меч вариантом -
- //var newRegionAttachment = region.ToRegionAttachment(region.name, scale);
- //slot.Attachment = newRegionAttachment;
- /// тогда меч будет в неправильных позициях в руке.
- }
- }
- public virtual void Activate() // -> Knight - ивент анимации атаки.Кадр попадания мечом.
- { // вызываем одинаковое поведение для всех мечей
- if(sword == null) // ударяем базовым мечом(не исп. джойстик мечей)
- GameData.In.zombie.GetComponent<Zombie>().ChangeHp(-1);
- else
- {
- sword.Activate(); // вызываем поведение меча
- GameData.In.zombie.GetComponent<Zombie>().ChangeHp(-6);
- Time.timeScale = 1f;
- trackK = GameData.In.knight.state.GetCurrent(0);
- activated = true;
- }
- }
- private void Update()
- {
- if(activated)
- {
- if(trackK.AnimationTime > 0.99f)
- {
- ReturnBasicSword();
- GameData.In.knight.state.SetAnimation(0, GameData.In.idleK, true);
- activated = false;
- sword = null;
- }
- }
- }
- }
- public class AdrenalinSword : Sword
- {
- private void Awake()
- {
- InitDerivedObject();
- newRegionAttachmentX = 1.9f;
- newRegionAttachmentY = 0;
- }
- public override void Activate()
- {
- Adrenalin.In.SetMaxLvl();
- }
- }
- public class FreezeSword : Sword
- {
- private MaterialPropertyBlock block;
- private Color newTintColor;
- private Color newDarkColor;
- private void Awake()
- {
- InitDerivedObject();
- newRegionAttachmentX = 1.9f;
- newRegionAttachmentY = 0;
- block = new MaterialPropertyBlock();
- }
- public override void Activate()
- {
- particles.transform.GetChild(0).gameObject.SetActive(true);
- GameData.In.zombie.GetComponent<Zombie>().enabled = false;
- ColorUtility.TryParseHtmlString("#008FFF", out newTintColor);
- ColorUtility.TryParseHtmlString("#83F9FF", out newDarkColor);
- block.SetColor("_Color", newTintColor);
- block.SetColor("_Black", newDarkColor);
- GameData.In.zombie.GetComponent<MeshRenderer>().SetPropertyBlock(block);
- GameData.In.zombie.timeScale = 0;
- Invoke("UnActivate", 2);
- }
- private void UnActivate()
- {
- particles.transform.GetChild(0).gameObject.SetActive(false);
- GameData.In.zombie.GetComponent<Zombie>().enabled = true;
- block.SetColor("_Color", Color.white);
- block.SetColor("_Black", Color.black);
- GameData.In.zombie.GetComponent<MeshRenderer>().SetPropertyBlock(block);
- GameData.In.zombie.timeScale = 0.5f;
- }
- }
RAW Paste Data