当前位置:网站首页>unity 循环选择器
unity 循环选择器
2022-08-04 05:56:00 【吴梓穆】
我们经会遇到点击上一个按钮选择上一个物体,点击下一个按钮选择下一个物体,这种需求,因此整理了一个通用类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 循环选择器
/// </summary>
public class LoopSelecter<T>
{
/// <summary>
/// 所有的物体
/// </summary>
public List<T> objs = new List<T>();
/// <summary>
/// 上一个按钮
/// </summary>
/// </summary>
public Button lastBtn;
/// <summary>
/// 下一个按钮
/// </summary>
public Button nextBtn;
/// <summary>
/// 当前的页码
/// </summary>
public int index = 0;
/// <summary>
/// 每页的数量
/// </summary>
public int onePageNum;
/// <summary>
/// 回调函数 参数1 当前选中的物体 参数2 索引
/// </summary>
public System.Action<T, int> act;
/// <summary>
/// 构造函数 参数1 2 向前按钮 向后按钮 参数3 所有的循环物体 参数4 初始索引 默认为0
/// </summary>
public LoopSelecter(Button lastBtn, Button nextBtn, List<T> objs,int onePageNum = 1,int startIndex = 0)
{
this.onePageNum = onePageNum;
index = startIndex;
//注册上一个按钮
if (lastBtn != null)
{
this.lastBtn = lastBtn;
this.lastBtn.onClick.AddListener(() =>
{
ChangeSelect_One(false);
});
}
//注册下一个按钮
if (nextBtn != null)
{
this.nextBtn = nextBtn;
this.nextBtn.onClick.AddListener(() =>
{
ChangeSelect_One(true);
});
}
//放入物体列表
for (int i = 0; i < objs.Count; i++)
{
this.objs.Add(objs[i]);
}
}
/// <summary>
/// 切换 单个
/// </summary>
/// <param name="isNext"></param>
public T ChangeSelect_One(bool isNext)
{
if (isNext)
{
index += 1;
if (index >= objs.Count)
{
index = 0;
}
}
else
{
index -= 1;
if (index < 0)
{
index = objs.Count - 1;
}
}
act?.Invoke(objs[index], index);
return objs[index];
}
/// <summary>
/// 获取当前的物体
/// </summary>
/// <returns></returns>
public T GetCurrentObj()
{
return objs[index];
}
/// <summary>
/// 根据索引获取一个物体
/// </summary>
/// <returns></returns>
public T GetObjByIndex(int index)
{
return objs[index];
}
/// <summary>
/// 获取当前的索引
/// </summary>
public int GetCurrentIndex()
{
return index;
}
/// <summary>
/// 重置索引 并返回第一个值
/// </summary>
/// <returns></returns>
public T ResetIndex()
{
index = 0;
return objs[index];
}
}
使用示例,示例化一个上述脚本的对象
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 音乐盒面板,处理面板的逻辑
/// </summary>
public class JukeboxPanel : PanelBase
{
/// <summary>
/// 循环选择器
/// </summary>
private LoopSelecter<Sprite> loopSelecter;
public Button lastBtn;
public Button nextBtn;
/// <summary>
/// 图片的集合
/// </summary>
public List<Sprite> spriteList = new List<Sprite>();
/// <summary>
/// 展示用的图片
/// </summary>
private Image image;
/// <summary>
/// 提示的文本框
/// </summary>
private Text tipText;
/// <summary>
/// 提示语句
/// </summary>
public List<string> tipList;
private void Awake()
{
image = transform.Find("Container/TipPanel/Image").GetComponent<Image>();
tipText = transform.Find("Container/TipPanel/TipText").GetComponent<Text>();
loopSelecter = new LoopSelecter<Sprite>(lastBtn, nextBtn,spriteList);
loopSelecter.act += (obj, index) =>
{
ResetTipOnEnable(obj as Sprite, tipList[index]);
};
}
/// <summary>
/// 重设提示面板
/// </summary>
private void ResetTipOnEnable(Sprite sprite,string tip)
{
image.sprite = sprite;
tipText.text = tip;
}
}
边栏推荐
猜你喜欢
随机推荐
字符串的一些方法
Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
电脑知识:台式电脑应该选择品牌和组装,值得收藏
Database Skills: Organize SQL Server's Very Practical Scripts
数组的一些方法
系统流量预估、架构设计方案
MATLAB版量化交易技术分析工具TA-Lib【不付费也可获取,不要被付费吓跑】
Mac安装PHP开发环境
关于我写的循环遍历
从零开始单相在线式不间断电源(UPS)(硬件)
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
What is the connection between GRNN, RBF, PNN, KELM?
基于EEMD+GRU+MLR的时间序列预测
软件:给大家推荐一款国产非常好用的效率软件uTools
海康VisionMaster与西门子Smart 200进行S7通信
基于子空间结构保持的迁移学习方法MLSSM
set集合
ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
缓存穿透、击穿、雪崩
Error EPERM operation not permitted, mkdir ‘Dsoftwarenodejsnode_cache_cacach两种解决办法