简单游戏截图_可控截取内容1
一个需求我需要在场景中截取不同层级的截图(如只截模型或只截UI或只截外部相加看到的画面 或全都截或和Shader配合呈现人眼夜视仪热成像的画面切换)将截图排到列表中,在场景UI中展示出来如何做相机要能够看到不同的画面将当前帧画面存储下来将存储的画面展示出来实现时需要掌握的知识点相机要能够看到不同的画面将不同的游戏对象分类成不同的Layer需要单独设置一个相机x与原相机保持一致,唯独更改它的Rend
·
一个需求
我需要在场景中截取不同层级的截图(如只截模型或只截UI或只截外部相加看到的画面 或全都截或和Shader配合呈现人眼夜视仪热成像的画面切换)
将截图排到列表中,在场景UI中展示出来
如何做
-
相机要能够看到不同的画面
-
将当前帧画面存储下来
-
将存储的画面展示出来
实现时需要掌握的知识点
相机要能够看到不同的画面
-
将不同的游戏对象分类成不同的Layer
-
需要单独设置一个相机x与原相机保持一致,唯独更改它的Rendering->CullingMask 规定它可以看什么不看什么,还有Rendering->Priority层级要高于原相机 (还要关闭它的AudioListener,防止重复)
-
通常我们要关掉,只在截图的时候打开它
动态控制摄像机Rendering->CullingMask的方法
public Camera cameraToChange; //控制的相机
public LayerMask newCullingLayers; //选择Layers
void SetCullingMask()
{
//显示选择的Layers
cameraToChange.cullingMask = newCullingLayers;
}
void ToggleCullingMask()
{
// 取反剔除层
cameraToChange.cullingMask = ~cameraToChange.cullingMask;
}
void DisableAllLayers()
{
//全部剔除
cameraToChange.cullingMask = 0;
}
将画面存储下来
需要输入宽度和高度用于创建Texture2D和截图内容用,有两种方式意思直接输入屏幕存储或创建一个image,常用这个image宽高
int width = Screen.width;
int height = Screen.height;
或
public RectTransform UIRect;
{
//计算截图的宽度和高度
int width = (int)(UIRect.rect.width);
int height = (int)(UIRect.rect.height);
//创建一个新的Texture2D对象,宽度和高度与截图的宽度和高度匹配
Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
}
储存方法
事先要创建出StreamingAssets文件夹
public RectTransform UIRect;
public RawImage rawImage; // 添加一个RawImage对象
void Update()
{
if (Input.GetKeyDown(KeyCode.Q))
{
string fileName = Application.dataPath + "/StreamingAssets/" + "12.png";
//系统不识别标点符号,但支持中文
IEnumerator coroutine = CaptureByUI(UIRect, fileName);
StartCoroutine(coroutine);
}
}
public IEnumerator CaptureByUI(RectTransform UIRect, string mFileName)
{
yield return new WaitForEndOfFrame(); //等待当前帧的UI渲染完成
//计算截图的宽度和高度
int width = (int)(UIRect.rect.width);
int height = (int)(UIRect.rect.height);
//创建一个新的Texture2D对象,宽度和高度与截图的宽度和高度匹配
Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
//计算从屏幕上读取像素的起始位置
float leftBtmX = UIRect.transform.position.x + UIRect.rect.xMin;
float leftBtmY = UIRect.transform.position.y + UIRect.rect.yMin;
//使用tex.ReadPixels()函数从屏幕上读取指定区域的像素,并存储到Texture2D中。
tex.ReadPixels(new Rect(leftBtmX, leftBtmY, width, height), 0, 0);
//执行读取操作,将修改应用到Texture2D中
tex.Apply();
//将Texture2D编码为PNG格式的字节数组
byte[] bytes = tex.EncodeToPNG();
//将字节数组保存为PNG图片文件
System.IO.File.WriteAllBytes(mFileName, bytes);
}
将存储的画面展示出来
到UnityWebRequest 从给的路径里拿数据
public RawImage rawImage;
public string imageFileName;
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
// 拼接图片路径
string imagePath = System.IO.Path.Combine(Application.streamingAssetsPath, imageFileName);
// 开始协程加载图片
StartCoroutine(LoadImage(imagePath));
}
}
IEnumerator LoadImage(string path)
{
// 发送请求获取图片
UnityWebRequest www = UnityWebRequestTexture.GetTexture(path);
yield return www.SendWebRequest();
// 检查请求是否成功
if (www.result == UnityWebRequest.Result.Success)
{
// 获取加载的Texture
Texture2D texture = DownloadHandlerTexture.GetContent(www);
// 将加载的Texture赋值给RawImage的texture属性
rawImage.texture = texture;
// 调整RawImage的大小以适应图片的长宽比例
rawImage.SetNativeSize();
}
else
{
Debug.LogError("Failed to load image: " + www.error);
}
}
更多推荐
所有评论(0)