UGUI实现的虚拟摇杆,可改变摇杆位置

实现方式主要参考这篇文章:http://www.cnblogs.com/plateFace/p/4687896.html。

主要代码如下:

  1 using UnityEngine;
  2 using System.Collections;
  3 using UnityEngine.UI;
  4 using UnityEngine.EventSystems;
  5
  6
  7 public delegate void JoystickMoveDelegate(JoystickData data);
  8
  9 public class Joystick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
 10 {
 11
 12
 13     public GameObject joystickUI;                   //摇杆整体UI,方便Active
 14     public RectTransform joystickCenter;            //摇杆重心
 15     public RectTransform joystickBackground;        //摇杆背景
 16
 17     public RectTransform joystickRect;
 18     private float radius;
 19     bool isClick;
 20     Vector2 clickPosition;
 21
 22
 23     public static event JoystickMoveDelegate JoystickMoveEvent;
 24
 25
 26
 27     // Use this for initialization
 28     void Start()
 29     {
 30         radius = 71;
 31     }
 32
 33     // Update is called once per frame
 34     void Update()
 35     {
 36         JoystickController();
 37     }
 38
 39     public void JoystickController()
 40     {
 41         if (isClick)
 42         {
 43             clickPosition = GetClickPosition();
 44             float distance = Vector2.Distance(new Vector2(clickPosition.x, clickPosition.y) / Screen.width * 960, joystickRect.anchoredPosition);
 45
 46             if (distance < radius)
 47             {
 48                 //当距离小于半径就开始移动 摇杆重心
 49                 joystickCenter.anchoredPosition = new Vector2(clickPosition.x / Screen.width * 960 - joystickRect.anchoredPosition.x, clickPosition.y / Screen.width * 960 - joystickRect.anchoredPosition.y);
 50             }
 51             else
 52             {
 53                 //求圆上的一点:(目标点-原点) * 半径/原点到目标点的距离
 54                 Vector2 endPosition = (new Vector2(clickPosition.x, clickPosition.y) / Screen.width * 960 - joystickRect.anchoredPosition) * radius / distance;
 55                 joystickCenter.anchoredPosition = endPosition;
 56             }
 57
 58             if (JoystickMoveEvent != null)
 59             {
 60                 JoystickMoveEvent(new JoystickData() { x = joystickCenter.anchoredPosition.x - joystickBackground.anchoredPosition.x, y = joystickCenter.anchoredPosition.y - joystickBackground.anchoredPosition.y });
 61             }
 62
 63         }
 64     }
 65
 66     public void OnPointerDown(PointerEventData eventData)
 67     {
 68         ChangeAlpha(1);
 69         clickPosition = GetClickPosition();
 70         joystickRect.anchoredPosition = clickPosition / Screen.width * 960;
 71         isClick = true;
 72     }
 73
 74     public void OnPointerUp(PointerEventData eventData)
 75     {
 76         ChangeAlpha(0.3f);
 77         joystickCenter.anchoredPosition = Vector2.zero;
 78         isClick = false;
 79     }
 80
 81     /// <summary>
 82     /// 根据平台不同获取点击位置坐标
 83     /// </summary>
 84     /// <returns></returns>
 85     Vector2 GetClickPosition()
 86     {
 87         if (Application.platform == RuntimePlatform.Android)
 88         {
 89             return Input.GetTouch(0).position;
 90
 91         }
 92         else if (Application.platform == RuntimePlatform.WindowsEditor)
 93         {
 94             return Input.mousePosition;
 95         }
 96         return Vector2.zero;
 97     }
 98
 99     /// <summary>
100     /// 改变图片alpha值
101     /// </summary>
102     /// <param name="alphaValue"></param>
103     void ChangeAlpha(float alphaValue)
104     {
105         joystickBackground.GetComponent<RawImage>().color = new Color(1,1,1,alphaValue);
106         joystickCenter.GetComponent<Image>().color = new Color(1, 1, 1, alphaValue);
107     }
108 }
109
110 public class JoystickData
111 {
112     public float x;
113     public float y;
114
115 }

主要实现了两个接口:IPointerDownHandler, IPointerUpHandler,监测按下和抬起事件。

时间: 2024-08-28 11:33:13

