您的位置:首页 > 移动开发 > Unity3D

Unity3d截图 指定相机截图

2016-05-17 15:09 696 查看
文章中主要参考了 http://blog.csdn.net/anyuanlzh/article/details/17008909;

对其中还有 一些疑惑:就是 如果相机有天空盒 就无法截取到3D物体 比如Cube 等

Camera :主要对物体进行截取 Clear Flags 不选择 天空盒

Camera2: 主要对UI进行截取

using UnityEngine;
using System.Collections;

public class Screenshot : MonoBehaviour
{
public Camera mainCamera;
public Camera uiCamera;
/// <summary>
/// 对相机截图。
/// </summary>
/// <returns>The screenshot2.</returns>
/// <param name="camera">Camera.要被截屏的相机</param>
/// <param name="rect">Rect.截屏的区域</param>
Texture2D CaptureCamera(Camera camera, Camera camera2 ,Rect rect)
{
// 创建一个RenderTexture对象
RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, -1);
// 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机
camera.targetTexture = rt;
camera.Render();
//ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。
camera2.targetTexture = rt;
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;
camera2.targetTexture = null;
RenderTexture.active = null; // JC: added to avoid errors
GameObject.Destroy(rt);
// 最后将这些纹理数据,成一个png图片文件
byte[] bytes = screenShot.EncodeToPNG();
string filename = Application.dataPath + "/Screenshot.png";
System.IO.File.WriteAllBytes(filename, bytes);
Debug.Log(string.Format("截屏了一张照片: {0}", filename));

return screenShot;
}

void OnGUI()
{
if (GUILayout.Button("AAAA"))
{
CaptureCamera(mainCamera, uiCamera,new Rect(0, 0, Screen.width, Screen.height));
}
}
}




指定相机 截图
void SaveFile ()
{

shot_Number++;
if (shot_Number > 9) {
shot_Number = 0;
}

//HideUI ();
//yield return new WaitForEndOfFrame ();
//保存

//yield return new WaitForSeconds(0.5f);
# if UNITY_EDITOR
//		temp = "/StreamingAssets/ScreenShot/";
temp = "/ScreenShot/";
string path = string.Format ("{0:D4}{1:D2}.png", temp, shot_Number.ToString ());
//		filename = Application.dataPath + path;
filename = Application.persistentDataPath + path;
# else

#if UNITY_ANDROID
temp = "/ScreenShot/";
string path  = string.Format ("{0:D4}{1:D2}.png", temp,shot_Number.ToString());
filename = Application.persistentDataPath + path;

#endif

#if UNITY_IPHONE
temp = "/Raw/ScreenShot/";
string path  = string.Format ("{0:D4}{1:D2}.png", temp,shot_Number.ToString());
filename = Application.temporaryCachePath + path;

#endif

#if UNITY_STANDALONE_WIN
filename = "Screenshot.png";
#endif
#endif

Camera earthCamera;
GameObject earth = GameObject.Find ("EarthCamera");
if (earth) {
earthCamera = GameObject.Find ("EarthCamera").GetComponent<Camera> ();
} else {
return;
}

RenderTexture renderTexture;
//深度问题depth
renderTexture = new RenderTexture (Screen.width, Screen.height, 24);
earthCamera.targetTexture = renderTexture;
earthCamera.Render ();

Texture2D myTexture2D = new Texture2D (renderTexture.width, renderTexture.height);
RenderTexture.active = renderTexture;
myTexture2D.ReadPixels (new Rect (0, 0, renderTexture.width, renderTexture.height), 0, 0);
myTexture2D.Apply ();
byte[] bytes = myTexture2D.EncodeToJPG ();
myTexture2D.Compress (true);
myTexture2D.Apply ();
RenderTexture.active = null;

System.IO.File.WriteAllBytes (filename, bytes);
//Debug.Log (string.Format ("截屏了一张图片: {0}", filename));
Debug.Log ("保存图片的路径" + filename);

earthCamera.targetTexture = null;
GameObject.Destroy (renderTexture);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: