1. 程式人生 > >[Unity]關於UGUI拖拽備份克隆功能的簡單實現

[Unity]關於UGUI拖拽備份克隆功能的簡單實現

最近題主在做一個RPGDemo的技能拖拽到技能欄的功能時,遇到了UGUI中並沒有直接實現拖拽備份克隆的功能(PS:題主還是剛入門的新手),索性自己就寫了一下,邏輯算不上覆雜,但剛開始也不太簡單。
這裡寫圖片描述
這裡寫圖片描述
之前的效果(沒有實現前)

在講ugui的實現之前我們來看看老版本的ngui如何實現拖拽備份克隆的功能。
這裡寫圖片描述
就是直接繼承了UIDragDropItem介面直接實現
這裡寫圖片描述
這個藉口在面板提供了一個物件Clone On Drag 選擇是否拖拽備份克隆

好了我們來正式說UGUI的實現:
想要實現的功能很簡單,就是拖拽備份克隆。
每一個技能面板有單獨的格子gird,和圖片icon-name.
這裡寫圖片描述


這裡寫圖片描述
給icon-name和icon-name_1都掛載UISkillItemDrag指令碼
這裡寫圖片描述
這個skillitem做成了預置體,同時把icon-name技能的圖片單獨做成預置體icon-name_1.
這裡寫圖片描述
同時設定Skillitem的tag為skillitem。
這裡寫圖片描述
UGUI需要繼承這3個介面:
這裡寫圖片描述
這三個介面很好理解,開始拖拽,拖拽中,拖拽結束

  public void OnBeginDrag(PointerEventData eventData)
    {

        this.transform.parent = this.transform.root;//當開始拖拽設定當前圖片icon-name的父物體為根目錄,取消拖拽的邊界限制作用!
SetDraggedPosition(eventData); //轉換座標 } private void SetDraggedPosition(PointerEventData eventData) { var rt = this.gameObject.GetComponent<RectTransform>(); Vector3 globalMousePos; if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out
globalMousePos)) { rt.position = globalMousePos; } }

在開始拖拽時我們通過查詢所有的Tag=skillitem的預製體,再通過遍歷的方式判斷每一個子物體!=5的SkillItem,因為當我們拖拽當前的SkillItem時,它的子物體icon-name圖片會放到root根目錄下,也就是當前SkillItem的子物體!=5。

   public void OnBeginDrag(PointerEventData eventData)
    {
        skillId = this.transform.parent.GetComponent<skillItem>().id;
        this.transform.parent = this.transform.root;

        GameObject[] skillitems = GameObject.FindGameObjectsWithTag("skillitem");   //開始拖拽時我們通過查詢所有的Tag=skillitem的預製體

        for (int i = 0; i < skillitems.Length; i++)
        {

            if (skillitems[i].transform.childCount != 5)
            { 
                //再通過遍歷的方式判斷每一個子物體!=5的SkillItem
                //設定父物體
                //得到它的sprite元件
                Sprite goimg = eventData.pointerCurrentRaycast.gameObject.GetComponent<Image>().sprite;
                GameObject go = Instantiate(icon_name_01);
                //更新圖片資訊
                go.GetComponent<Image>().sprite = goimg;
                go.transform.SetParent(skillitems[i].transform);
                //更新位置屬性
                /// <summary>
                /// 當我們例項化出來的時候icon-name_1預置物體的RectTransform的Position屬性是相對於根目錄的Position,當我們設定新的父物體事我們需要修改它的RectTransform.anchoredPosition的值相對於當前的父物體的位置。
                /// </summary>
                go.GetComponent<RectTransform>().anchoredPosition = new Vector2(-73.2f,1.8f);
            }

        }
        SetDraggedPosition(eventData);
    }