1.Vector3中的静态变量是相对于世界坐标系的还是相对于自身坐标系呢?(我们创建的Vector3类对象同理)
答:这取决我们将创建的Vector3类对象 / 通过Vector3调用的静态变量传给了哪一个引用
如果是传给了positon的话,则该Vector3类对象就是相对于世界坐标系的,反之,如果传的是localPosition的话,则是Vector3类对象是相对于本地坐标系(父类坐标系)的
(如果游戏物体没有父类的话,其localPositon与Position重合)
1.这个Transform中显示的是localPosition,localRotation和localScale
当游戏物体没有父物体的时候,游戏物体相对于世界的Positon,rotation和scale和相对于本地坐标系local的部分相重合
2.以一个有父物体的游戏物体为例:
如果我们直接设置
那么会出现:
a.Transform的Position(localPosition)显示0,1,0 --- 物体位置发生改变
b.该物体的世界坐标系Positon跟随着localPositon的改变而发生对应的改变
如果我们更改的是物体的position的话
a.物体的位置也会发生改变 --- 物体的位置会变到跟定的世界坐标系的位置,同时要注意的是
通过positon改变了物体的位置后,物体的localPositon也会根据新的位置发生对应的变化,变化完成后,生成的新的localPositon会在Transfrom中显示
1.可以直接通过类名 + 点操作符访问的方法/变量,就是静态方法/变量
1.normalized 和 Normalize的区别:
a. normalized 是Vector3类中的属性,而Normalized则是Vector3类中的一个方法
b. 一个Vector3类对象A调用normalized属性之后,会返回一个新的Vector3类对象,该对象是A的单位向量
c.一个Vector3类对象A调用Normalize方法后,会改变自身的模长 --- 具体改变是将自身的模长改为1,将自身变为自身的单位向量
1.参数为ref标志着这个参数是引用参数
2.该方法的作用是将与引用A指向的向量垂直的两个单位向量分别传给引用basisB 和 引用 basisC(注意,这个垂直指的是类似于坐标轴那样的垂直) --- PS:三个向量彼此互相垂直
1.上面这个介绍的是Vector3中的一个静态方法 --- Project()方法,这个方法的作用是投影一个向量到另一个向量
这里的投影是什么意思呢?
a.首先我们要知道该方法是vector向量投影到onNormal向量上
b.该方法的返回值是一个向量,且该向量是vector向量投影后得到的那根投影向量
3.所谓的投影其实就是vector向量沿着onNormal向量的方向做分量
1.在Reflect方法中,第一个参数 --- Vector3对象 inDirection是用来给定一个确定入射方向的向量的;第二个参数就是给定一个确定法线方向的向量
2.最后该方法会返回一个向量,该向量是沿着给定的入射向量和法线向量反射后得到的反射向量
1.法线是垂直于面的,给定一条法线就能够确定一个面
接下来开始讲讲Vector3类中为我们提供的插值移动方法
这个方法与直接更改游戏物体transfrom中的位置属性的区别是:
1.插值移动方法在给定移动终点后能够实现从起点到终点的逐步移动过程
2.直接更改位置属性则是直接将游戏物体在起点处的渲染停止,直接在终点处开始渲染 --- 这样呈现出的效果就是突然消失然后突然出现
1.Vector3类中为我们提供的插值方法就是 --- MoveTowards方法 ,该方法需要三个参数 --- 第一个是游戏物体的移动起点,第二个是移动终点(这两个都是Vector3变量),最后一个则是移动速度
使用这个方法产生的移动效果就是 --- 游戏物体按照给定的速度逐渐从起点匀速移动到终点
注意:该方法只能够实现匀速移动!
1.对应的还有一个Lerp方法,它能够实现游戏物体从起点先快后慢向终点移动,且只能无限接近终点而无法到达终点。
2.Lerp方法除了能够实现物体从起点出发由快到慢不断接近终点之外,它还能够实现各种各样的速度变化:
a.首先我们先介绍一下默认的由快到慢的速度变化时,三个参数的情况:
起点参数是不固定的,他会随着物体位置的改变而跟着改变;终点参数是固定的,段落比例是固定的(为什么是段落比例可以去看看前面讲解的Lerp插值方法的实现原理)
b.此时我们再引进一个变量:
(curve是曲线的意思),设置好公共动画曲线之后,我们就能够在inspector面板看到这样一个参数窗口点开之后会出现一个线条窗口供我们调节 ---
在这里我们可以自由的设置一个曲线的形状(曲线的x轴是时间),设置好之后就会返回给我们一个变量 --- 这个变量的类型是浮点型,它的最小值是0,最大值是1
这个变量的值是随着时间不断变化的,而具体的变化规律就是我们设置好的曲线
1.引入了两个变量之后我们开始正式讲解这个Lerp方法的进阶使用 ---
首先进阶使用方法依然需要三个参数,其中起点参数和终点参数必须是固定的,唯一能够变化的参数是比例参数
2.这个变化的比例参数 = curve.Evaluate(时间参数) --- curve就是我们引用的AnimationCurve变量
我们最终的目的是获得动画曲线的y轴上的值来作为比例参数,且这个y轴上的值还必须随着时间变化 --- 那么实现这个需求就需要我们调用动画曲线中的放啊 -- Evaluate() --- 在给定该方法一个单精度浮点型参数之后(要求参数范围是0到1,一旦小于0/大于1,方法只会返回0/1),它就会在动画曲线的x轴上找到这个参数的位置,并将这个位置对应的y轴值返回
(也就是说,如果我们想持续改变比例参数的话,就需要提供一个不断变化的时间参数给Evaluate方法)
(PS:在C#中,默认0.5,0.6...这种浮点数的类型为双精度浮点数double,如果想将其转换为单精度浮点数类型float的话,只需要在数的后面加上一个f --- 如0.5f,0.6f)
3.在动画曲线中如果想增加一个点来调整的话,只需要在想要增加的点双击即可
4.动画曲线的y轴值可以大于1,也可以小于0
5.Lerp方法需要的比例参数可以大于1,也可以小于0 --- 当比例参数大于1的时候。Lerp方法调用后的效果是:物体移动1:1的距离,直接闪现到终点
如果小于0的话,则是物体移动0:1的距离,不发生移动
6.如果想让Lerp方法在比例大于1,小于0的时候也能够有效果的话,就需要我们用一个Lerp的解放版方法 --- LerpUnclamped方法 ---unclamp松开 --- 使用该方法后,如给比例大于1如1.5,则游戏物体会沿着起点到终点的方向加速移动到两者距离的1.5倍处,反之小于0,如-0.5则是沿着起点到终点的反方向由快到慢的移动到二者之间距离的0.5倍处
7.设curve.Evaluate()方法的时间参数为x(浮点型),该参数从0开始累加,当参数加到1的时候,动画曲线走完全程,游戏物体完成移动 --- 也就是说游戏物体从起点到终点总共耗时1s
如果我们想改变消耗的时间 --- 比如使得消耗时间小于1s/大于1s,那我们该怎么做呢?
此时我们需要创建一个变量,该变量用来记录我们实际想让游戏物体完成全程的时间 T
然后对Evaluate的时间参数做修改 ---- 从单纯的x变为 x/T --- 此时只有在x = T时,游戏物体才会完成全程(动画曲线也会跟着时间参数等比例缩放)(PS:一般时间参数x都是通过 x = x + Time.deltaTime来实现不断向前变化的)