Unity使用UGUI實現某個UI控件進入某個區域後按格移動

最近項目需求,需要實現類似於暗黑破壞神揹包那樣的按格存放功能,在此之前先實現物體按格進入揹包,然後觸發相應的事件,減少後續的歸位操作。

圖片控制代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ImgControl : MonoBehaviour
{
    public BackGroundControl m_backGround;              //懶得弄了直接拖吧

    private bool m_isChoosed;

    private Vector3 m_mouseOldPos;
    private Vector3 m_transNextPos;
    private Vector3 m_transToMouseOffset;

    void Start()
    {
        m_isChoosed = false;

    }

    void Update()
    {
        if (m_isChoosed)
        {
            //先計算物體要移動的下個點
            m_transNextPos = this.transform.position + Input.mousePosition - m_mouseOldPos;
            m_transNextPos = m_backGround.ConfirmImgPos(m_transNextPos);

            //計算鼠標此時應在的位置
            m_mouseOldPos = m_transNextPos + m_transToMouseOffset;

            this.transform.position = m_transNextPos;
        }

        //擡起鼠標則不能移動
        if (Input.GetMouseButtonUp(0))
        {
            m_isChoosed = false;
        }
    }

    /// <summary>
    /// 選定圖片,懶得綁定了,面板拖動
    /// </summary>
    public void ChooseImg()
    {
        m_mouseOldPos = Input.mousePosition;
        m_transToMouseOffset = Input.mousePosition - this.transform.position;
        m_isChoosed = true;
        m_backGround.ConfirmRect();
    }
}

背景面板控制代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BackGroundControl : MonoBehaviour
{
    public RectTransform m_imgRect;         //圖片的Rect

    private Rect m_backGroundRect;          //放置區域的Rect
    private int m_boxWidth = 10;            //格格寬
    private int m_boxHeight = 10;

    /// <summary>
    /// 確定圖片位置
    /// </summary>
    /// <param name="pos"></param>
    /// <returns></returns>
    public Vector3 ConfirmImgPos(Vector3 pos)
    {
        if (m_backGroundRect.Contains(pos))
        {
            //計算鼠標位置和邊界的差值
            float x = pos.x - m_backGroundRect.x;
            float y = pos.y - m_backGroundRect.y;

            //求出移動的倍數
            int xRatio = Mathf.CeilToInt(x / m_boxWidth);
            int yRatio = Mathf.CeilToInt(y / m_boxHeight);

            pos.x = m_backGroundRect.x + xRatio * m_boxWidth;
            pos.y = m_backGroundRect.y + yRatio * m_boxHeight;
        }
        return pos;
    }

    /// <summary>
    /// 確定區域矩形
    /// </summary>
    public void ConfirmRect()
    {
        Rect transRect = this.GetComponent<RectTransform>().rect;
        Rect imgRect = m_imgRect.rect;

        m_backGroundRect.Set(this.transform.position.x + transRect.x + imgRect.x,
           this.transform.position.y + transRect.y + imgRect.y,
           transRect.width + imgRect.width, transRect.height + imgRect.height);
    }
}

源程序:源程序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章