01 Sprite和Texture
这里参考下他人介绍,由于没找到原出处,就直接摘抄一部分了。
导入到Unity的图片,不论什么格式,Unity都会用自己的格式处理一遍。设置滤波模式,如point、bilinear和trilinear,则效果依次提升。point使用最近邻滤波,这样放大后有像素风格,适合制作棋盘等。bilinear线性滤波,找相邻四个像素插值,放大缩小后有模糊效果,trilinear几乎一样,就比bilinear高级一些。
压缩格式如果纹理没有透明通道一般后勾选,会占用4位,而真彩色质量最高,占用32位空间。
贴图必须时2的次幂,且没有透明通道,这样才能被压缩,Android会压缩成ETC格式。
Sprite是精灵,一般用于2D UI上。之前博客也提到过图集的概念,可以用Sprite制作图集。
Texture是纹理,可以用于2D UI,放在Raw Image组件上。用于3D场景时,一般作为3D模型贴图。
02 线性AnimationCurve
在实际使用中,编辑器中可以设置关键帧的Linear,从而达到线性效果。而用代码如:
audio.audioCurveX.AddKey(time, positionX);
对AnimationCurve添加一个帧则得到的动画是平滑的。为了得到线性效果,使用:
AnimationUtility.SetKeyLeftTangentMode(audio.audioCurveX, i, AnimationUtility.TangentMode.Linear);
可以达到编辑器设置的线性效果。然而该AnimationUtility属于UnityEditor中,打包安卓的时候会报错。因此设置线性不是很方便的,网上没搜索到优雅的做法。下面提供的代码可以将AnimationCurve进行线性化,就是自己用代码计算其出入的切线角度:
public static void SetCurveLinear(AnimationCurve curve)
{
for (int i = 0; i < curve.keys.Length; i++)
{
float inTangent = 0;
float outTangent = 0;
bool isInTangentSet = false;
bool isOutTangentSet = false;
Vector2 point1;
Vector2 point2;
Vector2 deltapoint;
Keyframe key = curve[i];
if (i == 0)
{
inTangent = 0; isInTangentSet = true;
}
if (i == curve.keys.Length - 1)
{
outTangent = 0; isOutTangentSet = true;
}
if (!isInTangentSet)
{
point1.x = curve.keys[i - 1].time;
point1.y = curve.keys[i - 1].value;
point2.x = curve.keys[i].time;
point2.y = curve.keys[i].value;
deltapoint = point2 - point1;
try
{
inTangent = deltapoint.y / deltapoint.x;
}
catch
{
inTangent = 0;
}
}
if (!isOutTangentSet)
{
point1.x = curve.keys[i].time;
point1.y = curve.keys[i].value;
point2.x = curve.keys[i + 1].time;
point2.y = curve.keys[i + 1].value;
deltapoint = point2 - point1;
try
{
outTangent = deltapoint.y / deltapoint.x;
}
catch
{
outTangent = 0;
}
}
key.inTangent = inTangent;
key.outTangent = outTangent;
curve.MoveKey(i, key);
}
}
代码是搜索到的,目前用起来没有问题,得到的线性效果如下:
03 屏幕方向
Unity中有四种:
Portrait、PortraitUpsideDown、LandscapeLeft和LandscapeRight
Portrait是肖像画的意思,一般是竖着挂肖像画,所以代表竖屏,这也是我们平时拿手机用的最多的方向;
Landscape是风景画的意思,一般横着挂风景画,因此代表横屏,一般玩游戏或者看电影的时候用。
那么竖屏反向也不用多介绍,横屏左是以逆时针向左转90度,横屏右则是顺时针向右转90度。
我个人习惯横屏左转90度,比如你设置一个Screen Space Overlay的Canvas,在其左上角放一个Button,编译选择Landsca Left,那么手机上运行的时候就是要逆时针左旋90度达到横屏才会使该Button在左上角,竖屏拿着手机的时候它是在右上角的。
04 坐标系
坐标系的概念接触过,但是很少单独拉出来说,这里要理一下。
首先是数学课上的空间直角坐标系,如下:
这个由于我太久没看以前的数学书,觉得我以前学的好像一般是朝右的标为x轴正向。但是Unity中却是y轴向上:
Unity场景中的是世界坐标系,属于左手坐标系。提到左手坐标系,看下怎么规定的,这个以前看过多次总是记不住:
左手大拇指指向x轴正方向,食指指向y轴正方向,中指方向如果是z轴正方向,那么就是左手坐标系,否则就是右手坐标系,这个正好和上图中的场景对比,Unity确实是左手坐标系。另有一个对比图:
这样也就可以理解为,坐在电脑前,向上的为Y轴正向,向右的为X轴正向,向前的为Z轴正向,这就是Unity的方向表示。那么相对于右手坐标系,实际上就是Z坐标会与左手坐标系的值相反,也就是加个负号,这二者的转换就是如此简单。