---
title: "线性插值"
content_type: tutorial
url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi?language=zh-cn"
language: zh-cn
difficulty: beginner
duration_minutes: 10
unity_version:
  - "2019.3"
  - "2019.2"
  - "2019.1"
  - "2018.4"
  - "2018.3"
  - "2018.2"
  - "2018.1"
  - "2017.4"
  - "2017.3"
  - "2017.2"
  - "2017.1"
  - "5.x"
  - "4.x"
supported_unity_versions:
  - name: "2019.3"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2019.3"
  - name: "2019.2"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2019.2"
  - name: "2019.1"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2019.1"
  - name: "2018.4"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2018.4"
  - name: "2018.3"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2018.3"
  - name: "2018.2"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2018.2"
  - name: "2018.1"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2018.1"
  - name: "2017.4"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2017.4"
  - name: "2017.3"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2017.3"
  - name: "2017.2"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2017.2"
  - name: "2017.1"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=2017.1"
  - name: "5.x"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=5.x"
  - name: "4.x"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn&version=4.x"
available_languages:
  - name: "en"
    url: "https://learn.unity.com/tutorial/linear-interpolation.md?language=en"
  - name: "es"
    url: "https://learn.unity.com/tutorial/interpolacion-linear.md?language=es"
  - name: "ja"
    url: "https://learn.unity.com/tutorial/linear-interpolation-xian-xing-bu-jian.md?language=ja"
  - name: "ko"
    url: "https://learn.unity.com/tutorial/seonhyeong-bogan.md?language=ko"
  - name: "zh-cn"
    url: "https://learn.unity.com/tutorial/xian-xing-cha-zhi.md?language=zh-cn"
last_updated: "2026-08-04T14:25:00.000Z"
---

# 线性插值

学习在 C# 脚本中使用 Lerp 函数，在游戏逻辑中在线性插值两个数值。

在制作游戏时，有时可以在两个值之间进行线性插值。这是通过 Lerp 函数来完成的。

本教程包含在“[初级编程](https://learn.unity.com/project/chu-ji-bian-cheng?language=zh)”项目中。

上一教程：[Look At](https://learn.unity.com/tutorial/look-at-s-1?language=zh&projectId=5e3afd88edbc2a2998252c77)

下一教程：[Destroy](https://learn.unity.com/tutorial/destroy-n?language=zh&projectId=5e3afd88edbc2a2998252c77)

## 1. 线性插值

在制作游戏时，有时可以在两个值之间进行线性插值。这是通过 Lerp 函数来完成的。线性插值会在两个给定值之间找到某个百分比的值。例如，我们可以在数字 3 和 5 之间按 50% 进行线性插值以得到数字 4。这是因为 4 是 3 和 5 之间距离的 50%。

在 Unity 中，有多个 Lerp 函数可用于不同类型。对于我们刚才使用的示例，与之等效的将是 Mathf.Lerp 函数，如下所示：

```csharp
// 在此示例中，result = 4
float result = Mathf.Lerp (3f, 5f, 0.5f);
```

Mathf.Lerp 函数接受 3 个 float 参数：一个 float 参数表示要进行插值的起始值，另一个 float 参数表示要进行插值的结束值，最后一个 float 参数表示要进行插值的距离。在此示例中，插值为 0.5，表示 50%。如果为 0，则函数将返回“from”值；如果为 1，则函数将返回“to”值。

Lerp 函数的其他示例包括 Color.Lerp 和 Vector3.Lerp。这些函数的工作方式与 Mathf.Lerp 完全相同，但是“from”和“to”值分别为 Color 和 Vector3 类型。在每个示例中，第三个参数仍然是一个 float 参数，表示要插值的大小。这些函数的结果是找到一种颜色（两种给定颜色的某种混合）以及一个矢量（占两个给定矢量之间的百分比）。

让我们看看另一个示例：

```csharp
Vector3 from = new Vector3 (1f, 2f, 3f);
Vector3 to = new Vector3 (5f, 6f, 7f);

// 此处 result = (4, 5, 6)
Vector3 result = Vector3.Lerp (from, to, 0.75f);
```

在此示例中，结果为 (4, 5, 6)，因为 4 位于 1 到 5 之间的 75% 处，5 位于 2 到 6 之间的 75% 处，而 6 位于 3 到 7 之间的 75% 处。

使用 Color.Lerp 时适用同样的原理。在 Color 结构中，颜色由代表红色、蓝色、绿色和 Alpha 的 4 个 float 参数表示。使用 Lerp 时，与 Mathf.Lerp 和 Vector3.Lerp 一样，这些 float 数值将进行插值。

在某些情况下，可使用 Lerp 函数使值随时间平滑。请考虑以下代码段：

```csharp
void Update ()
{
    light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f);
}
```

如果光的强度从 0 开始，则在第一次更新后，其值将设置为 4。下一帧会将其设置为 6，然后设置为 7，再然后设置为 7.5，依此类推。因此，经过几帧后，光强度将趋向于 8，但随着接近目标，其变化速率将减慢。请注意，这是在若干个帧的过程中发生的。如果我们不希望与帧率有关，则可以使用以下代码：

`void Update () {     light.intensity =` `Mathf.Lerp(light.intensity, 8f, 0.5f` `*` `Time.deltaTime); }`

```csharp
void Update ()
{
    light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f * Time.deltaTime);
}
```

这意味着强度变化将按每秒而不是每帧发生。

请注意，在对值进行平滑时，通常情况下最好使用 SmoothDamp 函数。仅当您确定想要的效果时，才应使用 Lerp 进行平滑。
