最近一直在倒腾用UGUI做虚拟摇杆,网上普遍的的做法就是使用以下的代码,但是这个有些注意事项,第一点就是Canvas的Render Mode必须是Screen Space Overlay,第二点就是挂载这个脚本的锚点的x,y必须是0.5,如图下:

using UnityEngine;
using UnityEngine.EventSystems;
public class JoyStick : MonoBehaviour, IDragHandler, IEndDragHandler
{Transform point;Vector3 startPos;//开始位置Vector3 dir;//方向float radius = 0;//需要移动的半径void Start(){point = transform.GetChild(0);radius = (transform as RectTransform).sizeDelta.x * 0.5f;startPos = point.position;}public void OnDrag(PointerEventData eventData){point.position = eventData.position;dir = (point.position - startPos).normalized;if (Vector3.SqrMagnitude(point.position - startPos) > radius * radius)point.position = startPos + dir * radius;}public void OnEndDrag(PointerEventData eventData){point.localPosition = Vector3.zero;}
}

如果Canvas的Render Mode是Screen Space Camera,这样的话上面的代码是不能满足要求的,花了一点时间才发现是这个原因,导致上面的代码不适用的,最后把代码重写了一下,终于可以成功了!

public class JoyStick : MonoBehaviour, IDragEvent
{private Canvas canvas;private RectTransform rectTransform;//坐标private static Quaternion amendAngle;private static float mRadius = 0,v=0, h=0;private static Transform point;private static Vector3 initPos;private static Vector2 startPos;private void Start(){point = transform.GetChild(0);canvas = GameObject.Find("UIRoot").GetComponent<Canvas>();rectTransform = transform as RectTransform; //也可以写成this.GetComponent<RectTransform>(),但是不建议;mRadius = (transform as RectTransform).sizeDelta.x * 0.5f;initPos = point.localPosition;h = v = 0;}public void OnBeginDrag(PointerEventData eventData){RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, canvas.worldCamera, out startPos);startPos = eventData.position - startPos;h = v = 0;   }public void OnDrag(PointerEventData eventData){point.localPosition = eventData.position - startPos;Vector3 dir = (point.localPosition - initPos).normalized;v = dir.normalized.x; h = dir.normalized.y;if (Vector3.SqrMagnitude(point.localPosition - initPos) > mRadius * mRadius)point.localPosition = initPos + dir * mRadius;}public void OnEndDrag(PointerEventData eventData){point.localPosition = Vector3.zero;h = v = 0;   }
}

RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, canvas.worldCamera, out startPos)这个的startPos返回的是点击屏幕的坐标,rectTransform是这个脚本挂载物体上的RectTransform的组件,然后减去eventData.position就知道坐标的偏移值了,看一下代码应该都可以了解意思,这里就不过多的解释了。

Unity的虚拟摇杆相关推荐

  1. Unity实现虚拟摇杆

    首先添加两者图片 从左到右分别是Back和Front 将Front放到Back中心 在Front身上添加脚本 using System.Collections; using System.Collec ...

  2. Unity实战篇:实现虚拟摇杆控制人物(Easy Touch 5.X插件)

    先上一张效果图 1.先导入Easy Touch 5.X插件 https://download.csdn.net/download/qq_15020543/10718144 强烈建议大家去Unity 商 ...

  3. unity中的2D虚拟摇杆和3D虚拟摇杆

    源代码链接https://github.com/hiramtan/HiJoystick_unity 如何使用 可以从此链接下载最新的unity package: 完成功能 2D虚拟摇杆 3D虚拟摇杆 ...

  4. Unity用UGUI做虚拟摇杆

    一.首先点击UI创建两个Image,将Image的Source Image改成自己想要的Texture即可,然后在Canvas下创建一空物体,将两个Image放在空物体下作为他的子对象: 然后为可以拖 ...

  5. Unity中实现虚拟摇杆

    一:效果演示 二:使用 --创建一个可操作的区域Joystick作为父物体,调整Joystick大小以控制可以操作的区域 --在可操作区域下创建摇杆背景Background --在摇杆背景下创建摇杆控 ...

  6. Unity 简单的虚拟摇杆

    需求:点击创建一个虚拟摇杆底盘,鼠标拖拽时候上方摇杆会跟随鼠标方向移动,并且不会超出摇杆盘范围 *摇杆功能另外实现 UI显示 using System.Collections; using Syste ...

  7. EasyTouch5 之 Joystick 虚拟摇杆

    一.EasyTouch 资源结构 EasyTouchBundle [插件的根目录] |-EasyTouch [插件核心,核心功能的实现,偏向底层] |-EasyTouchControls [插件控制器 ...

  8. EasyTouch 学习之——ETCJoystick 虚拟摇杆

    ETC Joystick 继承自 ETCBase类, 并且要实现 PointerEnterHandler  IDragHandler, IBeginDragHander IPointerDownHan ...

  9. Unity3d项目入门之虚拟摇杆

    Unity本身不提供摇杆的组件,开发者可以使用牛逼的EasyTouch插件或者应用NGUI实现相关的需求,下面本文通过Unity自身的UGUI属性,实现虚拟摇杆的功能. 主参考 <Unity:使 ...

  10. 【功能实现】手机游戏虚拟摇杆功能实现

    [UNITY3D] 声明: 查API和根据自己的想法实现此功能.如果你喜欢我这个实现,希望你能有所收获,如果你能改进那就更棒了,但如果你想直接拿走,希望标明出处. 只需要把脚本交给画布下的空物体,自行 ...

最新文章

  1. vb退出窗体代码_VB中基本概念(3)
  2. P3166-[CQOI2014]数三角形【GCD】
  3. rtrim php,php rtrim() 格式化中文问题
  4. 小白浅论JAVA数组中“for加强版”
  5. list怎么取数据_MongoDB 自动过滤重复数据
  6. 数据:以太坊2.0合约质押新增7.47万ETH
  7. 阿里达摩院为什么吸引到世界顶尖人才?
  8. EXCEL 绘制斜线表头
  9. java内置的四大函数式接口
  10. Android 提升效率
  11. Ubuntu12.04软件安装指南
  12. Origin画图技巧之3D锥形图
  13. php-hyperf 使用Saber报 HTTP -4 Unknown: Linux Code 11: Resource temporarily unavailable
  14. 寒冬之下持续吸金,蛰伏30年的国产数据库终迎黄金时代?
  15. 二(1-苯基-异喹啉)(乙酰丙酮)合铱(III)
  16. 蓝桥杯历年省赛JAVA-B组真题汇总及题目详解
  17. 京东2015校园招聘技术类笔试题
  18. hp服务器性能测试,较新架构服务器用CPU性能对比测试
  19. 4 大软件架构,你们公司用哪种?
  20. Android通信方式

热门文章

  1. Linux安装Jenkins教程
  2. python模糊匹配_python 字符串模糊匹配 Fuzzywuzzy
  3. Django-天天生鲜项目-用户登录
  4. Ubuntu安装redis客户端工具及简单使用
  5. 2022华为杯数学建模研赛选题建议和思路分析
  6. A4双面打印多少钱一张
  7. 装双系统出现winload.efi,也就是安装win10,提示0xc0000359
  8. 数论和有限域的基本概念
  9. 财务数据分析工作总结汇报PPT模板
  10. 获取稳定的西刺代理IP