Dog.cs 5.9 KB

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