Unity 實現物體拖拽


Unity實現拖拽可以用協程的方式,也可以繼承Unity EventSystem中的接口實現。

當鼠標按下的時候以左鍵為例:

   Using System.Collections;
Using System.Collections.Generic;
Using UnityEngine;   
public class Test:MonoBehavioout{     private Vector3 mousePos;//鼠標位置屏幕     private Vector3 targetPos;//目標位置     private Vector3 offect;//偏移位置鼠標轉世界坐標與transform.position的偏移量     private Transform tran;//目標體Transform組件     void Awake(){       tran=transform;//獲取Transform組件     }     Ienumerator OnMousedown{//Mono中的OnMouseDown可以改成協程       mousePos=new Vector3(Input.mousePosition.x,Input.mousePosition.y,tran.position.z);       offect=tran.position-Camera.main.ScreenToWorldPoint(mousePos);       while(Input.GetMouseButton(0)){         mousePos=new Vector3(Input.mousePosition.x,Input.mousePosition.y,tran.position.z);         targetPos=offect+Camera.main.ScreenToWorldPoint(mousePos);         tran.position=targetPos;         yield return new WaitForFixedUpdate();       }     }

當需要拖拽的物體是UI是,會阻擋射線檢測即OnMouseDown等消息機制無法監聽到,為了解決這個情況我們需要用到EventTrigger組件,用法類似給Button加上函數。

最重要的是對於UI使用的坐標並非transform組件而是rectTransform組件,故坐標為anchoredPosition才是UI的rect坐標。為了使鼠標坐標能夠轉換為rectPos坐標需要用到RectTransformUtility.ScreenPointToLocalPointInRectangle()函數,例子如下:

   using UnityEngine;
using System.Collections;   public class Test:MonoBehaviour{     Canvas canvas;//當前UI所在的畫布     RectTransform rectTransform;     void Statr(){       rectTransform=transform as RectTransform;//將當transform組件轉換為RectTransform       canvas=GameObject.Find(“Canvas”).GetComponent<Canvas>();
    }     
void Update(){       Vector2 Pos;       if(RectTransformUtility.ScreenPointToLocalPointInRectangle
(canvas.transform as RectTransform,Input.mousePosition,canvas.worldCamera,out pos))         rectTransform.anchoredPosition=pos;     }

其中rect 代表當前UI父對象的Rect,screecPoint代表需要轉換成LocalPoint的屏幕坐標,cam代表渲染的相機,LocalPoint存儲當前的LocalPos。若Canvas渲染模式為Overlay(疊加)模式cam為null。


免責聲明!

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



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