IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity中队列(Queue)和栈(Stack)的使用 -> 正文阅读

[游戏开发]Unity中队列(Queue)和栈(Stack)的使用

队列先进后出,栈先进先出,解决简单的异步并发问题.栈辅助类非原创


一.队列辅助类

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

/// <summary>
/// 异步任务队列
/// </summary>
public class AsyncQueueTask : MonoBehaviour
{
    public delegate Task<bool> TaskDel(object data);
    private bool isWait;
    //方法队列
    Queue<TaskDel> taskQueue = new Queue<TaskDel>();
    //参数队列
    Queue<object> paraQueue = new Queue<object>();
    
    /// <summary>
    /// 调用这个即可
    /// </summary>
    /// <param name="ac">方法</param>
    /// <param name="data">参数</param>
    public void AddQueueTask(TaskDel ac, object data)
    {
        Debug.Log("入队");
        taskQueue.Enqueue(ac);
        paraQueue.Enqueue(data);
        StartTask();
    }
    
    async void StartTask()
    {
        if (!isWait && taskQueue.Count != 0)
        {
            isWait = true;
            await taskQueue.Peek()(paraQueue.Peek());
            Debug.Log("出队");
            taskQueue.Dequeue();
            paraQueue.Dequeue();
            isWait = false;
            StartTask();
        }
    }
}

二.队列Samples

每次点击不会干扰之前异步的代码运行

执行完当前异步方法后在执行之后的方法

呈现先进后出的效果,直到执行完队列中的所有方法


using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Rendering;

public class QueueTaskSamples : MonoBehaviour
{

    private int _clickCount;
    public AsyncQueueTask _asyncQueue;
        
    
    /// <summary>
    ///按钮绑定方法 
    /// </summary>
    public void OnClick()
    {
        _clickCount++;
        _asyncQueue.AddQueueTask(OnMethod,_clickCount);
    }

    /// <summary>
    /// 绑定方法实体
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    private async Task<bool> OnMethod(object index)
    {
        await Task.Delay(1000);
     
        Debug.Log("你点击了按钮"+index.ToString()+"次");
        
        return true;
    }
}

在这里插入图片描述

三.栈辅助类(基于队列进行修改)

在这里插入图片描述

using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

public class AsyncStackTask : MonoBehaviour
{
    public delegate Task<bool> TaskDel(object data);

    private bool isWait;

    //方法堆栈
    Stack<TaskDel> taskStack = new Stack<TaskDel>();

    //参数堆栈
    Stack<object> paraStack = new Stack<object>();

    /// <summary>
    /// 调用这个即可
    /// </summary>
    /// <param name="ac">方法</param>
    /// <param name="data">参数</param>
    public void AddStackTask(TaskDel ac, object data)
    {
        Debug.Log("入栈");
        taskStack.Push(ac);
        paraStack.Push(data);
        StartTask();
    }

    async void StartTask()
    {
        if (!isWait && taskStack.Count != 0)
        {
            isWait = true;
            await taskStack.Peek()(paraStack.Peek());
            Debug.Log("出栈");
            taskStack.Pop();
            paraStack.Pop();
            isWait = false;
            StartTask();
        }
    }
}

四.栈Samples

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using Scirpts;
using UnityEngine;
using UnityEngine.Rendering;

public class QueueTaskSamples : MonoBehaviour
{

    private int _clickCount;
    public AsyncQueueTask _asyncQueue;

    public AsyncStackTask _asyncStack;
    
    /// <summary>
    ///按钮绑定方法 
    /// </summary>
    public void OnClick()
    {
        _clickCount++;
        _asyncStack.AddStackTask(OnMethod,_clickCount);
       // _asyncQueue.AddQueueTask(OnMethod,_clickCount);
    }

    /// <summary>
    /// 队列绑定方法实体
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    private async Task<bool> OnMethod(object index)
    {
        await Task.Delay(1000);
     
        Debug.Log("你点击了按钮"+index.ToString()+"次");
        
        return true;
    }
}

使用效果图
在这里插入图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:48:06  更:2021-10-12 23:48:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:54:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码