Unity 实用代码 小工具

  • Unity 屏幕截图
    • 全屏截图方法
    • 全屏截图方法 带委托事件
    • 自定义截图方法
    • 自定义截图方法 带委托
  • 延迟工具
    • 携程延迟方法
    • 携程延迟带委托方法
  • 场景加载
    • 场景加载 方法
    • 场景加载方法 带委托
    • 异步场景加载 方法
  • 计时器方法
  • 鼠标双击方法
  • 最大最小值限定方法
  • 完整代码

代码很简单没有难度,都有注解,随便 康一康 就会了。

Unity 屏幕截图

全屏截图方法

优点:响应速度快,几乎不用考虑优化问题。
缺点:只能截全屏。
/// <summary>/// 屏幕截图/// </summary>/// <param 截图保存名字="_ImageName"></param>/// <returns></returns>IEnumerator Screenshot(string _ImageName){//等待当前帧结束yield return new WaitForEndOfFrame();//Environment.CurrentDirectory 相对路径:在项目文件夹//如果这个文件夹不存在就创建一个if (Directory.Exists(Environment.CurrentDirectory + "\\Screenshot ") == false){Directory.CreateDirectory(Environment.CurrentDirectory + "\\Screenshot ");ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");}else{ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");}yield break;}

全屏截图方法 带委托事件

给两个参考文档:
Texture2D.ReadPixels 参考文档

Rect类 参考文档

额。。。就是带了一个委托
/// <summary>/// 屏幕截图/// </summary>/// <param 委托事件="_Action"></param>/// <param 截图名称="_ImageName"></param>/// <returns></returns>IEnumerator Screenshot(Action _Action, string _ImageName){//等待当前帧结束yield return new WaitForEndOfFrame();//Environment.CurrentDirectory 相对路径:在项目文件夹//如果这个文件夹不存在就创建一个if (Directory.Exists(Environment.CurrentDirectory + "\\Screenshot ") == false){Directory.CreateDirectory(Environment.CurrentDirectory + "\\Screenshot ");ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");}else{ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");}_Action.Invoke();yield break;}

自定义截图方法

可自定义保存路径,截图名称,截图大小,就很银杏化
/// <summary>/// 屏幕截图/// </summary>/// <param 保存路径="_FilePath"></param>/// <param 截图名称="_ImageName"></param>/// <param 截图长度="_ImageWidth"></param>/// <param 截图高度="_ImageHeight"></param>/// <returns></returns>IEnumerator Screenshot(string _FilePath, string _ImageName,int _ImageWidth,int _ImageHeight){//等待当前帧结束yield return new WaitForEndOfFrame();Texture2D _DestinationTexture;// 创建一个新的带有屏幕宽度和高度的Texture2D,并缓存它以便重用  _DestinationTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);if (_ImageWidth == 0){_ImageWidth = Screen.width;}if (_ImageHeight == 0){_ImageHeight = Screen.height;}// 定义ReadPixels操作的参数  Rect _RegionToReadFrom = new Rect(0, 0, _ImageWidth, _ImageHeight);int xPosToWriteTo = 0;int yPosToWriteTo = 0;// 从相机的渲染目标复制像素到纹理  _DestinationTexture.ReadPixels(_RegionToReadFrom, xPosToWriteTo, yPosToWriteTo);// 将纹理数据上传到GPU,由GPU渲染更新后的纹理  // 注意:这个方法代价很高,应该只在需要时调用它  // 如果您不打算呈现更新后的纹理,此时没有必要调用此方法  //destinationTexture.Apply();//截图数据存储byte[] _BytesImage = _DestinationTexture.EncodeToPNG();File.WriteAllBytes(_FilePath + "\\" + _ImageName + ".png", _BytesImage);yield break;}

自定义截图方法 带委托

