TheInitialProject/Assets/Scripts/UI/UIControl/UIInputNumChange.cs
2024-10-23 16:59:02 +08:00

378 lines
8.0 KiB
C#

/*-------------------------------------------------------------------------------------
--- 创建人:
--- 描 述:
--- 创建时间: 2022年8月10日
-------------------------------------------------------------------------------------*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Game;
using CaoCao.Event;
using System;
using TMPro;
/// <summary>
/// xx 功能界面
/// </summary>
public class UIInputNumChange : MonoBehaviour
{
//UIAutoBuild_CtrlDefine
//public InputField iptNumShow;
//public Button btnAdd;
//public Button btnRedece;
//UIAutoBuild_CtrlDefine
public int mNum { get; private set; } = 0;
public int mMaxNum = -1;
public int mMinNum = -1;
private bool mStateAdd = false;
private bool mStateReduce = false;
private float mBeginExp;
private float mEndExp;
private float mTickTimeSpeed;
private float mBeginExp2;
private float mEndExp2;
private float mTickTimeSpeed2;
public TMP_InputField IptNumShow;
private UILongClickButton mAddBtn;
private UILongClickButton mReduceBtn;
public Slider sldValue;
/// <summary>
/// 抛出数值修改事件,父级界面联动用
/// </summary>
[HideInInspector]
public Action ChangeEvent;
[HideInInspector]
public bool bNeedMinHideReduceBtn = false;
bool bAwake = false;
public void Awake()
{
////UIAutoBuild_CtrlBind
//Transform tf = transform;
//iptNumShow = tf.Find("IptNumShow").GetComponent<InputField>();
//btnAdd = tf.Find("btnAdd").GetComponent<Button>();
//btnRedece = tf.Find("btnRedece").GetComponent<Button>();
//UIAutoBuild_CtrlBind
Transform tf = transform;
IptNumShow = tf.Find("TIptNumShow").GetComponent<TMP_InputField>();
mAddBtn = tf.Find("BtnAdd").GetComponent<UILongClickButton>();
mReduceBtn = tf.Find("BtnRedece").GetComponent<UILongClickButton>();
sldValue = tf.Find("sldValue").GetComponent<Slider>();
bAwake = true;
}
void OnEnable()
{
//UIAutoBuild_EventReg
//btnAdd.onClick.AddListener(OnBtnAddClick);
//btnRedece.onClick.AddListener(OnBtnRedeceClick);
//UIAutoBuild_EventReg
mAddBtn.onClick.AddListener(OnBtnAddClick);
mReduceBtn.onClick.AddListener(OnBtnRedeceClick);
IptNumShow.onValueChanged.AddListener((param) => { OniptNumShowChange(param); });
mAddBtn.NumberChange += (() => { AddNum(); });
mAddBtn.ButtonUpAction += (() => { AddNumCanel(); });
mReduceBtn.NumberChange += (() => { ReduceNum(); });
mReduceBtn.ButtonUpAction += (() => { ReduceNumCanel(); });
sldValue.onValueChanged.AddListener(OnSldValueChange);
/*
AppEntry.Event.Subscribe(NumChangeAddEvent.EventId, AddNum);
AppEntry.Event.Subscribe(NumChangeReduceEvent.EventId, ReduceNum);
AppEntry.Event.Subscribe(NumChangeAddCancelEvent.EventId, AddNumCanel);
AppEntry.Event.Subscribe(NumChangeReduceCancelEvent.EventId, ReduceNumCanel);
*/
ChangeEventInvoke();
RefreshUI();
}
void OnDisable()
{
//UIAutoBuild_EventUnReg
//btnAdd.onClick.RemoveAllListeners();
//btnRedece.onClick.RemoveAllListeners();
//UIAutoBuild_EventUnReg
mAddBtn.onClick.RemoveAllListeners();
mReduceBtn.onClick.RemoveAllListeners();
IptNumShow.onValueChanged.RemoveAllListeners();
mAddBtn.NumberChange = null;
mAddBtn.ButtonUpAction = null;
mReduceBtn.NumberChange = null;
mReduceBtn.ButtonUpAction = null;
sldValue.onValueChanged.RemoveAllListeners();
/*
AppEntry.Event.Unsubscribe(NumChangeAddEvent.EventId, AddNum);
AppEntry.Event.Unsubscribe(NumChangeReduceEvent.EventId, ReduceNum);
AppEntry.Event.Unsubscribe(NumChangeAddCancelEvent.EventId, AddNumCanel);
AppEntry.Event.Unsubscribe(NumChangeReduceCancelEvent.EventId, ReduceNumCanel);
*/
}
void Start()
{
}
// 每次显示都执行, 可定义参数
public void Show()
{
}
public void ClearNum()
{
mNum = 0;
if (!bAwake) return;
//IptNumShow.text = mNum.ToString();
RefreshNumShow();
ChangeEventInvoke();
}
public void SetNeedMinNumHide()
{
bNeedMinHideReduceBtn = true;
mReduceBtn?.gameObject.SetActive(mNum != mMinNum);
if (mNum == mMinNum)
{
ReduceNumCanel();
}
}
public void SetNum(int tNum)
{
if (mMaxNum != -1)
mNum = Mathf.Min(mMaxNum, tNum);
if (mMinNum != -1)
mNum = Mathf.Max(mMinNum, mNum);
if (!bAwake) return;
//IptNumShow.text = mNum.ToString();
RefreshNumShow();
ChangeEventInvoke();
}
private void RefreshUI()
{
//IptNumShow.text = mNum.ToString();
RefreshNumShow();
}
private void OniptNumShowChange(string pValue)
{
if (int.TryParse(pValue, out int tNum))
{
mNum = tNum;
if(mMaxNum != -1)
mNum = Mathf.Min(mMaxNum, tNum);
if(mMinNum != -1)
mNum = Mathf.Max(mMinNum, mNum);
}
//IptNumShow.text = mNum.ToString();
RefreshNumShow();
ChangeEventInvoke();
}
private void OnBtnAddClick()
{
if (int.TryParse(IptNumShow.text, out int tNum))
{
++tNum;
if (mMaxNum != -1)
{
tNum = Mathf.Min(tNum, mMaxNum);
}
//IptNumShow.text = tNum.ToString();
RefreshNumShow();
ChangeEventInvoke();
}
else
{
Debug.LogError("IptNumShow.text 数据错误: " + IptNumShow.text);
}
}
private void OnBtnRedeceClick()
{
if (int.TryParse(IptNumShow.text, out int tNum))
{
--tNum;
if (mMinNum != -1)
{
tNum = Mathf.Max(tNum, mMinNum);
}
//IptNumShow.text = tNum.ToString();
RefreshNumShow();
ChangeEventInvoke();
}
else
{
Debug.LogError("IptNumShow.text 数据错误: " + IptNumShow.text);
}
}
public void SetMaxNum(int pMaxNum)
{
mMaxNum = pMaxNum;
if (sldValue == null)
sldValue = transform.Find("sldValue").GetComponent<Slider>();
sldValue.maxValue = pMaxNum;
}
public void SetMinNum(int pMinNum)
{
mMinNum = pMinNum;
if (sldValue == null)
sldValue = transform.Find("sldValue").GetComponent<Slider>();
sldValue.minValue = pMinNum;
}
public void SetMaxNumAndMinNum(int pMaxNum, int pMinNum)
{
mMaxNum = pMaxNum;
mMinNum = pMinNum;
if (sldValue == null)
sldValue = transform.Find("sldValue").GetComponent<Slider>();
sldValue.maxValue = pMaxNum;
sldValue.minValue = pMinNum;
}
private void AddNum()
{
if (mMaxNum == -1) return;
mNum = int.Parse(IptNumShow.text);
mStateAdd = true;
}
private void ReduceNum()
{
if (mMinNum == -1) return;
mNum = int.Parse(IptNumShow.text);
mStateReduce = true;
}
private void AddNumCanel()
{
mStateAdd = false;
mTickTimeSpeed = 0;
}
private void ReduceNumCanel()
{
mStateReduce = false;
mTickTimeSpeed2 = 0;
}
void ChangeEventInvoke()
{
ChangeEvent?.Invoke();
if (bNeedMinHideReduceBtn)
{
mReduceBtn.gameObject.SetActive(mNum != mMinNum);
if (mNum == mMinNum)
{
ReduceNumCanel();
}
}
}
#region Slider
private void OnSldValueChange(float pValue)
{
float tt = sldValue.value;// * sldValue.value;
int tNum = Mathf.FloorToInt(tt);//Slider 选的 whole Numbers 可忽略
IptNumShow.text = tNum.ToString();
//CheckIsCanBuy();
}
private void RefreshNumShow()
{
IptNumShow.text = mNum.ToString();
sldValue.value = mNum;
}
#endregion
private void Update()
{
if(mStateAdd)
{
int change = mMaxNum - mNum;
mBeginExp = 0;
mEndExp = Mathf.Log(change);
mTickTimeSpeed += Time.deltaTime;
//Debug.Log(mTickTimeSpeed);
float currExp = Mathf.Lerp(mBeginExp, mEndExp, mTickTimeSpeed * 0.2f);
mNum += (int)Mathf.Exp(currExp);
//IptNumShow.text = mNum.ToString();
RefreshNumShow();
ChangeEventInvoke();
}
if(mStateReduce)
{
int change = mNum - mMinNum;
mBeginExp2 = 0;
mEndExp2 = Mathf.Log(change);
mTickTimeSpeed2 += Time.deltaTime;
//Debug.Log(mTickTimeSpeed);
float currExp = Mathf.Lerp(mBeginExp2, mEndExp2, mTickTimeSpeed2 * 0.2f);
mNum -= (int)Mathf.Exp(currExp);
//IptNumShow.text = mNum.ToString();
RefreshNumShow();
ChangeEventInvoke();
}
}
}