174 lines
5.8 KiB
C#
174 lines
5.8 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
namespace GeneralTools
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 工程里 通用的方法写这里
|
|||
|
|
/// </summary>
|
|||
|
|
public class UtilityTool : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 删除transform下所有子物体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="tran"></param>
|
|||
|
|
public static void DeleteChild(Transform tran)
|
|||
|
|
{
|
|||
|
|
for (int i = tran.childCount - 1; i >= 0; i--)
|
|||
|
|
{
|
|||
|
|
DestroyImmediate(tran.GetChild(i).gameObject);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 截取某摄像机画面
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="camera"></param>
|
|||
|
|
/// <param name="rect"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static Texture2D GetScreenShot(Camera camera, Rect rect)
|
|||
|
|
{
|
|||
|
|
if (camera == null)
|
|||
|
|
{
|
|||
|
|
Debug.LogError("camera is null");
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
// 创建一个RenderTexture对象
|
|||
|
|
RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
|
|||
|
|
// 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机
|
|||
|
|
camera.targetTexture = rt;
|
|||
|
|
camera.Render();
|
|||
|
|
//ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。
|
|||
|
|
//ps: camera2.targetTexture = rt;
|
|||
|
|
//ps: camera2.Render();
|
|||
|
|
//ps: -------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// 激活这个rt, 并从中中读取像素。
|
|||
|
|
RenderTexture.active = rt;
|
|||
|
|
Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
|
|||
|
|
screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素
|
|||
|
|
screenShot.Apply();
|
|||
|
|
|
|||
|
|
// 重置相关参数,以使用camera继续在屏幕上显示
|
|||
|
|
camera.targetTexture = null;
|
|||
|
|
//ps: camera2.targetTexture = null;
|
|||
|
|
RenderTexture.active = null; // JC: added to avoid errors
|
|||
|
|
Destroy(rt);
|
|||
|
|
return screenShot;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public enum TexStyle
|
|||
|
|
{
|
|||
|
|
JPG,
|
|||
|
|
PNG,
|
|||
|
|
EXR
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Texture2D 转换为 byte[]
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="tex"></param>
|
|||
|
|
/// <param name="style"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static byte[] TexConvertBytes(Texture2D tex, TexStyle style)
|
|||
|
|
{
|
|||
|
|
byte[] bytes = null; ;
|
|||
|
|
switch (style)
|
|||
|
|
{
|
|||
|
|
case TexStyle.JPG:
|
|||
|
|
bytes = tex.EncodeToJPG();
|
|||
|
|
break;
|
|||
|
|
case TexStyle.PNG:
|
|||
|
|
bytes = tex.EncodeToPNG();
|
|||
|
|
break;
|
|||
|
|
case TexStyle.EXR:
|
|||
|
|
bytes = tex.EncodeToEXR();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
return bytes;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// bytes数组 转 Texture2D
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="bytes"></param>
|
|||
|
|
/// <param name="width"></param>
|
|||
|
|
/// <param name="height"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static Texture2D BytesConvertTex2D(byte[] bytes, int width, int height)
|
|||
|
|
{
|
|||
|
|
Texture2D tex = new Texture2D(width, height);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
tex.LoadImage(bytes);
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
Debug.LogError("bytes转图片失败");
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
return tex;
|
|||
|
|
}
|
|||
|
|
//寻找子物体,用于初始化
|
|||
|
|
public static Transform FindChild(Transform trans, string childName)
|
|||
|
|
{
|
|||
|
|
Transform child = trans.Find(childName);
|
|||
|
|
if (child != null)
|
|||
|
|
{
|
|||
|
|
return child;
|
|||
|
|
}
|
|||
|
|
int count = trans.childCount;
|
|||
|
|
Transform go = null;
|
|||
|
|
for (int i = 0; i < count; ++i)
|
|||
|
|
{
|
|||
|
|
child = trans.GetChild(i);
|
|||
|
|
go = FindChild(child, childName);
|
|||
|
|
if (go != null)
|
|||
|
|
return go;
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static T FindChild<T>(Transform trans, string childName) where T : Component
|
|||
|
|
{
|
|||
|
|
Transform go = FindChild(trans, childName);
|
|||
|
|
if (go == null)
|
|||
|
|
return null;
|
|||
|
|
return go.GetComponent<T>();
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 返回trans下所有子物体的T集合
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="T"></typeparam>
|
|||
|
|
/// <param name="trans"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static List<T> CollectComponent<T>(Transform trans)
|
|||
|
|
{
|
|||
|
|
List<T> tempList = new List<T>();
|
|||
|
|
for (int i = 0; i < trans.childCount; i++)
|
|||
|
|
{
|
|||
|
|
T _t = trans.GetChild(i).GetComponent<T>();
|
|||
|
|
if (_t != null)
|
|||
|
|
{
|
|||
|
|
tempList.Add(_t);
|
|||
|
|
}
|
|||
|
|
if (trans.GetChild(i).childCount > 0)
|
|||
|
|
{
|
|||
|
|
tempList = tempList.Concat(CollectComponent<T>(trans.GetChild(i))).ToList();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return tempList;
|
|||
|
|
}
|
|||
|
|
public static IEnumerator DelayToInvokeDo(Action action, float delaySeconds)
|
|||
|
|
{
|
|||
|
|
yield return new WaitForSeconds(delaySeconds);
|
|||
|
|
action();
|
|||
|
|
}
|
|||
|
|
public static IEnumerator DelayToInvokeDo(Action<object[]> action, float delaySeconds, params object[] objs)
|
|||
|
|
{
|
|||
|
|
yield return new WaitForSeconds(delaySeconds);
|
|||
|
|
action(objs);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|