一.首先点击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做虚拟摇杆相关推荐

  1. Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机

    前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控制器,主要看看UGUI虚拟摇杆是否可以完美的控制移动和旋转.(PS:主要是为接下来的项目做技术测试),手游版的CF ...

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

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

  3. UGUI实现虚拟手柄功能

    用Uniyt自带的UGUI实现虚拟摇杆功能,使用摇杆控制物体移动 首先新建一个unity工程,建一个画布,两张Image 父子关系,像这样: 建好之后把准备好的素材拉上去,素材在最后上传,效果图如下: ...

  4. 【Unity】UGUI超级简单的摇杆制作,摇杆控制物体移动

                [Unity]UGUI超级简单的摇杆制作,摇杆控制物体移动 目录 1.效果展示 2.博客介绍 3.具体内容和思路 (1)摇杆制作 (2)移动控制 4.资源包下载 5.推送 6. ...

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

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

  6. Unity中实现虚拟摇杆

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

  7. Unity 简单的虚拟摇杆

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

  8. EasyTouch5 之 Joystick 虚拟摇杆

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

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

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

最新文章

  1. 英特尔专家告诉你 信息时代如何掌控数据安全(附视频PPT)
  2. 利用cx_Freeze将py文件打包成exe文件(图文全解)
  3. java可视化日历_Java简单可视化日历程序
  4. 中国首档程序员综艺:你有freebug吗?
  5. AI(人工智能)的英文全称是什么?AI指什么?包含什么?
  6. ubuntu上打开md文件_Ubuntu 使用教程.md
  7. “此电话号码无法用于进行验证” 注册gmail邮箱手机号码不能验证的解决方法(已解决)
  8. 【HDU2019多校】E - Snowy Smile (最大字段和)
  9. mysql emoji 问号_mysql数据库怎么存入emoji表情,更改utf8mb4后为什么出现全是问号...
  10. unity开发android游戏(一)搭建Unity安卓开发环境
  11. Android手写签名
  12. 图片不变形,按照等比例缩小或扩大显示
  13. <video>标签及属性说明
  14. mysql下出现Unknown column ‘id‘ in ‘on clause‘的解决方法
  15. win10下解决编译环境find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer
  16. 【操作系统基础】操作系统核心概述
  17. PTA 电话聊天狂人 思路分析及代码解析
  18. 重t2加权是什么意思_LOL:每周半价恢复,幸好有一款T2等级皮肤撑场面
  19. 假如有人把支付宝存储服务器炸了
  20. Uncaught Error: [vuex] must call Vue.use(Vuex) before creating a store instance解决

热门文章

  1. 硬核干货:一位码农的架构师封神之路!
  2. 终于有人把中台说清楚了
  3. 使用Kubespray部署Kubernetes集群
  4. Spring Cloud第二篇:服务消费者RestTemplate+Ribbon
  5. 机器学习4个常用超参数调试方法!
  6. 《最受欢迎的女友职业排行榜 Top10》
  7. 用简单术语让你看到贝叶斯优化之美
  8. AI大觉醒:图灵奖得主Bengio称AI将产生意识,未来机器学习核心是注意力机制
  9. 68位高考状元真实身份曝光:最好的教育,是拼爹!
  10. 小白都能看懂的神经网络教程:从原理到优化如此简单