Dog.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using DG.Tweening;
  5. namespace DuckHunter
  6. {
  7. public class Dog : MonoBehaviour
  8. {
  9. public static Dog Instance;
  10. private RectTransform _rectTransform;
  11. DragonBones.UnityArmatureComponent armature;
  12. private Transform leftHand;
  13. private Transform rightHand;
  14. private Transform[] objectInHands = { null, null, null };
  15. static Vector2 DefaultAanchoredPosition = Vector2.down * 100;
  16. void Start()
  17. {
  18. Instance = this;
  19. armature = GetComponentInChildren<DragonBones.UnityArmatureComponent>();
  20. armature.AddEventListener(DragonBones.EventObject.COMPLETE, OnAnimationEventHandler);
  21. _rectTransform = transform as RectTransform;
  22. _rectTransform.anchoredPosition = DefaultAanchoredPosition;
  23. PlayIdle();
  24. //生成左右手掌的节点,用于拿起鸭子
  25. var lo = new GameObject();
  26. lo.transform.SetParent(transform.Find("dog/shoubi3"));
  27. leftHand = lo.transform;
  28. leftHand.localPosition = new Vector3(-0.332f, 0.251f);
  29. var ro = new GameObject();
  30. ro.transform.SetParent(transform.Find("dog/shoubi4"));
  31. rightHand = ro.transform;
  32. rightHand.localPosition = new Vector3(0.332f, 0.251f);
  33. }
  34. private void OnAnimationEventHandler(string type, DragonBones.EventObject eventObject)
  35. {
  36. // PlayIdle();
  37. // Debug.Log(string.Format("animationName:{0},eventType:{1},eventName:{2}", eventObject.animationState.name, type, eventObject.name));
  38. }
  39. void OnDestroy()
  40. {
  41. if (Instance == this) Instance = null;
  42. }
  43. void Update()
  44. {
  45. if (objectInHands[0]) objectInHands[0].position = leftHand.position;
  46. if (objectInHands[1]) objectInHands[1].position = rightHand.position;
  47. }
  48. void PlayIdle()
  49. {
  50. PlayAnimation("idle");
  51. }
  52. void PlayChaoFeng()
  53. {
  54. PlayAnimation("chaofeng");
  55. }
  56. void PlayKaiXin()
  57. {
  58. PlayAnimation("kaixin");
  59. }
  60. string _lastAnimationName = null;
  61. void PlayAnimation(string animationName)
  62. {
  63. if (animationName == _lastAnimationName) return;
  64. _lastAnimationName = animationName;
  65. if (animationName == "idle")
  66. {
  67. armature.animation.GotoAndStopByProgress("chaofeng", 0);
  68. return;
  69. }
  70. if (animationName == "chaofeng")
  71. {
  72. armature.animation.Play(animationName, 0);
  73. AudioManager.Instance.PlayDogTaunt(gameObject);
  74. }
  75. if (animationName == "kaixin")
  76. {
  77. armature.animation.Play(animationName, 0);
  78. AudioManager.Instance.PlayDogHappy(gameObject);
  79. }
  80. }
  81. [System.NonSerialized] public bool isShowing = false;
  82. void Show()
  83. {
  84. isShowing = true;
  85. Vector3 myPos = _rectTransform.position;
  86. float topPointY = transform.parent.Find("TopCenterPoint").position.y;
  87. RaycastHit2D[] hits = Physics2D.RaycastAll(new Vector2(myPos.x, topPointY), Vector2.down);
  88. foreach (var item in hits)
  89. {
  90. if (item.collider.name == "BottomCollider")
  91. {
  92. _rectTransform.position = new Vector2(_rectTransform.position.x, item.point.y);
  93. break;
  94. }
  95. }
  96. _rectTransform.anchoredPosition += Vector2.down * 170;
  97. float startAnchoredPositionY = _rectTransform.anchoredPosition.y;
  98. //_rectTransform.anchoredPosition = new Vector2(_rectTransform.anchoredPosition.x, 30);
  99. Sequence sequence = DOTween.Sequence();
  100. sequence.Append(_rectTransform.DOAnchorPosY(startAnchoredPositionY + 145, 0.5f));
  101. sequence.AppendInterval(0.5f);
  102. sequence.Append(_rectTransform.DOAnchorPosY(startAnchoredPositionY, 0.5f));
  103. sequence.AppendCallback(() =>
  104. {
  105. isShowing = false;
  106. if (_lastAnimationName == "kaixin") ClearObjectInHands();
  107. _rectTransform.anchoredPosition = DefaultAanchoredPosition;
  108. PlayIdle();
  109. });
  110. }
  111. int _handleDuckCount = 0;
  112. bool _needKaixin = false;
  113. public void OnEvent(SensitiveEventType eventType, params object[] args)
  114. {
  115. _handleDuckCount++;
  116. if (eventType == SensitiveEventType.DuckHit)
  117. {
  118. _needKaixin = true;
  119. Duck duck = args[0] as Duck;
  120. AddDuckToHands(duck);
  121. //把狗弄到鸟下落的位置
  122. _rectTransform.position = new Vector2(duck.transform.position.x, 0);
  123. //避免狗太靠边
  124. //Vector3 lc = _rectTransform.localPosition;
  125. //float pw = (_rectTransform.parent as RectTransform).rect.width;
  126. //float minX = -pw / 2 + 200;
  127. //float maxX = pw / 2 - 200;
  128. //if (lc.x < minX) lc.x = minX;
  129. //else if (lc.x > maxX) lc.x = maxX;
  130. //_rectTransform.localPosition = lc;
  131. float xMin = _rectTransform.parent.Find("DogSideL").position.x;
  132. float xMax = _rectTransform.parent.Find("DogSideR").position.x;
  133. _rectTransform.position = new Vector2(Mathf.Clamp(_rectTransform.position.x, xMin, xMax), _rectTransform.position.y);
  134. }
  135. else if (eventType == SensitiveEventType.DuckGetAway)
  136. {
  137. }
  138. if (_handleDuckCount == GameManager.Instance.theDuckCountWaitingForDogHandle)
  139. {
  140. GameManager.Instance.theDuckCountWaitingForDogHandle = _handleDuckCount = 0;
  141. if (_needKaixin)
  142. {
  143. _needKaixin = false;
  144. PlayKaiXin();
  145. Show();
  146. }
  147. else
  148. {
  149. PlayChaoFeng();
  150. Show();
  151. }
  152. }
  153. }
  154. void AddDuckToHands(Duck duck)
  155. {
  156. for (int i = 0; i < objectInHands.Length; i++)
  157. {
  158. if (objectInHands[i]) continue;
  159. objectInHands[i] = duck.transform;
  160. duck.PlayDeadForDogHand(i == 0 ? -1 : 1);
  161. break;
  162. }
  163. }
  164. void ClearObjectInHands()
  165. {
  166. for (int i = 0; i < objectInHands.Length; i++)
  167. {
  168. if (!objectInHands[i]) continue;
  169. if (objectInHands[i].gameObject) Destroy(objectInHands[i].gameObject);
  170. objectInHands[i] = null;
  171. }
  172. }
  173. public enum SensitiveEventType
  174. {
  175. DuckHit,
  176. DuckGetAway,
  177. }
  178. }
  179. }