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;
    }
}
复制代码

 

posted @   xms_667  阅读(167)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示