实现方式主要参考这篇文章: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. UVA 536 (13.08.17)

     Tree Recovery  Little Valentine liked playing with binary trees very much. Her favoritegame was con ...

  2. apache访问控制设置

    apache访问控制设置 (2009-03-17 11:24:36) 转载▼ 标签: it 杂谈   Order allow,deny    默认情况下禁止所有客户机访问 Order deny,all ...

  3. 获取被选择的radio的值

    function selectRadio() { var val = $('input:radio[name="address_select"]:checked').val(); ...

  4. class创建单击事件

    $(function () {            $(".search-button").click(function () {                $(" ...

  5. UIDeviceOrientation UIInterfaceOrientation 区别

    UIDeviceOrientation      是机器硬件的当前旋转方向   这个你只能取值 不能设置 UIInterfaceOrientation   是你程序界面的当前旋转方向   这个可以设置 ...

  6. 进阶笔记(1)——JavaScript 语言精碎

    调用:(调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数) 每个函数接受连个附加参数:this (取决于调用的模式).argument. js的四种调用模式及this指向: 1.方法调用:( ...

  7. 远程复制 scp命令

    定义 本机为A,用户名为usera,登录远程主机B的为userb,IP为remote_ip 1. 从B 拷贝文件到A机器  用下面的命令 scp userb@remote_ip:remote_path ...

  8. thinkphp使用模块/控制器/操作访问时出现No input file specified.解决方式

    thinkphp使用 http://serverName/index.php/模块/控制器/操作 访问时,出现了 No input file specified. 的错误 解决办法: 一: 开启cgi ...

  9. 做一个正气的杭电人--hdu2500

    做一个正气的杭电人 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  10. POJ Find The Multiple 1426 (搜索)

    Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22576   Accepted: 929 ...