当前位置: 首页 > news >正文

长春网站排名优化费用劳务工程信息平台

长春网站排名优化费用,劳务工程信息平台,申请自己的网站,wix做网站教程Unity 之 使用原生UGUI实现随手移动摇杆功能实现效果一,实现思路1.1 原理解析1.2 思路概述二,实现代码2.1 随手落下2.2 摇杆转动三,源码分享3.1 场景搭建3.2 完整代码3.3 实现效果实现效果 本文最终实现效果: 一,实现…

请添加图片描述

Unity 之 使用原生UGUI实现随手移动摇杆功能

  • 实现效果
  • 一,实现思路
    • 1.1 原理解析
    • 1.2 思路概述
  • 二,实现代码
    • 2.1 随手落下
    • 2.2 摇杆转动
  • 三,源码分享
    • 3.1 场景搭建
    • 3.2 完整代码
    • 3.3 实现效果

实现效果

本文最终实现效果:
请添加图片描述


一,实现思路

1.1 原理解析

做一个实验看一下使用ScrollRect组件实现摇杆的原理。

  1. Hierarchy面板右键 UI -> Scroll View 创建一个滚动视图,这个组件经常被应用于排行榜,选角色之类的可滑动的界面。

  2. Scroll View -> Viewport -> Content 添加一个Image组件

  3. 运行场景,鼠标点击并拖动中间部分,即可看到如下效果:

看到这里基本了解实现思路了吧,其实就是通过Scroll Rect组件的Context和Viewport的关系来进行模拟的。

更多关于ScrollRect的使用方法和实战应用,可以查看:Unity 之 UGUI Scroll Rect滚动矩形组件详解


1.2 思路概述

  1. 随手指落下位置
    思路:其实就是根据手指第一次落下的屏幕坐标,修改摇杆的初始位置;手抬起时再将摇杆位置还原
    知识点:获取手指按下和抬起的回调,将手指落下坐标转换为屏幕UI坐标

  2. 摇杆移动
    思路:使用Scroll Rect的移动回调,来控制中间的虚拟摇杆进行位置变化
    注意的点:使用OnDrag进行回调,并来控制虚拟摇杆的标移动位置不要超出背景

  3. 移动回调
    思路:当使用摇杆时使用Update进行实时回调
    注意的点:使用OnEndDrag进行回调,还原要个位置


二,实现代码

2.1 随手落下

