UGUI-UGUITool
作者:追风剑情 发布于:2019-7-5 13:35 分类:Unity3d
示例:工具类
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public static class UGUITool
{
/// <summary>
/// 计算子项在容器中的Bounds(相对于container的锚点)
/// </summary>
/// <param name="container">可以不是直接父容器</param>
/// <param name="child"></param>
/// <returns></returns>
public static Bounds CalculateBounds(RectTransform container, RectTransform child)
{
Vector3[] corners = new Vector3[4];
child.GetWorldCorners(corners);
Matrix4x4 containerWorldToLocalMatrix = container.worldToLocalMatrix;
var vMin = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
var vMax = new Vector3(float.MinValue, float.MinValue, float.MinValue);
for (int j = 0; j < 4; j++)
{
Vector3 v = containerWorldToLocalMatrix.MultiplyPoint3x4(corners[j]);
vMin = Vector3.Min(v, vMin);
vMax = Vector3.Max(v, vMax);
}
Bounds bounds = new Bounds(vMin, Vector3.zero);
bounds.Encapsulate(vMax);
return bounds;
}
// 计算RectTransform的Bounds
public static Bounds CalculateBounds(RectTransform rectTransform)
{
return new Bounds(rectTransform.rect.center, rectTransform.rect.size);
}
// 获取GUI元素在Canvas中的矩形区域
public static Rect GetCanvasRect(RectTransform t, Canvas c)
{
if (c == null)
return new Rect();
//1.获取t的世界坐标
//2.将t的世界坐标转成c的本地坐标
Vector3[] worldCorners = new Vector3[4];
Vector3[] canvasCorners = new Vector3[4];
t.GetWorldCorners(worldCorners);
var canvasTransform = c.GetComponent<Transform>();
for (int i = 0; i < 4; ++i)
canvasCorners[i] = canvasTransform.InverseTransformPoint(worldCorners[i]);
//计算出的x,y坐标是相对于Canvas锚点的
return new Rect(canvasCorners[0].x, canvasCorners[0].y, canvasCorners[2].x - canvasCorners[0].x, canvasCorners[2].y - canvasCorners[0].y);
}
// 设置相对于锚点的坐标
public static void SetAnchoredPosition(RectTransform rectTransform, float x, float y)
{
Vector2 anchoredPosition = rectTransform.anchoredPosition;
anchoredPosition.x = x;
anchoredPosition.y = y;
rectTransform.anchoredPosition = anchoredPosition;
}
// 设置相对于锚点的坐标
public static void SetAnchoredPosition3D(RectTransform rectTransform, float x, float y, float z)
{
Vector3 anchoredPosition = rectTransform.anchoredPosition3D;
anchoredPosition.x = x;
anchoredPosition.y = y;
anchoredPosition.z = z;
rectTransform.anchoredPosition3D = anchoredPosition;
}
public static void SetAnchoredPositionX(RectTransform rectTransform, float x)
{
Vector2 anchoredPosition = rectTransform.anchoredPosition;
anchoredPosition.x = x;
rectTransform.anchoredPosition = anchoredPosition;
}
public static void SetAnchoredPositionY(RectTransform rectTransform, float y)
{
Vector2 anchoredPosition = rectTransform.anchoredPosition;
anchoredPosition.y = y;
rectTransform.anchoredPosition = anchoredPosition;
}
// 设置相对于锚点的坐标偏移
public static void SetAnchoredPositionOffsetX(RectTransform rectTransform, float x)
{
Vector2 anchoredPosition = rectTransform.anchoredPosition;
anchoredPosition.x += x;
rectTransform.anchoredPosition = anchoredPosition;
}
public static void SetAnchoredPositionOffsetY(RectTransform rectTransform, float y)
{
Vector2 anchoredPosition = rectTransform.anchoredPosition;
anchoredPosition.y += y;
rectTransform.anchoredPosition = anchoredPosition;
}
// 绕轴旋转
public static void SetAnchoredRotate(RectTransform rectTransform, Vector3 axis, float angle)
{
rectTransform.Rotate(axis, angle);
}
// 设置上边距
public static void SetMarginTop(RectTransform rectTransform, float top, float size)
{
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, top, size);
}
// 设置下边距
public static void SetMarginBottom(RectTransform rectTransform, float bottom, float size)
{
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, bottom, size);
}
// 设置左边距
public static void SetMarginLeft(RectTransform rectTransform, float left, float size)
{
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, left, size);
}
// 设置右边距
public static void SetMarginRight(RectTransform rectTransform, float right, float size)
{
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, right, size);
}
// 设置边距
public static void SetMargin(RectTransform rectTransform, float top, float bottom, float left, float right, float size)
{
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, top, size);
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, bottom, size);
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, left, size);
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, right, size);
}
// 设置宽度
public static void SetRectTransformWidth(RectTransform rectTransform, float width)
{
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, width);
}
// 设置宽度
public static void SetRectTransformWidth(RectTransform rectTransform, RectTransform widthRectTransform)
{
float width = widthRectTransform.sizeDelta.x;
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, width);
}
// 设置高度
public static void SetRectTransformHeight(RectTransform rectTransform, float height)
{
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height);
}
// 设置高度
public static void SetRectTransformHeight(RectTransform rectTransform, RectTransform heightRectTransform)
{
float height = heightRectTransform.sizeDelta.y;
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height);
}
// 设置宽高 scaleFactor: Canvas.scaleFactor
public static void SetWidthAndHeight(RectTransform rectTransform, float width, float height, float scaleFactor = 1.0f)
{
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, width / scaleFactor);
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height / scaleFactor);
}
// 允许随父容器水平拉申
public static void SetAnchorsHorizontalStrength(RectTransform rectTransform)
{
rectTransform.anchorMin = new Vector2(0, 0.5f);
rectTransform.anchorMax = new Vector2(1, 0.5f);
}
// 允许随父容器垂直拉申
public static void SetAnchorsVerticalStrength(RectTransform rectTransform)
{
rectTransform.anchorMin = new Vector2(0.5f, 0);
rectTransform.anchorMax = new Vector2(0.5f, 1);
}
// 居中
public static void SetAnchorsMiddle(RectTransform rectTransform)
{
rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
}
// 全屏拉伸
public static void SetAnchorsStretch(RectTransform rectTransform)
{
//第2个参数是离父容器边界的距离,第3个参数是大小
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 0);
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 0, 0);
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, 0);
rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 0, 0);
rectTransform.anchorMin = new Vector2(0f, 0f);
rectTransform.anchorMax = new Vector2(1f, 1f);
}
// 获取本地坐标对应的贴图像素
public static Color GetLocalPixel(RectTransform rt, Vector2 localPoint, Texture2D tex)
{
//贴图尺寸与容器尺寸之比
float scaleX = tex.width / rt.sizeDelta.x;
float scaleY = tex.height / rt.sizeDelta.y;
//本地坐标 rt:Pivot(0.5, 0.5)
float px = localPoint.x;
float py = localPoint.y;
//将原点移到左下角
px += rt.sizeDelta.x / 2;
py += rt.sizeDelta.y / 2;
//乘以缩放比例
px *= scaleX;
py *= scaleY;
Color c = tex.GetPixel((int)px, (int)py);
return c;
}
// 设置rectTransform的宽高与sprite的分辨率一至
public static void SetNativeSize(RectTransform rectTransform, Sprite sprite)
{
if (rectTransform == null || sprite == null)
return;
Canvas canvas = rectTransform.gameObject.GetComponentInParent<Canvas>();
float pixelsPerUnit = 1;
if (canvas != null)
pixelsPerUnit = sprite.pixelsPerUnit / canvas.referencePixelsPerUnit;
float w = sprite.rect.width / pixelsPerUnit;
float h = sprite.rect.height / pixelsPerUnit;
rectTransform.anchorMax = rectTransform.anchorMin;
rectTransform.sizeDelta = new Vector2(w, h);
}
// RectTransform四个角的坐标转屏幕坐标
public static Vector2[] GetScreenCorners(RectTransform rectTransform, Camera cam = null)
{
if (rectTransform == null)
return new Vector2[4];
Vector3[] worldCorners = new Vector3[4];
rectTransform.GetWorldCorners(worldCorners);
//worldCorners[0] 左下角
//worldCorners[1] 左上角
//worldCorners[2] 右上角
//worldCorners[3] 右下角
/*
1 2
0 3
*/
Vector2[] screenCorners = new Vector2[4];
for (int i = 0; i < worldCorners.Length; i++)
{
screenCorners[i] = RectTransformUtility.WorldToScreenPoint(cam, worldCorners[i]);
}
return screenCorners;
}
// RectTransform在世界空间中的区域
public static Vector4 GetWorldArea(RectTransform rectTransform)
{
Vector4 area = new Vector4();
if (rectTransform == null)
return area;
Vector3[] worldCorners = new Vector3[4];
rectTransform.GetWorldCorners(worldCorners);
//左下角坐标
area.x = worldCorners[0].x;
area.y = worldCorners[0].y;
//右上角坐标
area.z = worldCorners[2].x;
area.w = worldCorners[2].y;
return area;
}
// 获取RectTransform所在屏幕区域(注意:屏幕坐标原点在左下角)
public static Rect GetScreenRect(RectTransform rectTransform, Camera cam = null)
{
Vector2[] screenCorners = GetScreenCorners(rectTransform, cam);
float x = screenCorners[0].x;
float y = screenCorners[0].y;
float w = screenCorners[2].x - screenCorners[0].x;
float h = screenCorners[2].y - screenCorners[0].y;
Rect rect = new Rect();
rect.Set(x, y, w, h);
return rect;
}
// 对RectTransform区域截屏
// yield return new WaitForEndOfFrame();//必须在当前帧绘制完后才能截屏,否则会报错
public static Texture2D CaptureScreenRect(RectTransform rectTransform, Camera cam = null)
{
if (rectTransform == null)
return Texture2D.whiteTexture;
Vector2[] screenCorners = GetScreenCorners(rectTransform, cam);
Vector2 corner0 = screenCorners[0];
Vector2 corner2 = screenCorners[2];
int width = (int)(corner2.x - corner0.x);
int height = (int)(corner2.y - corner0.y);
Rect rect = new Rect(corner0.x, corner0.y, width, height);
Texture2D screenShot = new Texture2D(width, height, TextureFormat.RGB24, false);
// 读取屏幕像素信息并存储为纹理数据
screenShot.ReadPixels(rect, 0, 0);
screenShot.Apply();
return screenShot;
}
// 保存Texture
public static void SaveTexture(Texture2D tex, string path)
{
byte[] bytes = tex.EncodeToPNG();
File.WriteAllBytes(path, bytes);
}
// 屏幕坐标转本地坐标
// Canvas的Render Mode选择Screen Space - Overlay时Camera传null
// 屏幕坐标原点在左下角
public static Vector2 ScreenPointToLocal(RectTransform rectTransform, Vector2 screenPoint, Camera cam = null)
{
Vector2 localPoint;
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, cam, out localPoint);
if (rectTransform!= null)
{
//如果本地坐标系原点不在左下角,需要做个偏移处理
Vector2 sizeDelta = rectTransform.sizeDelta;
Vector2 pivot = rectTransform.pivot;
float parentWidth = sizeDelta.x;
float parentHeight = sizeDelta.y;
float offsetX = parentWidth * pivot.x;
float offsetY = parentHeight * pivot.y;
localPoint.x += offsetX;
localPoint.y += offsetY;
}
return localPoint;
}
/// <summary>
/// 转载 https://www.cnblogs.com/shanksyi/p/5634060.html
/// 获取指定距离下相机视口四个角的坐标
/// </summary>
/// <param name="cam" />
/// <param name="distance" />相对于相机的距离
/// <returns></returns>
public static Vector3[] GetCameraFovPositionByDistance(Camera cam, float distance)
{
Vector3[] corners = new Vector3[4];
float halfFOV = (cam.fieldOfView * 0.5f) * Mathf.Deg2Rad;
float aspect = cam.aspect;
float height = distance * Mathf.Tan(halfFOV);
float width = height * aspect;
Transform tx = cam.transform;
// 左上角
corners[0] = tx.position - (tx.right * width);
corners[0] += tx.up * height;
corners[0] += tx.forward * distance;
// 右上角
corners[1] = tx.position + (tx.right * width);
corners[1] += tx.up * height;
corners[1] += tx.forward * distance;
// 左下角
corners[2] = tx.position - (tx.right * width);
corners[2] -= tx.up * height;
corners[2] += tx.forward * distance;
// 右下角
corners[3] = tx.position + (tx.right * width);
corners[3] -= tx.up * height;
corners[3] += tx.forward * distance;
return corners;
}
// RectTransform区域转屏幕上的像素区域
public static Rect PixelAdjustRect(RectTransform rt, Canvas canvas)
{
return RectTransformUtility.PixelAdjustRect(rt, canvas);
}
// 使Anchors的宽高与Text内容一致
public static IEnumerator TextPreferredSize(Text t, RectTransform.Axis axis)
{
yield return new WaitForEndOfFrame();
//以面的代码等效于t.preferredWidth、t.preferredHeight
TextGenerator tg = t.cachedTextGeneratorForLayout;
TextGenerationSettings settings = t.GetGenerationSettings(Vector2.zero);
float size = (axis == RectTransform.Axis.Horizontal) ?
tg.GetPreferredWidth(t.text, settings) : tg.GetPreferredHeight(t.text, settings);
size /= t.pixelsPerUnit;
//end
RectTransform rectTransform = t.GetComponent<RectTransform>();
rectTransform.SetSizeWithCurrentAnchors(axis, size);
}
// 获取Text宽度
public static float GetTextPreferredWidth(Text t)
{
float width, height;
GetTextPreferredSize(t, out width, out height);
return width;
}
// 获取Text高度
public static float GetTextPreferredHeight(Text t)
{
float width, height;
GetTextPreferredSize(t, out width, out height);
return height;
}
// 获取Text大小
public static void GetTextPreferredSize(Text t, out float width, out float height)
{
//需要强制更新一次
Canvas.ForceUpdateCanvases();
TextGenerator tg = t.cachedTextGeneratorForLayout;
TextGenerationSettings settings = t.GetGenerationSettings(Vector2.zero);
width = tg.GetPreferredWidth(t.text, settings) / t.pixelsPerUnit;
//如果Horizontal Overflow=Wrap,必须勾上Best Fit,否则获取到的高度不准。
height = tg.GetPreferredHeight(t.text, settings) / t.pixelsPerUnit;
}
// 适配: 等比缩放
public static void Zoom(RectTransform container, RectTransform rectTransform, float width, float height)
{
Vector3[] corners = new Vector3[4];
container.GetLocalCorners(corners);
float w = corners[2].x - corners[0].x;
float h = corners[2].y - corners[0].y;
float scale = 1;
if (width > w)
{
scale = w / width;
width = w;
height *= scale;
}
if (height > h)
{
scale = h / height;
height = h;
width *= scale;
}
SetAnchorsMiddle(rectTransform);
SetWidthAndHeight(rectTransform, width, height);
}
// 全屏显示
public static void FullScreen(RectTransform rt)
{
rt.sizeDelta = new Vector2(Screen.width, Screen.height);
}
// 等比缩放,尽量填满父容器
public static void FitInParent(Rect parent, RectTransform rt, Texture2D tex)
{
float pw = parent.width;
float ph = parent.height;
float w = tex.width;
float h = tex.height;
float rw = pw / w;
float rh = ph / h;
float r = rw < rh ? rw : rh;
w *= r;
h *= r;
rt.sizeDelta = new Vector2(w, h);
}
// 找到Root Canvas
public static Canvas FindRootCanvas(Transform transform = null)
{
Canvas canvas = null;
if (transform == null)
{
GameObject go = GameObject.FindGameObjectWithTag("RootCanvas");
if (go == null)
return null;
canvas = go.GetComponent<Canvas>();
return canvas;
}
Transform tran = transform;
while (tran.parent != null)
tran = transform.parent;
canvas = tran.GetComponent<Canvas>();
return canvas;
}
// 获取父容器大小
public static Vector2 GetParentSize(RectTransform rectTransform)
{
RectTransform parent = rectTransform.parent as RectTransform;
if (!parent)
return Vector2.zero;
return parent.rect.size;
}
// 获取大小
public static Vector2 GetSize(RectTransform rectTransform)
{
return rectTransform.rect.size;
}
// 获取Canvas的缩放值
public static float RootCanvasScaleFactor()
{
Canvas rootCanvas = FindRootCanvas();
if (rootCanvas == null)
return 1.0f;
return rootCanvas.scaleFactor;
}
// 去掉路径前缀
public static string TrimFilePrefix(string path)
{
path = path.Replace("file://", "");
return path;
}
// 替换文件名
public static string ReplaceFileName(string path, string newFileName)
{
string extension = Path.GetExtension(path);
int index = path.LastIndexOf('/');
path = path.Substring(0, index);
path = string.Format("{0}/{1}{2}", path, newFileName, extension);
return path;
}
/// <summary>
/// 获取鼠标停留处UI
/// </summary>
public static GameObject GetOverUI(GameObject canvas)
{
PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
pointerEventData.position = Input.mousePosition;
GraphicRaycaster gr = canvas.GetComponent<GraphicRaycaster>();
List<RaycastResult> results = new List<RaycastResult>();
gr.Raycast(pointerEventData, results);
if (results.Count != 0)
return results[0].gameObject;
return null;
}
//RenderTexture转Texture2D
public static Texture2D ConvertTexture2D(RenderTexture renderTexture)
{
int width = renderTexture.width;
int height = renderTexture.height;
Texture2D texture2D = new Texture2D(width, height, TextureFormat.ARGB32, false);
RenderTexture.active = renderTexture;
texture2D.ReadPixels(new Rect(0, 0, width, height), 0, 0);
texture2D.Apply();
return texture2D;
}
// 判断点击事件是否发生在UI上
// 参考 https://blog.csdn.net/LIQIANGEASTSUN/article/details/46490041
public static bool IsPointerOverUI()
{
bool over = false;
if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0) || Input.touchCount > 0)
{
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
if (EventSystem.current.IsPointerOverGameObject())
#elif UNITY_IPHONE || UNITY_ANDROID
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
#else
if (EventSystem.current.IsPointerOverGameObject())
#endif
over = true;
else
over = false;
}
return over;
}
//判断 鼠标/手指 Click
private static float lastPointerDownTime;
public static bool IsPointerClick()
{
if (Input.touchSupported)
{
if (Input.touchCount > 0)
{
if (Input.GetTouch(0).phase == TouchPhase.Began)
lastPointerDownTime = Time.realtimeSinceStartup;
if (Input.GetTouch(0).phase == TouchPhase.Ended)
return Time.realtimeSinceStartup - lastPointerDownTime < 0.2f;
}
return false;
}
if (Input.GetMouseButtonDown(0))
lastPointerDownTime = Time.realtimeSinceStartup;
if (Input.GetMouseButtonUp(0))
return Time.realtimeSinceStartup - lastPointerDownTime < 0.2f;
return false;
}
//判断鼠标是否点击到某个UI区域内
public static bool IsMouseButtonDownRect(RectTransform rectTransform, Camera cam = null)
{
if (!Input.GetMouseButtonDown(0))
return false;
Vector2 mousePoint = Input.mousePosition;
Rect rect = GetScreenRect(rectTransform, cam);
return rect.Contains(mousePoint);
}
//判断鼠标是否点击到某个UI区域外
public static bool IsMouseButtonDownOutRect(RectTransform rectTransform, Camera cam = null)
{
if (!Input.GetMouseButtonDown(0) && !Input.GetMouseButtonDown(1))
return false;
Vector2 mousePoint = Input.mousePosition;
Rect rect = GetScreenRect(rectTransform, cam);
return !rect.Contains(mousePoint);
}
//超出希望显示的字符数追加后缀...
//size: 允许显示的字符个数,按中文字符占宽计算(即,2个英文字符算作1个中文字符)
public static string OverflowFormat(string s, int size)
{
if (string.IsNullOrEmpty(s) || s.Length <= size)
return s;
byte[] bytes = Encoding.BigEndianUnicode.GetBytes(s);
//中文Unicode编码范围4E00-9FA5或19968-40869
//4E=78,9F=159,A5=165
//Unicode:每个字符占2个字节
float count = 0f;
List<byte> list = new List<byte>();
for (int i = 0; i < bytes.Length; i += 2)
{
//判断是否为中文Unicode
//if (bytes[i] >= 78 && bytes[i] >= 159 &&
// bytes[i+1] >= 0 && bytes[i+1] >= 165)
//简单判断是否为双字节字符
count += bytes[i] > 0 ? 1 : 0.5f;
list.Add(bytes[i]);
list.Add(bytes[i + 1]);
if (count >= size)
break;
}
string bs = Encoding.BigEndianUnicode.GetString(list.ToArray());
if (bs.Length < s.Length)
bs += "...";
return bs;
}
//判断某个世界坐标是否落在屏幕内
public static bool WithInScreen(Vector3 worldPosition, Camera camera = null)
{
//判断目标坐标是否落在屏幕内
if (camera == null)
camera = Camera.main;
Vector3 screenPoint = camera.WorldToScreenPoint(worldPosition);
bool inScreen = screenPoint.x >= 0 && screenPoint.y >= 0 &&
screenPoint.x <= Screen.width && screenPoint.y <= Screen.height &&
screenPoint.z > 0;
return inScreen;
}
// 世界坐标转屏幕坐标
public static Vector3 WorldToScreenPoint(Canvas canvas, Vector3 worldPos, Camera camera=null)
{
if (camera == null)
camera = Camera.main;
//屏幕坐标系原点在左下角
Vector3 pos = camera.WorldToScreenPoint(worldPos);
//Canvas坐标原点在屏幕中心
//与Canvas坐标原点对齐
pos.x -= canvas.pixelRect.width / 2;
pos.y -= canvas.pixelRect.height / 2;
//适配不同分辨率
pos = pos / canvas.scaleFactor;
//去掉小数,避免抖动
pos.x = Mathf.Ceil(pos.x);
pos.y = Mathf.Ceil(pos.y);
pos.z = Mathf.Ceil(pos.z);
return pos;
}
// 判断是否在 HoloLens 2 设备上运行
public static bool IsHoloLens2()
{
bool h2 = SystemInfo.deviceModel.Contains("HoloLens 2");
return h2;
}
}
标签: Unity3d
日历
最新文章
随机文章
热门文章
分类
存档
- 2025年11月(1)
- 2025年9月(3)
- 2025年7月(4)
- 2025年6月(5)
- 2025年5月(1)
- 2025年4月(5)
- 2025年3月(4)
- 2025年2月(3)
- 2025年1月(1)
- 2024年12月(5)
- 2024年11月(5)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
- Open CASCADE
- CascadeStudio
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号






