Unity截屏,Raycast射线,绕某条边旋转

    xiaoxiao2021-03-25  114

        1.Physics.Raycast射线来检测碰撞,实现控制按键的选取,按下。头控加射线实现用户操作。      

         Raycast主要有两个:(引用自 http://blog.sina.com.cn/s/blog_471132920101g6kt.html)      Physics.Raycast:      作用于任何物体,可以加限定,只检测某layer层      RaycastHit hit;      Physics.Raycast(transform.position, forward, out hit, 1000)// 射线发射点位置,方向,存储发生碰撞物体的信息,射线发射的距离。

         Collider.Raycast:      只检测ray是否穿过该Collider

         RaycastHit hit;      Ray ray= new Ray(transform.position,Vector3.down);      if(collider.Raycast(ray,out hit,100)                          print("test"); 注意:      (1)无论是哪种raycast检测,从物体内部穿到外面的,都不视为穿过。只有从物体外穿到里面的才视为穿过。      (2)可以绘制 可见线 来辅助开发。      1.Debug.DrawLine(V3 start,V3 end);      2.Gizmos.DrawLine    (可以在编辑模式下显示,可视化更强)

        如果在scene的Gizmos选项下 勾选 3D Gizmos, 那么线段位于真实3D空间里,有前后遮挡。 如果不勾选,则gizmo永远在最前显示。

        2. 读取图片设置成纹理进行显示。

        首先,加载图片,获取到字节流

    /// <summary> /// 从指定图片全路径(包括文件名)加载图片,返回字节数组 /// </summary> /// <param name="path"></param> /// <returns></returns> public static byte[] LoadPNG(string path) { if (File.Exists(path)) { FileStream fs = File.OpenRead(path); long tempLength = fs.Length; int fsLength = (int)fs.Length; byte[] binary = new byte[fsLength]; int readLength = fs.Read(binary, 0, fsLength); fs.Close(); return binary; } else { return null; } }

         其次,设置到相应的UI对象上,作为纹理:   

    Texture2D t2dL = new Texture2D(0, 0); t2dL.LoadImage(ImageManager.LoadPNG(ImageManager.imgPathListSkyL[ImageManager.currPageSkyL].FullName)); mSphereL.GetComponent<Renderer>().material.mainTexture = t2dL;

        3.实现UI面板绕某一条边旋转。

        实现思路有两种:添加一个父物体,将要旋转的对象作为其子物体,设置其在父物体中的位置,然后对付物体进行旋转;另一种则可以设置要旋转空间的RectTransform的Pivot的位置,来实现。

        4.截屏功能的实现

        方法一:

    public IEnumerator GetCapture() { yield return new WaitForEndOfFrame(); int width = Screen.width; int height = Screen.height; Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false); tex.ReadPixels(new Rect(0, 0, width, height), 0, 0, true); byte[] imagebytes = tex.EncodeToPNG();//转化为png图// tex.Compress(false);//对屏幕缓存进行压缩// string imagePath = ""; //获取一个 DateTime 对象,该对象设置为此计算机上的当前日期和时间,表示为本地时间。// Debug.Log("jm-------GetCapture" + imagebytes.Length); string dateTime = System.DateTime.Now.ToString("HHmmssfff"); imagePath = @"/storage/emulated/0/UIHelper/SkyBoxL/" + dateTime + ".png"; File.WriteAllBytes(imagePath, imagebytes);//存储png图// }

        在测试时发现,使用方法一可能出现截屏图片为Unity的Logo图片的情况,截取不到场景图(由于该APP中使用到了其他SDK导致)。于是采用了两一种方法:利用RenderTexture来进行截图。

    void CaptureCamera(Camera camera, Rect rect) { //建一个RenderTxture对象 RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 1); //临时设置相关相机的targetTexture为rt,并手动渲染相关相机。 camera.targetTexture = rt; camera.Render(); //激活这个rt,并从中读取像素。 RenderTexture.active = rt; Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false); screenShot.ReadPixels(rect, 0, 0);//这个时候,他是从RendureTexture.active中读取像素。 screenShot.Apply(); //充值相关参数,已使用camera继续在屏幕上显示 camera.targetTexture = null; RenderTexture.active = null; GameObject.Destroy(rt); //最后将这些纹理数据,转成一个png图片文件 byte[] imagebytes = screenShot.EncodeToPNG();//转化为png图// screenShot.Compress(false);//对屏幕缓存进行压缩// string imagePath = ""; //获取一个 DateTime 对象,该对象设置为此计算机上的当前日期和时间,表示为本地时间。// Debug.Log("jm-------GetCapture" + imagebytes.Length); string dateTime = System.DateTime.Now.ToString("HHmmssfff"); imagePath = @"/storage/emulated/0/UIHelper/SkyBoxL/" + dateTime + ".png"; File.WriteAllBytes(imagePath, imagebytes);//存储png图// // return null; }

    注意:想访问安卓设备sd card,其根目录地址为/storage/emulated/0/。使用举例如下,表示sd card根目录下的名为UI的文件夹。

    DirectoryInfo folderL = new DirectoryInfo(@"/storage/emulated/0/UI");

    转载请注明原文地址: https://ju.6miu.com/read-22187.html

    最新回复(0)