projectEli/Assets/Inventory System/ICWM Assets/Inventory/Scripts/ToolTip/ToolTipBase.cs

299 lines
13 KiB
C#
Raw Normal View History

2022-10-08 02:26:09 +00:00
//********************************************************//
// //
// 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<MeshRenderer>() || n.GetComponent<SkinnedMeshRenderer>())
{
n.gameObject.AddComponent<BoxCollider>(); // MeshCollider
n.transform.tag = InventoryBase.instance.inventoryTags.toolTipRaycastTag;
if (n.GetComponent<ToolTip>() == null)
n.gameObject.AddComponent<ToolTip>();
}
}
else if (mode == 1)
{
if (n.GetComponent<MeshRenderer>() || n.GetComponent<SkinnedMeshRenderer>())
{
Component.DestroyImmediate(n.gameObject.GetComponent<BoxCollider>());
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<ToolTip>() && hit.GetComponent<ToolTip>().m_NameItem != "")
tooltip.GetComponentInChildren<Text>().text = hit.GetComponent<ToolTip>().m_NameItem;
else
tooltip.GetComponentInChildren<Text>().text = hit.name;
LoadItemParameters(tooltip.GetComponentInChildren<MouseEnterToolTip>(), hit.GetComponent<ToolTip>());
Vector2 newSize = Vector2.zero;
// = (ширина GO - отступ от краев букв по 10 пикселей(или чо там)) - (10 (ширина буквы-наверное) * кол-ва букв)
newSize.x = (tooltip.GetComponent<RectTransform>().sizeDelta.x - 20) - tooltip.GetComponentInChildren<Text>().preferredWidth;
tooltip.GetComponentInChildren<Mask>().gameObject.GetComponent<RectTransform>().sizeDelta = -newSize;
newSize.x = newSize.x / 2.0f;
tooltip.GetComponentInChildren<Mask>().gameObject.GetComponent<RectTransform>().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
}
}
}