先上代码:
public class SinCos : MonoBehaviour
{
public float moveSpeed = 10f; //前进的速度
public float changValue = 5f; //左右的速度
public float changeSize = 5f; //左右的幅度
float time = 0;
void Update()
{
this.transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime); //前进
time += Time.deltaTime * changValue;
this.transform.Translate(Vector3.right * Mathf.Sin(time) * changeSize * Time.deltaTime);
}
}
第一: 首先要明确 在unity3d中物体是如何平滑移动的,我们才能在场景中看见移动的轨迹,看下面的介绍
在Unity3D中,一个物体朝着某个方向移动时,其移动的距离是由速度(speed
)和时间(time
)共同决定的。这里的“方向”是一个单位向量,表示物体移动的方向,而速度则是一个标量,表示物体每秒移动的距离。时间通常是指上一帧到当前帧的时间间隔,即Time.deltaTime
,它确保了物体的移动是平滑的且与帧率无关。
将方向、时间和速度相乘得到的是物体在这一帧内应该移动的距离。这是因为:
- 方向:提供了物体移动的方向,通常是一个单位向量(长度为1的向量)。
- 速度:定义了物体每秒移动的距离或速度的大小。
- 时间:指的是物体移动所经过的时间。在Unity中,这通常是
Time.deltaTime
,它表示上一帧到当前帧的时间间隔。
将这三者相乘,我们可以得到物体在这一帧内应该沿着指定方向移动的距离。这是因为距离等于速度乘以时间(distance = speed * time
),而方向则确定了这个距离是沿着哪个方向移动的。
搞懂这个概念我们再看上面代码,前进给了一个速度,因为我们是要实现物体能够先正弦函数或者余弦函数的轨迹一样,那我们根据物理知识,我们需要前进速度跟左右速度叠加起来那么就是我们想要的结果,比如正弦函数,有移动频率,振幅大小,那我们就需要一个sin函数就行了 ,sin函数范围是-1 到 1 在 * 振幅(changeSize)就可以调节他们的振幅,频率就通过改变changevalue,changeValue 变大 Sin函数频率就会越快,方向 频率 振幅 时间 都有了就可以平滑的看到物体的曲线移动轨迹。
如果不清楚可以看看这个:
在数学和物理中,"频率" 和 "速度" 是两个不同但相关的概念,尽管它们在某些上下文中可能表现出相似的特性。
-
频率:在波动(如正弦波、余弦波)的上下文中,频率是指单位时间内波形重复的次数,通常用赫兹(Hz)表示。在正弦函数
sin(x)
中,如果x
代表时间,那么频率决定了波形振荡的快慢。频率越高,波形振荡得越快。在Unity的上下文中,如果你使用sin(time * frequency)
,这里的frequency
会影响正弦波形变化的快慢,即物体左右摆动的快慢。 -
速度:在直线运动中,速度是指单位时间内物体移动的距离,通常用米/秒(m/s)或其他类似的单位表示。在Unity中,速度通常用于描述物体在三维空间中的移动快慢,比如一个物体每秒沿着某个方向移动多少米。
当你将 sin
函数应用于物体的移动时,你实际上是在创建一个周期性的运动,而不是直线运动。在这个情况下,sin
函数的"频率"决定了物体左右摆动的快慢,而不是它沿直线移动的速度。然而,如果你将 sin
函数的输出用作物体在某一方向上的速度(例如,通过将其乘以某个系数来调整速度的大小),那么 sin
函数的频率将间接影响物体在该方向上的移动快慢,因为频率越高,速度值变化得越快,从而导致物体移动得越快(但方向会不断变化)。
总结一下,sin
函数的频率和直线移动中的速度是两个不同的概念,但在某些情况下,sin
函数的频率可以影响物体在某一方向上的速度变化,从而间接影响物体的移动。在Unity中,如果你想要创建一个以正弦波形方式移动的物体,你需要将 sin
函数的输出与物体的移动速度相结合来实现。