通过锚点和RectTransformUtility坐标转换方法进行位置设置。

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;[RequireComponent(typeof(EventTrigger))]
public class JoystickTouch : ScrollRect
{    protected override void Start(){            EventTrigger trigger = GetComponent<EventTrigger>();EventTrigger.Entry entryPointerUp = new EventTrigger.Entry();entryPointerUp.eventID = EventTriggerType.PointerUp;entryPointerUp.callback.AddListener((data) => { OnPointerUp((PointerEventData)data); });trigger.triggers.Add(entryPointerUp);EventTrigger.Entry entryPointerDown = new EventTrigger.Entry();entryPointerDown.eventID = EventTriggerType.PointerDown;entryPointerDown.callback.AddListener((data) => { OnPointerDown((PointerEventData)data); });trigger.triggers.Add(entryPointerDown);}// 随手落下设置摇杆位置private void OnPointerDown(PointerEventData eventData){Vector2 LocalPosition;RectTransformUtility.ScreenPointToLocalPointInRectangle(this.GetComponent<RectTransform>(),eventData.position, eventData.pressEventCamera, out LocalPosition);this.viewport.localPosition = LocalPosition;}// 抬起还原位置private void OnPointerUp(PointerEventData eventData){this.viewport.anchoredPosition3D = Vector3.zero;}}

2.2 摇杆转动

还是在上面的类中重写OnDrag方法,进行虚拟摇杆中间位置的控制。

public class JoystickTouch : ScrollRect
{    // 半径 -- 控制拖拽区域private float mRadius;protected override void Start(){mRadius = this.content.sizeDelta.x * 0.5f;}public override void OnDrag(PointerEventData eventData){base.OnDrag(eventData);joyIsCanUse = true;//虚拟摇杆移动Vector3 contentPosition = this.content.anchoredPosition;if (contentPosition.magnitude > mRadius){contentPosition = contentPosition.normalized * mRadius;SetContentAnchoredPosition(contentPosition);}// 摇杆内部按钮旋转//if (content.anchoredPosition.y != 0)//{//    content.eulerAngles = new Vector3(0, 0,//        Vector3.Angle(Vector3.right, content.anchoredPosition) * content.anchoredPosition.y ///        Mathf.Abs(content.anchoredPosition.y) - 90);//}}
}

三,源码分享

3.1 场景搭建

创建三个Image一个作为一个的子物体,依次为:接收点击背景面积,摇杆背景板,摇杆中的虚拟按钮。
第一个Image挂载新建脚本JoystickTouch
场景搭建如下:


3.2 完整代码

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;[RequireComponent(typeof(EventTrigger))]
public class JoystickTouch : ScrollRect
{/// <summary>/// 拖动差值/// </summary>public Vector2 offsetValue;// 半径 -- 控制拖拽区域private float mRadius;/// <summary>/// 移动中回调/// </summary>public System.Action<RectTransform> JoystickMoveHandle;/// <summary>/// 移动结束回调/// </summary>public System.Action<RectTransform> JoystickEndHandle;/// <summary>/// 摇杆是否处于可用状态/// </summary>public bool joyIsCanUse = false;protected override void Start(){mRadius = this.content.sizeDelta.x * 0.5f;EventTrigger trigger = GetComponent<EventTrigger>();EventTrigger.Entry entryPointerUp = new EventTrigger.Entry();entryPointerUp.eventID = EventTriggerType.PointerUp;entryPointerUp.callback.AddListener((data) => { OnPointerUp((PointerEventData)data); });trigger.triggers.Add(entryPointerUp);EventTrigger.Entry entryPointerDown = new EventTrigger.Entry();entryPointerDown.eventID = EventTriggerType.PointerDown;entryPointerDown.callback.AddListener((data) => { OnPointerDown((PointerEventData)data); });trigger.triggers.Add(entryPointerDown);}protected override void OnEnable(){joyIsCanUse = false;offsetValue = Vector2.zero;}public override void OnDrag(PointerEventData eventData){base.OnDrag(eventData);joyIsCanUse = true;//虚拟摇杆移动Vector3 contentPosition = this.content.anchoredPosition;if (contentPosition.magnitude > mRadius){contentPosition = contentPosition.normalized * mRadius;SetContentAnchoredPosition(contentPosition);}// 摇杆内部按钮旋转//if (content.anchoredPosition.y != 0)//{//    content.eulerAngles = new Vector3(0, 0,//        Vector3.Angle(Vector3.right, content.anchoredPosition) * content.anchoredPosition.y ///        Mathf.Abs(content.anchoredPosition.y) - 90);//}}private void FixedUpdate(){if (joyIsCanUse){JoystickMoveHandle?.Invoke(this.content);offsetValue = this.content.anchoredPosition3D;}}public override void OnEndDrag(PointerEventData eventData){base.OnEndDrag(eventData);joyIsCanUse = false;offsetValue = Vector2.zero;JoystickEndHandle?.Invoke(this.content);}// 随手落下设置摇杆位置private void OnPointerDown(PointerEventData eventData){Vector2 LocalPosition;RectTransformUtility.ScreenPointToLocalPointInRectangle(this.GetComponent<RectTransform>(),eventData.position, eventData.pressEventCamera, out LocalPosition);this.viewport.localPosition = LocalPosition;}// 抬起还原位置private void OnPointerUp(PointerEventData eventData){this.viewport.anchoredPosition3D = Vector3.zero;}}

3.3 实现效果

按钮素材图片:


实现效果:


工程下载:源码和步骤都在上面分享过了,若还有什么不明白的,可以 点击链接下载 ,积分不够的童鞋关注下方卡片,回复:“摇杆” 即可获得开篇Demo源码~

http://www.yayakq.cn/news/844706/

相关文章:

  • 培训机构网站建设要求兰州做网站 咨询兰州做网站公司
  • 平台建设上线网站中国陕西省住房城乡建设厅官网
  • 温江网站开发电子工程设计网站
  • 做棋牌网站wordpress友情链接图像地址
  • 漯河市住房建设局网站上海做网站 公司 哪家好
  • 自己做网站服务器可以吗北京北京网站建设
  • 网站权重分析邢台网站建设费用
  • 网站建设教程自学网松江品牌网站建设
  • 淄博网站建设网站推广优化常用的网页设计软件
  • 如何查看百度指数网站的seo是什么意思
  • 建设一个视频网站需要多少钱慢慢来 网站建设
  • 四川建设网站塔吊企业信用信息查询公示报告
  • 网站检测中心奉贤庄行网站建设
  • 阿里云网站备案后中盛腾龙建设工程有限公司网站
  • 住房与城乡建设部网站注册中心wordpress的搭建环境搭建
  • 网站和微信对接江苏建设信息电子证书
  • 网站建设公司经营泸州 网站建设
  • 常德网站建设阿里云虚拟主机多个网站
  • php做网站需要注意什么铜陵市网站建设
  • 徐州做网站管理的公司删除后台wordpress新闻
  • 网站开发常用jquery插件邢台网站建设网络优化
  • 厦门网站建设及维护国内购物网站案例分析
  • 网站核验为个人实际是公司广东省有多少个市
  • wordpress本地网站上传网站建设属于哪类工作
  • 张家港网站建设早晨设计在县城做哪个招聘网站比较赚钱
  • 新网站怎么做外链全球设计师知识更新服务平台
  • 摄影网站的意义一些可以做翻译的网站
  • 怎么提高网站排名文化建设的名言警句
  • 传媒网站设计公司wordpress sahifa主题
  • 有哪些外贸公司网站做的比较好网站建设选择什么模式