当前位置:网站首页>Fairygui joystick
Fairygui joystick
2022-07-06 12:39:00 【SQ Liu】
FairyGUI rocker
Material resources :
One 、 preparation
1、 establish FairyGUI The new project
2、 Import material
3、 The new button
4、 Edit button
5、 Set the scope
6、 Set correlation
7、 Packaging releases
Two 、Unity It shows that
1、 establish Unity The new project
2、 Import FairyGUI Of unity Bao He DOTween package
3、Unity It shows that
3、 ... and 、 Script control
1、 newly build 2 Script
One is RockingBarMain, Need to be mounted on UIPanel On ; The other is the script of the rocker itself RockingBar.
2、 coded
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;
using DG.Tweening;
public class RockingBar : EventDispatcher // Event sending and receiving class
{
// The monitor of the event
public EventListener onMove {
get; private set; } // Set a security permission
public EventListener onEnd {
get; private set; }
//mainUI The object in
private GButton rockingbarButton;
private GObject thumb;
private GObject touchArea;
private GObject center;
// Properties of the rocker
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);
}
// Start touching
private void OnTouchBegin(EventContext context)
{
if (touchID == -1) // First touch
{
InputEvent inputEvent = (InputEvent)context.data;
touchID = inputEvent.touchId;
if (tweener != null)
{
tweener.Kill(); // Kill the last animation
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; // The angle of arc
thumb.rotation = degrees + 90;
context.CaptureTouch();
}
}
// Mobile touch
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;
// set range
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);
}
}
// End touch
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 frame
void Update()
{
}
private void RockingBarMove(EventContext context)
{
float degree = (float)context.data;
gTextField.text = degree.ToString();
}
private void RockingBarEnd()
{
gTextField.text = "";
}
}
Four 、 All implementation
边栏推荐
- Esp8266 connects to onenet cloud platform (mqtt) through Arduino IDE
- HCIP Day 12
- Minio文件下载问题——inputstream:closed
- Types de variables JS et transformations de type communes
- 数据库课程设计:高校教务管理系统(含代码)
- (四)R语言的数据可视化——矩阵图、柱状图、饼图、散点图与线性回归、带状图
- Unity3D制作注册登录界面,并实现场景跳转
- Symbolic representation of functions in deep learning papers
- Teach you to release a DeNO module hand in hand
- MySQL replacement field part content
猜你喜欢
Common properties of location
Teach you to release a DeNO module hand in hand
2021.11.10 compilation examination
Vscode basic configuration
FairyGUI人物状态弹窗
SVN更新后不出现红色感叹号
Database course design: college educational administration management system (including code)
单片机蓝牙无线烧录
idea中导包方法
Learning notes of JS variable scope and function
随机推荐
Programming homework: educational administration management system (C language)
(课设第一套)1-4 消息传递接口 (100 分)(模拟:线程)
Gateway fails to route according to the service name, and reports an error service unavailable, status=503
Important methods of array and string
(一)R语言入门指南——数据分析的第一步
Office提示您的许可证不是正版弹框解决
基于Redis的分布式锁 以及 超详细的改进思路
CUDA C programming authoritative guide Grossman Chapter 4 global memory
Esp8266 connects to bafayun (TCP maker cloud) through Arduino IED
Acwing-116 pilot brother
Esp8266 connect onenet (old mqtt mode)
MySQL時間、時區、自動填充0的問題
Design and implementation of general interface open platform - (39) simple and crude implementation of API services
SSD technical features
Working principle of genius telephone watch Z3
Esp8266 uses Arduino to connect Alibaba cloud Internet of things
How to add music playback function to Arduino project
2021.11.10 compilation examination
What is the maximum length of MySQL varchar field
Particle system for introduction to unity3d Foundation (attribute introduction + case production of flame particle system)