FGUI代码笔记


前面的面板会遮挡后面的面板. 即使是空白的. 除非勾选 点击穿透 可穿透空白区域


如果图片大小不对. 用缩放来调整大小


动效播放、属性设置

public class 包1 : MonoBehaviour
{
    GComponent 主ui;
    GComponent 战斗面板;
    float 开始值, 结束值;
    void Start()
    {
        主ui = GetComponent().ui;
        战斗面板 = UIPackage.CreateObject("包2", "战斗组").asCom;
        战斗面板.GetTransition("t0").SetHook("战斗标签", 增加攻击力Fun);
        主ui.GetChild("n0").onClick.Add(() =>
        {
            播放动效(战斗面板);
        });
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    void 播放动效(GComponent 播放者)
    {
        主ui.GetChild("n0").visible = false;
        GRoot.inst.AddChild(播放者);
        Transition 动效 = 播放者.GetTransition("t0");
        开始值 = 10000;
        结束值 = 开始值 + 2500;
        播放者.GetChild("n3").text = 开始值.ToString();
        播放者.GetChild("n6").text = 结束值.ToString();
        动效.Play(() =>
        {
            主ui.GetChild("n0").visible = true;
            GRoot.inst.RemoveChild(播放者);
        });
    }
    void 增加攻击力Fun()
    {
        DOTween.To(
            () => 开始值, 
            x => {战斗面板.GetChild("n3").text = Mathf.Floor(x).ToString();},
            结束值,
            0.3f).SetEase(Ease.Linear).SetUpdate(true);
    }

}



循环列表

public class 循环列表fgui : MonoBehaviour
{
    GComponent 主面板;
    GList 列表;
    void Start()
    {
        主面板 = GetComponent().ui;
        列表 = 主面板.GetChild("列表1").asList;
        列表.SetVirtualAndLoop();
        列表.itemRenderer = 渲染列表;
        列表.numItems = 5;
        列表.scrollPane.onScroll.Add(距离大小效果);
        距离大小效果();
    }
    void 渲染列表(int index,GObject obj)
    {
        GButton g按钮 = obj.asButton;
        g按钮.icon = UIPackage.GetItemURL("循环列表包", "n" + (index + 1));
    }
    void 距离大小效果()
    {
        float 列表中心 = 列表.scrollPane.posX + 列表.viewWidth / 2;// 最左边的点x+宽/2
        for(int i=0;i<列表.numChildren;i++)
        {
            GObject 图片 = 列表.GetChildAt(i);
            float 图片中心x = 图片.x + 图片.width / 2;//每张图片各自的中心
            float 图片宽度 = 图片.width;
            float 离中心距离 = Mathf.Abs(列表中心 - 图片中心x); 
            if(离中心距离<图片宽度)//离中心距离比较近.就放大.
            {
                float 距离大小 = 1 + (1 - 离中心距离 / 图片宽度) * 0.2f;//如果离中心距离越远.得出来的值就越小
                //但是总体是大于1的.
                图片.SetScale(距离大小, 距离大小);
            }
            else//离比较远的就不放大了.
            {
                图片.SetScale(1, 1);
            }
        }
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}



摇杆

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;

public class 遥感主面板 : MonoBehaviour
{
    GComponent 主面板;
    GTextField 文本输入;
    遥感 遥感_;

    void Start()
    {
        主面板 = GetComponent().ui;
        文本输入 = 主面板.GetChild("角度txt").asTextField;
        遥感_ = new 遥感(主面板);
        遥感_.OnMove.Add(YaoganYidong);
        遥感_.OnEnd.Add(YaoganJieshu);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    void YaoganYidong(EventContext neirong)
    {
        float jiaodu = (float)neirong.data;
        文本输入.text = jiaodu.ToString();
    }
    void YaoganJieshu()
    {
        文本输入.text = "结束";
    }
}



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;
using DG.Tweening;

public class 遥感 : EventDispatcher//时间调节
{
    public EventListener OnMove;
    public EventListener OnEnd;

    //面板里的对象
    GButton 遥感按钮;//注意.他的xy是在左上角的(默认锚点)
    GObject 滑块;
    GObject 触摸区域;
    GObject 中心;

    //摇杆的属性
    float 初始x;
    float 初始y;
    float kaishiWeizhiX;
    float kaishiWeizhiY;
    float zuihouWeizhiX;
    float zuihouWeizhiY;
    int chumoID;//遥感的状态
    int 半径;
    GTweener donghua;

