Unity使用UGUI實現某個UI控制元件進入某個區域後按格移動
阿新 • • 發佈:2018-11-28
最近專案需求,需要實現類似於暗黑破壞神揹包那樣的按格存放功能,在此之前先實現物體按格進入揹包,然後觸發相應的事件,減少後續的歸位操作。
圖片控制程式碼:
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); } }