欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity制作一个好玩且鸡肋的操作回滚功能

程序员文章站 2022-03-21 23:47:19
...

在描述正文之前,必须介绍一下,堆栈后进先出的特点。

其实就好比,一组人进到一条黑漆漆只容得下一个人的死胡同,第一个人进去了,砰,撞墙了,但是他郁闷啊。前面都是人,他只能等最后进的人先出去,最后他才能出去。

操作回滚主要也是运用堆栈后进先出的特点进行编写的。

Unity制作一个好玩且鸡肋的操作回滚功能

这是一个示例,假设这三个页签按键(当然实际上,可能是几个页面,几个Btn,几个文本)代表用户的操作,而返回键对用户操作进行回滚。

返回键:分为两种状态,第一是用户有了用户操作,可点击状态;第二是用户没有用户操作或者已经滚回去的不能再滚了,是不可点击状态。

Unity制作一个好玩且鸡肋的操作回滚功能

好啦好啦,避免超字儿,贴上代码,TabButtonGroup是页签属性的类,以及页签本身所涉及的逻辑就不贴了。整体还是比较容易理解的。


public class BtnTabView : MonoBehaviour
{
    //定义的TabBtnGroup类存储TabBTN属性
    private List<TabBtnGroup> m_TabBtnsList = new List<TabBtnGroup>();
    //对应每个按钮存在的委托事件(按键索引对应委托传进去的值)
    private List<Action <int> > ClickCallBacks  = new List<Action<int>> ();
    //当前TabBTN的索引
    private int m_CurTabBtnIndex = 0;
    //创建Stack存贮以前的点击索引
    private Stack<int> m_PreTabBtn = new Stack<int>();
    //是不是第一次点击返回按键
    //因为第一次点击要删除两次栈顶的值,之后就不应了
    int m_PreBtnIndex = 0;
    private void Start()
    {
        Transform root = this.m_currentTrans;
        if (root != null)
        {
            AddTabBtn(root);
            InitTabBtn();
            //一打开设置为不可打开的状态
            SetPreCanSel();
            //在选中状态默认第一个按钮为第一个状态
            m_PreTabBtn.Push(0);
        }
    }
    /// TabBTN点击事件的设置
    public  void Click(GameObject gb, UIEventData data)
    {
        string clickName = gb.name;
        //...针对页签的点击(省略)
        if( clickName == "select" && data != null )
        {
            HandleReturnBtn();
        }
    }
    /// 对于返回键的操作
    /// </summary>
    private void HandleReturnBtn()
    {
        //栈顶不为空
        //为空设置为不可选状态
        m_PreBtnIndex++;
        if ( PreBtnCount(m_PreTabBtn) > 1 &&  m_PreBtnIndex==1 )
        {
            //把栈顶的值返回并删除,删除的第二个就是之前的按键
            m_PreTabBtn.Pop();
            int preIndex = m_PreTabBtn.Pop();
            HandeleRetBtn(preIndex);
            SetPreFirCanSel();
        }
        if ( PreBtnCount(m_PreTabBtn) > 0 && m_PreBtnIndex != 1 )
        {
            int preIndex = m_PreTabBtn.Pop();
            HandeleRetBtn(preIndex);
            SetPreFirCanSel();
        }
    }
    /// 返回栈顶是否有元素
    private bool isPreTabBtnNULL(Stack<int> m_PreTabBtn)
    {
        return m_PreTabBtn.IsNull();
    }
    /// 得到PreTabBtn堆栈内存在的个数
    private int PreBtnCount(Stack<int> m_PreTabBtn)
    {
         return m_PreTabBtn.Count;
    }
    /// 设置返回按钮的是否可选中状态
    public void SetPreCanSel( )
    {
        //当堆栈里数目大于1显示select按键,否则为unselect按键(略)
    }
    public void SetPreFirCanSel()
    {
        //当堆栈里数目大于1显示select按键,否则为unselect按键(略)
    }
    /// 把以前的index存储在Stack里面方便调用
    private void SetPreIndex(int index )
    { 
        m_PreTabBtn.Push(index);
    }
    /// 点击事件的具体调用
    private void HandeleTabBtn( int index )
    {
        //对应执行点击TabBTN的委托方法,以传进去的按键的索引为判断
        GetCurIndex(index);
        SetSelORUnSel();
        //把点击的索引传进去
        SetPreIndex(index);
        //有点击传入的第一次,设置为可选状态
        SetPreCanSel();
    }
    // 点击返回按钮
    public void HandeleRetBtn( int preIndex )
    {
        //对应执行点击TabBTN的委托方法,以传进去的按键的索引为判断
        GetCurIndex( preIndex );
        SetSelORUnSel();
    }
    /// 把TabBtn和对应的Action委托事件存储在列表里(略)
    private void AddTabBtn( Transform rootTrans )
    {
    }
    private void InitTabBtn()
    {
        //因为暂时没有其他数据所以只能先手工设置第一次为0选中状态
        SetSelORUnSel();
    }
    /// 得到当前的按键索引为m_CurTabBtnIndex赋值
    private int GetCurIndex( int index )
    {
        if (index < m_TabBtnsList.Count)
        {
            m_CurTabBtnIndex = index;
            return m_CurTabBtnIndex;
        }
        else
            return 0;
    }
    //设置按钮的选中状态或者未选中状态(略)
    private void SetSelORUnSel( )
    { 
    }
    //action委托对应的执行方法
    private void ActionToLabel( int index )
    {
    }
}

 

相关标签: Unity