Unityでゲーム開発を行う際、プレイヤーのスコアや経験値など、数値が増加する演出をアニメーションとして表示すると、より魅力的なユーザー体験を提供できます。
この記事では、数値が滑らかに増加するアニメーションをUnityで実装する方法を初心者向けに解説します。

紹介する実装方法は、Unityのチュートリアルレベルの知識があることが前提にしています。すべての設定項目等を細かく伝えているチュートリアル的な記事ではない点をご留意下さい。
プロジェクトのセットアップ
この記事で紹介する内容は、MiniGameManagerというクラスを使い、スコアが増加する際にその数値をアニメーションで表示する方法です。この機能は、UnityのCoroutineとMathf.Lerpを使って実現します。
まず、必要なスクリプトを作成し、適切なオブジェクトにアタッチします。以下のスクリプトは、MiniGameManagerというクラスを利用し、ゲーム中にスコアを管理するためのものです。
以下が、スコアをアニメーションで表示するためのMiniGameManagerクラスのコードです。
using System.Collections;
using TMPro;
using UnityEngine;
public class MiniGameManager : MonoBehaviour
{
public static MiniGameManager instance;
public TMP_Text score_text;
public int nowScore = 0;
void Awake()
{
if (instance == null)
{
instance = this;
}
else
{
Destroy(gameObject);
}
StartCoroutine(AnimateScore(0));
}
public void AddScore(int score ,bool isUpdateText = false)
{
StartCoroutine(AnimateScore(score));
}
private IEnumerator AnimateScore(int newScore,bool isStartZero = false)
{
int startScore;
if (isStartZero) { startScore = 0; }
else{
startScore = nowScore;
}
float duration = 0.5f; // アニメーションの持続時間
float elapsed = 0.0f;
int tempScore = nowScore;
nowScore = newScore;
while (elapsed < duration)
{
elapsed += Time.deltaTime;
tempScore = (int)Mathf.Lerp(startScore, newScore, elapsed / duration);
score_text.text = " " + tempScore.ToString();
yield return null;
}
score_text.text = " " + nowScore;
}
}
スクリプトの解説
このスクリプトでは、スコアが増加する際にその値を滑らかに変化させるため、Coroutineを使用しています。具体的なポイントは以下の通りです。
Mathf.Lerp: この関数は、指定した時間内で、開始値から終了値へと徐々に変化させます。今回は、startScoreからnewScoreへのスコアの変化を制御しています。Coroutine: スコアのアニメーションはCoroutineで実行されています。これにより、非同期でアニメーションが行われ、メインスレッドをブロックすることなく、スムーズにスコアが更新されます。TMP_Text: UnityのTextMesh Proを利用して、スコアの表示を行っています。これはUIの品質を向上させるために推奨されるテキストレンダリングオプションです。
実際の使用方法
MiniGameManagerスクリプトをプロジェクトに追加し、スコアが増加するタイミングでAddScore()メソッドを呼び出すだけで、数値が滑らかに増加するアニメーションを簡単に実装できます。
例えば、以下のように呼び出すことができます。
// 例: スコアを100点増加させる場合
MiniGameManager.instance.AddScore(MiniGameManager.instance.nowScore + 100);
今回の例では、MainManager.csから呼び出しています。
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
using DG.Tweening;
public class MainManager : MonoBehaviour
{
#region public 変数
/// <summary>
/// メインマネージャーのインスタンス
/// </summary>
public static MainManager instance;
/// <summary> ミニゲームオブジェクト</summary>
public GameObject miniGameManager;
#endregion
#region private 変数
/// <summary>
/// ミニゲームマネージャ
/// </summary>
private MiniGameManager miniGameM;
#endregion
#region unityのイベント処理
void Awake()
{
if (instance == null)
{
instance = this;
}
else
{
Destroy(gameObject);
}
}
private void Start()
{
//ミニゲーム取得
miniGameM = miniGameManager.GetComponent<MiniGameManager>();
}
#endregion
#region デバッグ処理
public void debug()
{
miniGameM.AddScore(miniGameM.nowScore + 100);
}
#endregion
}サンプルでのHierrarchyの状況
今回のサンプルでは以下のような構成になっています。



まとめ
この機能を使えば、数値が変動する際にプレイヤーへ視覚的なフィードバックを与えることができ、ゲームの演出がよりリッチになります。特にスコアの変動が多いゲームでは、このアニメーション機能が役立つでしょう。
Unityを使ってゲーム開発を行う際に、このような細かい演出を積み重ねることで、プレイヤーの体験を向上させることができます。是非、プロジェクトに取り入れてみてください!
