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