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; } }
分类:
unity
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!