Unity的虚拟摇杆
最近一直在倒腾用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的虚拟摇杆相关推荐
- Unity实现虚拟摇杆
首先添加两者图片 从左到右分别是Back和Front 将Front放到Back中心 在Front身上添加脚本 using System.Collections; using System.Collec ...
- Unity实战篇:实现虚拟摇杆控制人物(Easy Touch 5.X插件)
先上一张效果图 1.先导入Easy Touch 5.X插件 https://download.csdn.net/download/qq_15020543/10718144 强烈建议大家去Unity 商 ...
- unity中的2D虚拟摇杆和3D虚拟摇杆
源代码链接https://github.com/hiramtan/HiJoystick_unity 如何使用 可以从此链接下载最新的unity package: 完成功能 2D虚拟摇杆 3D虚拟摇杆 ...
- Unity用UGUI做虚拟摇杆
一.首先点击UI创建两个Image,将Image的Source Image改成自己想要的Texture即可,然后在Canvas下创建一空物体,将两个Image放在空物体下作为他的子对象: 然后为可以拖 ...
- Unity中实现虚拟摇杆
一:效果演示 二:使用 --创建一个可操作的区域Joystick作为父物体,调整Joystick大小以控制可以操作的区域 --在可操作区域下创建摇杆背景Background --在摇杆背景下创建摇杆控 ...
- Unity 简单的虚拟摇杆
需求:点击创建一个虚拟摇杆底盘,鼠标拖拽时候上方摇杆会跟随鼠标方向移动,并且不会超出摇杆盘范围 *摇杆功能另外实现 UI显示 using System.Collections; using Syste ...
- EasyTouch5 之 Joystick 虚拟摇杆
一.EasyTouch 资源结构 EasyTouchBundle [插件的根目录] |-EasyTouch [插件核心,核心功能的实现,偏向底层] |-EasyTouchControls [插件控制器 ...
- EasyTouch 学习之——ETCJoystick 虚拟摇杆
ETC Joystick 继承自 ETCBase类, 并且要实现 PointerEnterHandler IDragHandler, IBeginDragHander IPointerDownHan ...
- Unity3d项目入门之虚拟摇杆
Unity本身不提供摇杆的组件,开发者可以使用牛逼的EasyTouch插件或者应用NGUI实现相关的需求,下面本文通过Unity自身的UGUI属性,实现虚拟摇杆的功能. 主参考 <Unity:使 ...
- 【功能实现】手机游戏虚拟摇杆功能实现
[UNITY3D] 声明: 查API和根据自己的想法实现此功能.如果你喜欢我这个实现,希望你能有所收获,如果你能改进那就更棒了,但如果你想直接拿走,希望标明出处. 只需要把脚本交给画布下的空物体,自行 ...
最新文章
- vb退出窗体代码_VB中基本概念(3)
- P3166-[CQOI2014]数三角形【GCD】
- rtrim php,php rtrim() 格式化中文问题
- 小白浅论JAVA数组中“for加强版”
- list怎么取数据_MongoDB 自动过滤重复数据
- 数据:以太坊2.0合约质押新增7.47万ETH
- 阿里达摩院为什么吸引到世界顶尖人才?
- EXCEL 绘制斜线表头
- java内置的四大函数式接口
- Android 提升效率
- Ubuntu12.04软件安装指南
- Origin画图技巧之3D锥形图
- php-hyperf 使用Saber报 HTTP -4 Unknown: Linux Code 11: Resource temporarily unavailable
- 寒冬之下持续吸金,蛰伏30年的国产数据库终迎黄金时代?
- 二(1-苯基-异喹啉)(乙酰丙酮)合铱(III)
- 蓝桥杯历年省赛JAVA-B组真题汇总及题目详解
- 京东2015校园招聘技术类笔试题
- hp服务器性能测试,较新架构服务器用CPU性能对比测试
- 4 大软件架构,你们公司用哪种?
- Android通信方式