unity筆記(指令碼6)(UGUI)
阿新 • • 發佈:2022-03-10
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; } }