常用功能整理记录(一些比较简单的功能实现集合(网上找的一些比较好的解决方案)放在这里)

目录

控制台打印

深拷贝

物体跟随鼠标移动

UI跟随玩家移动(Canvas在屏幕坐标覆盖或者世界坐标皆可)

简易存档工具

Sprite字体使用

防止鼠标射线穿透UI的API

UniWebview无法加载Https解决办法

AB包加载小工具

Singleton

Unity物体看向鼠标

Unity小程序发布

GoogleProtobuf使用学习链接

Adrressable教程

素材网站

数字转换KBT单位


控制台打印

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ConsoleToSceen : MonoBehaviour
{const int maxLines = 50;const int maxLineLength = 120;private string _logStr = "";private readonly List<string> _lines = new List<string>();void OnEnable() { Application.logMessageReceived += Log; }void OnDisable() { Application.logMessageReceived -= Log; }void Update() { }public void Log(string logString, string stackTrace, LogType type){foreach (var line in logString.Split('\n')){if (line.Length <= maxLineLength){_lines.Add(line);continue;}var lineCount = line.Length / maxLineLength + 1;for (int i = 0; i < lineCount; i++){if ((i + 1) * maxLineLength <= line.Length){_lines.Add(line.Substring(i * maxLineLength, maxLineLength));}else{_lines.Add(line.Substring(i * maxLineLength, line.Length - i * maxLineLength));}}}if (_lines.Count > maxLines){_lines.RemoveRange(0, _lines.Count - maxLines);}_logStr = string.Join("\n", _lines);}void OnGUI(){GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity,new Vector3(Screen.width / 1200.0f, Screen.height / 800.0f, 1.0f));GUI.Label(new Rect(10, 10, 800, 370), _logStr, new GUIStyle() { fontSize = 30 });}
}

深拷贝

 public static T DeepCopyByReflection<T>(T obj){if (obj is string || obj.GetType().IsValueType)return obj;object retval = Activator.CreateInstance(obj.GetType());FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);foreach (var field in fields){try{field.SetValue(retval, DeepCopyByReflection(field.GetValue(obj)));}catch { }}return (T)retval;}

物体跟随鼠标移动

private Vector3 cubeScreenPos;private Vector3 mouseScreenPos;private Vector3 objOffset;// 偏移private void OnMouseDown(){Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position);mouseScreenPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPos.z);objOffset = transform.position - Camera.main.ScreenToWorldPoint(mouseScreenPos);}private void OnMouseDrag(){//为什么要先把cube转化为屏幕坐标?这样可以保证cube的z轴坐标不变cubeScreenPos = Camera.main.WorldToScreenPoint(transform.position);mouseScreenPos.x = Input.mousePosition.x;mouseScreenPos.y = Input.mousePosition.y;mouseScreenPos.z = cubeScreenPos.z;Vector3 endPos = Camera.main.ScreenToWorldPoint(mouseScreenPos) + objOffset;//  transform.Translate(new Vector3(endPos.x, transform.position.y, transform.position.z) * Time.deltaTime, Space.World);//transform.Translate(new Vector3(endPos.x, endPos.y, endPos.z) * Time.deltaTime, Space.World);transform.position = new Vector3(endPos.x, transform.position.y, transform.position.z);// transform.}

