Unity 收藏本版 已有9人收藏 +发表新主题
查看: 16871|回复: 0
打印 上一主题 下一主题

[小知识]用UGUI的Image限制截屏范围

[复制链接]

[小知识]用UGUI的Image限制截屏范围

helloABC 发表于 2015-9-21 22:55:29 浏览:  16871 回复:  0 只看该作者 复制链接
本帖最后由 helloABC 于 2015-9-21 22:55 编辑

本文讲解了用ugui的image来实现只截取屏幕中该ui限定区域的一点小经验。
首先只谈谈canvas的前两种模式,即screen space-overlay和screen space-camera,因为第三种是3dUI,当然道理上讲也是一样的。
一般的,把canvas scaler scale mode模式设为scale with screen size。x和y设为game视图设置的分辨率,比如,基准是1920x1080,x和y就设为1920和1080。match mode我用match with or height,并把match拖到height的一端,也就是UI按屏幕的高度适配。然后才开始界面布局。
用image限制截屏范围,也就是利用image控件的recttransform。其关键函数是RectTransform的GetWorldCorners函数,它得到rect的世界坐标系。其赋值风格是填充传入的参数,一个长度为4的vector3数组,就是四个角的坐标。
对于screen space-overlay模式的canvas,得到的这几个世界坐标就等于屏幕坐标,可以直接用它来限定范围,而对于screen space-camera模式的canvas,也就是有个uiCamera的模式,可以使用以下方法得到屏幕坐标中的rect,传入image的recttransform组件和uicamera即可~~~~
public static Rect UGUI2ScreenRect(RectTransform rectTran,Camera uiCamera) {
        Vector3[] worldPos = new Vector3[4];
        rectTran.GetWorldCorners(worldPos);
        //foreach (var i in worldPos)
        //    Debug.Log(i);
        Vector3[] corner = new Vector3[4];
        for (int i = 0; i < 4; i++)
            corner = uiCamera.WorldToScreenPoint(worldPos);
        return new Rect(corner[0].x, corner[0].y, corner[3].x - corner[0].x, corner[1].y - corner[0].y);

}

自此我们就得到了限定范围用的rect,然后就可以用texture2d的实例方法:readpixels 去读取屏幕像素了,声明如下:
void ReadPixels (Rect source , int destX , int destY , bool recalculateMipMaps = true)读完apply()一下,OK了







分享至:
| 人收藏
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.