1. 程式人生 > 其它 >unity筆記(指令碼6)(UGUI)

unity筆記(指令碼6)(UGUI)

public class CustomMeshCollision : Image
{
    //重寫IsRaycastLocationValid方法,定義新的事件響應區域
    public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
    {
        //return base.IsRaycastLocationValid(screenPoint, eventCamera);
        return GetComponent<PolygonCollider2D>().OverlapPoint(screenPoint);
    }
 
}
public class EventDemo : MonoBehaviour, IPointerClickHandler,IDragHandler
{
    public void Fun1()
    {
        Debug.Log("Fun1");
    }
    public void Fun2(string str)
    {
        Debug.Log("Fun2:" + str);
    }

    private void Start1()
    {
        //事件:當滿足某種條件自動呼叫方法的過程。
        //註冊事件:將某個方法與某個事件做關聯。
        
//1.獲取相關元件引用 Button btn = transform.Find("Button").GetComponent<Button>(); //2.繫結 //public delegate void UnityAction(); //方法形參:委託型別 //方法實參:傳遞方法(無返回值,無引數) btn.onClick.AddListener(Fun1); var input = transform.Find("InputField").GetComponent<InputField>();
//public delegate void UnityAction<T0>(T0 arg0); //傳遞無返回值,1個引數的方法 input.onValueChanged.AddListener(Fun2); } //游標單擊當前UI時執行 public void OnPointerClick(PointerEventData eventData) { //eventData 事件引數類:包含了引發事件時的資訊 //判斷單擊次數 if (eventData.clickCount == 2) { Debug.Log("OnPointerClick"); } } //游標拖拽當前UI時執行 public void OnDrag(PointerEventData eventData) { //當canvas渲染模式為overlay時,世界座標原點與螢幕座標原點重合, //所以可以將螢幕座標視為世界座標 //獲取當前游標位置(螢幕) //transform.position = eventData.position; //通用拖拽程式碼 Vector3 worldPos; RectTransform parentRTF = transform.parent as RectTransform; //將螢幕座標 --> 世界座標 RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out worldPos); transform.position = worldPos; //練習:精準拖拽 } }
public class ItweenDemo : MonoBehaviour
{
    public iTween.EaseType type;
    public GameObject targetTF;
    public void ItweenMovement()
    {
        //iTween.MoveTo(targetTF, transform.position, 1);

        //緩動外掛  DoTween
        iTween.MoveTo(targetTF, iTween.Hash(
            "position", transform.position,
            "time", 1,
            "easetype", type,
            "oncomplete", "Fun1",
            "oncompletetarget",gameObject
       ));
    }

    //動畫事件
    private void Fun1()
    {
        print("到了");
    }
}
public class RectTransformDemo : MonoBehaviour
{
    public Vector3 localPos;
    public Vector2 size;
    private void Update()
    { 
        //UI 世界座標(從世界原點 指向 UI 軸心點Pivot向量)
        Vector3 worldPos = transform.position;

        //當前UI軸心點 相對於 父級(UI)軸心點 向量 
        //從父級軸心點 指向 當前UI軸心點 向量
        localPos = transform.localPosition;

        //RectTransform rtf = transform as RectTransform;
        RectTransform rtf = GetComponent<RectTransform>();
        //當前UI 錨點 指向 軸心點的向量
        Vector3 anchoredPos = rtf.anchoredPosition3D;

        //獲取3D模型大小
        //Vector3 size = GetComponent<MeshRenderer>().bounds.size;
        //獲取UI寬高
        float width = rtf.rect.width;
        float height = rtf.rect.height;

        ////設定UI寬度
        //rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 100);
        ////設定UI高度
        //rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 100);

        //rtf.sizeDelta = new Vector2(100, 100);
        //當前物體大小 -  錨點大小
        //如果錨點不分開,結果是物體大小
        size = rtf.sizeDelta;

        //RectTransformUtility
    }
 
}
public class SilderPanel : MonoBehaviour,IDragHandler,IEndDragHandler,IBeginDragHandler
{
    [Tooltip("拖拽速度")]
    public float dragSpeed = 30;

    private Transform[] childArrayTF;
    private void Start()
    {
        //將所有子物體(親兒子)變換元件儲存到陣列中
        childArrayTF = new Transform[transform.childCount];
        for (int i = 0; i < childArrayTF.Length; i++)
        {
            childArrayTF[i] = transform.GetChild(i);
        } 
    }
     
    public void OnDrag(PointerEventData eventData)
    {
        //當前游標位置 - 上一幀游標位置
        //print(eventData.delta);
        transform.Translate(eventData.delta.x * Time.deltaTime * dragSpeed, 0, 0);
    }

    //開始拖拽位置
    private Vector2 beginPoint;
    //開始拖拽
    public void OnBeginDrag(PointerEventData eventData)
    {
        beginPoint = eventData.position;
    }
    [Tooltip("滑動速度閾值")]
    public float silderSpeedThreshold = 5;
    public int index;

    private Vector2 beginPos, endPos;
    //結束拖拽時執行
    public void OnEndDrag(PointerEventData eventData)
    {
        Vector2 dragOffset = eventData.position - beginPoint;
        //更換頁面條件:游標移動距離、速度
        if (dragOffset.magnitude > Screen.width / 2 || Mathf.Abs(eventData.delta.x) > silderSpeedThreshold)
        {
            //如果游標向左移動 則頁碼增加
            if (dragOffset.x < 0)
                //計算頁碼
                index++;
            else
                index--;
            //限制頁碼範圍
            index = Mathf.Clamp(index, 0, transform.childCount - 1);
        }
        //transform.position = endPos;
        beginPos = transform.position;
        //公式:父UI位置 - 需要呈現頁面位置 + 當前物體位置
        endPos = transform.parent.position - childArrayTF[index].position + transform.position;
        x = 0;
    }

    public AnimationCurve curve;
    private float x = 1;
    [Tooltip("滑動持續時間")]
    public float duration = 0.5f;
    private void Update()
    {
        if (x < 1)
        {
            x += Time.deltaTime / duration;
            //起點固定   終點固定  比例變化
            transform.position = Vector3.Lerp(beginPos, endPos, curve.Evaluate(x));
        }
    } 
}
/*
     需求分析:
     1.面板跟隨游標移動方向(左右  eventData.delta )移動 transform.Translate(?,0,0)
     2.鬆開歸位
        -- 確定事件
        -- 更換頁面條件:游標移動距離、速度
        -- 計算頁碼
        -- 如何呈現指定頁面(計算當前物體SilderPanel需要移動的位置)
        -- 移動
 * 
 * 全屏滑動:
 * 建立 SilderPanel (四個錨點分開)作為所有頁面的父物體
 * 建立子頁面Panel
 * 
 * 小屏滑動:
 * 建立 PanelView(Panel) 作為呈現範圍,新增Mask元件,用於遮蓋範圍外的UI元素。
 * 將SilderPanel新增至PanelView中
*/
/*
 作業:實現2048使用者的輸入
 * 
 
 */
/// <summary>
/// UI拖拽
/// </summary>
public class UIDrag : MonoBehaviour,IPointerDownHandler,IDragHandler
{
    private RectTransform parentRTF;
    private void Start()
    {
        parentRTF = transform.parent as RectTransform;
    }

    private Vector3 downOffset;
    //游標按下時執行
    public void OnPointerDown(PointerEventData eventData)
    {  
        //記錄偏移位置
        //螢幕座標 eventData.position  -->  世界座標 downWorldPos
        Vector3 downWorldPos;
        RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out downWorldPos);

        downOffset = transform.position - downWorldPos;
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector3 currentWorldPos;
        RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out currentWorldPos);
        //拖拽時,在當前游標位置基礎上 +  按下時記錄的偏移量
        transform.position = currentWorldPos + downOffset;
    }
}