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

主要代码如下:

 using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems; public delegate void JoystickMoveDelegate(JoystickData data); public class Joystick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{ public GameObject joystickUI; //摇杆整体UI,方便Active
public RectTransform joystickCenter; //摇杆重心
public RectTransform joystickBackground; //摇杆背景 public RectTransform joystickRect;
private float radius;
bool isClick;
Vector2 clickPosition; public static event JoystickMoveDelegate JoystickMoveEvent; // Use this for initialization
void Start()
{
radius = ;
} // Update is called once per frame
void Update()
{
JoystickController();
} public void JoystickController()
{
if (isClick)
{
clickPosition = GetClickPosition();
float distance = Vector2.Distance(new Vector2(clickPosition.x, clickPosition.y) / Screen.width * , joystickRect.anchoredPosition); if (distance < radius)
{
//当距离小于半径就开始移动 摇杆重心
joystickCenter.anchoredPosition = new Vector2(clickPosition.x / Screen.width * - joystickRect.anchoredPosition.x, clickPosition.y / Screen.width * - joystickRect.anchoredPosition.y);
}
else
{
//求圆上的一点:(目标点-原点) * 半径/原点到目标点的距离
Vector2 endPosition = (new Vector2(clickPosition.x, clickPosition.y) / Screen.width * - joystickRect.anchoredPosition) * radius / distance;
joystickCenter.anchoredPosition = endPosition;
} if (JoystickMoveEvent != null)
{
JoystickMoveEvent(new JoystickData() { x = joystickCenter.anchoredPosition.x - joystickBackground.anchoredPosition.x, y = joystickCenter.anchoredPosition.y - joystickBackground.anchoredPosition.y });
} }
} public void OnPointerDown(PointerEventData eventData)
{
ChangeAlpha();
clickPosition = GetClickPosition();
joystickRect.anchoredPosition = clickPosition / Screen.width * ;
isClick = true;
} public void OnPointerUp(PointerEventData eventData)
{
ChangeAlpha(0.3f);
joystickCenter.anchoredPosition = Vector2.zero;
isClick = false;
} /// <summary>
/// 根据平台不同获取点击位置坐标
/// </summary>
/// <returns></returns>
Vector2 GetClickPosition()
{
if (Application.platform == RuntimePlatform.Android)
{
return Input.GetTouch().position; }
else if (Application.platform == RuntimePlatform.WindowsEditor)
{
return Input.mousePosition;
}
return Vector2.zero;
} /// <summary>
/// 改变图片alpha值
/// </summary>
/// <param name="alphaValue"></param>
void ChangeAlpha(float alphaValue)
{
joystickBackground.GetComponent<RawImage>().color = new Color(,,,alphaValue);
joystickCenter.GetComponent<Image>().color = new Color(, , , alphaValue);
}
} public class JoystickData
{
public float x;
public float y; }

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

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

  1. 关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位)

    关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位) 起因:在进行bootstrap的.navbar-brand内文字设置垂直居中时采用li ...

  2. delphi SetWindowPos改变窗体位置和状态

    http://blog.163.com/yuanliaofan@126/blog/static/1730690722012534428814/ delphi SetWindowPos改变窗体位置和状态 ...

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

    在写第三人称控制的时候,一开始在电脑测试是用WASD控制角色 后来需要发布到手机上,于是就加了一个摇杆 键盘控制角色的代码已经写好了,角色八方向移动 如果按照传统的大众思路来控制的话,是达不到我想要的 ...

  4. 【转】UGUI之用脚本动态的改变Button的背景图片 和 颜色

    http://blog.csdn.net/u014771617/article/details/45102701 public Button button;void Start(){ColorBloc ...

  5. 重写TextField Rect 改变显示位置

    很简单很常用的一些东西,希望给需要的人帮助. 效果图如下: 自定义textField init() { super.init(frame: CGRect(x: , y: , width: yourWi ...

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

    一.将图例Legend放于图表右侧1.设置chart的marginRight属性值:chart: { marginRight: 120}2.设置legend图例属性值如下 legend: { alig ...

  7. 利用Range改变光标位置

    先上代码,代码取自网上某插件中 function caret(begin, end) { if (this.length == 0) return; if (typeof begin == 'numb ...

  8. C# WPF 中WebBrowser拖动来移动窗口,改变窗口位置

    前言 wpf中的WebBrowser相比之前的winform阉割了不少东西,也增加了不少东西,但是msdn对wpf也没有较好的文档 WebBrowser可以说是一个.NET控件,相对于WPF中的控件, ...

  9. echarts改变图例位置

    只需要legend属性中修改如下几个示数即可: legend:{ orient:"horizontal", x:'right', y:' center', width:'100', ...

随机推荐

  1. IOS 设备信息读取

    let infoDictionary = NSBundle.mainBundle().infoDictionary let appDisplayName: AnyObject? = infoDicti ...

  2. LR选择哪种方式录制

    LR选择哪种方式录制,有以下考虑原则: 1.基于浏览器的应用程序推荐使用HTML-basic script方式录制 2.不是基于浏览器的应用程序推荐使用URL-basic script方式录制 3.如 ...

  3. SQL:define和verify命令及替换变量&

    =================替换变量&===============使用一个&符号来指定一个变量值,执行SQL语句时,会提示用户输入一个数值. SQL> select sa ...

  4. css_day5

  5. WEB服务器4--IIS中网站、Web应用程序和虚拟目录

    网站.Web应用程序和虚拟目录 在IIS中可以创建网站.Web 应用程序和虚拟目录,以便与计算机网络上的用户共享信息. “网站”.“Web 应用程序”和“虚拟目录”这三个概念的关系如图 8‑1所示. ...

  6. solr group分组查询

    如:http://localhost:8080/solr/test_core/select?q=*:*&wt=json&indent=true&group=true&g ...

  7. 1207.1——C语言 函数

    函数可以分为无参函数和有参函数. 无参函数的定义 无参函数定义的一般形式如下:返回值类型  函数名(){    函数体} 说明: 返回值类型可以是C语言中的任意数据类型. 函数名是标识符的一种,命名规 ...

  8. ORA-00937:不是单组分组函数_Oracle

    Demo: SELECT USER_ID, USER_NAME, USER_SEX, MAX(USER_AGE), SUM(USER_MONEY) AS USER_MONEY USER_TEL, US ...

  9. hdu1215七夕节

    Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" ...

  10. java基础知识4

    58.线程的基本概念.线程的基本状态以及状态之间的关系线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身.Java中的线程有四种状态分别是:运行.就绪.挂 ...