ItemDragManager.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using UnityEngine.EventSystems;
  6. namespace SoftKitty.InventoryEngine
  7. {
  8. /// <summary>
  9. /// This module is used to drag items around.
  10. /// </summary>
  11. public class ItemDragManager : MonoBehaviour
  12. {
  13. #region Variables
  14. public static bool isDragging = false;
  15. public static Vector3 DropPos;
  16. public ItemIcon DragItem;
  17. public RectTransform Rect;
  18. private static ItemDragManager instance;
  19. public static ItemIcon DraggingSource;
  20. public static bool DropReceived = true;
  21. public static bool SplitMode = false;
  22. public static InventoryStack SplitData;
  23. private bool playingDeleteAnimation = false;
  24. private float dropSpeed = 9.8F;
  25. private float rotateSpeed = 90F;
  26. #endregion
  27. #region MonoBehaviour
  28. void Start()
  29. {
  30. DragItem.Fav.GetComponent<Image>().color = InventorySkin.instance.FavoriteColor;
  31. }
  32. void Update()
  33. {
  34. if (playingDeleteAnimation)
  35. {
  36. dropSpeed += 100F * Time.deltaTime;
  37. if (DragItem.transform.position.y > -2000F)
  38. {
  39. DragItem.transform.position += Vector3.down * 120F * dropSpeed * Time.deltaTime;
  40. DragItem.transform.localEulerAngles = new Vector3(0F, 0F, DragItem.transform.localEulerAngles.z + Time.deltaTime * rotateSpeed);
  41. }
  42. else
  43. {
  44. Destroy(gameObject);
  45. }
  46. return;
  47. }
  48. else
  49. {
  50. dropSpeed = 9.8F;
  51. }
  52. if (isDragging)
  53. {
  54. if (!DragItem.gameObject.activeSelf) DragItem.gameObject.SetActive(true);
  55. DragItem.Rect.position = TransferPos(InputProxy.mousePosition, Rect, GetComponentInParent<Canvas>().renderMode== RenderMode.ScreenSpaceCamera? GetComponentInParent<Canvas>().worldCamera:null);
  56. if (InputProxy.GetMouseButtonUp(0))
  57. {
  58. EndDrag();
  59. }
  60. }
  61. else
  62. {
  63. if (DragItem.gameObject.activeSelf) DragItem.gameObject.SetActive(false);
  64. }
  65. }
  66. #endregion
  67. #region Internal Methods
  68. public void BeginPlayDeleteAnimation(InventoryItem _source, Vector3 _pos, int _overrideNum)
  69. {
  70. DragItem.SetAppearance(_source.StackData.Item.icon, _source.StackData.Item.GetTypeColor(), _source.StackData.Item.GetQualityColor(), true, true);
  71. DragItem.SetUpgradeLevel(_source.StackData.Item.upgradeLevel);
  72. DragItem.SetItemNumber(_overrideNum != 0 ? _overrideNum : _source.StackData.Number);
  73. DragItem.SetFavorate(_source.Fav.activeSelf);
  74. DragItem.transform.position = _pos;
  75. DragItem.transform.localScale = Vector3.one * InventorySkin.instance.InventorySlotScale;
  76. DragItem.gameObject.SetActive(true);
  77. rotateSpeed = Random.Range(-180F, 180F);
  78. playingDeleteAnimation = true;
  79. SoundManager.Play2D("ItemDelete");
  80. }
  81. public void BeginDrag(ItemIcon _source, int _overrideNum)
  82. {
  83. playingDeleteAnimation = false;
  84. DragItem.transform.localEulerAngles = Vector3.zero;
  85. DragItem.transform.localScale = Vector3.one * InventorySkin.instance.InventorySlotScale;
  86. if (EventSystem.current != null) EventSystem.current.SetSelectedGameObject(DragItem.gameObject);
  87. if (_overrideNum != 0)
  88. {
  89. SplitData = _source.GetStackData().Split(_overrideNum);
  90. DragItem.SetAppearance(SplitData.Item.icon, SplitData.Item.GetTypeColor(), SplitData.Item.GetQualityColor(), true, true);
  91. DragItem.SetUpgradeLevel(SplitData.Item.upgradeLevel);
  92. DragItem.SetItemNumber(SplitData.Number);
  93. }
  94. else
  95. {
  96. DragItem.SetAppearance(_source.GetItem().icon, _source.GetItem().GetTypeColor(), _source.GetItem().GetQualityColor(), true, true);
  97. DragItem.SetUpgradeLevel(_source.GetItem().upgradeLevel);
  98. DragItem.SetItemNumber(_source.GetNumber());
  99. }
  100. DragItem.SetFavorate(_source.Fav.activeSelf);
  101. DraggingSource = _source;
  102. DraggingSource.ToggleOutline(true);
  103. SoundManager.Play2D("ItemDrag");
  104. }
  105. private void EndDrag()
  106. {
  107. DropPos = DragItem.transform.position;
  108. DraggingSource.ToggleOutline(false);
  109. DropReceived = false;
  110. isDragging = false;
  111. DraggingSource.EndDrag(SplitMode ? SplitData.Number : 0);
  112. SoundManager.Play2D("ItemDrop");
  113. Destroy(gameObject);
  114. }
  115. #endregion
  116. /// <summary>
  117. /// Wehther the system is visible, meaning wehther something being dragged.
  118. /// </summary>
  119. /// <returns></returns>
  120. public static bool isVisible()
  121. {
  122. return instance!=null && (isDragging || !DropReceived);
  123. }
  124. /// <summary>
  125. /// Plays the delete animation for an item icon, causing the icon to fall to the bottom of the screen.
  126. /// </summary>
  127. /// <param name="_source"></param>
  128. /// <param name="_pos"></param>
  129. /// <param name="_overrideNum"></param>
  130. public static void PlayDeleteAnimation(InventoryItem _source,Vector3 _pos, int _overrideNum = 0)
  131. {
  132. if (instance == null)
  133. {
  134. GameObject newObj = Instantiate(Resources.Load<GameObject>("InventoryEngine/ItemDragManager"), WindowsManager.GetMainCanvas(_source.gameObject).transform);
  135. newObj.transform.SetAsLastSibling();
  136. newObj.transform.localPosition = Vector3.zero;
  137. newObj.transform.localScale = Vector3.one;
  138. instance = newObj.GetComponent<ItemDragManager>();
  139. }
  140. instance.BeginPlayDeleteAnimation(_source, _pos, _overrideNum);
  141. }
  142. /// <summary>
  143. /// Starts dragging an item. After the drag-and-drop action, the _source will be called by EndDrag().
  144. /// </summary>
  145. /// <param name="_source"></param>
  146. /// <param name="_rect"></param>
  147. /// <param name="_overrideNum"></param>
  148. public static void StartDragging(ItemIcon _source, RectTransform _rect,int _overrideNum=0)
  149. {
  150. if (instance == null)
  151. {
  152. GameObject newObj = Instantiate(Resources.Load<GameObject>("InventoryEngine/ItemDragManager"), WindowsManager.GetMainCanvas(_rect.gameObject).transform);
  153. newObj.transform.SetAsLastSibling();
  154. newObj.transform.localPosition = Vector3.zero;
  155. newObj.transform.localScale = Vector3.one;
  156. instance = newObj.GetComponent<ItemDragManager>();
  157. }
  158. SplitMode = (_overrideNum>0);
  159. instance.BeginDrag(_source, _overrideNum);
  160. DropPos = _source.transform.position;
  161. isDragging = true;
  162. }
  163. /// <summary>
  164. /// Transfrom mouse position to rect position.
  165. /// </summary>
  166. /// <param name="_pos"></param>
  167. /// <param name="_parentTransform"></param>
  168. /// <param name="_camera"></param>
  169. /// <returns></returns>
  170. public static Vector3 TransferPos(Vector3 _pos, RectTransform _parentTransform,Camera _camera)
  171. {
  172. Vector2 localPosition = Vector2.zero;
  173. RectTransformUtility.ScreenPointToLocalPointInRectangle(
  174. _parentTransform,
  175. _pos,
  176. _camera,
  177. out localPosition);
  178. return _parentTransform.TransformPoint(localPosition);
  179. }
  180. }
  181. }