没错  又是多了一个委托事件
 /// <summary>/// 屏幕截图/// </summary>/// <param 委托事件响应="_Action"></param>/// <param 保存路径="_FilePath"></param>/// <param 截图名称="_ImageName"></param>/// <param 截图长度="_ImageWidth"></param>/// <param 截图高度="_ImageHeight"></param>/// <returns></returns>IEnumerator Screenshot(Action _Action, string _FilePath, string _ImageName, int _ImageWidth, int _ImageHeight){//等待当前帧结束yield return new WaitForEndOfFrame();Texture2D _DestinationTexture;// 创建一个新的带有屏幕宽度和高度的Texture2D,并缓存它以便重用  _DestinationTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);if (_ImageWidth == 0){_ImageWidth = Screen.width;}if (_ImageHeight == 0){_ImageHeight = Screen.height;}// 定义ReadPixels操作的参数  Rect _RegionToReadFrom = new Rect(0, 0, _ImageWidth, _ImageHeight);int xPosToWriteTo = 0;int yPosToWriteTo = 0;// 从相机的渲染目标复制像素到纹理  _DestinationTexture.ReadPixels(_RegionToReadFrom, xPosToWriteTo, yPosToWriteTo);// 将纹理数据上传到GPU,由GPU渲染更新后的纹理  // 注意:这个方法代价很高,应该只在需要时调用它  // 如果您不打算呈现更新后的纹理,此时没有必要调用此方法  //destinationTexture.Apply();//截图数据存储byte[] _BytesImage = _DestinationTexture.EncodeToPNG();File.WriteAllBytes(_FilePath + "\\" + _ImageName + ".png", _BytesImage);//委托事件响应_Action.Invoke();yield break;}
// An highlighted block
var foo = 'bar';

延迟工具

携程延迟方法

使用 协程特性实现程序等待
    /// <summary>/// 延迟工具/// </summary>/// <param 延迟时间="_Time"></param>/// <returns></returns>public IEnumerator DelayedTime(float _Time){yield return new WaitForSeconds(_Time);Debug.Log($"延迟{_Time}秒");}

携程延迟带委托方法

和上面那个相似 不过加了个 委托事件
    /// <summary>/// 延迟工具/// </summary>/// <param 委托响事件="_Action"></param>/// <param 延迟时间="_Time"></param>/// <returns></returns>public IEnumerator DelayedTime(Action _Action, float _Time){yield return new WaitForSeconds(_Time);//延迟 _Time 秒 再响应委托方法_Action.Invoke();Debug.Log($"延迟{_Time}秒");}

场景加载

场景加载 方法

是的  是场景加载
   /// <summary>/// 场景加载/// </summary>/// <param 加载场景名称="_StrMap"></param>/// <returns></returns>IEnumerator LoadSceneMap(string _StrMap){SceneManager.LoadScene(_StrMap);yield return null;}

场景加载方法 带委托

没看错 就是简单的场景加载
  /// <summary>/// 场景加载/// </summary>/// <param 可使用委托事件调用="_ActionMaop"></param>/// <param 加载场景名称="_StrMap"></param>/// <returns></returns>IEnumerator LoadSceneMap(Action _ActionMaop,string _StrMap){SceneManager.LoadScene(_StrMap);yield return null;}

异步场景加载 方法

异步场景加载 连委托都没有了
    /// <summary>/// 异步场景加载/// </summary>/// <param 想要加载的场景名称="_StrMap"></param>/// <param 加载滑动条="_SliderLoad"></param>/// <param 加载百分比="_TextLoad"></param>/// <returns></returns>IEnumerator LoadSceneMap(string _StrMap, Slider _SliderLoad, Text _TextLoad){//想要加载的场景AsyncOperation _Operation = SceneManager.LoadSceneAsync(_StrMap);//允许场景被激活  为True 时跳转_Operation.allowSceneActivation = false;//当场景没有加载完毕while (!_Operation.isDone){//场景加载程度Debug.Log(_Operation.progress);//转换成百分比Debug.Log((_Operation.progress * 100).ToString() + "%");//滑动条 赋值_SliderLoad.value = Mathf.Lerp(_SliderLoad.value, _Operation.progress, Time.deltaTime * 1);//加载进度文字显示_TextLoad.text = (_Operation.progress * 100).ToString() + "%";//场景加载大于 0.9f 证明基本加载完毕if (_Operation.progress >= 0.9f){Debug.Log("100%");//允许场景被激活  为True 时跳转_Operation.allowSceneActivation = true;}yield return null;}}

计时器方法

