1. 程式人生 > >UGUI揹包,使用MVC框架(c#語言),模擬揹包物品載入到自己的揹包

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就可以了。