当前位置:网站首页>Fairygui joystick

Fairygui joystick

2022-07-06 12:39:00 SQ Liu

FairyGUI rocker

Material resources :
 Insert picture description here
 Insert picture description here

One 、 preparation

1、 establish FairyGUI The new project

 Insert picture description here

2、 Import material

 Insert picture description here

3、 The new button

 Insert picture description here

4、 Edit button

 Insert picture description here

5、 Set the scope

 Insert picture description here
 Insert picture description here
 Insert picture description here
 Insert picture description here

6、 Set correlation

 Insert picture description here

7、 Packaging releases

 Insert picture description here
 Insert picture description here

Two 、Unity It shows that

1、 establish Unity The new project

 Insert picture description here

2、 Import FairyGUI Of unity Bao He DOTween package

 Insert picture description here
 Insert picture description here

3、Unity It shows that

 Insert picture description here
 Insert picture description here

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.

 Insert picture description here

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

 Insert picture description here

原网站

版权声明
本文为[SQ Liu]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060913597301.html