UGUI揹包,使用MVC框架(c#語言),模擬揹包物品載入到自己的揹包
最近也就是了解了下MVC揹包模式,然後試著做了一下,先展示下效果圖吧:
左邊是我虛擬的商店物品,當然你也可以當成另一個倉庫。右邊是另一個倉庫。
左邊的揹包可以看出,是可以隨意換位置的,而且左邊的揹包換位置後放進自己的揹包是不受影響的。
ChessInto程式碼(這段程式碼是放在右邊的小揹包上的):
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
using UnityEngine.UI;
public class ChessInto : MonoBehaviour ,IDropHandler{
public Transform Find;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void OnDrop(PointerEventData eventData)
{
var originalObj = eventData.pointerDrag;
if (originalObj == null)
{
return;
}
var srcImage = originalObj.GetComponent<Image>();
if (srcImage == null)
{
return;
}
GetComponent<Image>().sprite = Resources.Load(MoveMouse.instance.myImage.name, typeof(Sprite)) as Sprite;
}
}
Message指令碼(顯示資訊)放在相機上即可:
using UnityEngine;
using System.Collections;
public class Message : MonoBehaviour
{
public static string debugStr = "";
void OnGUI()
{
GUILayout.Label(debugStr);
}
}
Model指令碼(用來載入圖片和模型資料):
public class Item1
{
public string name; // 物品名稱
public Sprite image; // 物品圖片
// 構造器
public Item1(string name, Sprite spriteimageg)
{
this.name = name;
this.image = spriteimageg;
}
}
public static List<Item1> items; // 儲存物品物件的集合
// 物品圖片陣列
public int size = 18;
Sprite[] sprites;
void Awake() // 資料初始化
{
items = new List<Item1>(); // 初始化List<Item>
sprites = new Sprite[size];
// 根據行列值初始化物品列表
for (int i = 0; i < BagViewTest.row; i++)
{
for (int j = 0; j < BagViewTest.col; j++)
{
items.Add(new Item1("", null));
}
}
for (int i = 0; i <size; i++)
{
sprites[i] = Resources.Load(i.ToString(), typeof(Sprite)) as Sprite;
items[i] = new Item1(i.ToString(), sprites[i]);
}
}
DragEventTest指令碼(拖拽事件)
public class DragEventTest : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public int gridID = 0; // 格子編號
public static int lastID;
string debugStr = "";
void Start()
{
gridID = GetComponentInParent<PickUpDropTest>().gridID; // 獲取格子編號
}
// 開始拖拽
public void OnBeginDrag(PointerEventData eventData)
{
Message.debugStr =gridID.ToString();
lastID = gridID;
//// 呼叫交換方法
PickUpDropTest.SwapItem(gridID);
}
// 拖拽中
public void OnDrag(PointerEventData eventData)
{
}
// 結束拖拽
public void OnEndDrag(PointerEventData eventData)
{
// 呼叫交換方法
PickUpDropTest.SwapItem(gridID);
}
}
MouseMove指令碼:
public static MoveMouse instance;
RectTransform rect; // 獲取UGUI定位元件
Image icon; // 顯示當前拾取物品的圖示
public Sprite myImage;
void Awake()
{
rect = GetComponent<RectTransform>();
// 【注意】圖示物件是第0個子物件
icon = transform.GetChild(0).GetComponent<Image>();
instance = this;
}
void Update()
{
// 用滑鼠位置給圖示圖片定位
rect.anchoredPosition3D = Input.mousePosition;//anchoredPosition3D 錨點的3D空間位置
// The 3D position of the pivot of this RectTransform relative to the anchor reference point.
//該矩陣變換相對於錨點參考點的中心點的3D位置。
//The anchor reference point is where the anchors are. If the anchors are not together, the four anchor positions are interpolated according to the pivot placement.
//錨點參考點是錨點的位置。如果錨點不在一起,四個錨點的位置是根據佈置的中心點的位置插值替換的。
// 根據是否有圖片確定透明度
if (PickUpDropTest.pickedItem != null)
{
if (PickUpDropTest.pickedItem.image != null)
{
icon.color = Color.white;
icon.sprite = PickUpDropTest.pickedItem.image;
myImage = PickUpDropTest.pickedItem.image;
}
else
{
icon.color = Color.clear;
}
}
}
// 忽略滑鼠圖示上的射線
public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
{
return false;
}
BagViewTest指令碼:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Xml.Linq;
public class BagViewTest : MonoBehaviour
{
public static BagViewTest instance;
// 揹包規格
public static int row = 10; // 行
public static int col = 7; // 列
// 揹包格子
public GameObject grid;
float width; // 格子寬度
float height; // 格子高度
// 根據格子預設體獲取寬和高
void Awake()
{
width = grid.GetComponent<RectTransform>().rect.width +30;
height = grid.GetComponent<RectTransform>().rect.height;
}
// 初始狀態:平鋪格子,建立揹包
void Start()
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
// 計算ID值(物品列表下標)
int id = j + i * col;
// 例項化格子預設,按寬高佈局
GameObject itemGrid = Instantiate(grid, transform.position + new Vector3(j * width, -i * height, 0)/2, Quaternion.identity) as GameObject;
// 將例項化的格子物件設定為揹包的子物件
itemGrid.transform.SetParent(transform);
// 呼叫自定義方法:顯示某個id的格子內容
ShowItem(itemGrid.transform, id);
// 給格子 PickUpDrop 元件編號,拾取放下時用
itemGrid.GetComponent<PickUpDropTest>().gridID = id;
//itemGrid.name = (j + i*col).ToString();
}
}
}
// 重新重新整理揹包顯示(物品位置發生變化時)
public void ShowItems()
{
for (int i = 0; i < row * col; i++)
{
Transform itemGrid = transform.GetChild(i);
ShowItem(itemGrid, i);
}
}
// 顯示物品格子
public void ShowItem(Transform itemGrid, int id)
{
// 顯示物品名稱
Text txtUGUI = itemGrid.GetComponentInChildren<Text>();
txtUGUI.text = ItemModelTest.items[id].name;
// 獲取物品Icon的Image元件
Image imageUGUI = itemGrid.GetChild(0).GetComponent<Image>();
// 如果有物品,就顯示圖片
if (ItemModelTest.items[id].image != null)
{
imageUGUI.color = Color.white;
}
else
{ // 否則不顯示
imageUGUI.color = Color.clear;
}
imageUGUI.sprite = ItemModelTest.items[id].image;
}
}
PickUpDropTest指令碼:
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
using UnityEngine.UI;
public class PickUpDropTest : MonoBehaviour, IDropHandler
{
public int gridID;
public static ItemModelTest.Item1 pickedItem; // 當前拾取的物品
void Start()
{
// 初始化當前拾取物品為空
pickedItem = new ItemModelTest.Item1("", null);
}
// 揹包核心邏輯:交換
public static void SwapItem(int gridID)
{
// 交換揹包中的物品和拾取物品
ItemModelTest.Item1 temp = pickedItem;
pickedItem = ItemModelTest.items[gridID];
ItemModelTest.items[gridID] = temp;
// 重新整理揹包顯示
GameObject.Find("Parent").GetComponent<BagViewTest>().ShowItems();
}
// 當物品按鈕被點下時(點選觸發模式)
public void Drop()
{
SwapItem(gridID);
}
// 當物品放在格子中時(拖拽觸發模式)
public void OnDrop(PointerEventData eventData)
{
Message.debugStr = gridID.ToString();
if (gridID != DragEventTest.lastID)
{
SwapItem(gridID);
}
}
}
Unity佈置:
Reasouces裡面放入圖片,因為我是用Reasouces載入的。
最後name下新增一個Test就可以了。