using UnityEditor;
using UnityEngine;
[CanEditMultipleObjects]
[CustomEditor(typeof(CameraDefined))]
public class CameraEditor : Editor
{
public override void OnInspectorGUI()
{
// 属性
CameraDefined script = (CameraDefined)target;
int selected = (int)script.captureSize;
// GUI
EditorGUI.BeginChangeCheck();
drawProperty("targetCamera", "目标像机");
//属性设置三种截图方式
string[] options = new string[] { "像机", "屏幕", "自定义" };
selected = EditorGUILayout.Popup("截图尺寸", selected, options, GUILayout.ExpandWidth(true));
script.captureSize = (CameraDefined.CaptureSize)selected;
if (script.captureSize == CameraDefined.CaptureSize.FixedSize)
{
drawProperty("pixelSize", "像素尺寸");
EditorGUILayout.HelpBox("保持正确的宽高比!/n否则截图区域会出问题。", MessageType.Info);
}
drawProperty("savePath", "保存路径");
drawProperty("fileName", "文件名");
// 保存截图按钮
bool isPress = GUILayout.Button("保存截图", GUILayout.ExpandWidth(true));
if (isPress) script.saveCapture();
if (EditorGUI.EndChangeCheck()) serializedObject.ApplyModifiedProperties();
}
private void drawProperty(string property, string label)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty(property), new GUIContent(label), true);
}
}
using UnityEngine;
using System.IO;
///挂载到相机
public class CameraDefined: MonoBehaviour
{
// 截图尺寸
public enum CaptureSize
{
CameraSize,
ScreenResolution,
FixedSize
}
// 目标摄像机
public Camera targetCamera;
// 截图的尺寸
public CaptureSize captureSize = CaptureSize.CameraSize;
// 像素
public Vector2 pixelSize;
// 保存路径
public string savePath = "StreamingAssets/";
// 文件名称
public string fileName = "cameradefined.png";
private void Reset()
{
targetCamera = GetComponent<Camera>();
pixelSize = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);
}
//保存截图
public void saveCapture()
{
Vector2 size = pixelSize;
if (captureSize == CaptureSize.CameraSize)
{
size = new Vector2(targetCamera.pixelWidth, targetCamera.pixelHeight);
}
else if (captureSize == CaptureSize.ScreenResolution)
{
size = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);
}
string path = Application.dataPath + "/" + savePath + fileName;
saveTexture(path, capture(targetCamera, (int)size.x, (int)size.y));
}
//截图
public static Texture2D capture(Camera camera)
{
return capture(camera, Screen.width, Screen.height);
}
public static Texture2D capture(Camera camera, int width, int height)
{
RenderTexture rt = new RenderTexture(width, height, 0);
rt.depth = 24;
rt.antiAliasing = 8;
camera.targetTexture = rt;
camera.RenderDontRestore();
RenderTexture.active = rt;
Texture2D texture = new Texture2D(width, height, TextureFormat.ARGB32, false, true);
Rect rect = new Rect(0, 0, width, height);
texture.ReadPixels(rect, 0, 0);
texture.filterMode = FilterMode.Point;
texture.Apply();
camera.targetTexture = null;
RenderTexture.active = null;
//Destroy(rt);
return texture;
}
//保存贴图
public static void saveTexture(string path, Texture2D texture)
{
File.WriteAllBytes(path, texture.EncodeToPNG());
Debug.Log("已截屏并保存截图到:" + path);
}
}