InteractionInterface.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. namespace HQFPSWeapons.UserInterface
  5. {
  6. public class InteractionInterface : UserInterfaceBehaviour
  7. {
  8. [BHeader("GENERAL", true)]
  9. [SerializeField]
  10. private Animator m_MainAnimator = null;
  11. [SerializeField]
  12. private Animator m_SwapAnimator = null;
  13. [Space]
  14. [SerializeField]
  15. private Text m_MainText = null;
  16. [Space]
  17. [SerializeField]
  18. [Group]
  19. private WeaponSwappingModule m_WeaponSwapping = new WeaponSwappingModule();
  20. private RaycastData m_RaycastData;
  21. private ItemPickup m_ItemPickup;
  22. public override void OnPostAttachment()
  23. {
  24. Player.RaycastData.AddChangeListener(OnPlayerRaycastChanged);
  25. Player.EquippedItem.AddChangeListener(ChangeVisibilityOfSwapIcon);
  26. }
  27. private void OnPlayerRaycastChanged(RaycastData raycastData)
  28. {
  29. bool show = raycastData != null && raycastData.IsInteractive;
  30. m_RaycastData = raycastData;
  31. if (show)
  32. {
  33. m_MainAnimator.SetBool("Show", true);
  34. if (m_WeaponSwapping.SwapIcon != null)
  35. {
  36. bool enableSwapUI = false;
  37. m_MainText.text = m_RaycastData.InteractiveObject.InteractionText;
  38. // Current item
  39. SaveableItem currentItem = Player.EquippedItem.Get();
  40. if (currentItem != null && Player.ItemIsSwappable.Try(currentItem))
  41. {
  42. // Detected item
  43. ItemPickup pickup = m_RaycastData.InteractiveObject as ItemPickup;
  44. //Make sure the item is swappable and check if the inventory is full
  45. enableSwapUI = pickup != null && Player.ItemIsSwappable.Try(pickup.ItemInstance) &&
  46. Player.Inventory.GetContainerWithFlags(pickup.TargetContainers).ContainerIsFull();
  47. if (enableSwapUI)
  48. {
  49. m_ItemPickup = pickup;
  50. m_ItemPickup.NeedToSwap = true;
  51. m_WeaponSwapping.EquippedItemImg.sprite = Player.EquippedItem.Val.Data.Icon;
  52. m_WeaponSwapping.GroundItemImg.sprite = m_ItemPickup.ItemInstance.Data.Icon;
  53. }
  54. }
  55. EnableSwapUI(enableSwapUI);
  56. }
  57. }
  58. else
  59. {
  60. m_MainAnimator.SetBool("Show", false);
  61. m_SwapAnimator.SetBool("Show", false);
  62. if (m_ItemPickup != null)
  63. {
  64. m_ItemPickup.NeedToSwap = false;
  65. m_ItemPickup = null;
  66. }
  67. }
  68. }
  69. private void ChangeVisibilityOfSwapIcon(SaveableItem item)
  70. {
  71. bool enable = (item != null);
  72. if(enable)
  73. m_WeaponSwapping.EquippedItemImg.sprite = item.Data.Icon;
  74. if(Player.RaycastData != null)
  75. EnableSwapUI(enable);
  76. }
  77. private void Update()
  78. {
  79. if (m_ItemPickup != null)
  80. UpdateSwapFill(m_ItemPickup.InterractionProgress);
  81. }
  82. private void EnableSwapUI(bool enable)
  83. {
  84. if (Player.RaycastData.Val != null)
  85. {
  86. if (Player.RaycastData.Val.IsInteractive)
  87. {
  88. m_MainAnimator.SetBool("Show", !enable);
  89. m_SwapAnimator.SetBool("Show", enable);
  90. }
  91. }
  92. else
  93. {
  94. m_MainAnimator.SetBool("Show", false);
  95. m_SwapAnimator.SetBool("Show", false);
  96. }
  97. if (m_ItemPickup != null && enable == false)
  98. m_ItemPickup.NeedToSwap = false;
  99. }
  100. private void UpdateSwapFill(float amount)
  101. {
  102. m_WeaponSwapping.SwapIcon.fillAmount = amount * (1 / m_ItemPickup.SwapTime);
  103. }
  104. #region Internal
  105. #pragma warning disable 0649
  106. [Serializable]
  107. private struct WeaponSwappingModule
  108. {
  109. public Image SwapIcon;
  110. public Image EquippedItemImg;
  111. public Image GroundItemImg;
  112. }
  113. #endregion
  114. }
  115. }