UI框架
1 功能:
①管理场景中所有的面板
②控制面板之间的跳转
2 屏幕自适应:
UI Scale Mode—Scale With Screen Size
Match:width为1时根据宽度Size变化,height为1时根据高度Size变化。
其它根据值的大小判定高度宽度对Size变化影响的大小。
补充:
Render Mode属性
Screen Space-Overlay:是屏幕空间-覆盖,这个模式始终将UI放到场景最上面渲染,但是当有多个Canvas时就需要根据Sort Order来计算前后关系,这个值越大越靠前,即值越大越显示在前面,值小的在后面。Pixel Perfect表示是否需要打开抗锯齿。
Screen Space-Camera:是屏幕空间-相机,这个模式需要指定一个渲染相机,Plane Distance指定了UI与该相机的距离,越近越显示在前面。Sorting layer则指定了相机的渲染顺序,Order in Layer值越大,该UI越显示在前面。值越小越靠后。所以Sorting layer只有在有多个同类型Sorting Layer时才有效。如果两个Canvas指定的Sorting Layer一样,则依据Order in Layer的值的大小决定先后顺序。如果Sorting Layer不一样,则Order in Layer值无意义,此时会根据Sorting Layer里面值的顺序来决定,值越大显示越靠前。
World Space:是世界空间。也需要指定渲染相机,Sorting Layer与Order in Layer的处理与屏幕空间相机一样。
Canvas Scaler主要负责屏幕适配,当Canvas的render mode为Screen Space-Overlay或者Screen Space-Camera时,可以指定UI Scale Mode,有三种模式:
Constant Pixel Size:保持UI的像素大小无论屏幕大小如何改变。Scale Factor指定几倍像素。
Scale With Screen Size:随着屏幕的大小改变而等比缩放UI大小。然后就是设置标准长宽。Reference Pixel Per Unit:如果sprite设置了一个单元的像素值,这里设置的值将被sprite的Pixel per unit值覆盖。也就是说如果sprite设置Pixel per unit为100,这里如果设置为200,那么在这个Canvas下面的sprite如果Set Native Size的话,长宽均会X2.。
Constant Physical Size:根据物理单位来进行缩放,暂时不会使用。
Rect Transform: 看到标签已经变成PosX,Top,PosZ,Width,Bottom.PosX指定了Image中心点到锚点这条线的距离,Top指定了中心点到锚点最上方的距离,Bottom指定了中心点到锚点最下方的距离,Width指定了Image本身的宽。
Raycast Target:UI事件会在EventSystem在Update的Process触发。UGUI会遍历屏幕中所有RaycastTarget是true的UI,接着就会发射线,并且排序找到玩家最先触发的那个UI,在抛出事件给逻辑层去响应。
有的图片不需要响应,开发人员又没有取消勾选,如果RaycastTarget被勾选过多的话,
效率必然会低。
MaskableGraphic是UGUI的核心组件,它继承自Graphic。MaskableGraphic是一个抽象类,它的派生类有RawImage、Image、Text。顾名思义,MaskableGraphic是可遮罩的图像。
可以表示UI的各种类型的物体。
3 c# serializable
作用将对象转换为容易传输的格式的过程。使用时,反序列化根据流重新构造对象。
使用序列化的原因:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;按值将对象从一个应用程序域发送至另一个应用程序域。
在unity中,序列化一直是个很头疼的问题,尽管官方支持了许多类型,但一些自定义类型和常用,比如Dictionary不能序列化,让人大呼头疼。不过幸运的是,ISerializationCallbackReceiver的出现解决了这个问题。
编写一个类继承ISerializationCallbackReceiver接口,通过编写2个回调让List类型代替Dictionary参与序列化。
4 Dictionary
要使用Dictionary集合,需要导入C#泛型命名空间
System.Collections.Generic(程序集:mscorlib)
Dictionary的描述
1、从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成
2、任何键都必须是唯一的
3、键不能为空引用null(VB中的Nothing),若值为引用类型,则可以为空值
4、Key和Value可以是任何类型(string,int,custom class 等)
Dictionary常用用法:以 key 的类型为 int , value的类型为string 为例
1、创建及初始化
Dictionary<int,string>myDictionary=newDictionary<int,string>();
2、添加元素
myDictionary.Add(1,"C#"); myDictionary.Add(2,"C++");
myDictionary.Add(3,"ASP.NET");myDictionary.Add(4,"MVC");
3、通过Key查找元素
if(myDictionary.ContainsKey(1))
{
Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]);
}
4、通过KeyValuePair遍历元素
foreach(KeyValuePair<int,string>kvp in myDictionary){
Console.WriteLine("Key = {0}, Value = {1}",kvp.Key, kvp.Value);}
5、仅遍历键 Keys 属性
Dictionary<int,string>.KeyCollection keyCol=myDictionary.Keys;
foreach(int key in keyCol)
{
Console.WriteLine("Key = {0}", key);
}
6、仅遍历值 Valus属性
Dictionary<int,string>.ValueCollection valueCol=myDictionary.Values;
foreach(stringvalueinvalueCol){
Console.WriteLine("Value = {0}", value);}
7、通过Remove方法移除指定的键值
myDictionary.Remove(1);
if(myDictionary.ContainsKey(1))
{
Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]);
}
else
{
Console.WriteLine("不存在 Key : 1");
}
其它常见属性和方法的说明:
Comparer: 获取用于确定字典中的键是否相等的 IEqualityComparer。
Count: 获取包含在 Dictionary中的键/值对的数目。
Item: 获取或设置与指定的键相关联的值。
Keys: 获取包含 Dictionary中的键的集合。
Values: 获取包含 Dictionary中的值的集合。
Add: 将指定的键和值添加到字典中。
Clear: 从 Dictionary中移除所有的键和值。
ContainsKey: 确定 Dictionary是否包含指定的键。
ContainsValue: 确定 Dictionary是否包含特定值。
GetEnumerator: 返回循环访问 Dictionary的枚举数。
GetType: 获取当前实例的 Type。 (从 Object 继承。)
Remove: 从 Dictionary中移除所指定的键的值。
ToString: 返回表示当前 Object的 String。 (从 Object 继承。)
TryGetValue: 获取与指定的键相关联的值。
Enum.Parse()方法
这个方法带3个参数,第一个参数是要使用的枚举类型。其语法是关键字typeof后跟放在括号中的枚举类名。第二个参数是要转换的字符串,第三个参数是一个bool,指定在进行转换时是否忽略大小写。最后,注意Enum.Parse()方法实际上返回一个对象引用——我们需要把这个字符串显式转换为需要的枚举类型(这是一个取消装箱操作的例子),也就是强制转换。
字典扩展
㈠
/// <summary>/// 尝试将键和值添加到字典中:如果不存在,才添加;存在,不添加也不抛导常/// </summary>
public static Dictionary<TKey, TValue> TryAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, TValue value)//需要使用字典,两个参数,返回的是词典
{
if (dict.ContainsKey(key) == false) dict.Add(key, value);
return dict;
}
/// <summary>/// 将键和值添加或替换到字典中:如果不存在,则添加;存在,则替换/// </summary>
public static Dictionary<TKey, TValue> AddOrReplace<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, TValue value)//需要使用字典,两个参数,返回的是词典
{
dict[key] = value;
return dict;
}
使用:
dict.TryAdd(2, "Banana");
dict.AddOrReplace(3, "Orange");
㈡
public static TValue TryGet<TKey,TValue>(this Dictionary<TKey,TValue>dict,TKey key)
{
TValue value;
dict.TryGetValue(key,out value);
return value;
}
//需要使用字典,一个参数key,返回的是value
BasePanel panel = panelDic.TryGet(panelType);
Canvas Group
可以通过Canvas Group影响该组UI元素的部分性质,而不需要费力的对该组UI下的每个元素逐个调整。Canvas Group是同时作用于该组UI下的全部元素。
参数:
Alpha:该组UI元素的透明度。需要注意,每个UI最终的透明度是由此值和自身的alpha数值相乘得到。
Interactable:是否需要交互(勾选则可交互),同时作用于该组全部UI元素
Blcok Raycasts:如果需要图形射线(GraphicRaycaster)检测。勾选后,可将此组件作为一个射线碰撞盒。注意,不适用于Physics.Raycast。
Ignore Parent Groups:是否需要忽略父级对象中的CanvasGroup的设置。(勾选则忽略)
补充:
CanvasGroup的典型应用方式:
1.通过调整CanvasGroup的Alpha可以控制改组UI的淡入淡出
2.不勾选Interactable,可设置某个UI对象的所有子对象都不参与交互
3.通过设置Blcok Raycasts为false,可以使UI不阻挡鼠标(点击)事件