网站后台密码忘记了,西安建站费用,wordpress宝塔安装,中国新产品招商网一个需求 我需要在场景中截取不同层级的截图(如只截模型或只截UI或只截外部相加看到的画面 或全都截或和Shader配合呈现人眼夜视仪热成像的画面切换) 将截图排到列表中#xff0c;在场景UI中展示出来 如何做 相机要能够看到不同的画面 将当前帧画面存储下来 将存储的画面展示出… 一个需求 我需要在场景中截取不同层级的截图(如只截模型或只截UI或只截外部相加看到的画面 或全都截或和Shader配合呈现人眼夜视仪热成像的画面切换) 将截图排到列表中在场景UI中展示出来 如何做 相机要能够看到不同的画面 将当前帧画面存储下来 将存储的画面展示出来 实现时需要掌握的知识点 相机要能够看到不同的画面 将不同的游戏对象分类成不同的Layer 需要单独设置一个相机x与原相机保持一致唯独更改它的Rendering-CullingMask 规定它可以看什么不看什么还有Rendering-Priority层级要高于原相机 (还要关闭它的AudioListener防止重复) 通常我们要关掉只在截图的时候打开它 动态控制摄像机Rendering-CullingMask的方法 publicCameracameraToChange;//控制的相机publicLayerMasknewCullingLayers;//选择LayersvoidSetCullingMask(){//显示选择的LayerscameraToChange.cullingMask newCullingLayers;}voidToggleCullingMask(){// 取反剔除层cameraToChange.cullingMask ~cameraToChange.cullingMask;}voidDisableAllLayers(){//全部剔除cameraToChange.cullingMask 0;} 将画面存储下来 需要输入宽度和高度用于创建Texture2D和截图内容用有两种方式意思直接输入屏幕存储或创建一个image常用这个image宽高 intwidth Screen.width;intheight Screen.height;或publicRectTransformUIRect;{//计算截图的宽度和高度intwidth (int)(UIRect.rect.width);intheight (int)(UIRect.rect.height);//创建一个新的Texture2D对象宽度和高度与截图的宽度和高度匹配Texture2Dtex newTexture2D(width,height,TextureFormat.RGB24,false);} 储存方法 事先要创建出StreamingAssets文件夹 publicRectTransformUIRect;publicRawImagerawImage;// 添加一个RawImage对象voidUpdate(){if(Input.GetKeyDown(KeyCode.Q)){stringfileName Application.dataPath /StreamingAssets/12.png;//系统不识别标点符号但支持中文IEnumeratorcoroutine CaptureByUI(UIRect,fileName);StartCoroutine(coroutine);}}publicIEnumeratorCaptureByUI(RectTransformUIRect,stringmFileName){yieldreturnnewWaitForEndOfFrame();//等待当前帧的UI渲染完成//计算截图的宽度和高度intwidth (int)(UIRect.rect.width);intheight (int)(UIRect.rect.height);//创建一个新的Texture2D对象宽度和高度与截图的宽度和高度匹配Texture2Dtex newTexture2D(width,height,TextureFormat.RGB24,false);//计算从屏幕上读取像素的起始位置floatleftBtmX UIRect.transform.position.x UIRect.rect.xMin;floatleftBtmY UIRect.transform.position.y UIRect.rect.yMin;//使用tex.ReadPixels()函数从屏幕上读取指定区域的像素并存储到Texture2D中。tex.ReadPixels(newRect(leftBtmX,leftBtmY,width,height),0,0);//执行读取操作,将修改应用到Texture2D中tex.Apply();//将Texture2D编码为PNG格式的字节数组byte[]bytes tex.EncodeToPNG();//将字节数组保存为PNG图片文件System.IO.File.WriteAllBytes(mFileName,bytes);} 将存储的画面展示出来 到UnityWebRequest 从给的路径里拿数据 publicRawImagerawImage;publicstringimageFileName;voidUpdate(){if(Input.GetKeyDown(KeyCode.W)){// 拼接图片路径stringimagePath System.IO.Path.Combine(Application.streamingAssetsPath,imageFileName);// 开始协程加载图片StartCoroutine(LoadImage(imagePath));}}IEnumeratorLoadImage(stringpath){// 发送请求获取图片UnityWebRequestwww UnityWebRequestTexture.GetTexture(path);yieldreturnwww.SendWebRequest();// 检查请求是否成功if(www.result UnityWebRequest.Result.Success){// 获取加载的TextureTexture2Dtexture DownloadHandlerTexture.GetContent(www);// 将加载的Texture赋值给RawImage的texture属性rawImage.texture texture;// 调整RawImage的大小以适应图片的长宽比例rawImage.SetNativeSize();}else{Debug.LogError(Failed to load image: www.error);}}