Unity用UGUI做虚拟摇杆
一.首先点击UI创建两个Image,将Image的Source Image改成自己想要的Texture即可,然后在Canvas下创建一空物体,将两个Image放在空物体下作为他的子对象;
然后为可以拖动的Image编写脚本,脚本如下:(有注释,就不多说了)
using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems;public class JoyStick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler//需要注意继承的接口,接口内的方法需要实现 {/// <summary>/// 摇杆最大半径/// 以像素为单位/// </summary>public float JoyStickRadius = 50;/// <summary>/// 摇杆重置所诉/// </summary>public float JoyStickResetSpeed = 5.0f;/// <summary>/// 当前物体的Transform组件/// </summary>private RectTransform selfTransform;/// <summary>/// 是否触摸了虚拟摇杆/// </summary>private bool isTouched = false;/// <summary>/// 虚拟摇杆的默认位置/// </summary>private Vector2 originPosition;/// <summary>/// 虚拟摇杆的移动方向/// </summary>private Vector2 touchedAxis;public Vector2 TouchedAxis{get{if (touchedAxis.magnitude < JoyStickRadius)return touchedAxis.normalized / JoyStickRadius;return touchedAxis.normalized;}}/// <summary>/// 定义触摸开始事件委托 /// </summary>public delegate void JoyStickTouchBegin(Vector2 vec);/// <summary>/// 定义触摸过程事件委托 /// </summary>/// <param name="vec">虚拟摇杆的移动方向</param>public delegate void JoyStickTouchMove(Vector2 vec);/// <summary>/// 定义触摸结束事件委托/// </summary>public delegate void JoyStickTouchEnd();/// <summary>/// 注册触摸开始事件/// </summary>public event JoyStickTouchBegin OnJoyStickTouchBegin;/// <summary>/// 注册触摸过程事件/// </summary>public event JoyStickTouchMove OnJoyStickTouchMove;/// <summary>/// 注册触摸结束事件/// </summary>public event JoyStickTouchEnd OnJoyStickTouchEnd;void Start(){//初始化虚拟摇杆的默认方向selfTransform = this.GetComponent<RectTransform>();originPosition = selfTransform.anchoredPosition;}public void OnPointerDown(PointerEventData eventData){isTouched = true;touchedAxis = GetJoyStickAxis(eventData);if (this.OnJoyStickTouchBegin != null)this.OnJoyStickTouchBegin(TouchedAxis);}public void OnPointerUp(PointerEventData eventData){isTouched = false;selfTransform.anchoredPosition = originPosition;touchedAxis = Vector2.zero;if (this.OnJoyStickTouchEnd != null)this.OnJoyStickTouchEnd();}public void OnDrag(PointerEventData eventData){touchedAxis = GetJoyStickAxis(eventData);if (this.OnJoyStickTouchMove != null)this.OnJoyStickTouchMove(TouchedAxis);}void Update(){//当虚拟摇杆移动到最大半径时摇杆无法拖动//为了确保被控制物体可以继续移动//在这里手动触发OnJoyStickTouchMove事件if (isTouched && touchedAxis.magnitude >= JoyStickRadius){if (this.OnJoyStickTouchMove != null)this.OnJoyStickTouchMove(TouchedAxis);}//松开虚拟摇杆后让虚拟摇杆回到默认位置if (selfTransform.anchoredPosition.magnitude > originPosition.magnitude)selfTransform.anchoredPosition -= TouchedAxis * Time.deltaTime * JoyStickResetSpeed;}/// <summary>/// 返回虚拟摇杆的偏移量/// </summary>/// <returns>The joy stick axis.</returns>/// <param name="eventData">Event data.</param>private Vector2 GetJoyStickAxis(PointerEventData eventData){//获取手指位置的世界坐标Vector3 worldPosition;if (RectTransformUtility.ScreenPointToWorldPointInRectangle(selfTransform,eventData.position, eventData.pressEventCamera, out worldPosition))selfTransform.position = worldPosition;//获取摇杆的偏移量Vector2 touchAxis = selfTransform.anchoredPosition - originPosition;//摇杆偏移量限制if (touchAxis.magnitude >= JoyStickRadius){touchAxis = touchAxis.normalized * JoyStickRadius;selfTransform.anchoredPosition = touchAxis;}return touchAxis;}}
二.接下来,就是拖拽p_w_picpath使物体能够移动了;
为该物体添加脚本:
using UnityEngine; using System.Collections;public class JoyStick3D : MonoBehaviour {private JoyStick js;void Start(){js = GameObject.FindObjectOfType<JoyStick>();js.OnJoyStickTouchBegin += OnJoyStickBegin;js.OnJoyStickTouchMove += OnJoyStickMove;js.OnJoyStickTouchEnd += OnJoyStickEnd;}void OnJoyStickBegin(Vector2 vec){Debug.Log("开始触摸虚拟摇杆");}void OnJoyStickMove(Vector2 vec){Debug.Log("正在移动虚拟摇杆");//设置角色朝向Quaternion q = Quaternion.LookRotation(new Vector3(vec.x, 0, vec.y));transform.rotation = q;//移动角色transform.Translate(Vector3.forward * 75f * Time.deltaTime);}void OnJoyStickEnd(){Debug.Log("触摸移动摇杆结束");}void OnGUI(){GUI.Label(new Rect(30, 30, 200, 30), "3D模式下的虚拟摇杆测试");} }
三.接着可以试着运行,可以看到物体可以随着p_w_picpath的拖动而移动,但是有不好的地方,就是拖拽的p_w_picpath超过半径所设置的半径JoyStickRadius时,p_w_picpath的位置就会固定在一个位置不动,
而且当在半径范围内时,物体不会持续移动,这个就不好了,不知道有那位大神能够邦杰呢?
转载于:https://blog.51cto.com/cjboking/1840752
Unity用UGUI做虚拟摇杆相关推荐
- Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机
前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控制器,主要看看UGUI虚拟摇杆是否可以完美的控制移动和旋转.(PS:主要是为接下来的项目做技术测试),手游版的CF ...
- unity中的2D虚拟摇杆和3D虚拟摇杆
源代码链接https://github.com/hiramtan/HiJoystick_unity 如何使用 可以从此链接下载最新的unity package: 完成功能 2D虚拟摇杆 3D虚拟摇杆 ...
- UGUI实现虚拟手柄功能
用Uniyt自带的UGUI实现虚拟摇杆功能,使用摇杆控制物体移动 首先新建一个unity工程,建一个画布,两张Image 父子关系,像这样: 建好之后把准备好的素材拉上去,素材在最后上传,效果图如下: ...
- 【Unity】UGUI超级简单的摇杆制作,摇杆控制物体移动
[Unity]UGUI超级简单的摇杆制作,摇杆控制物体移动 目录 1.效果展示 2.博客介绍 3.具体内容和思路 (1)摇杆制作 (2)移动控制 4.资源包下载 5.推送 6. ...
- Unity实战篇:实现虚拟摇杆控制人物(Easy Touch 5.X插件)
先上一张效果图 1.先导入Easy Touch 5.X插件 https://download.csdn.net/download/qq_15020543/10718144 强烈建议大家去Unity 商 ...
- 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 ...
最新文章
- 英特尔专家告诉你 信息时代如何掌控数据安全(附视频PPT)
- 利用cx_Freeze将py文件打包成exe文件(图文全解)
- java可视化日历_Java简单可视化日历程序
- 中国首档程序员综艺:你有freebug吗?
- AI(人工智能)的英文全称是什么?AI指什么?包含什么?
- ubuntu上打开md文件_Ubuntu 使用教程.md
- “此电话号码无法用于进行验证” 注册gmail邮箱手机号码不能验证的解决方法(已解决)
- 【HDU2019多校】E - Snowy Smile (最大字段和)
- mysql emoji 问号_mysql数据库怎么存入emoji表情,更改utf8mb4后为什么出现全是问号...
- unity开发android游戏(一)搭建Unity安卓开发环境
- Android手写签名
- 图片不变形,按照等比例缩小或扩大显示
- <video>标签及属性说明
- mysql下出现Unknown column ‘id‘ in ‘on clause‘的解决方法
- win10下解决编译环境find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer
- 【操作系统基础】操作系统核心概述
- PTA 电话聊天狂人 思路分析及代码解析
- 重t2加权是什么意思_LOL:每周半价恢复,幸好有一款T2等级皮肤撑场面
- 假如有人把支付宝存储服务器炸了
- Uncaught Error: [vuex] must call Vue.use(Vuex) before creating a store instance解决