UI跟随玩家移动(Canvas在屏幕坐标覆盖或者世界坐标皆可)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UIContraller : MonoBehaviour
{public GameObject player;public Camera cam;// Update is called once per framevoid Update(){CalPosition();//    Vector2 pos = Camera.main.WorldToScreenPoint(player.transform.position);// GetComponent<RectTransform>().localPosition = pos;}public Vector3 Offset = new Vector3(0, 1, 0);private void CalPosition(){Vector3 vector3 = Vector3.zero;Vector3 screenPosition = cam.WorldToScreenPoint(player.transform.position + Offset);//将目标物体的坐标转化为屏幕坐标Vector3 uiPosition = Vector3.zero;//;//将得到的屏幕坐标转化为UGUI坐标if (RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, screenPosition, null, out uiPosition)){uiPosition = new Vector3(Mathf.FloorToInt(uiPosition.x), Mathf.FloorToInt(uiPosition.y), Mathf.FloorToInt(uiPosition.z));transform.position = uiPosition;}}}

控制UI显示顺序:UI是根据摄像机控制的,canvas下的图层顺序没用,控制摄像机的深度值即可设置Canvas显示深度

世界坐标的Canvas和世界坐标比例100:1,设置Canvas缩放0.01,直接设置坐标即可

go.GetComponent<RectTransform>().position = Entity.transform.position;

VSCode新版代码不提示:

搜索Snippet,settingJson中修改"editor.suggest.snippetsPreventQuickSuggestions": false

简易存档工具

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor;
public static class SaveJson
{public static void WriteToJson(string fileName, object data){var json = JsonUtility.ToJson(data, true);Debug.Log(json);var path = Path.Combine(Application.persistentDataPath, fileName);try{File.WriteAllText(path, json);}catch (System.Exception e){Debug.LogError("未能写入到该json文件" + e);}}public static T ReadJsonFile<T>(string fileName, object data){var path = Path.Combine(Application.persistentDataPath, fileName);try{string file = null;if (!File.Exists(path)){WriteToJson(fileName, data);file = File.ReadAllText(path);}else{file = File.ReadAllText(path);}var json = JsonUtility.FromJson<T>(file);return json;}catch (System.Exception e){Debug.LogError("无法读取当前文件" + e);return default;}}public static void DeleteAllJson(string fileName){var path = Path.Combine(Application.persistentDataPath, fileName);try{File.Delete(path);}catch (System.Exception e){Debug.LogError("未能成功删除存档" + e);}}}

Sprite字体使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEditor;
public class SetTTf : MonoBehaviour
{//本方法是通过裁切的sprite导出字体文件,裁切使用的是unity自带的sprite editor,方便操作。//另外,裁切之后,每个sprite的名字的最后一个字符对应了ascii码的编码,比如://0: 我们只要将sprite的名字命名成xxx0,就可以了!//由于使用到的了sprite加载,所以字体图片请放在Resources目录下面,等制作完毕,再把他们放到fonts文件夹或者其他文件夹中即可。[MenuItem("SetTTf/CreateMyFontSprite")]static void CreateMyFontSprite(){if (Selection.objects == null) return;if (Selection.objects.Length == 0){Debug.LogWarning("没有选中Sprite文件,需要将Sprite Mode设置成Multiple,切分好,并且以以名字的最后一个字符当做ascii码");return;}string resoursePath = "Resources";Object o = Selection.objects[0];if (o.GetType() != typeof(Texture2D)){Debug.LogWarning("选中的并不是图片文件");return;}string selectionPath = AssetDatabase.GetAssetPath(o);if (selectionPath.Contains(resoursePath)){string selectionExt = Path.GetExtension(selectionPath);if (selectionExt.Length == 0){return;}string loadPath = selectionPath.Remove(selectionPath.Length - selectionExt.Length);string fontPathName = loadPath + ".fontsettings";string matPathName = loadPath + ".mat";float lineSpace = 0.1f;//字体行间距,下面会根据最高的字体得到行间距,如果是固定高度,可以在这里自行调整loadPath = Path.GetFileNameWithoutExtension(selectionPath);Sprite[] sprites = Resources.LoadAll<Sprite>(loadPath);if (sprites.Length > 0){//以textrue方式获得该资源,可以设置到创建的材质中去Texture2D tex = o as Texture2D;//创建字体材质,并且将图片设置好Material mat = new Material(Shader.Find("GUI/Text Shader"));AssetDatabase.CreateAsset(mat, matPathName);mat.SetTexture("_MainTex", tex);//创建字体文件,设置字体文件的材质Font m_myFont = new Font();m_myFont.material = mat;AssetDatabase.CreateAsset(m_myFont, fontPathName);//创建字体中的字符集数组CharacterInfo[] characterInfo = new CharacterInfo[sprites.Length];//得到最高的高度,设置行高和进行偏移计算for (int i = 0; i < sprites.Length; i++){if (sprites[i].rect.height > lineSpace){lineSpace = sprites[i].rect.height;}}for (int i = 0; i < sprites.Length; i++){Sprite spr = sprites[i];CharacterInfo info = new CharacterInfo();//设置ascii码,使用切分sprite的最后一个字母info.index = (int)spr.name[spr.name.Length - 1];Rect rect = spr.rect;//根据pivot设置字符的偏移,具体需要做成什么样的,可以根据自己需要修改公式float pivot = spr.pivot.y / rect.height - 0.5f;if (pivot > 0){pivot = -lineSpace / 2 - spr.pivot.y;}else if (pivot < 0){pivot = -lineSpace / 2 + rect.height - spr.pivot.y;}else{pivot = -lineSpace / 2;}Debug.Log(pivot);int offsetY = (int)(pivot + (lineSpace - rect.height) / 2);//设置字符映射到材质上的坐标info.uvBottomLeft = new Vector2((float)rect.x / tex.width, (float)(rect.y) / tex.height);info.uvBottomRight = new Vector2((float)(rect.x + rect.width) / tex.width, (float)(rect.y) / tex.height);info.uvTopLeft = new Vector2((float)rect.x / tex.width, (float)(rect.y + rect.height) / tex.height);info.uvTopRight = new Vector2((float)(rect.x + rect.width) / tex.width, (float)(rect.y + rect.height) / tex.height);//设置字符顶点的偏移位置和宽高info.minX = 0;info.minY = -(int)rect.height - offsetY;info.maxX = (int)rect.width;info.maxY = -offsetY;//设置字符的宽度info.advance = (int)rect.width;characterInfo[i] = info;}// lineSpace += 2;m_myFont.characterInfo = characterInfo;EditorUtility.SetDirty(m_myFont);//设置变更过的资源AssetDatabase.SaveAssets();//保存变更的资源AssetDatabase.Refresh();//刷新资源,貌似在Mac上不起作用//由于上面fresh之后在编辑器中依然没有刷新,所以暂时想到这个方法,//先把生成的字体导出成一个包,然后再重新导入进来,这样就可以直接刷新了//这是在Mac上遇到的,不知道Windows下面会不会出现,如果不出现可以把下面这一步注释掉AssetDatabase.ExportPackage(fontPathName, "temp.unitypackage");AssetDatabase.DeleteAsset(fontPathName);AssetDatabase.ImportPackage("temp.unitypackage", true);AssetDatabase.Refresh();//最佳高度:上下各留一个像素的间距,如果不需要可以注释掉,根据需求更改//打印是为了使使用者方便填写行高,因为font不支持设置行高。Debug.Log("创建字体成功, 最大高度:" + lineSpace + ", 最佳高度:" + (lineSpace + 2));}else{Debug.LogWarning("没有选中Sprite文件,需要将Sprite放到Resources文件夹下面,可以参考函数上方的说明操作");}}}
}

防止鼠标射线穿透UI的API

 if (!EventSystem.current.IsPointerOverGameObject()){//}

UniWebview无法加载Https解决办法

网址https://blog.csdn.net/boyZhenGui/article/details/121250008UniWebView,是一个支持安卓,ios和mac系统的网页插件(Windows不可用,意味着Windows系统的Unity编辑器无法看到效果,只有打包放到手机上才可以看到效果)。原因
出现ERR_CLEARTEXT_NOT_PERMITTED这个报错的原因,在于安卓。从Android 9.0(API级别28)开始,默认情况下禁用明文支持。因此http的url均无法在webview中加载。解决方案
所以我们需要在安卓的清单中AndroidManifest.xml,添加可以加载http的标签。在Unity中完成修改AndroidManifest.xml
在Unity中无AndroidManifest.xml文件的情况下。Unity默认情况会根据插件中的所有 Android 清单,和打包设置,自动生成一份清单文件AndroidManifest.xml。如果Unity中Assets/Plugins/Android/AndroidManifest.xml,有清单文件,则会使用此清单。对于在Unity中的安卓清单详细解释可以看Unity官方手册。网上找到的清单都不符合Unity需求,我们需要得到Unity需要的清单文件。一、打包apk,得到Unity自动生成的最终清单文件AndroidManifest.xml
打包成功apk后,在关闭Unity编辑器之前,在Temp/StagingArea/AndroidManifest.xml 可以找到此apk使用的最终清单。二、将最终清单文件放到Unity中
复制步骤一中得到的清单,放到如下链接Assets/Plugins/Android/AndroidManifest.xml。三、修改AndroidManifest.xml
打开AndroidManifest.xml,找到标签, 在里面加入android:usesCleartextTraffic="true"即可,这个代码标表示可以使用http明文传输,解决方法:找到AndroidManifest.xml的方法=“找到Player下安卓的发布设置找到custom mina manifest”;或者在unity主程序找相同文件复制
<application android:usesCleartextTraffic="true">

AB包加载小工具


using System.Net.Mime;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>/// AB包管理器 全局唯一 使用单例模式/// </summary>public class ABManager : MonoSingleton<ABManager>{//AB包缓存---解决AB包无法重复加载的问题 也有利于提高效率。private Dictionary<string, AssetBundle> abCache=new Dictionary<string, AssetBundle>();private AssetBundle mainAB = null; //主包private AssetBundleManifest mainManifest = null; //主包中配置文件---用以获取依赖包//各个平台下的基础路径 --- 利用宏判断当前平台下的streamingAssets路径private string basePath{get{//使用StreamingAssets路径注意AB包打包时 勾选copy to streamingAssets
#if UNITY_EDITOR || UNITY_STANDALONEreturn Application.dataPath + "/StreamingAssets/";
#elif UNITY_IPHONEreturn Application.dataPath + "/Raw/";
#elif UNITY_ANDROIDreturn Application.dataPath + "!/assets/";
#endif}}//各个平台下的主包名称 --- 用以加载主包获取依赖信息private string mainABName{get{
#if UNITY_EDITOR || UNITY_STANDALONEreturn "StandaloneWindows";
#elif UNITY_IPHONEreturn "IOS";
#elif UNITY_ANDROIDreturn "Android";
#endif}}//加载AB包private AssetBundle LoadABPackage(string abName){AssetBundle ab;//加载ab包,需一并加载其依赖包。if (mainAB == null){//根据各个平台下的基础路径和主包名加载主包mainAB = AssetBundle.LoadFromFile(basePath + mainABName);//获取主包下的AssetBundleManifest资源文件(存有依赖信息)mainManifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");}//根据manifest获取所有依赖包的名称 固定APIstring[] dependencies = mainManifest.GetAllDependencies(abName);//循环加载所有依赖包for (int i = 0; i < dependencies.Length; i++){//如果不在缓存则加入if (!abCache.ContainsKey(dependencies[i])){//根据依赖包名称进行加载ab = AssetBundle.LoadFromFile(basePath + dependencies[i]);//注意添加进缓存 防止重复加载AB包abCache.Add(dependencies[i], ab);}}//加载目标包 -- 同理注意缓存问题if (abCache.ContainsKey(abName)) return abCache[abName];else{ab = AssetBundle.LoadFromFile(basePath + abName);abCache.Add(abName, ab);return ab;}}//==================三种资源同步加载方式==================//提供多种调用方式 便于其它语言的调用(Lua对泛型支持不好)#region 同步加载的三个重载/// <summary>/// 同步加载资源---泛型加载 简单直观 无需显示转换/// </summary>/// <param name="abName">ab包的名称</param>/// <param name="resName">资源名称</param>public T LoadResource<T>(string abName, string resName) where T : UnityEngine. Object{//加载目标包AssetBundle ab = LoadABPackage(abName);//返回资源return ab.LoadAsset<T>(resName);}//不指定类型 有重名情况下不建议使用 使用时需显示转换类型public Object LoadResource(string abName, string resName){//加载目标包AssetBundle ab = LoadABPackage(abName);//返回资源return ab.LoadAsset(resName);}//利用参数传递类型,适合对泛型不支持的语言调用,使用时需强转类型public Object LoadResource(string abName, string resName, System.Type type){//加载目标包AssetBundle ab = LoadABPackage(abName);//返回资源return ab.LoadAsset(resName, type);}#endregion//================三种资源异步加载方式======================/// <summary>/// 提供异步加载----注意 这里加载AB包是同步加载,只是加载资源是异步/// </summary>/// <param name="abName">ab包名称</param>/// <param name="resName">资源名称</param>public void LoadResourceAsync(string abName, string resName, System.Action<Object> finishLoadObjectHandler){AssetBundle ab = LoadABPackage(abName);//开启协程 提供资源加载成功后的委托StartCoroutine(LoadRes(ab, resName, finishLoadObjectHandler));}private IEnumerator LoadRes(AssetBundle ab, string resName, System.Action<Object> finishLoadObjectHandler){if (ab == null) yield break;//异步加载资源APIAssetBundleRequest abr = ab.LoadAssetAsync(resName);yield return abr;//委托调用处理逻辑finishLoadObjectHandler(abr.asset);}//根据Type异步加载资源public void LoadResourceAsync(string abName, string resName, System.Type type, System.Action<Object> finishLoadObjectHandler){AssetBundle ab = LoadABPackage(abName);StartCoroutine(LoadRes(ab, resName, type, finishLoadObjectHandler));}private IEnumerator LoadRes(AssetBundle ab, string resName, System.Type type, System.Action<Object> finishLoadObjectHandler){if (ab == null) yield break;AssetBundleRequest abr = ab.LoadAssetAsync(resName, type);yield return abr;//委托调用处理逻辑finishLoadObjectHandler(abr.asset);}//泛型加载public void LoadResourceAsync<T>(string abName, string resName, System.Action<Object> finishLoadObjectHandler) where T : Object{AssetBundle ab = LoadABPackage(abName);StartCoroutine(LoadRes<T>(ab, resName, finishLoadObjectHandler));}private IEnumerator LoadRes<T>(AssetBundle ab, string resName, System.Action<Object> finishLoadObjectHandler) where T : Object{if (ab == null) yield break;AssetBundleRequest abr = ab.LoadAssetAsync<T>(resName);yield return abr;//委托调用处理逻辑finishLoadObjectHandler(abr.asset as T);}//====================AB包的两种卸载方式=================//单个包卸载public void UnLoad(string abName){if (abCache.ContainsKey(abName)){abCache[abName].Unload(false);//注意缓存需一并移除abCache.Remove(abName);}}//所有包卸载public void UnLoadAll(){AssetBundle.UnloadAllAssetBundles(false);//注意清空缓存abCache.Clear();mainAB = null;mainManifest = null;}}

Singleton

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 无需挂载直接调用即可
/// </summary>
/// <typeparam name="T"></typeparam>
public class Singleton<T> : MonoBehaviour where T : Singleton<T>
{private static T instance;public static T Instance{get{if (instance == null){instance = FindObjectOfType(typeof(T)) as T;if (instance == null){GameObject go = new GameObject();go.name = typeof(T).ToString();instance = go.AddComponent<T>();}}return instance;}}/// <summary>/// 如果需要跟随场景在Awake中调用Init即可/// </summary>protected void Init(){  DontDestroyOnLoad(gameObject);if (instance == null){instance = this as T;}else{Destroy(gameObject);}}}

Unity物体看向鼠标

 public LayerMask whatIsGround;// Update is called once per framevoid Update(){GetPos();}void GetPos(){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.Raycast(ray, out hitInfo, 200, whatIsGround)){Vector3 target = hitInfo.point;target.y = transform.position.y;transform.LookAt(target);}}

Unity小程序发布

Unity对接抖音_暗夜血媚的博客-CSDN博客_unity 抖音小游戏

GoogleProtobuf使用学习链接

protobuf如何使用Protogen工具生成CS代码详细教学篇_Little丶Seven的博客-CSDN博客_protobuf protogen

Adrressable教程

【游戏开发探究】Unity Addressables资源管理方式用起来太爽了,资源打包、加载、热更变得如此轻松(Addressable Asset System | 简称AA)_林新发的博客-CSDN博客

Unity Addressable发布至服务器流程与自动打包代码_凌志·C的博客-CSDN博客

素材网站

阿里巴巴矢量图库,地址:iconfont-阿里巴巴矢量图标库

如何调节你想显示的3d物理模型(比如离得近才显示完全体,离得远显示底模,加上这个组件就可以)

调节阴影距离

Npm相关

npm 安装第三方插件(moment.js)_weixin_44134551的博客-CSDN博客_npm安装moment

https://blog.csdn.net/lenfranky/article/details/90177121

如何方便快速的在指定文件夹打开cmd_LenFranky的博客-CSDN博客_在文件夹打开cmd

数字转换KBT单位

/// <summary>/// 数字换算/// </summary>/// <param name="num"></param>/// <returns></returns>public string Numdispose(double Allcount){string num = Allcount.ToString();if (Allcount < 999){return num;}string[] symbol = { "K", "M", "B", "T", "aa", "ab", "ac", "ad" };bool isSciece = false;bool isInt = false;if (Allcount > 999999999999999){isSciece = true;}int endLength;if (isSciece){int len = num.Length;string lengStr = num.Substring(len - 2, 2);int taille = int.Parse(lengStr);//Debug.Log(lengStr + "      " + taille);endLength = taille + 1;//TODOif (num.Contains(".")){num = num.Remove(1, 1);}else{isInt = true;}}else{endLength = num.Length; ;}int remainCount = endLength / 3;string sym = symbol[remainCount - 1];int reNum = endLength % 3;if (reNum == 0){reNum = 3;sym = symbol[remainCount - 2];}string head = num.Substring(0, reNum);string tail = num.Substring(reNum, 2);num = head + "." + tail + sym;// + sym;if (isInt){num = 10 * reNum + sym;}//Debug.Log(num);return num;}

Unity笔记—常用小功能整合相关推荐

  1. android 常用小功能(第二版)

    经历过一段岁月,转眼2013的半年都过去了,第二版整理好的小功能,答应大家发布的,直到今日,终于和大家相见了,第二版没有第一版多,大家也可以去参考第一版的内容,希望大家使用愉快! 目录: 1.获取当前 ...

  2. android 模拟器 vuforia,Vuforia+Unity尝试AR小功能(1)

    本人新手菜鸟,看了网上很多教程,希望把它记录下来作为自己的回顾和总结.本文纯属自娱自乐,如有大神请帮忙指点一下,蟹蟹- 配置环境 首先需要安装Unity软件,到官网下载安装文件,在安装过程中记得勾选i ...

  3. Unity实现一些小功能(持续更新)

    检查是否是2的整数幂 苹果手机, 图片长宽均为2的整数幂, 且是正方形, 才能用pvrtc4压缩 检查图片是否为POT: static bool IsPowerOfTwo(int x) {return ...

  4. 常用小功能(打电话、发短信、发邮件)

    打电话-⽅方法1 ● 最简单最直接的⽅方式:直接跳到拨号界⾯面 NSURL *url = [NSURL URLWithString:@"tel://10010"]; [[UIApp ...

  5. 【微信小程序】几个常用小功能

    简单封装接口 接口js文件: function aaa(data, callback) {wx.request({url: url + "/testUrl",method: &qu ...

  6. 基于Unity的2D小游戏 SpeedDown 开发笔记(学习bilibili@[M_Studio]的教学视频

    基于Unity的2D小游戏 SpeedDown 开发笔记(学习bilibili@M_Studio的教学视频) 主要内容:在Sunnyland游戏的设计基础上,新增了物理组件Joint系列.DrawGi ...

  7. SiKi学院 Unity中常用api学习笔记(001-014)

    Api 应用程序编程接口 前言 笔记是看siki学院中<Unity中常用api>的学习笔记 课程地址:  http://www.sikiedu.com/my/course/59 强烈推荐大 ...

  8. c++双向列表释放_Python列表生成式12个小功能,你常用哪几个?

    作者 | zglg 来源 | Python与算法社区 原文 | Python列表生成式12个小功能,你常用哪几个? python里[] 表示一个列表,对容器类型的数据进行运算和操作,生成新的列表最高效 ...

  9. CentOS4.4下邮件服务器架设笔记之windows AD整合功能实现

    1.通过"CentOS4.4下邮件服务器架设笔记之邮件网关功能实现"这一篇文章,我们已经实现了邮件网关功能,但是对于microsoft ad 平台下exchange邮件系统用户来说 ...

  10. unity2d游戏开发系列教程:二、新建工程并熟悉Unity编辑器常用功能

    目录 unity2d游戏开发系列教程:一.环境安装 第一步.打开项目 耐心等待一小会 工程界面 第二步.创建第一个场景(第一关)进行试玩 点击图中标号1的运行按钮,即可简单试玩感受,操作如下 移动A, ...

最新文章

  1. SAP SD基础知识之交货单不完全日志
  2. D3 dataset - what is usage of key function in data
  3. List实现类中调用下标删除VS调用元素删除
  4. UIEdgeInsets
  5. 图论 —— 着色问题
  6. pyqt5-控件是否可用
  7. 如何编写大数据分析师简历
  8. 盘点14个因安全事故引咎辞职的高管领导
  9. Fibonacci数列 斐波那契数列
  10. 剧白白 v3.1.1 修改版 (强大的最新影视在线平台)
  11. 利用OpencvSharp计算工件移动后,机器人旋转中心(抓取位置)
  12. Vins_mono重力对齐理解
  13. [转]信息安全相关理论题(二)
  14. ATH9K Driver Learning Part II: Important Transmission Functions
  15. 211大学计算机复试不机试,2019清华大学计算机考研912考试复试常问问题?
  16. JavaScript 时间与Unix时间戳互相转换,指定时间转换或获取当前时间
  17. android 蜂巢平台,Android 3.2来临 蜂巢系统平板详解析
  18. 移动Windows Kits文件夹后产生问题的解决方案
  19. Vue项目——Vue开发掘金WebApp(仿掘金App)
  20. 计算机毕业设计 SpringBoot+Vue物资储备管理系统 库存物资管理系统 仓库物资管理系统Java Vue MySQL数据库 远程调试 代码讲解

热门文章

  1. idea导入eclipse快捷键
  2. IDEA自动生成serialVersionUID的设置
  3. ubuntu手动下载安装软件包
  4. TortoiseSVN汉化教程
  5. SecureCRT的安装破解
  6. Bigemap GIS Office软件 报价单
  7. Hcse 交换知识点-4
  8. python人口普查数据显示_如何使用FCC的API在Python中查找人口普查数据块并遍历dict列表?...
  9. 看完淘宝技术这十年思考
  10. 人民币大写金额转换算法