unity 学习笔记 UI

UI布局相关

需求-卡牌游戏

实现鼠标移动到卡片时放大,移出时恢复原状,可拖动,可判定拖动至不同ui区域,在手牌区域放置后会自动回到原来的位置

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
public class CardItem : MonoBehaviour, IEndDragHandler, IDragHandler,IPointerEnterHandler,IPointerExitHandler,IPointerClickHandler
{
    public RectTransform[] regions;// 假设你已经有了四个区域边界的RectTransform引用  
    public Transform _orignTrans;//原手牌区域的panel
    public Transform _hightlightTrans;//高亮的手牌panel
    RectTransform _mainCanvas;//canvas的

    public int _index;//卡片在手牌区域的索引(根据这个索引在不使用卡片时恢复到原来的手牌区域的位置中)
    private void Awake()
    {
        _mainCanvas = GameObject.Find("Canvas").GetComponent<RectTransform>();
    }
    //拖拽的逻辑
    public void OnDrag(PointerEventData eventData)
    {
        Vector3 globalMousePos;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle
            (_mainCanvas, eventData.position, eventData.pressEventCamera, out globalMousePos))
        {

            this.transform.position = globalMousePos;
            this.transform.rotation = _mainCanvas.rotation;
            //CheckPos();

        }
    }
	///结束拖拽的逻辑,结束时判定ui所在的ui区域是否为所需要的位置,是的话则开始执行下一个功能逻辑,不是则返回到原来的位置
    public void OnEndDrag(PointerEventData eventData)
    {
        // 转换当前UI元素的RectTransform到Canvas的坐标系中  
        Vector2 localPoint;
        for (int i = 0; i < regions.Length; i++)
        {
            //将选中的点转换为Image区域内的本地点
            RectTransformUtility.ScreenPointToLocalPointInRectangle(regions[i], eventData.position, null, out localPoint);

            Vector2 pivot = regions[i].pivot;
            Vector2 normalizedLocal =
                new Vector2(pivot.x + localPoint.x / regions[i].sizeDelta.x, pivot.y + localPoint.y / regions[i].sizeDelta.y);
            if ((normalizedLocal.x >= 0 && normalizedLocal.x <= 1) && ((normalizedLocal.y >= 0 && normalizedLocal.y <= 1)))
            {
                Debug.Log($"拖拽到区域{i+1}");
                // 假设rectTransform是包含需要刷新布局的UI元素的RectTransform
                if (i == 3)
                {
                    this.Back2OriginPanel();
                    LayoutRebuilder.ForceRebuildLayoutImmediate(regions[3]);
                }

                return;
            }
        }
        LayoutRebuilder.ForceRebuildLayoutImmediate(regions[3]);

    }
	///鼠标移开卡片时的逻辑
    public void OnPointerExit(PointerEventData eventData)
    {
        this.Back2OriginPanel();
    }
	///鼠标移入卡片时的逻辑
    public void OnPointerEnter(PointerEventData eventData)
    {
        this.ToHightlightPanel();
    }
	///鼠标点击卡片时的逻辑
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("123");
    }
	///回到卡片原来的位置
    private void Back2OriginPanel()
    {
        this.transform.DOScale(1f, 0.3f);
        this.transform.SetParent(_orignTrans);
        this.transform.SetSiblingIndex(_index);
        this.GetComponentInParent<HorizontalLayoutGroup>().enabled = true;
    }
	//卡片高亮
    private void ToHightlightPanel()
    {
        this.transform.DOScale(1.2f, 0.3f);
        this.GetComponentInParent<HorizontalLayoutGroup>().enabled = false;
        this.transform.SetParent(_hightlightTrans);
    }
}


相关推荐

  1. unity 学习笔记 UI

    2024-07-13 16:34:02       22 阅读
  2. UI Grounding 学习笔记

    2024-07-13 16:34:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 16:34:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 16:34:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 16:34:02       57 阅读
  4. Python语言-面向对象

    2024-07-13 16:34:02       68 阅读

热门阅读

  1. py每日spider案例之tts制作接口

    2024-07-13 16:34:02       18 阅读
  2. 创建型模式-单例模式

    2024-07-13 16:34:02       18 阅读
  3. 云WAF在电子商务领域具体能提供哪些安全功能?

    2024-07-13 16:34:02       20 阅读
  4. 常用排序算法汇总

    2024-07-13 16:34:02       20 阅读
  5. 前后端项目部署方案汇总

    2024-07-13 16:34:02       22 阅读
  6. Python基础总结之字典元素的删除方法详解

    2024-07-13 16:34:02       23 阅读
  7. 搭建安全扩展

    2024-07-13 16:34:02       17 阅读
  8. 金币程序题

    2024-07-13 16:34:02       21 阅读
  9. Docker Compose 启动容器例子

    2024-07-13 16:34:02       20 阅读
  10. vue3下载base64文件

    2024-07-13 16:34:02       22 阅读
  11. 使用 WebSocket 进行实时数据传输

    2024-07-13 16:34:02       22 阅读