Main/Component/UI/Common/BoundedDrag.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Main/Component/UI/Common/DragContainer.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Main/Component/UI/Common/DragItem.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Main/Config/PartialConfigs/PlayerPropertyConfig.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Main/System/HeroUI/HeroPosWin.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Main/System/HeroUI/HeroScenePosCell.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Main/Component/UI/Common/BoundedDrag.cs
@@ -10,11 +10,13 @@ using System; /// <summary> /// 实现拖拽和缩放功能的组件,支持单指拖拽和双指缩放。 /// </summary> public class BoundedDrag : MonoBehaviour, IEndDragHandler, IBeginDragHandler, IDragHandler { [SerializeField] RectTransform m_Target; RectTransform m_Target; // 拖拽的目标对象 public RectTransform target { get { return m_Target; } set { @@ -25,24 +27,24 @@ public RectTransform rectTransform { get { return this.transform as RectTransform; } } [SerializeField] ScaleRange m_ScaleRange; ScaleRange m_ScaleRange; // 缩放范围 public ScaleRange scaleRange { get { return m_ScaleRange; } set { m_ScaleRange = value; } } [SerializeField] float m_DefaultScale; float m_DefaultScale; // 默认缩放值 public float defaultScale { get { return m_DefaultScale; } } [SerializeField] float m_DestScale = 1f; float m_DestScale = 1f; // 目标缩放值 public float destScale { get { return m_DestScale; } set { m_DestScale = Mathf.Clamp(value, scaleRange.min, scaleRange.max); } } float refScale = 0f; float refScale = 0f; // 用于平滑缩放的参考值 public float currentScale { get { @@ -54,41 +56,41 @@ } [SerializeField] MoveArea m_MoveArea; MoveArea m_MoveArea; // 拖拽的边界区域 public MoveArea moveArea { get { return m_MoveArea; } set { m_MoveArea = value; } } [SerializeField] Vector2 m_DestPosition = Vector2.zero; Vector2 m_DestPosition = Vector2.zero; // 目标位置 public Vector2 destPosition { get { return m_DestPosition; } set { m_DestPosition = new Vector2(Mathf.Clamp(value.x, moveArea.Left * destScale, moveArea.Right * destScale), Mathf.Clamp(value.y, moveArea.Bottom * destScale, moveArea.Top * destScale)); } } Vector3 refPosition = Vector3.zero; Vector3 refPosition = Vector3.zero; // 用于平滑移动的参考值 public Vector2 currentPosition { get { return target.anchoredPosition; } set { target.anchoredPosition = value; } } Vector2 startTouchPosition01; Vector2 startGroundPosition; Vector2 startTouchPosition01; // 单指拖拽的起始触摸位置 Vector2 startGroundPosition; // 单指拖拽的起始地面位置 Vector2 lastTouchPosition01; Vector2 curTouchPosition01; Vector2 lastTouchPosition02; Vector2 curTouchPosition02; Vector2 lastTouchPosition01; // 双指缩放的上一帧触摸位置1 Vector2 curTouchPosition01; // 双指缩放的当前帧触摸位置1 Vector2 lastTouchPosition02; // 双指缩放的上一帧触摸位置2 Vector2 curTouchPosition02; // 双指缩放的当前帧触摸位置2 [SerializeField] Action m_OnBeginDrag; Action m_OnBeginDrag; // 拖拽开始事件 public Action onBeginDrag { get { return m_OnBeginDrag; } } bool m_Actionable = true; bool m_Actionable = true; // 是否可操作 public bool actionable { get { return m_Actionable; } set { m_Actionable = value; } @@ -96,20 +98,22 @@ private void OnEnable() { destPosition = currentPosition = Vector3.zero; destPosition = currentPosition = Vector3.zero; // 初始化位置 } /// <summary> /// 拖拽开始事件处理 /// </summary> public void OnBeginDrag(PointerEventData eventData) { #if UNITY_EDITOR || UNITY_STANDALONE if (Input.GetKey(KeyCode.LeftControl) && eventData.button == PointerEventData.InputButton.Left) { TwoFingerHandleBegin(); TwoFingerHandleBegin(); // 双指缩放开始 } else if (eventData.button == PointerEventData.InputButton.Left) { OneFingerHandleBegin(eventData); OneFingerHandleBegin(eventData); // 单指拖拽开始 } #else if (Input.touchCount == 2) { @@ -119,19 +123,22 @@ OneFingerHandleBegin(eventData); } #endif onBeginDrag?.Invoke(); onBeginDrag?.Invoke(); // 触发拖拽开始事件 } /// <summary> /// 拖拽过程中的事件处理 /// </summary> public void OnDrag(PointerEventData eventData) { #if UNITY_EDITOR || UNITY_STANDALONE if (Input.GetKey(KeyCode.LeftControl) && eventData.button == PointerEventData.InputButton.Left) { TwoFingerHandle(); TwoFingerHandle(); // 双指缩放 } else if (eventData.button == PointerEventData.InputButton.Left) { OneFingerHandle(eventData); OneFingerHandle(eventData); // 单指拖拽 } #else if (Input.touchCount == 2) { @@ -143,10 +150,16 @@ #endif } /// <summary> /// 拖拽结束事件处理 /// </summary> public void OnEndDrag(PointerEventData eventData) { } /// <summary> /// 每帧更新,平滑处理缩放和位置 /// </summary> void LateUpdate() { if (!actionable) @@ -167,14 +180,19 @@ } } /// <summary> /// 单指拖拽开始 /// </summary> private void OneFingerHandleBegin(PointerEventData eventData) { startTouchPosition01 = Vector2.zero; RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, out startTouchPosition01); startGroundPosition = currentPosition; } /// <summary> /// 单指拖拽处理 /// </summary> private void OneFingerHandle(PointerEventData eventData) { Vector2 localMouse; @@ -185,6 +203,9 @@ } } /// <summary> /// 双指缩放处理 /// </summary> private void TwoFingerHandle() { // 方便PC调试逻辑 @@ -206,6 +227,9 @@ lastTouchPosition02 = curTouchPosition02; } /// <summary> /// 双指缩放开始 /// </summary> private void TwoFingerHandleBegin() { // 方便PC调试逻辑 @@ -223,20 +247,26 @@ lastTouchPosition02 = curTouchPosition02; } /// <summary> /// 缩放范围结构体 /// </summary> [Serializable] public struct ScaleRange { public float min; public float max; public float min; // 最小缩放值 public float max; // 最大缩放值 } /// <summary> /// 拖拽区域结构体 /// </summary> [Serializable] public struct MoveArea { public float Left; public float Right; public float Top; public float Bottom; public float Left; // 左边界 public float Right; // 右边界 public float Top; // 上边界 public float Bottom; // 下边界 public MoveArea(float _left, float _right, float _top, float _bottom) { @@ -245,6 +275,5 @@ this.Top = _top; this.Bottom = _bottom; } } } Main/Component/UI/Common/DragContainer.cs
@@ -3,13 +3,13 @@ // [ Date ]: Monday, July 31, 2017 //-------------------------------------------------------- using UnityEngine; using System.Collections; //DragContainer挂载在有射线检测的物体上,指向主物件 public class DragContainer : MonoBehaviour { public int pos; public Transform mainTransform; // 主节点 Transform } Main/Component/UI/Common/DragItem.cs
@@ -13,6 +13,8 @@ /// </summary> public class DragItem:MonoBehaviour,ICanvasRaycastFilter,IBeginDragHandler,IDragHandler,IEndDragHandler { [SerializeField] public Canvas parentCanvas; [SerializeField] public Canvas canvas; // 拖拽区域限制 [SerializeField] RectTransform m_Area; @@ -26,12 +28,13 @@ private set { m_RaycastTarget = value; } } [SerializeField] public int pos; [NonSerialized] public int pos; private Vector3 orgScale; private DragContainer lastTransform; // 当前对象的RectTransform组件 public RectTransform rectTransform { get { return this.transform as RectTransform; } } RectTransform rectTransform { get { return this.transform as RectTransform; } } /// <summary> /// 开始拖拽时调用 @@ -40,8 +43,10 @@ { raycastTarget = false; this.transform.position = UIUtility.ClampWorldPosition(area, eventData); orgScale = rectTransform.localScale; rectTransform.localScale = orgScale * 1.2f; rectTransform.localScale = Vector3.one * 1.2f; canvas.sortingLayerID = parentCanvas.sortingLayerID; canvas.sortingOrder = parentCanvas.sortingOrder + pos + 10; } /// <summary> @@ -51,21 +56,23 @@ this.transform.position = UIUtility.ClampWorldPosition(area,eventData); // 检测是否进入目标区域 if (eventData.pointerEnter != null) { var target = eventData.pointerEnter.transform; if (target != null) { if (eventData.pointerEnter != null) { if (lastTransform != null && lastTransform != eventData.pointerEnter.GetComponent<DragContainer>()) { lastTransform.mainTransform.localScale = Vector3.one; lastTransform = null; } var target = eventData.pointerEnter.GetComponent<DragContainer>(); // 输出组件路径 if (target != null) { lastTransform = target; // 进入目标区域,放大 1.2 倍 target.localScale = Vector3.one * 1.2f; } } else { // 离开目标区域,恢复大小 if (eventData.pointerPress != null) { var target = eventData.pointerPress.transform; if (target != null) { target.localScale = Vector3.one; lastTransform.mainTransform.localScale = Vector3.one * 1.2f; } } } rectTransform.localScale = Vector3.one * 1.2f; } /// <summary> @@ -73,9 +80,16 @@ /// </summary> public Action<int, int> onEndDragEvent; public void OnEndDrag(PointerEventData eventData) { public void OnEndDrag(PointerEventData eventData) { raycastTarget = true; rectTransform.localScale = orgScale; rectTransform.localScale = Vector3.one; if (lastTransform != null) { lastTransform.mainTransform.localScale = Vector3.one; lastTransform = null; } if (eventData.pointerEnter == null) { @@ -84,16 +98,14 @@ } var container = eventData.pointerEnter.GetComponent<DragContainer>(); if(container == null) { if (container == null) { onEndDragEvent?.Invoke(pos, -1); return; } // var contain = UIUtility.RectTransformContain(eventData.pointerEnter.transform as RectTransform,rectTransform); // if(contain) { // rectTransform.position = eventData.pointerEnter.transform.position; // } onEndDragEvent?.Invoke(pos, container.pos); canvas.sortingLayerID = parentCanvas.sortingLayerID; canvas.sortingOrder = parentCanvas.sortingOrder + pos + 1; } /// <summary> Main/Config/PartialConfigs/PlayerPropertyConfig.cs
@@ -84,20 +84,20 @@ return string.Empty; } if (config.Name.Contains("%s")) if (config.ShowName.Contains("%s")) { if (id == 52) { return Regex.Replace(config.Name, "%s", (value * 0.0001f).ToString("f2")); return Regex.Replace(config.ShowName, "%s", (value * 0.0001f).ToString("f2")); } else { return Regex.Replace(config.Name, "%s", value.ToString()); return Regex.Replace(config.ShowName, "%s", value.ToString()); } } else { return string.Format("{0} +{1}", config.Name, GetValueDescription(id, value)); return string.Format("{0} +{1}", config.ShowName, GetValueDescription(id, value)); } } Main/System/HeroUI/HeroPosWin.cs
@@ -93,6 +93,7 @@ RefreshOnTeamCountry(); RefreshOnTeamBtn(); RefreshTeamHero(); RefreshFlyHead(); if (HeroUIManager.Instance.heroOnTeamSortList.Count == 0) { @@ -109,9 +110,17 @@ fiterManager.Display(0, 0, 0, SelectJobCountry); fightPowerText.text = "1234k"; } void RefreshFlyHead() { var flyCanvas = flyAlphaTween.GetComponent<Canvas>(); flyCanvas.sortingLayerID = canvas.sortingLayerID; flyCanvas.sortingOrder = canvas.sortingOrder + 9; flyAlphaTween.alpha = 0; flyHead.transform.localScale = Vector3.zero; fightPowerText.text = "1234k"; } void SelectJobCountry(int job, int country) @@ -197,6 +206,7 @@ } } } //管理布阵入口按钮:如竞技场是否根据功能显隐,通天塔和主线只有进攻方布阵默认不显示 @@ -240,12 +250,19 @@ sceneHero[i].Display(teamHero.guid, i); //按scenePosImgs 顺序排序对应位置 sceneHero[i].transform.position = scenePosImgs[i].transform.position; sceneHero[i].transform.localScale = Vector3.one; } } RefreshPosScale(); } void RefreshPosScale() { for (int i = 0; i < scenePosImgs.Count; i++) { scenePosImgs[i].transform.localScale = Vector3.one; } } /// <summary> @@ -269,9 +286,12 @@ sceneHero[i].Display(teamHero.guid, i, flyFrom >= 0); //按scenePosImgs 顺序排序对应位置 sceneHero[i].transform.position = scenePosImgs[i].transform.position; sceneHero[i].transform.localScale = Vector3.one; } } RefreshPosScale(); heroListScroller.m_Scorller.RefreshActiveCellViews(); //表现飞入,连续点击不同头像触发的话则重置 if (flyFrom > -1) @@ -296,6 +316,7 @@ sequence.Append(flyHead.transform.DOMove(targetPos, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad)) .Join(flyHead.transform.DOScale(new Vector3(0.5f, 0.5f, 0.5f), HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad)) .Join(flyAlphaTween.DOFade(0f, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad)); sequence.onComplete = () => { flyHead.transform.localScale = Vector3.zero; }; } } @@ -308,13 +329,9 @@ { team.AddHero(HeroManager.Instance.GetHero(guidList[i]), i); } List<int> posList = new List<int>(); for (int i = 0; i < guidList.Count; i++) { posList.Add(i); } TeamChangeEvent(posList, -1, Vector3.zero); heroListScroller.m_Scorller.RefreshActiveCellViews(); TeamChangeEvent(new List<int>() { 0, 1, 2, 3, 4, 5 }, -1, Vector3.zero); } void SaveTeam() Main/System/HeroUI/HeroScenePosCell.cs
@@ -20,6 +20,7 @@ [SerializeField] DragItem dragObj; [SerializeField] Transform objForfly; //点击飞入的时候的显隐控制 public void Display(string guid, int index, bool isFly = false) { var hero = HeroManager.Instance.GetHero(guid); @@ -46,7 +47,11 @@ suggestForm.SetActive(false); } dragObj.pos = index; dragObj.onEndDragEvent -= SwitchPos; dragObj.onEndDragEvent += SwitchPos; dragObj.canvas.sortingLayerID = dragObj.parentCanvas.sortingLayerID; dragObj.canvas.sortingOrder = dragObj.parentCanvas.sortingOrder + index + 1; heroBtn.AddListener(() => { @@ -72,6 +77,23 @@ void SwitchPos(int pos1, int pos2) { Debug.Log("交换位置:" + pos1 + " " + pos2); var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType); if (pos2 == -1) { //下阵 team.RemoveHero(pos1); HeroUIManager.Instance.NotifyOnTeamPosChangeEvent(new List<int>() { pos1 }, -1, Vector3.zero); } else if (pos1 == pos2) { HeroUIManager.Instance.NotifyOnTeamPosChangeEvent(new List<int>() { pos1 }, -1, Vector3.zero); } else { //通知刷新 team.SwapPosition(pos1, pos2); HeroUIManager.Instance.NotifyOnTeamPosChangeEvent(new List<int>() { pos1, pos2 }, -1, Vector3.zero); } } async UniTask DelayShow()