FairyGUI摇杆

素材资源:

一、准备工作

1、创建FairyGUI新项目

2、导入素材

3、新建按钮

4、编辑按钮

5、设置作用区域




6、设置关联

7、打包发布


二、Unity中显示

1、创建Unity新项目

2、导入FairyGUI的unity包和DOTween包


3、Unity中显示


三、脚本控制

1、新建2个脚本

一个是RockingBarMain,需要挂载在UIPanel上;另一个是摇杆本身脚本RockingBar。

2、编码实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;
using DG.Tweening;public class RockingBar : EventDispatcher  //事件收发类
{//事件的监听者public EventListener onMove { get; private set; }  //设置了一个安全权限public EventListener onEnd { get; private set; }//mainUI里的对象private GButton rockingbarButton;private GObject thumb;private GObject touchArea;private GObject center;//摇杆的属性private float initX;private float initY;private float startStageX;private float startStageY;private float lastStageX;private float lastStageY;private int touchID;private int radius { get; set; }private Tweener tweener;public RockingBar(GComponent mainUI){onMove = new EventListener(this,"onMove");onEnd = new EventListener(this, "onEnd");rockingbarButton = mainUI.GetChild("RockingBar").asButton;rockingbarButton.changeStateOnClick = false;thumb = rockingbarButton.GetChild("thumb");touchArea = mainUI.GetChild("RockingBarTouchArea");center = mainUI.GetChild("RockingBarCenter");initX = center.x + center.width / 2;initY = center.y + center.height / 2;touchID = -1;radius = 150;touchArea.onTouchBegin.Add(OnTouchBegin);touchArea.onTouchMove.Add(OnTouchMove);touchArea.onTouchEnd.Add(OnTouchEnd);}//开始触摸private void OnTouchBegin(EventContext context){if (touchID == -1)  //第一次触摸{InputEvent inputEvent = (InputEvent)context.data;touchID = inputEvent.touchId;if (tweener != null){tweener.Kill();  //杀死上一个动画tweener = null;}Vector2 localPos = GRoot.inst.GlobalToLocal(new Vector2(inputEvent.x, inputEvent.y));float posX = localPos.x;float posY = localPos.y;rockingbarButton.selected = true;lastStageX = posX;lastStageY = posY;startStageX = posX;startStageY = posY;center.visible = true;center.SetXY(posX - center.width / 2, posY - center.height / 2);rockingbarButton.SetXY(posX - rockingbarButton.width / 2, posY - rockingbarButton.height / 2);float deltaX = posX - initX;float deltaY = posY - initY;float degrees = Mathf.Atan2(deltaY, deltaX) * 180 / Mathf.PI;  //弧度转角度thumb.rotation = degrees + 90;context.CaptureTouch();}}//移动触摸private void OnTouchMove(EventContext context){InputEvent inputEvent = (InputEvent)context.data;if (touchID != -1 && inputEvent.touchId == touchID){Vector2 localPos = GRoot.inst.GlobalToLocal(new Vector2(inputEvent.x, inputEvent.y));float posX = localPos.x;float posY = localPos.y;float moveX = posX - lastStageX;float moveY = posY - lastStageY;lastStageX = posX;lastStageY = posY;float buttonX = rockingbarButton.x + moveX;float buttonY = rockingbarButton.y + moveY;float deltaX = buttonX + rockingbarButton.width / 2 - startStageX;float deltaY = buttonY + rockingbarButton.height / 2 - startStageY;float rad = Mathf.Atan2(deltaY, deltaX);float degree = rad * 180 / Mathf.PI;thumb.rotation = degree + 90;//设置范围float maxX = radius * Mathf.Cos(rad);float maxY = radius * Mathf.Sin(rad);if (Mathf.Abs(deltaX) > Mathf.Abs(maxX)){deltaX = maxX;}if (Mathf.Abs(deltaY) > Mathf.Abs(maxY)){deltaY = maxY;}buttonX = startStageX + deltaX;buttonY = startStageY + deltaY;rockingbarButton.SetXY(buttonX - rockingbarButton.width / 2, buttonY - rockingbarButton.height / 2);onMove.Call(degree);}}//结束触摸private void OnTouchEnd(EventContext context){InputEvent inputEvent = (InputEvent)context.data;if (touchID != -1 && inputEvent.touchId == touchID){touchID = -1;thumb.rotation = thumb.rotation + 180;center.visible = false;tweener = rockingbarButton.TweenMove(new Vector2(initX - rockingbarButton.width / 2, initY - rockingbarButton.height / 2), 0.3f).OnComplete(() =>{tweener = null;rockingbarButton.selected = false;thumb.rotation = 0;center.visible = true;center.SetXY(initX - center.width / 2, initY - center.height / 2);;});}onEnd.Call();}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;public class RockingBarMain : MonoBehaviour
{private GComponent mainUI;private GTextField gTextField;private RockingBar rockingBar;void Start(){mainUI = GetComponent<UIPanel>().ui;gTextField = mainUI.GetChild("n4").asTextField;rockingBar = new RockingBar(mainUI);rockingBar.onMove.Add(RockingBarMove);rockingBar.onEnd.Add(RockingBarEnd);}// Update is called once per framevoid Update(){}private void RockingBarMove(EventContext context){float degree = (float)context.data;gTextField.text = degree.ToString();}private void RockingBarEnd(){gTextField.text = "";}
}

四、全部实现

FairyGUI摇杆相关推荐

  1. 强大的UI编辑器-FairyGui简单介绍

    FairyGui简单介绍 学习路径 1.下载FairyGUI编辑器. 2.下载对应你的开发平台的FairyGUI SDK. 3.对照SDK里的例子(包括编辑器里的UI设计,和运行时的代码),阅读全部官 ...

  2. vscode用鼠标滚轮_「鼠标」垂直鼠标体验之三 麦塔奇Rockstick2摇杆鼠标

    Microtouch麦塔奇是我体验的第三个垂直鼠标品牌了,前两个分别是罗技和多彩. 对比来看,这次上手的Rockstick2是我目前体验的垂直鼠标里最迷你的一个. 整体外观先上图给大家看一下~ 到手了 ...

  3. FairyGUI和NGUI对比

    一直在做Unity方面的游戏开发,经同事介绍了解到有这么一个GUI能提供跨平台的能力,有独立UI编辑器,而且功能强大,能够组合成复杂的UI界面,可以导出到Unity,Flash,Starling等,文 ...

  4. Unity用UGUI做虚拟摇杆

    一.首先点击UI创建两个Image,将Image的Source Image改成自己想要的Texture即可,然后在Canvas下创建一空物体,将两个Image放在空物体下作为他的子对象: 然后为可以拖 ...

  5. 关于Unity中自带摇杆与车轮碰撞器的使用

    准备 在创建好项目目录的基础上 导入一个第三方的资源包,在Project面板里面 右键---->Import Package---->Custom Package---->easy_ ...

  6. DelphiX教程系列 1 - 使用键盘和摇杆

    用到的组件(TDXInput.TTimer): 原文链接:http://www.delphigamedev.com/tutorials/dxtut1.htm 在这一教程里,我们将会学习如何使用键盘来移 ...

  7. Ardino基础教程 22_PS2摇杆

    PS2摇杆 PS2 摇杆一般可以用来控制小车等等,其构造主要就是两个10K 的电位器,还有一个按键开关.五个端口分别为VCC,X,Button,Y,GND. 实验接线图 以下为参考程序代码: #inc ...

  8. 【Cocosd2d实例教程五】Cocos2d添加虚拟摇杆控制器

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍     cocos2d为我们提供了好用的摇杆控制器,主要是对ZJoystick.h和ZJoystick ...

  9. Android 之一 Android Studio 安装、配置等新手入门 + 百度地图定位 + 移动摇杆 的实现

    缘起   之前在玩一款 VR 游戏:一起来捉妖.这款游戏是使用地图进行游戏的.无奈网上找了各种工具,要么付费,要么不好使.想想自己就是个程序猿,于是乎决定自己开发一个.现在游戏基本放弃了,但是为了游戏 ...

最新文章

  1. 《树莓派学习指南(基于Linux)》——第 2 章 开始探索 2.1 欢迎使用LXDE
  2. Go的RESTful
  3. java 更新对象_java通过key-list和对应value更新当前对象
  4. 八个程序员必备的代码编辑器(附下载链接)
  5. 人工智能技术在银行客服中心的应用风险
  6. 计算机网络属性设置方法,电脑本地连接的属性设置在哪里
  7. Asp.Net分页生成页码超链接方法
  8. 塑料盖行业调研报告 - 市场现状分析与发展前景预测
  9. 求职数据分析师岗位,简历应该如何写?|工科生三个月成功转行数据分析心得浅谈
  10. UI设计初学者必备的工具以及学习路线(附思维导图)
  11. darknetYolov3图片的分类计数、置信度以及输出xmin,xmax,ymin,ymax的结果
  12. 正六边形:判断点是否在正六边形内
  13. Android华为推送踩坑,极光推送集成华为遇到的坑?
  14. ewebeditor文件上传漏洞2.8.0版本(漏洞复现)
  15. linux下解压命令大全
  16. NB-IoT网络架构
  17. 秋晨微凉的第一篇CSDN博客
  18. 求n以内的所有素数(质数)个数
  19. 【周赛】第一周周赛——欢迎16级的新同学题解(题目出自codeforces 318A,546A,431C,665E,HDU 4104)
  20. 动脉自旋标记磁共振成像在灌注和侧支循环检测的研究进展

热门文章

  1. 用阿里云安装docker
  2. 公司抽奖小程序(自定义名单,空格控制滚动、抽奖,可作弊,可满足千人团队, 带可执行程序下载及源代码)
  3. 04 【eCharts样式定制系列】矩形树图自定义颜色
  4. Linux per_cpu机制的详解
  5. 新智元【Yoshua Bengio 亲自解答】机器学习 81 个问题及答案(最全收录)
  6. python中 ab c 2结果是_ab + c * 2的结果是( )。
  7. 时针分针角度问题(不含秒针)
  8. 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐
  9. 如何用Python操作Excel自动化办公?一个案例教会你openpyxl——读取数据
  10. 光猫 高级NAT配置