SphereShotTarget.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. namespace ShotSimulator.Target
  6. {
  7. public enum ReduceHealthTriggerType
  8. {
  9. None, //不扣除
  10. OnHovering, //悬停中
  11. OnClick, //点击
  12. }
  13. public enum ReduceHealthType
  14. {
  15. Per,
  16. Time
  17. }
  18. public enum MotionType
  19. {
  20. None,
  21. Foreach,
  22. PingPong
  23. }
  24. public class SphereShotTarget : BaseShotTarget
  25. {
  26. #region Health
  27. private ReduceHealthTriggerType m_ReduceHealthTriggerType;
  28. private ReduceHealthType m_ReduceHealthType;
  29. private float maxHealth;
  30. private float curHealth;
  31. public float CurHealth
  32. {
  33. get { return curHealth; }
  34. set
  35. {
  36. curHealth = value;
  37. if (CurHealth > 1)
  38. {
  39. healthBarImage.color = new Color(0, 1, 1);
  40. }
  41. else
  42. {
  43. healthBarImage.color = Color.red;
  44. }
  45. healthBar.value = curHealth / maxHealth;
  46. }
  47. }
  48. [SerializeField]
  49. private Slider healthBar;
  50. public Image healthBarImage;
  51. private bool viewHealthBar;
  52. public bool ViewHealthBar
  53. {
  54. get { return viewHealthBar; }
  55. set
  56. {
  57. viewHealthBar = value;
  58. healthBar.gameObject.SetActive(viewHealthBar);
  59. }
  60. }
  61. #endregion
  62. #region Color
  63. [SerializeField]
  64. private MeshRenderer meshRenderer;
  65. [SerializeField]
  66. public Color defaultColor;
  67. [SerializeField]
  68. public Color onClickColor;
  69. [SerializeField]
  70. public Color onHoveringColor;
  71. public bool onClickCanChangeColor;
  72. public bool onHoveringCanChangeColor;
  73. #endregion
  74. #region Method
  75. public void Init(float maxHealth, ReduceHealthTriggerType rgtType, bool viewHealthBar, ReduceHealthType reduceHealthType, MotionType mType, Vector3 origin, List<Vector3> pos = null, float speed = 5)
  76. {
  77. this.maxHealth = maxHealth;
  78. CurHealth = this.maxHealth;
  79. m_ReduceHealthType = reduceHealthType;
  80. m_ReduceHealthTriggerType = rgtType;
  81. this.ViewHealthBar = viewHealthBar;
  82. m_MotionType = mType;
  83. gameObject.transform.position = origin;
  84. targetPositions.Clear();
  85. if (pos != null)
  86. {
  87. targetPositions.AddRange(pos);
  88. }
  89. //meshRenderer.material.SetColor("Color", defaultColor);
  90. meshRenderer.material.color = defaultColor;
  91. this.speed = speed;
  92. }
  93. private void TriggerReduceHealth(ReduceHealthTriggerType type)
  94. {
  95. if (type != ReduceHealthTriggerType.None && m_ReduceHealthTriggerType == type)
  96. {
  97. switch (m_ReduceHealthType)
  98. {
  99. case ReduceHealthType.Per:
  100. CurHealth--;
  101. break;
  102. case ReduceHealthType.Time:
  103. CurHealth -= Time.deltaTime;
  104. break;
  105. }
  106. }
  107. }
  108. #endregion
  109. #region Motion
  110. private MotionType m_MotionType;
  111. private List<Vector3> targetPositions = new List<Vector3>();
  112. public int curTargetPosIndex;
  113. private float speed;
  114. #endregion
  115. #region Interactive
  116. public override void OnClick()
  117. {
  118. if (!IsRunning) return;
  119. base.OnClick();
  120. if (onClickCanChangeColor)
  121. {
  122. meshRenderer.material.color = onClickColor;
  123. }
  124. //SoundManager.GetInstance().PlaySoundEffect("Audio/音效/aimlab击中音效3", false);
  125. TriggerReduceHealth(ReduceHealthTriggerType.OnClick);
  126. }
  127. public override void OnEnter()
  128. {
  129. if (!IsRunning) return;
  130. base.OnEnter();
  131. if (onHoveringCanChangeColor)
  132. {
  133. meshRenderer.material.color = onHoveringColor;
  134. }
  135. }
  136. public override void OnExit()
  137. {
  138. if (!IsRunning) return;
  139. base.OnExit();
  140. if (onHoveringCanChangeColor)
  141. {
  142. meshRenderer.material.color = defaultColor;
  143. }
  144. }
  145. public override void OnHovering()
  146. {
  147. if (!IsRunning) return;
  148. base.OnHovering();
  149. TriggerReduceHealth(ReduceHealthTriggerType.OnHovering);
  150. }
  151. #endregion
  152. #region Unity
  153. public override void FixedUpdate()
  154. {
  155. if (!IsRunning || m_MotionType == MotionType.None) return;
  156. base.FixedUpdate();
  157. PingPongUpdate();
  158. }
  159. private void PingPongUpdate()
  160. {
  161. float dis = Vector3.Distance(transform.position, targetPositions[curTargetPosIndex]);
  162. if (dis <= 0.01)
  163. {
  164. curTargetPosIndex++;
  165. if (curTargetPosIndex >= targetPositions.Count)
  166. {
  167. curTargetPosIndex = 0;
  168. targetPositions.Reverse();
  169. }
  170. }
  171. //transform.position = Vector3.Lerp(transform.position, targetPositions[curTargetPosIndex], speed * Time.deltaTime);
  172. transform.position = Vector3.MoveTowards(transform.position, targetPositions[curTargetPosIndex], speed * Time.fixedDeltaTime);
  173. }
  174. #endregion
  175. private void OnDestroy()
  176. {
  177. if (curHealth <= 0)
  178. {
  179. GameObject brokenObj = Instantiate(Resources.Load<GameObject>("Prefabs/Broken"), transform.position, transform.rotation);
  180. brokenObj.transform.localScale = meshRenderer.transform.localScale;
  181. brokenObj.GetComponent<SkinnedMeshRenderer>().material.color = defaultColor;
  182. Destroy(brokenObj, 7);
  183. }
  184. }
  185. }
  186. }