unity ugui的拖拽與放置


1、創建一個工程

2、創建Panel(會自動創建Canvas 和EventSystem),將Panel中的Image組件刪除,重命名為MainPanel。

3、在MainPanel下面創建Panel,調整大小,添加Grid Layout Group組件---能夠自動的排列子物體。將Child Alignment改成Middle Center;

3、在Panel下面創建Panel,重命名slot,添加Grid Layout Group組件,將Cell Size中的x,y都改成90,Child Alignment改成Middle Center;

4、在slot中創建一個image,重命名為drag,在source Image添加圖像。添加組件Canvas Group;拖拽到project作為預制體,刪除slot下面的drag;

5、多復制幾個slot,調整他們之間的間距

6、將Panel復制,調整位置,調整大小,可以多增加幾個slot。將預制體drag拖拽到所有的slot中當子物體,並且改變里面的圖像

7、創建腳本DragHandle,拖拽到drag預制體上,現在實現的功能:能夠拖拽圖片,但是松開鼠標后會回到初始的位置

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems; // 導入命名空間

// 繼承幾個接口,用於拖拽
public class DragHandle : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler
{
    // 拖拽的物體
    public static GameObject itemBeginDragged;
    // 初始位置
    Vector3 startPos;

    // 開始拖拽
    public void OnBeginDrag(PointerEventData eventData)
    {
        itemBeginDragged = gameObject;
        startPos = transform.position;
    }

    // 拖拽中
    public void OnDrag(PointerEventData eventData)
    {
        // 
        transform.position = Input.mousePosition;
    }

    // 結束拖拽
    public void OnEndDrag(PointerEventData eventData)
    {
        itemBeginDragged = null;
        transform.position = startPos;
    }

 
}

8、修改上面的代碼

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems; // 導入命名空間

// 繼承幾個接口,用於拖拽
public class DragHandle : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler
{
    // 拖拽的物體
    public static GameObject itemBeginDragged;
    // 初始位置
    Vector3 startPos;
    // 記錄拖拽物體的父物體
    Transform startParent;

    // 開始拖拽
    public void OnBeginDrag(PointerEventData eventData)
    {
        itemBeginDragged = gameObject;
        startPos = transform.position;
        startParent = transform.parent;
        // 拖拽的時候不能阻擋射線,不然一會在卡槽中放置的時候,射線射不到卡槽上
        GetComponent<CanvasGroup>().blocksRaycasts = false;
    }

    // 拖拽中
    public void OnDrag(PointerEventData eventData)
    {
        // 
        transform.position = Input.mousePosition;
    }

    // 結束拖拽
    public void OnEndDrag(PointerEventData eventData)
    {
        itemBeginDragged = null;
        // 結束拖拽后,讓它能接受射線
        GetComponent<CanvasGroup>().blocksRaycasts = true;
        // 如果沒有設置新的父物體,就回到原來的地方。
        if (transform.parent == startParent)
        {
            transform.position = startPos;
        }
        
    }

 
}

9、創建腳本SlotHandle,拖拽到所有的slot,現在實現的功能是-能夠往卡槽上拖拽圖片,每個卡槽上只能放一個,沒有放到卡槽上,會回到原來的地方

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

public class SlotHandle : MonoBehaviour,IDropHandler
{
    public GameObject item
    {
        get
        {
            // 如果有子物體在返回,沒有就為空
            if(transform.childCount > 0)
            {
                return transform.GetChild(0).gameObject;
            }
            return null; 
        }
    }

    // 
    public void OnDrop(PointerEventData eventData)
    {
        // 如果上面沒有物體,就能放置
        if (!item)
        {
            DragHandle.itemBeginDragged.transform.SetParent(transform);
        }
    }

    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM