记:最近打算出本入门的 Unity脚本学习书籍,帮助那些零基础的同学,目前书稿苦写才写到3.5万字,不包含代码,给朋友看了,朋友反应还不错,说适合入门学习,本来写不下去了,结果得到朋友的安慰和鼓励,不管将来有没有出版社愿意出版,我在努努力写完,出版不了,贴在这里也能发挥他的价值,共勉。
以下是对Vector3.lerp的研究和学习结果,也是书中的部分,贴给大家。欢迎批评指正,共勉!
OK,接下来我们继续学习第5个Vector3类的静态方法Vector3Lerp(Vector3from,Vector3to,floatt);其中from是起点坐标,to表示终点坐标,而t是起点到终点插值(Vector3Dist=to-from)的进度比例,范围是(0-1),函数最终返回值是坐标点from+(to-from)*t。比如D=Vector3.Lerp(PointA,PointB,t):
当t=0Vector3.Lerp(PointA,PointB,t)返回结果是D=PointA坐标点
当0<t<1Vector3.Lerp(PointA,PointB,t)返回结果是D=PointA+(PointB-PointA)*t坐标点
当t=1Vector3.Lerp(PointA,PointB,t)D=PointB;
因此我们可以看出来,t的增高会让返回值接近于to,D始终处于PointA和PointB中间。这个方法主要用于我们把一个物体从起点移动到终点,并且通过控制t来实现平滑运动。
这里面有一个迭代,比如一开始A和B的距离是100米,我们给与t=0.01。我们让A的位置等于Vector3.Lerp(PointA,PointB,t),执行第一次,也就是说A的新位置A=PointA+(100米)*0.1
A=A+10米。这是第一次执行函数。A的速度是一帧移动了10米。
然而此时因为A往B方向移动了10米,此时A和B距离就剩下90米了。
第二帧再来刷新执行,A=PointA+(90米)*0.1
此时因为A往B方向移动了9米,此时A和B距离就剩下81米了。
第二帧A的速度是一帧移动9米。
第三帧增加的距离就是81*0.1=8.1米
第四帧增加的距离就是72.9*0.1=7.29米
我们会发现,这个算法会让A每帧移动的距离都在减少,也就意味着A的速度在逐渐降低。
但是还在往B的方向走,直至终点B。
这样的好处就是A点往B点移动的时候速度是渐缓变慢,移动效果舒缓。我们可以让摄像机跟随主角,实现一个缓跟镜头。
接下来我们实现让一个小球逐渐靠近终点并且让摄像机减缓跟随主角移动。
附上源码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Vector3_ClassLerp : MonoBehaviour
{
// 用于插值计算
public Transform PointA, PointB;
Transform Target;
public float Speed = 0.2f;
public float T;
void Start()
{
Target = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update()
{
DirMove();//主角移动函数
PointB.LookAt(Target);//让摄像机Z 轴始终朝向目标
FollowingHero(PointB.position, Target.position);//坐标跟随插值函数
}
private void FollowingHero(Vector3 From, Vector3 To)
{
PointB.position = Vector3.Lerp(From, To,T );
}
//插值计算
private void DirMove()//使用Vector3的静态变量,使用其向量的方向属性
{
//Vector3的静态变量方向点
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * Speed);//向前移动 Translate默认是自身坐标系
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * Speed);//向前移动
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.left * Speed);//向前移动
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * Speed);//向前移动
}
if (Input.GetKey(KeyCode.Alpha1))
{
transform.Translate(Vector3.up * Speed);//向前移动
}
if (Input.GetKey(KeyCode.Alpha2))
{
transform.Translate(Vector3.down * Speed);//向前移动
}
}
}