299 lines
13 KiB
C#
299 lines
13 KiB
C#
//********************************************************//
|
||
// //
|
||
// 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
|
||
}
|
||
}
|
||
}
|