👌

【Unity Tips】Unityでなめらかな演出を生むLerpテクニック10選 後編

2024/12/21に公開

Unityでなめらかな演出を生むLerpテクニック10選

Lerp(線形補間) は、0~1 の値を用いて2つの状態をスムーズに行き来させる機能です。Unityでは、位置(Vector3) や数値(float)、回転(Quaternion) など、多彩な要素を手軽に補間できるため、アニメーション的な演出やUIのフェードイン/アウトなどに広く活用されています。

たとえば、Mathf.Lerp(a, b, t)は a(開始値)と b(終了値)の間を t(0.0~1.0) で補間する構文です。

• t=0 → aそのまま
• t=1 → bそのまま
• t=0.5 → aとbのちょうど中間の値

この“0から1へ徐々に変化させる”性質を時間経過やプレイヤー操作などと組み合わせれば、位置・回転・スケール・UI透明度などをなめらかに変化させることが可能です。

本記事では、全20個のLerpテクニックのうち、後半10個を詳しく解説します。

サンプルコードは簡易的なものなので、実際のプロジェクトでは変数や処理をカスタマイズしながらご活用ください。

前編はコチラから

https://zenn.dev/ryuryu_game/articles/9c58745082c68a

Unityの基本操作からC#スクリプトの基礎まで、やさしく学べる入門チュートリアルはこちら
https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

1. 「ふわっと登場!」キャラクターのなめらか移動

シーン開始時、キャラクターが初期位置から目的位置へ自然に移動すると、ゲームへの没入感が一気に高まります。Vector3.Lerpで2秒かけてスムーズに移動するサンプルコードを紹介。

using UnityEngine;

public class SmoothMover : MonoBehaviour {
    public Vector3 startPos;
    public Vector3 endPos;
    public float duration = 2f;
    private float elapsed = 0f;

    void Start() {
        transform.position = startPos;
    }

    void Update() {
        elapsed += Time.deltaTime;
        float t = Mathf.Clamp01(elapsed / duration);
        transform.position = Vector3.Lerp(startPos, endPos, t);
    }
}

2. 「ガクガク追尾を卒業!」プレイヤー追従カメラ

カメラがプレイヤー位置に“ビタッ”と追いつくと画面がぎこちなく感じることも。少し遅れて追従することで、自然な安定感と臨場感が得られます。

using UnityEngine;

public class FollowCamera : MonoBehaviour {
    public Transform player;
    public float followSpeed = 0.1f;
    private Vector3 offset;

    void Start() {
        offset = transform.position - player.position;
    }

    void LateUpdate() {
        Vector3 targetPos = player.position + offset;
        transform.position = Vector3.Lerp(transform.position, targetPos, followSpeed);
    }
}

3. 「ズームイン・アウトでドラマチック!」カメラ視野角(FOV)の調整

状況に応じてカメラのFOVをスムーズに変更し、臨場感あふれるズームイン・アウトを実装。Mathf.Lerpを使うことで急なカメラ切り替えを回避できます。

using UnityEngine;

public class CameraZoom : MonoBehaviour {
    public Camera mainCam;
    public float normalFOV = 60f;
    public float zoomedFOV = 30f;
    public float zoomTime = 1f;
    private float elapsed = 0f;
    private bool zoomingIn = false;

    void Update() {
        if (Input.GetKeyDown(KeyCode.Z)) {
            zoomingIn = !zoomingIn;
            elapsed = 0f;
        }
        elapsed += Time.deltaTime;
        float t = Mathf.Clamp01(elapsed / zoomTime);
        mainCam.fieldOfView = zoomingIn 
            ? Mathf.Lerp(normalFOV, zoomedFOV, t) 
            : Mathf.Lerp(zoomedFOV, normalFOV, t);
    }
}

4. 「メニューをスライド!」UIパネルの見せ方が変わる

UIのメニューやポップアップを、画面外からスルッと動かすだけで、格段に洗練された印象を与えられます。ユーザー体験がワンランク上に。

using UnityEngine;

public class UISlide : MonoBehaviour {
    public RectTransform panel;
    public Vector3 hiddenPos = new Vector3(-500,0,0);
    public Vector3 visiblePos = new Vector3(0,0,0);
    public float slideTime = 0.5f;
    private float elapsed = 0f;
    private bool showing = false;

    void Start() {
        panel.anchoredPosition = hiddenPos;
    }

    void Update() {
        if (Input.GetKeyDown(KeyCode.M)) {
            showing = !showing;
            elapsed = 0f;
        }
        elapsed += Time.deltaTime;
        float t = Mathf.Clamp01(elapsed / slideTime);
        Vector3 current = showing 
            ? Vector3.Lerp(hiddenPos, visiblePos, t)
            : Vector3.Lerp(visiblePos, hiddenPos, t);

        panel.anchoredPosition = current;
    }
}

5. 「スコアが伸びる快感を演出!」数値のアニメーション

一瞬で数字を切り替えるより、徐々に増える見せ方をすると、達成感を強調できます。Mathf.Lerpで中間値を出して数字をじわっと上げていきましょう。

using UnityEngine;
using UnityEngine.UI;

public class ScoreAnimator : MonoBehaviour {
    public Text scoreText;
    private int currentScore = 0;
    private int targetScore = 0;
    public float increaseTime = 0.5f;
    private float elapsed = 0f;