倒数计时器 附带委托 可自由变形
/// <summary>/// 计时器/// </summary>/// <param 委托事件调用="_ActionTimer"></param>/// <param 定时 时间="_RefreshTime"></param>/// <returns></returns>public IEnumerator TimerController(Action _ActionTimer, float _RefreshTime){while (true){//时间衰减_RefreshTime -= Time.deltaTime;Debug.Log($"时间流逝{_RefreshTime}秒");//衰减小于 0 时 执行方法if (_RefreshTime <= 0){//计时结束_ActionTimer.Invoke();yield break;}yield return null;}}

鼠标双击方法

算是对计时器的一个变种吧
 /// <summary>/// 鼠标双击事件/// </summary>/// <param 委托事件响应="_ActionTimer"></param>/// <param 状态布尔="_BoolState"></param>/// <returns></returns>public IEnumerator MouseClickDown(Action _ActionTimer, bool _BoolState){float _StarTime = 0.0f;float _EndTime = 0.0f;int _Number = 0;while (true){if (Input.GetMouseButtonDown(0)){_Number++;if (_Number == 1){//游戏开始后以秒为单位的实时时间(只读)。_StarTime = Time.realtimeSinceStartup;}else if (_Number >= 2){//游戏开始后以秒为单位的实时时间(只读)。_EndTime = Time.realtimeSinceStartup;//鼠标双击 满足条件 执行委托if (_EndTime - _StarTime <= 0.23f){_ActionTimer.Invoke();//状态布尔 如果为True 就只执行一次  如果为 False 会重复执行if (!_BoolState){yield break;}}_Number = 0;}}yield return null;}}

最大最小值限定方法

是的呢  就是你看到的意思 啧... 真简单
 /// <summary>/// 最大最小值限定/// </summary>/// <param 返回值="_Value"></param>/// <param 最小值="_Min"></param>/// <param 最大值="_Max"></param>/// <returns></returns>public float Clam(float _Value, float _Min, float _Max){//如果传递值 _Value 小于最小值 就返回最小值if (_Value < _Min){return _Min;}//如果传递值 _Value 大于最大值 就返回最大值if (_Value > _Max){return _Max;}//否则就返回当前值return _Value;}

