前面的面板会遮挡后面的面板. 即使是空白的. 除非勾选 点击穿透 可穿透空白区域
如果图片大小不对. 用缩放来调整大小
动效播放、属性设置
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();
}
}