UGUI实现的虚拟摇杆,可改变摇杆位置的相关文章

delphi SetWindowPos改变窗体位置和状态

http://blog.163.com/[email protected]/blog/static/1730690722012534428814/ delphi SetWindowPos改变窗体位置和状态 2012-06-03 16:04:28|  分类: 电脑|举报|字号 订阅 下载LOFTER我的照片书  | //声明:SetWindowPos(hWnd: HWND;            {窗口句柄}hWndInsertAfter: HWND; {窗口的 Z 顺序}X, Y: Intege

拖拽改变元素位置或大小bug修复

<!doctype html><html><head>   <meta charset="utf-8">   <title>无标题文档</title><style>body{   background:#000;}.upshop-view{   width:320px;   height:499px;   background:#fff;   background-size:contain;   pos

拖拽改变元素位置或大小

<!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title><style>body{ background:#000;}.upshop-view{ width:320px; height:499px; background:#fff; background-size:contain; position:relative; z-

[例]字体改变,文章位置不变

2014-8-21 15:33:22 用手机看小说的时候发现它放大和缩小字体,当前看到哪一行,位置就还在这一行,不会像以前那样不知道被挤到哪里去了. 人性化的设计,模仿一下. 地址:http://1.ccforeverd.sinaapp.com/blog/example/example2014-8-21.html function setSize(){ var lastTop=box.scrollTop; var lastHeight=box.scrollHeight; // console.l

highcharts图表的图例legend怎么改变显示位置

一.将图例Legend放于图表右侧1.设置chart的marginRight属性值:chart: { marginRight: 120}2.设置legend图例属性值如下 legend: { align: 'right', //水平方向位置 verticalAlign: 'top', //垂直方向位置 x: 0, //距离x轴的距离 y: 100 //距离Y轴的距离} 3.效果图: 二.将图例放于图表左上角1.设置legend的属性legend: { align: 'left', //水平方向位

unity3d easytouch计算摇杆旋转角度以及摇杆八方向控制角色

在写第三人称控制的时候,一开始在电脑测试是用WASD控制角色 后来需要发布到手机上,于是就加了一个摇杆 键盘控制角色的代码已经写好了,角色八方向移动 如果按照传统的大众思路来控制的话,是达不到我想要的效果的,传统控制思路代码如下: 1 //当摇杆处于移动状态时,角色开始奔跑 2 void OnJoystickMove(MovingJoystick move) 3 { 4 if (move.joystickName != "EasyJoystick") 5 { 6 return; 7 }

如何配置虚拟主机,改变项目存储目录

知识说明: 虽然HTML5是前端的东西,但好的前端工程师,基本的后端知识也是要有的,今天刚开始学习HTML5,把如何配置虚拟主机,更换项目预览地址做出说明! 一.安装WAMP集成环境 二.启动Apache服务器 三.修改C:\wamp\bin\apache\apache2.4.9\conf\https.conf文件(前提:我的wamp是安装在C盘下的) 将大概230行左右: DocumentRoot "C:\wamp\www"(此为默认的localhost目录) 修改为: Docume

单链表快排 改变节点位置

快速排序2(算法交换链表节点,平均时间复杂度O(nlogn),不考虑递归栈空间的话空间复杂度是O(1)) 这里的partition,我们选取第一个节点作为枢纽元,然后把小于枢纽的节点放到一个链中,把不小于枢纽的及节点放到另一个链中,最后把两条链以及枢纽连接成一条链. 这里我们需要注意的是,1.在对一条子链进行partition时,由于节点的顺序都打乱了,所以得保正重新组合成一条新链表时,要和该子链表的前后部分连接起来,因此我们的partition传入三个参数,除了子链表的范围(也是前闭后开区间)

虚拟内存页面文件pagefile.sys(棉文件)改变存放位置

"pagefile.sys"是页面交换文件,切记,这个文件不能删除,但是可以改变其大小和存放位置:右击"我的电脑/属性",然后在对话框的"高级"标签下单击"性能"下的"设置"按钮,在"性能选项"对话框中切换到"高级"标签下,再单击"虚拟内存"下的"更改"按钮,即可根据需要更改页面文件的大小--先选中c盘,然后选"无分页