//********************************************************// // // // Copyright © All rights reserved. MyNameIsVoo. 2020. // // // // REPRODUCTION FORBIDEN // // // //********************************************************// using System; using UnityEngine; using UnityEngine.UI; using ICWM.HelperSystem; using ICWM.RenderSystem; namespace ICWM { namespace ToolTipSystem { [Serializable] public class ToolTipBase { #region Parameters public enum ToolTipMode { DINAMIC, STATIC } [ToolTipAttribute.Tooltip("Time after which the tooltip will appear.")] public float WaitForSecond = 0.5f; [ToolTipAttribute.Tooltip("Prefab default tooltip, which will be displayed in the inventory when we hover the mouse over the icon.")] public GameObject m_Tooltip; [ToolTipAttribute.Tooltip("Enable the display mode of the tooltip in the modding mode.")] public bool IsModdingToolTip = true; [ToolTipAttribute.Tooltip("Prefab modified tooltip, which will be displayed in modding mode when we hover the mouse on the object (model).")] public GameObject m_TooltipM; [ToolTipAttribute.Tooltip("Tooltip display mode (in modding mode).")] public ToolTipMode m_ToolTipMode = ToolTipMode.STATIC; [ToolTipAttribute.Tooltip("The maximum length of the ray (or the distance at which the ray is released) from the camera (or screen).")] public float maxDistance = 200.0f; // Максимальная длина луча (или дистанция, на которую выпускается луч) [ToolTipAttribute.Tooltip("Time after which the tooltip will disappear.")] public float WaitForDestroy = 15.0f; // Сколько времени ждать, чтобы удалить подсказку #endregion #region Attributes [HideInInspector] public GameObject tooltip; // Tooltip с которой мы работаем (копия оригинала) [HideInInspector] public GameObject currentItemWithTooltip; // Ссылка на GO у которого есть скрипт ToolTip [HideInInspector] public bool isStaticTooltipMod = false; // Для динамического режима флаг, что мы перешли в режим некой статики по нажатии кнопки М или какая там стоит [HideInInspector] public bool isActiveRaycastHit = false; [HideInInspector] public bool isActiveTooltip = false; private float deltaTime = 0.0f; // Счетчик для отключения подсказки private bool hitRaycast; // Флаг, что можно выпускать луч private bool hasCreatedTooltip = false; // Мы создали подсказку private bool keyPressFlag = false, wait = false; private RaycastHit lastReferenceHit = new RaycastHit(); // Ссылка на предыдущий GO private Vector2 screenCoef = Vector2.zero; #endregion #region PUBLIC #region Raycast public void ActivateRaycast() { //Посылаем луч от курсора на расстояние maxDistance перпендикулярно экрану if (Physics.Raycast(InventoryBase.instance.RenderCamera.ScreenPointToRay(Input.mousePosition), out RaycastHit hit, maxDistance)) { Debug.Log("1 = " + hit.transform.name); if (!hitRaycast && !wait) { DestroyTooltip(); hitRaycast = true; } if (hit.transform.CompareTag(InventoryBase.instance.inventoryTags.toolTipRaycastTag)) // Если в кого то попали с тегом Raycast { Debug.Log("1.1"); deltaTime = 0.0f; // Обнулим сччетчик времени (может быть не равен нулю на последующих итерациях) if (hit.transform != lastReferenceHit.transform) // Сравниваем старый с новым обектом { hitRaycast = false; // Если они не равны то удаляем подсказку и создадим новую на следующей итерации } lastReferenceHit = hit; // Запоминаем предыдущий объект - на следующей итерации будем сравнивать его с новым if (!hasCreatedTooltip) // Если не создана подсказка, то создаем { TooltipAction(hit.transform.gameObject); } else // { if (m_ToolTipMode == ToolTipMode.DINAMIC) { if (Input.GetKeyDown(InventoryInputSystem.instance.tooltipModeKey)) // Если нажата кнопка для редактирования содержимого { if (!keyPressFlag) // Если нажимаем первый раз { keyPressFlag = true; // Говорим, что это первый раз isStaticTooltipMod = true; // Включаем статический режим } else // Если второй раз (т.е. выключаем) { keyPressFlag = false; // Говорим, что мы выключаем isStaticTooltipMod = false; // Отключаем статический режим } } if (!isStaticTooltipMod) UpdatePositionTooltip(); // Обновляем позицию одсказки } else if (m_ToolTipMode == ToolTipMode.STATIC) { if (!tooltip) { DestroyTooltip(); } else { wait = true; deltaTime += Time.deltaTime; if (deltaTime >= WaitForDestroy) DestroyTooltip(); } } } } } else // Если что? { Debug.Log("2"); if (tooltip) // { deltaTime += Time.deltaTime; if (deltaTime >= WaitForDestroy) DestroyTooltip(); } } } #endregion #region Searching public void SeachMeshRenderer(int mode) { if (WeaponRender.instance.CL != null) { Component[] p = WeaponRender.instance.vspModel.GetComponentsInChildren(typeof(Transform), true); if (p != null) { foreach (Transform n in p) { if (mode == 0) { if (n.GetComponent() || n.GetComponent()) { n.gameObject.AddComponent(); // MeshCollider n.transform.tag = InventoryBase.instance.inventoryTags.toolTipRaycastTag; if (n.GetComponent() == null) n.gameObject.AddComponent(); } } else if (mode == 1) { if (n.GetComponent() || n.GetComponent()) { Component.DestroyImmediate(n.gameObject.GetComponent()); n.transform.tag = "Untagged"; } } } } } } #endregion #region Create / Destroy public void DestroyTooltip() { deltaTime = 0.0f; currentItemWithTooltip = null; wait = false; isActiveTooltip = false; keyPressFlag = false; isStaticTooltipMod = false; hasCreatedTooltip = false; screenCoef = Vector2.zero; if (tooltip) GameObject.DestroyImmediate(tooltip); } #endregion #endregion #region PRIVATE #region Update private void UpdatePositionTooltip() { if (!tooltip) { DestroyTooltip(); return; } // Add percentage Vector2 newPos; newPos.x = Input.mousePosition.x + Input.mousePosition.x * screenCoef.x; newPos.y = Input.mousePosition.y + Input.mousePosition.y * screenCoef.y; tooltip.transform.localPosition = newPos; } #endregion #region Action // M - Static mode // Left click to update tooltip private void TooltipAction(GameObject hit) { if (!tooltip) CreateTooltip(); // Add percentage Vector2 newPos; screenCoef = Helper.CalculateScreenCoefficient(); newPos.x = Input.mousePosition.x + Input.mousePosition.x * screenCoef.x; newPos.y = Input.mousePosition.y + Input.mousePosition.y * screenCoef.y; tooltip.transform.localPosition = newPos; // if (hit.GetComponent() && hit.GetComponent().m_NameItem != "") tooltip.GetComponentInChildren().text = hit.GetComponent().m_NameItem; else tooltip.GetComponentInChildren().text = hit.name; LoadItemParameters(tooltip.GetComponentInChildren(), hit.GetComponent()); Vector2 newSize = Vector2.zero; // = (ширина GO - отступ от краев букв по 10 пикселей(или чо там)) - (10 (ширина буквы-наверное) * кол-ва букв) newSize.x = (tooltip.GetComponent().sizeDelta.x - 20) - tooltip.GetComponentInChildren().preferredWidth; tooltip.GetComponentInChildren().gameObject.GetComponent().sizeDelta = -newSize; newSize.x = newSize.x / 2.0f; tooltip.GetComponentInChildren().gameObject.GetComponent().anchoredPosition = -newSize; currentItemWithTooltip = hit; InventoryBase.instance.scavenger.AddNewComponentToDestroyList(tooltip); hasCreatedTooltip = true; } #endregion #region Load Parameters private void LoadItemParameters(MouseEnterToolTip n, ToolTip p) { if (n.m_InputField) n.m_InputField.text = p.m_Description; } #endregion #region Create / Destroy private void CreateTooltip() { tooltip = GameObject.Instantiate(m_TooltipM); tooltip.transform.SetParent(InventoryBase.instance.RootSpawnWindows.transform); } #endregion #endregion } } }