    public 遥感(GComponent 主ui)
    {
        OnMove = new EventListener(this, "onMove");
        OnEnd = new EventListener(this, "onEnd");

        遥感按钮 = 主ui.GetChild("遥感").asButton;
        遥感按钮.changeStateOnClick = false;
        滑块 = 遥感按钮.GetChild("滑块");
        触摸区域 = 主ui.GetChild("遥感区域");
        中心= 主ui.GetChild("中心点");

        初始x = 中心.x + 中心.width / 2;
        初始y = 中心.y + 中心.height / 2;
        chumoID = -1;
        半径 = 150;

        触摸区域.onTouchBegin.Add(OnKaishichumo);
        触摸区域.onTouchMove.Add(OnYidongChumo);
        触摸区域.onTouchEnd.Add(OnJieshuChumo);
    }
    //开始触摸
    void OnKaishichumo(EventContext neirong)
    {
        if(chumoID==-1)
        {
            InputEvent shuruShijian = neirong.inputEvent;
            chumoID = shuruShijian.touchId;

            if(donghua!=null)
            {
                donghua.Kill();//删除上个动画
                donghua = null;
            }
            Vector2 bendiPos = GRoot.inst.GlobalToLocal(new Vector2(shuruShijian.x, shuruShijian.y));//全局位置转换到ui的本地坐标
            float weizhiX = bendiPos.x;//这些都是鼠标位置
            float weizhiY = bendiPos.y;
            遥感按钮.selected = true;

            zuihouWeizhiX = weizhiX;//这些都是鼠标位置
            zuihouWeizhiY = weizhiY;
            kaishiWeizhiX = weizhiX;//这些都是鼠标位置
            kaishiWeizhiY = weizhiY;

            中心.visible = true;
            中心.SetXY(weizhiX - 中心.width / 2, weizhiY - 中心.width / 2);//计算.鼠标位置为图片中心
            遥感按钮.SetXY(weizhiX - 遥感按钮.width / 2, weizhiY - 遥感按钮.height / 2);

            float juliX = weizhiX - 初始x;//鼠标位置x - 摇杆.x
            float juliY = weizhiY - 初始y;
            float jiaodu = Mathf.Atan2(juliY, juliX) * Mathf.Rad2Deg;
            滑块.rotation = jiaodu;
            neirong.CaptureTouch();//捕获触摸.表示已经使用了这个触摸事件?
        }
    }

    void OnYidongChumo(EventContext neirong)
    {
        InputEvent shuruShijian = neirong.inputEvent;
        if(chumoID!=-1&&shuruShijian.touchId==chumoID)//触摸状态是触摸开始的赋值
        {
            Vector2 shubiaoWeizhi = GRoot.inst.GlobalToLocal(new Vector2(shuruShijian.x, shuruShijian.y));//鼠标点击的位置
            float weizhiX = shubiaoWeizhi.x;
            float weizhiY = shubiaoWeizhi.y;
            float yidongJuliX = weizhiX - zuihouWeizhiX;
            float yidongJuliY = weizhiY - zuihouWeizhiY;
            zuihouWeizhiX = weizhiX;
            zuihouWeizhiY = weizhiY;
            float anniuX = 遥感按钮.x + yidongJuliX;//摇杆按钮的新位置
            float anniuY = 遥感按钮.y + yidongJuliY;

            float weiyiX = anniuX + 遥感按钮.width / 2 - kaishiWeizhiX;//简单的说就是当前摇杆.x - 开始时摇杆.x
            float weiyiY = anniuX + 遥感按钮.height / 2 - kaishiWeizhiY;

            float hudu = Mathf.Atan2(weiyiY, weiyiX);
            float jiaodu = hudu * Mathf.Rad2Deg;
            滑块.rotation = jiaodu;

            //设置位移范围
            float zuidaX = 半径 * Mathf.Cos(hudu);//cos结果可能是负数
            Debug.Log(Mathf.Sin(hudu) * 半径 + " 三角函数 " + Mathf.Tan(hudu) * zuidaX);
            float zuidaY = 半径 * Mathf.Sin(hudu);
            if(Mathf.Abs(weiyiX)>Mathf.Abs(zuidaX))
            {
                weiyiX = zuidaX;
            }
            if(Mathf.Abs(weiyiY)>Mathf.Abs(zuidaY))
            {
                weiyiY = zuidaY;
            }
            anniuX = kaishiWeizhiX + weiyiX;
            anniuY = kaishiWeizhiY + weiyiY;

            遥感按钮.SetXY(anniuX - 遥感按钮.width / 2, anniuY - 遥感按钮.height / 2);

            OnMove.Call(jiaodu);
        }
    }
    void OnJieshuChumo(EventContext neirong)
    {
        InputEvent shuruShijian = neirong.inputEvent;
        if (chumoID != -1 && shuruShijian.touchId == chumoID)
        {
            chumoID = -1;
            滑块.rotation = 滑块.rotation + 180;
            中心.visible = false;
            donghua = 遥感按钮.TweenMove(new Vector2(初始x - 遥感按钮.width / 2, 初始y - 遥感按钮.height / 2), 0.3f).OnComplete(
                () =>
                {
                    donghua = null;
                    遥感按钮.selected = false;
                    滑块.rotation = 0;
                    中心.visible = true;
                    中心.SetXY(初始x - 中心.width / 2, 初始y - 中心.height / 2);
                });
        }
        OnEnd.Call();
    }
}

你可能感兴趣的:(FGUI代码笔记)