当前位置:网站首页>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

边栏推荐
猜你喜欢

基于Redis的分布式锁 以及 超详细的改进思路

(一)R语言入门指南——数据分析的第一步

Particle system for introduction to unity3d Foundation (attribute introduction + case production of flame particle system)

Common properties of location

Gravure sans fil Bluetooth sur micro - ordinateur à puce unique

MySQL time, time zone, auto fill 0

Design and implementation of general interface open platform - (39) simple and crude implementation of API services

dosbox第一次使用

JS function promotion and declaration promotion of VaR variable

单片机蓝牙无线烧录
随机推荐
單片機藍牙無線燒錄
Remember an experience of ECS being blown up by passwords - closing a small black house, changing passwords, and changing ports
[offer18] delete the node of the linked list
Custom view puzzle getcolor r.color The color obtained by colorprimary is incorrect
基於Redis的分布式ID生成器
如何给Arduino项目添加音乐播放功能
Important methods of array and string
How to add music playback function to Arduino project
JS regular expression basic knowledge learning
FairyGUI简单背包的制作
Minio file download problem - inputstream:closed
Basic operations of databases and tables ----- view data tables
[Nodejs] 20. Koa2 onion ring model ----- code demonstration
JS Title: input array, exchange the largest with the first element, exchange the smallest with the last element, and output array.
level16
Unity场景跳转及退出
基于Redis的分布式ID生成器
数据库课程设计:高校教务管理系统(含代码)
Gateway fails to route according to the service name, and reports an error service unavailable, status=503
Basic operations of databases and tables ----- creating data tables