完整代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;/// <summary>
/// 实用工具集合
/// </summary>
public class CodeTools_ZH:MonoBehaviour
{//单例public static CodeTools_ZH _Instance;private void Awake(){_Instance = this;}void Start(){StartCoroutine(DelayedTime(3.0f));StartCoroutine(DelayedTime(() => { Debug.Log("方法延迟"); }, 4.0f));StartCoroutine(TimerController(() => { Debug.Log("计时结束后的方法调用"); }, 4.0f));StartCoroutine(MouseClickDown(() => { Debug.Log("鼠标双击事件"); }, false));StartCoroutine(Screenshot( "全屏截图"));StartCoroutine(Screenshot("F:\\桌面\\11","自定义截图",100,100));StartCoroutine(Screenshot(()=> { Debug.Log("带委托的截图方法"); },"F:\\桌面\\11", "自定义截图", 100, 100));Clam(12, 0, 50);}void Update(){if (Input.GetKeyDown(KeyCode.Q)){}}#region 延迟响应/// <summary>/// 延迟工具/// </summary>/// <param 延迟时间="_Time"></param>/// <returns></returns>public IEnumerator DelayedTime(float _Time){yield return new WaitForSeconds(_Time);Debug.Log($"延迟{_Time}秒");}/// <summary>/// 延迟工具/// </summary>/// <param 委托响事件="_Action"></param>/// <param 延迟时间="_Time"></param>/// <returns></returns>public IEnumerator DelayedTime(Action _Action, float _Time){yield return new WaitForSeconds(_Time);//延迟 _Time 秒 再响应委托方法_Action.Invoke();Debug.Log($"延迟{_Time}秒");}#endregion#region 屏幕截图/// <summary>/// 屏幕截图/// </summary>/// <param 截图保存名字="_ImageName"></param>/// <returns></returns>IEnumerator Screenshot(string _ImageName){//等待当前帧结束yield return new WaitForEndOfFrame();//Environment.CurrentDirectory 相对路径:在项目文件夹//如果这个文件夹不存在就创建一个if (Directory.Exists(Environment.CurrentDirectory + "\\Screenshot ") == false){Directory.CreateDirectory(Environment.CurrentDirectory + "\\Screenshot ");ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");}else{ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");}yield break;}/// <summary>/// 屏幕截图/// </summary>/// <param 委托事件="_Action"></param>/// <param 截图名称="_ImageName"></param>/// <returns></returns>IEnumerator Screenshot(Action _Action, string _ImageName){//等待当前帧结束yield return new WaitForEndOfFrame();//Environment.CurrentDirectory 相对路径:在项目文件夹//如果这个文件夹不存在就创建一个if (Directory.Exists(Environment.CurrentDirectory + "\\Screenshot ") == false){Directory.CreateDirectory(Environment.CurrentDirectory + "\\Screenshot ");ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");}else{ScreenCapture.CaptureScreenshot(Environment.CurrentDirectory + "\\Screenshot\\" + _ImageName + ".png");}_Action.Invoke();yield break;}/// <summary>/// 屏幕截图/// </summary>/// <param 保存路径="_FilePath"></param>/// <param 截图名称="_ImageName"></param>/// <param 截图长度="_ImageWidth"></param>/// <param 截图高度="_ImageHeight"></param>/// <returns></returns>IEnumerator Screenshot(string _FilePath, string _ImageName,int _ImageWidth,int _ImageHeight){//等待当前帧结束yield return new WaitForEndOfFrame();Texture2D _DestinationTexture;// 创建一个新的带有屏幕宽度和高度的Texture2D,并缓存它以便重用  _DestinationTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);if (_ImageWidth == 0){_ImageWidth = Screen.width;}if (_ImageHeight == 0){_ImageHeight = Screen.height;}// 定义ReadPixels操作的参数  Rect _RegionToReadFrom = new Rect(0, 0, _ImageWidth, _ImageHeight);int xPosToWriteTo = 0;int yPosToWriteTo = 0;// 从相机的渲染目标复制像素到纹理  _DestinationTexture.ReadPixels(_RegionToReadFrom, xPosToWriteTo, yPosToWriteTo);// 将纹理数据上传到GPU,由GPU渲染更新后的纹理  // 注意:这个方法代价很高,应该只在需要时调用它  // 如果您不打算呈现更新后的纹理,此时没有必要调用此方法  //destinationTexture.Apply();//截图数据存储byte[] _BytesImage = _DestinationTexture.EncodeToPNG();File.WriteAllBytes(_FilePath + "\\" + _ImageName + ".png", _BytesImage);yield break;}/// <summary>/// 屏幕截图/// </summary>/// <param 委托事件响应="_Action"></param>/// <param 保存路径="_FilePath"></param>/// <param 截图名称="_ImageName"></param>/// <param 截图长度="_ImageWidth"></param>/// <param 截图高度="_ImageHeight"></param>/// <returns></returns>IEnumerator Screenshot(Action _Action, string _FilePath, string _ImageName, int _ImageWidth, int _ImageHeight){//等待当前帧结束yield return new WaitForEndOfFrame();Texture2D _DestinationTexture;// 创建一个新的带有屏幕宽度和高度的Texture2D,并缓存它以便重用  _DestinationTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);if (_ImageWidth == 0){_ImageWidth = Screen.width;}if (_ImageHeight == 0){_ImageHeight = Screen.height;}// 定义ReadPixels操作的参数  Rect _RegionToReadFrom = new Rect(0, 0, _ImageWidth, _ImageHeight);int xPosToWriteTo = 0;int yPosToWriteTo = 0;// 从相机的渲染目标复制像素到纹理  _DestinationTexture.ReadPixels(_RegionToReadFrom, xPosToWriteTo, yPosToWriteTo);// 将纹理数据上传到GPU,由GPU渲染更新后的纹理  // 注意:这个方法代价很高,应该只在需要时调用它  // 如果您不打算呈现更新后的纹理,此时没有必要调用此方法  //destinationTexture.Apply();//截图数据存储byte[] _BytesImage = _DestinationTexture.EncodeToPNG();File.WriteAllBytes(_FilePath + "\\" + _ImageName + ".png", _BytesImage);//委托事件响应_Action.Invoke();yield break;}#endregion#region 场景加载/// <summary>/// 异步场景加载/// </summary>/// <param 想要加载的场景名称="_StrMap"></param>/// <param 加载滑动条="_SliderLoad"></param>/// <param 加载百分比="_TextLoad"></param>/// <returns></returns>IEnumerator LoadSceneMap(string _StrMap, Slider _SliderLoad, Text _TextLoad){//想要加载的场景AsyncOperation _Operation = SceneManager.LoadSceneAsync(_StrMap);//允许场景被激活  为True 时跳转_Operation.allowSceneActivation = false;//当场景没有加载完毕while (!_Operation.isDone){//场景加载程度Debug.Log(_Operation.progress);//转换成百分比Debug.Log((_Operation.progress * 100).ToString() + "%");//滑动条 赋值_SliderLoad.value = Mathf.Lerp(_SliderLoad.value, _Operation.progress, Time.deltaTime * 1);//加载进度文字显示_TextLoad.text = (_Operation.progress * 100).ToString() + "%";//场景加载大于 0.9f 证明基本加载完毕if (_Operation.progress >= 0.9f){Debug.Log("100%");//允许场景被激活  为True 时跳转_Operation.allowSceneActivation = true;}yield return null;}}/// <summary>/// 场景加载/// </summary>/// <param 可使用委托事件调用="_ActionMaop"></param>/// <param 加载场景名称="_StrMap"></param>/// <returns></returns>IEnumerator LoadSceneMap(Action _ActionMaop,string _StrMap){SceneManager.LoadScene(_StrMap);yield return null;}/// <summary>/// 场景加载/// </summary>/// <param 加载场景名称="_StrMap"></param>/// <returns></returns>IEnumerator LoadSceneMap(string _StrMap){SceneManager.LoadScene(_StrMap);yield return null;}#endregion/// <summary>/// 计时器/// </summary>/// <param 委托事件调用="_ActionTimer"></param>/// <param 定时 时间="_RefreshTime"></param>/// <returns></returns>public IEnumerator TimerController(Action _ActionTimer, float _RefreshTime){while (true){//时间衰减_RefreshTime -= Time.deltaTime;Debug.Log($"时间流逝{_RefreshTime}秒");//衰减小于 0 时 执行方法if (_RefreshTime <= 0){//计时结束_ActionTimer.Invoke();yield break;}yield return null;}}/// <summary>/// 鼠标双击事件/// </summary>/// <param 委托事件响应="_ActionTimer"></param>/// <param 状态布尔="_BoolState"></param>/// <returns></returns>public IEnumerator MouseClickDown(Action _ActionTimer, bool _BoolState){float _StarTime = 0.0f;float _EndTime = 0.0f;int _Number = 0;while (true){if (Input.GetMouseButtonDown(0)){_Number++;if (_Number == 1){//游戏开始后以秒为单位的实时时间(只读)。_StarTime = Time.realtimeSinceStartup;}else if (_Number >= 2){//游戏开始后以秒为单位的实时时间(只读)。_EndTime = Time.realtimeSinceStartup;//鼠标双击 满足条件 执行委托if (_EndTime - _StarTime <= 0.23f){_ActionTimer.Invoke();//状态布尔 如果为True 就只执行一次  如果为 False 会重复执行if (!_BoolState){yield break;}}_Number = 0;}}yield return null;}}/// <summary>/// 最大最小值限定/// </summary>/// <param 返回值="_Value"></param>/// <param 最小值="_Min"></param>/// <param 最大值="_Max"></param>/// <returns></returns>public float Clam(float _Value, float _Min, float _Max){//如果传递值 _Value 小于最小值 就返回最小值if (_Value < _Min){return _Min;}//如果传递值 _Value 大于最大值 就返回最大值if (_Value > _Max){return _Max;}//否则就返回当前值return _Value;}}

暂时先这样吧,如果有时间的话就会更新,实在看不明白就留言,看到我会回复的。
路漫漫其修远兮,与君共勉。

Unity 实用代码 小工具相关推荐