    void Update() {
        if (Input.GetKeyDown(KeyCode.Space)) {
            targetScore += 100;
            elapsed = 0f;
        }
        if (currentScore != targetScore) {
            elapsed += Time.deltaTime;
            float t = Mathf.Clamp01(elapsed / increaseTime);
            int displayedScore = (int)Mathf.Lerp(currentScore, targetScore, t);
            scoreText.text = displayedScore.ToString();

            if (t >= 1f) {
                currentScore = targetScore;
            }
        }
    }
}

6. 「ミニマップをナチュラルに!」アイコンの遅延追従

ミニマップアイコンがプレイヤーやオブジェクトをピタッと追うと、味気ない印象になりがち。少し遅延を入れて動かすだけで、自然で生き生きしたUIに変わります。

using UnityEngine;

public class MinimapIcon : MonoBehaviour {
    public Transform target;
    public float followSpeed = 0.1f;

    void LateUpdate() {
        Vector3 targetPos = target.position;
        transform.position = Vector3.Lerp(transform.position, targetPos, followSpeed);
    }
}

7. 「HPゲージのドキドキ感をプラス!」UIゲージの滑らかな変動

一気に減るより、ゆっくり減るほうが緊張感も高まるし、プレイヤーが状況を把握しやすい。スタミナバーやHPバーに応用できるテクニックです。

using UnityEngine;
using UnityEngine.UI;

public class SmoothGauge : MonoBehaviour {
    public Image gaugeFill;
    private float currentFill = 1f;
    private float targetFill = 1f;
    public float adjustSpeed = 2f;

    void Update() {
        if (Input.GetKeyDown(KeyCode.D)) {
            targetFill = Mathf.Clamp01(targetFill - 0.1f);
        }
        currentFill = Mathf.Lerp(currentFill, targetFill, Time.deltaTime * adjustSpeed);
        gaugeFill.fillAmount = currentFill;
    }
}

8. 「タイトルロゴを幻想的に演出!」フェードインの作法

いきなりパッと出すより、CanvasGroup.alphaを0→1に段階的に変化させると、ロゴがしっとり浮かび上がる印象に。まるで映画のオープニングのようなクオリティ感が出ます。

using UnityEngine;

public class TitleFade : MonoBehaviour {
    public CanvasGroup titleCanvasGroup;
    public float fadeInTime = 1f;
    private float elapsed = 0f;

    void Start() {
        titleCanvasGroup.alpha = 0f;
    }

    void Update() {
        elapsed += Time.deltaTime;
        float t = Mathf.Clamp01(elapsed / fadeInTime);
        titleCanvasGroup.alpha = Mathf.Lerp(0f, 1f, t);
    }
}

9. 「パネルを回転させて視線を誘導!」ちょっとした注目効果

パネルをわずかに回転させてユーザーの視線を引き付ける小ワザ。イベントシーンやUIの強調表示に使うと、インパクトが段違いです。

using UnityEngine;

public class PanelRotate : MonoBehaviour {
    public float rotateAngle = 15f;
    public float rotateTime = 0.5f;
    private float elapsed = 0f;
    private bool triggered = false;

    Quaternion originalRot;
    Quaternion tiltedRot;

    void Start() {
        originalRot = transform.rotation;
        tiltedRot = originalRot * Quaternion.Euler(0,0,rotateAngle);
    }

    void Update() {
        if (Input.GetKeyDown(KeyCode.R)) {
            triggered = !triggered;
            elapsed = 0f;
        }
        elapsed += Time.deltaTime;
        float t = Mathf.Clamp01(elapsed / rotateTime);

        if (triggered) {
            transform.rotation = Quaternion.Lerp(originalRot, tiltedRot, t);
        } else {
            transform.rotation = Quaternion.Lerp(tiltedRot, originalRot, t);
        }
    }
}

10. 「背景が動くと世界観が変わる!」背景要素を往復させよう

雲や遠景オブジェクトが行ったり来たりすると、世界に“風”が吹いているようなリアルさを与えられます。シーンが静止画っぽい雰囲気から脱却できます。

using UnityEngine;

public class BackgroundShift : MonoBehaviour {
    public Vector3 posA;
    public Vector3 posB;
    public float cycleTime = 5f;
    private float elapsed = 0f;
    private bool forward = true;

    void Update() {
        elapsed += Time.deltaTime;
        float t = Mathf.Clamp01(elapsed / cycleTime);

        if (forward) {
            transform.position = Vector3.Lerp(posA, posB, t);
        } else {
            transform.position = Vector3.Lerp(posB, posA, t);
        }
        if (t >= 1f) {
            forward = !forward;
            elapsed = 0f;
        }
    }
}

まとめ

「Lerp系演出」は小さな工夫でゲーム体験に大きな違いを生み出します。見出しを魅力的にするだけでなく、最初の数行(導入)やサブ見出しに一言で「なぜこれが面白いのか」を書くことで、読者の滞在時間が伸びやすくなります。

  • 見出しを“問い”にする→ 読むほどに答えが見つかりそう
  • 短いサブリードで期待感を高める→ 「ここを読めば解決できる!」と思わせる
  • 冒頭で結論やメリットを示す→ 最初の数秒で「読み続ける価値がある」と伝える

こうした工夫を織り交ぜれば、記事としてもさらに魅力がアップし、滞在時間や読了率の向上が期待できます。ぜひお試しください。

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion