UGUI源码学习之Image
【转载】https://blog.csdn.net/a237653639/article/details/50774207
声明:由于官方只公开了UGUI源码的C#封装的这层,并未公开C++底层代码,不过看看这些C#代码也不错
UIBehavior这个父类总共有14个派生类,派生类包括Selectable、Graphic等。其中Button、Slide、Scrollbar、Toggle、InputField被归为Selectable的子类,即“可选”的意思;而Image、Text、RawImage则被归为Graphic的子类,这就是编写者的设计思路了。
UGUI源码分为运行时代码和编辑时代码,运行时和编辑时代码都被分为EventSystem和UI两部分。本小节仅讲解运行时代码, 先讲UI部分的Image:
一、各个属性讲解
1.Source Image
在新建Panel面板时,会自动添加Image组件,且其中使用的是unity自带的Background图片。这样您会看到屏幕并未被填满,且四周有一定的空隙。
如果您的目的是要填满全屏,则建议设Source Image和Material为None,这样就是使用Unity的默认渲染方式(而不是使用指定的Background图片)。
2.Color
点开后有一个Hex Color表示当前颜色的十六进制
3.Material
4.Raycast Target
是否标记为光线投射目标。默认勾选表示鼠标点击到该物体后不再穿透到下面的物体。取消勾选则穿透该物体。tips:新建button时可设置其上物体为点击穿透。
5.Image Type 6.FillMethod 7.FillOrigin 8.FillAmount 9.Clockwise 10.Fill Center
11.Preserve Aspect
保持图片原始的宽高比。(不论图片的宽高如何调整,宽高的比例保持始终不变,仅用于ImageType为Simple和Filled)
二、从Image所继承的类和实现的接口来看
下面再从Image所继承的类和实现的接口来看看这些接口和父类有什么用,类图如下:
public class Image : MaskableGraphic, ISerializationCallbackReceiver, ILayoutElement,
ICanvasRaycastFilter
1.MaskableGraphic
Graphic是对玩家来说可见的UI控件的基类。而MaskableGraphic继承自Graphic类,那么就带有Graphic的属性,比如布局啦,材质啦,顶点处理啦,颜色啦。而作为Graphic的子类的MaskableGraphic的不同之处在于自己是否可被标记为masked,而默认值为true表示可被mask。
另外,Graphic类缓存了rectTransform,而Image继承了MaskableGraphic,则拥有了以上属性。
2.ISerializationCallbackReceiver
这东西有两个回调,OnAfterDeserialize和OnBeforeSerialize,意思就是允许Image在被序列化和反序列化的前后进行自己的一些处理。那就是说Image有被序列化这一回事咯?那当然了,比如*.unity就是保存了场景的数据,而在运行时我们就去读取其中的数据用来反序列化为运行时的对象。
3.ILayoutElement
见文知意,这个接口是为了配合Layout这一类脚本使用的。有了它,再在Image所在对象上挂一个Layout脚本,就可以进行布局操作咯。
4.ICanvasRaycastFilter
这个接口是Button的事件用的。其中有一个接口方法IsRaycastLocationValid, 用来检测光线投射到该物体是否有效。
另外一篇很好的文章,推荐给大家:http://www.resetoter.cn/?p=396