最近項目需求,需要實現類似於暗黑破壞神揹包那樣的按格存放功能,在此之前先實現物體按格進入揹包,然後觸發相應的事件,減少後續的歸位操作。
圖片控制代碼:
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);
}
}
源程序:源程序