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

299 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//********************************************************//
// //
// 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
}
}
}