BreakObjHurt.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. using System;
  2. using System.Collections.Generic;
  3. using GameWorld;
  4. using LitJson;
  5. using UnityEngine;
  6. public class BreakObjHurt : MonoBehaviour
  7. {
  8. private void Start()
  9. {
  10. this.sprite = base.GetComponent<SpriteRenderer>();
  11. this.currentHP = this.HP;
  12. this.brokenFlag = false;
  13. this.cc3 = Camera.main.GetComponent<CameraController>();
  14. this.pAttr = R.Player.Attribute;
  15. if (this.breakType == BreakObjHurt.BreakType.SpAttack)
  16. {
  17. JsonData jsonData = JsonMapper.ToObject(this.spAttackText.text);
  18. if (jsonData["spAttack"].IsArray)
  19. {
  20. for (int i = 0; i < jsonData["spAttack"].Count; i++)
  21. {
  22. this.spAttack.Add(jsonData["spAttack"][i].ToString());
  23. }
  24. }
  25. }
  26. }
  27. private void OnEnable()
  28. {
  29. EventManager.RegisterEvent<EnemyHurtAtkEventArgs>("EnemyHurtAtk", new EventManager.FBEventHandler<EnemyHurtAtkEventArgs>(this.Hurt), EventManager.ListenerQueue.Game);
  30. }
  31. private void OnDisable()
  32. {
  33. EventManager.UnregisterEvent<EnemyHurtAtkEventArgs>("EnemyHurtAtk", new EventManager.FBEventHandler<EnemyHurtAtkEventArgs>(this.Hurt), EventManager.ListenerQueue.Game);
  34. }
  35. private void Update()
  36. {
  37. if (this.currentHP <= this.breakHp && !this.breakFlag)
  38. {
  39. this.breakFlag = true;
  40. this.sprite.sprite = this.ChooseSprite(this.breakSprite);
  41. }
  42. if (this.currentHP <= 0 && !this.brokenFlag)
  43. {
  44. this.sprite.sprite = this.ChooseSprite(this.brokenSprite);
  45. this.brokenFlag = true;
  46. this.Break();
  47. }
  48. }
  49. private bool Hurt(string eventName, object sender, EnemyHurtAtkEventArgs msg)
  50. {
  51. if (msg.hurted != base.gameObject)
  52. {
  53. return false;
  54. }
  55. BreakObjHurt.BreakType breakType = this.breakType;
  56. if (breakType != BreakObjHurt.BreakType.HitTimes)
  57. {
  58. if (breakType == BreakObjHurt.BreakType.SpAttack)
  59. {
  60. this.SpAttackHurt(msg.attackData, msg.hurtPos);
  61. }
  62. }
  63. else
  64. {
  65. this.HitTimeHurt(msg.attackData, msg.hurtPos);
  66. }
  67. return true;
  68. }
  69. private void HitTimeHurt(EnemyHurtAtkEventArgs.PlayerNormalAtkData atkData, Vector3 pos)
  70. {
  71. this.currentHP--;
  72. Vector3 pos2 = pos - base.transform.position;
  73. this.HitEffect(pos2);
  74. this.TimeFrozenAndCameraShake(atkData.frozenFrame, atkData.shakeType, atkData.camShakeFrame, atkData.shakeStrength);
  75. }
  76. private void SpAttackHurt(EnemyHurtAtkEventArgs.PlayerNormalAtkData atkData, Vector3 pos)
  77. {
  78. if (this.AvailableAttack(atkData.atkName))
  79. {
  80. this.HitTimeHurt(atkData, pos);
  81. }
  82. }
  83. private bool AvailableAttack(string atkName)
  84. {
  85. foreach (string b in this.spAttack)
  86. {
  87. if (atkName == b)
  88. {
  89. return true;
  90. }
  91. }
  92. return false;
  93. }
  94. private void Break()
  95. {
  96. this.hurtBox.enabled = false;
  97. }
  98. private Sprite ChooseSprite(Sprite[] sprite)
  99. {
  100. if (sprite.Length <= 0)
  101. {
  102. return null;
  103. }
  104. int num = UnityEngine.Random.Range(0, sprite.Length);
  105. return sprite[num];
  106. }
  107. protected void TimeFrozenAndCameraShake(int frozenFrame, int shakeType, int shakeFrame, float shakeOffset)
  108. {
  109. SingletonMono<WorldTime>.Instance.TimeFrozenByFixedFrame(frozenFrame, WorldTime.FrozenArgs.FrozenType.All, true);
  110. if (shakeType != 0)
  111. {
  112. if (shakeType != 1)
  113. {
  114. if (shakeType == 2)
  115. {
  116. this.cc3.CameraShake((float)shakeFrame / 60f, shakeOffset, CameraController.ShakeTypeEnum.Vertical, false);
  117. }
  118. }
  119. else
  120. {
  121. this.cc3.CameraShake((float)shakeFrame / 60f, shakeOffset, CameraController.ShakeTypeEnum.Horizon, false);
  122. }
  123. }
  124. else
  125. {
  126. this.cc3.CameraShake((float)shakeFrame / 60f, shakeOffset, CameraController.ShakeTypeEnum.Rect, false);
  127. }
  128. }
  129. protected void HitEffect(Vector3 pos)
  130. {
  131. R.Effect.Generate(1, base.transform, pos, Vector3.zero, default(Vector3), true);
  132. R.Effect.Generate(71, base.transform, pos + Vector3.right * (float)this.pAttr.faceDir * 0.5f, new Vector3(0f, (float)((this.pAttr.faceDir <= 0) ? 0 : 180), UnityEngine.Random.Range(-90f, 0f)), default(Vector3), true);
  133. R.Effect.Generate(151, base.transform, pos, Vector3.zero, default(Vector3), true);
  134. }
  135. [Header("破坏条件")]
  136. public BreakObjHurt.BreakType breakType;
  137. [Header("总血量")]
  138. public int HP;
  139. private int currentHP;
  140. [Header("破坏条件为特殊攻击时,记录特殊攻击名称,仅在条件为SpAttack时有效")]
  141. public TextAsset spAttackText;
  142. private List<string> spAttack = new List<string>();
  143. public Collider2D hurtBox;
  144. private bool brokenFlag;
  145. private bool breakFlag;
  146. private CameraController cc3;
  147. private PlayerAttribute pAttr;
  148. private SpriteRenderer sprite;
  149. [Header("损坏血量")]
  150. public int breakHp;
  151. [Header("损坏图片")]
  152. public Sprite[] breakSprite;
  153. [Header("破坏图片")]
  154. public Sprite[] brokenSprite;
  155. public enum BreakType
  156. {
  157. HitTimes,
  158. SpAttack
  159. }
  160. }