当前位置:网站首页>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;
}
}
边栏推荐
- Hardware Knowledge: Introduction to RTMP and RTSP Traditional Streaming Protocols
- What is the connection between GRNN, RBF, PNN, KELM?
- Faster - RCNN principle and repetition code
- SystemVerilog-条件(三元)运算符
- 无监督特征对齐的迁移学习理论框架
- Triton部署mmdeploy导出的TensorRT模型失败篇
- Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
- 零分贝超静音无线鼠标!数量有限!!先到先得!!!【元旦专享】
- set集合
- IDEA 控制台 中文乱码问题(如果网上教程都无法解决你的问题的话)
猜你喜欢
Gramm Angle field GAF time-series data into the image and applied to the fault diagnosis
基于EEMD+GRU+MLR的时间序列预测
从零开始单相在线式不间断电源(UPS)(硬件)
MySQL(4)
Database document generation tool V1.0
JVM工具之 JPS
类图规范总结
Software: Recommend a domestic and very easy-to-use efficiency software uTools to everyone
mysql基础(4)
2DCNN, 1DCNN, BP, SVM fault diagnosis and result visualization of matlab
随机推荐
力扣每日一题-第47天-15. 三数之和
Implementation of ICEEMDAN Decomposition Code in MATLAB
更改mysql数据库默认的字符集(mysql 存储 emoji表情)
Time Series Forecasting Based on Reptile Search RSA Optimized LSTM
nacos 返回 403 unknown user 太他么坑了 源码解析
MAML原理讲解和代码实现
网络技巧:教你给路由器装上电池,断电照样可以上网!
用matlab打造的摩斯电码加解码器音频版,支持包括中文在内的任意字符
DOM的12中节点类型,通过关系或方法获取DOM节点,渲染到浏览器页面的一些特效功能,获取DOM节点来改变属性,点击图片,切换为所点击的图片为背景图,页面上的表单验证,点击底部导航栏切换界面
YOLOv3详解:从零开始搭建YOLOv3网络
JVM 快速检测死锁
Error occurred while trying to proxy request项目突然起不来了
this关键字,构造函数
Database document generation tool V1.0
水平垂直居中的12种方法,任意插入节点的方法,事件的绑定的三种方法和解绑的方法,事件对象,盒子模型
目标检测中的先验框(Anchor)
MySQL大总结
fanuc机器人IO分配报警信号分配无效
花了近70美元入手的学生版MATLAB体验到底如何?
Triton部署mmdeploy导出的TensorRT模型失败篇