当前位置:网站首页>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;
}
}
边栏推荐
- MMDeploy部署实战系列【第三章】:MMdeploy pytorch模型转换onnx,tensorrt
- 字符串的一些方法
- 什么是多态。
- MySQL基础(DDL、DML、DQL)
- ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
- 自适应迁移学习核极限学习机用于预测
- MMDeploy部署实战系列【第二章】:mmdeploy安装及环境搭建
- 基于EEMD+GRU+MLR的时间序列预测
- Gramm Angle field GAF time-series data into the image and applied to the fault diagnosis
- 微信小程序实现活动倒计时
猜你喜欢
随机推荐
专属程序员的浪漫七夕
数据库:整理四个实用的SQLServer脚本函数
花了近70美元入手的学生版MATLAB体验到底如何?
nacos 返回 403 unknown user 太他么坑了 源码解析
子空间结构保持的多层极限学习机自编码器(ML-SELM-AE)
Activiti 工作流引擎 详解
数据库文档生成工具V1.0
What is the connection between GRNN, RBF, PNN, KELM?
搭建redis哨兵
MAML principle explanation and code implementation
Database document generation tool V1.0
网页中常用的两种绘图技术,用canvas绘图,绘制出一个三角形,矩形,柱状图,扇形图
idea使用@Autowired注解爆红原因及解决方法
目标检测中的IoU、GIoU、DIoU与CIoU
SQL如何从字符串截取指定字符(LEFT、MID、RIGHT三大函数)
MySQL面试题大全(陆续更新)
JVM调优实践
叔本华的《人生的智慧》感悟
DenseNet详解及Keras复现代码
基于时序模式注意力机制(TPA)的长短时记忆(LSTM)网络TPA-LSTM的多变量输入风电功率预测