  1. 【华为云技术分享】程序员实用JDK小工具归纳

    在JDK的安用装目录bin下,有一些有非常实用的小工具,可用于分析JVM初始配置.内存溢出异常等问题,我们接下来将对些常用的工具进行一些说明. 1. JDK小工具简介 在JDK的bin目录下面有一些小 ...

  2. Bookmarklet - 小书签,实用浏览器小工具

    导读: 1 .什么是 Bookmarklet ? Bookmarklet ,大陆这边一般都称呼为小书签,台湾那边称呼为书签列小程式 or 书签小程式.它是一段 JavaScript 脚本,一般网络上的 ...

  3. Unity 截屏小工具

    Unity截屏小工具 前言 ​ 在unity日常开发中,有时候美工会遇到将3D场景保存为2D图片的功能,用普通的截图工具截出来的图片不是特别理想,所以需要程序员提供一个简易的截屏小工具 实现思路 ​ ...

  4. 在计算机桌面上添加小工具日历,实用桌面小工具时钟日历在win7中的添加方法...

    我们在win7系统的使用中,小伙伴们都是知道的系统可以直接选择安装不同的小工具在电脑中使用,比如电脑中的时钟日历等都是可以直接安装在桌面来使用的牡丹石有小伙伴对于时钟日历不知道是在哪里添加到桌面的,对 ...

