uGUI練習(七) Drag And Drop


練習目標

練習UI的拖放操作

一、相關組件

  • EventTrigger
  • Canvas Group
  • ScrollRect
  • Mask
  • Scrollbar

二、拖放練習

1、創建一個Panel,命名Panel1,添加EventTrigger組件,稍稍改一下Panel的顏色

image

2、Panel1下創建一個Text,輸入”Test Draggable\n       object”,設置字體顏色及Text超出處理

image

DragDropScene.cs代碼

3、在 uGUI練習(五) Draggable Object一文中,已經大概了解uGUI的EventSystem,需要繼承三個事件接口,接下來我們創建一個DragDropScene.cs,代碼如下

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class DragDropScene : MonoBehaviour,IDragHandler,IPointerDownHandler,IPointerUpHandler 
{
    public void OnDrag(PointerEventData eventData)
    {
        GetComponent<RectTransform>().pivot.Set(0,0);
        transform.position=Input.mousePosition;
    }
    
    public void OnPointerDown(PointerEventData eventData)
    {
        transform.localScale=new Vector3(0.7f,0.7f,0.7f);
    }
    
    public void OnPointerUp(PointerEventData eventData)
    {
        transform.localScale=new Vector3(1f,1f,1f);
    }
}

4、上面的代碼就是 按下,拖動,抬起 這三個事件的處理.把這個腳本綁定在Panel1,按Ctrl+P 運行游戲,在Game視圖我們就可以拖動Panel1了.

5、選中創建好的Panel1,按Ctrl+D Copy 幾個Panel,更改成不同的顏色,如下圖所示:

image

6、在上面的步驟中,我們創建了幾個Panel1,並且給它們都綁定了DragDropScene.cs,但還沒有實現Drop的事件;

接下來,我們創建一個Panel,命名DropPanel,用來作停放Panel的容器

7、在DropPanel下創建一個Panel,命名Grid,並給它添加Grid Layout Group和Canvas Group組件

image

8、為了讓我們知道Drop是可以停放的,我們在Grid下創建兩個Panel,同樣的給它們綁定DragDropScene.cs,如下圖:

imageimage

9、接下來就是把Panel,拖動並停放在DropPanel下,如下圖所示

image

 

修改事件代碼

10、打開DragDropScene.cs腳本,添加一行,並修改OnPointerDown(),OnPointUp( )

[SerializeField] GameObject grid=null,rootCanvas=null;
public void OnPointerDown(PointerEventData eventData)
{
    transform.localScale=new Vector3(0.7f,0.7f,0.7f);
    transform.parent=rootCanvas.transform;
}

 

public void OnPointerUp(PointerEventData eventData)
{
    transform.localScale=new Vector3(1f,1f,1f);

    RaycastHit2D hit = Physics2D.Raycast(Input.mousePosition,-Vector2.up);
    if (hit.collider != null) {
        //如果射線檢測到的gameobject為grid,就把當前Panel放在grid節點下
        if(hit.collider.gameObject.name=="Grid")
            transform.parent=grid.transform;
    }
}

上面的代碼,當鼠標抬起時,如果是在Grid的上方,就把當前Panel設置在Grid下,鼠標按下時,設置當前Panel的Parent為rootCanvas11、為DragDropScene設置參數值:

image

 

12、到這一步,我們就可以拖動Panel放到Grid下了,為了避免Grid下的Panel超出,在uGUI練習(六) ScrollView一文中我們使用了SrollRect和Mask。所以現在我們就給DropPanel添加上這兩個組件,當然最后也可以給DropPanel添加Scrollbar

image

組件代碼

拖拽組件,修改部分代碼,更符合實際項目中使用

https://github.com/zhaoqingqing/UGUIDemo 倉庫中搜索:DragDropTrigger

三、CanvasGroup

CanvasGroup是一個容器,可以用來改變child的Alpha,Raycasting,Enable state.

可以用來改變child元素的state.

比如:在一段時間內window變淡,在同一個group里的child元素的alpha值也會受到影響,alpha 值=任何嵌套的group相乘。乘以canvas元素的alpha值.

CanvasGroup 可以配置為不遮擋 射線(在這個group里的任何物件都不用為圖形射線考慮) ,並且元素是否相互作用.

四、EventTrigger

從事件系統接收事件並調用每一個已注冊的事件.

在每一個特殊的函數中,都可以使用EventTrigger,你可以在一個事件上注冊多個函數,當EventTrigger接收事件時,將按提供的順序調用.

注意:將EventTrigger組件綁定在任何Gameobject上之后,它將攔截一切事件,並在這個對象上沒有冒泡事件出現.

五、Drag && Drop 效果

Drag Drop-1


免責聲明!

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



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