  5. [转]Windows Sysinternals 微软官方免费的极品实用绿色小工具合集,绝对值得你收藏

    Windows Sysinternals Suite 是一套由微软官方免费提供的系统工具集,其中包含了大量超级实的优秀绿色小软件,譬如 Desktops (虚拟桌面).Process Explorer ...

  6. Windows Sysinternals 微软官方免费的极品实用绿色小工具合集,绝对值得你收藏

    Windows Sysinternals Suite是一套由微软官方免费提供的系统工具集,其中包含了大量超级实的优秀绿色小软件,譬如 Desktops (虚拟桌面).Process Explorer ...

  7. unity vs没有智能提示_Unity博主营地你不可不知的Unity C#代码小技巧

    「Unity博主营地第一期」于2019年11月开启,现已收到数百篇原创投稿.每周根据Unity Connect社区反馈,帮助大家发现最优质.最干货.最受欢迎的博文作品. 开门见山的说,这篇文章干到挤不 ...

  8. 5款实用爬虫小工具推荐(云爬虫+采集器)

    目前市面上我们常见的爬虫软件大致可以划分为两大类:云爬虫和采集器(特别说明:自己开发的爬虫工具和爬虫框架除外) 云爬虫就是无需下载安装软件,直接在网页上创建爬虫并在网站服务器运行,享用网站提供的带宽和 ...

  9. 编程IDE杂项与各种实用的小工具及windows设置(装机必备)

    ##shellcheck:shell脚本语法检查器 有多种使用方法,实践过的: 1.在线使用:https://www.shellcheck.net/ 2.在ubuntu上与vim集成使用(https: ...

最新文章

  1. 哈佛管理论丛:谁背上了令人讨厌的猴子
  2. cpu渲染测试软件,CineBench渲染能力测试_CPUCPU评测-中关村在线
  3. Android下的动画
  4. .ini文件的读写操作
  5. centos下面搭建svn服务器详细流程
  6. 如何自学python基础-零基础如何自学成为Python高手?我有几点干货
  7. 离群点(oulier)挖掘详解
  8. linux连接http报301解决,https下不加www的301强制跳转
  9. 微软新浏览器_要超越Chrome?微软新发布的这款浏览器,有翻天覆地的变化!
  10. BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)
  11. 专题导读:数据资产化探索
  12. 【Python】Mac下Sublime Text3配置Python3开发环境
  13. wps算账怎么用计算机,WPS教程--基本编辑功能的使用--操作界面
  14. 思科路由器的双出口nat研究
  15. 怎么将CAD图纸转化为PDF格式呢?教你两个妙招搞定!
  16. 手机app怎么制作?app软件开发流程详解
  17. 房地产微信营销方案微信“危”与“机”
  18. 华为鸿蒙系统首发设备,华为鸿蒙系统首发设备 必须支持华为,早点甩掉安卓...
  19. 【优质潜力刊】Elsevier旗下1区SCI, 热门前沿领域,已稳定检索37年~
  20. SQL语句 合并列值 将一列的多个值合并成一行

热门文章

  1. VRF(虚拟路由转发)
  2. 什么是教育邮箱?企业邮箱注册流程是什么样的?
  3. 用队列模拟患者医院看病的过程
  4. AI如何练就读唇术?唇语识别数据功不可没
  5. 我在网上找到了新家:99盘
  6. 怎么安装jdk6,怎么安装jdk-6u33-linux-i586.bin
  7. “笨办法”学Python3,Zed A. Shaw,习题20
  8. java实现游戏对战过程_【Java实战】Java实现简易坦克对战小游戏
  9. 什么是真值(truthy)
  10. 5个开源聊天应用程序