Appearance
第08回 UIエフェクト1
前回: 第07回 軌跡 / 次回: 第09回 UIエフェクト2
注意
この授業には提出課題があります
提出方法は 授業内で説明します
前回の振り返り
軌跡エフェクトを作りました
- 第07回では、Trail Renderer・Particle Trails・Line Renderer を扱いました
- 軌跡は単に装飾的な見た目だけでなく、 ゲーム上の意味のある情報をプレイヤーに伝える役割も持っています
- そのことを踏まえて、動きの方向・速さ・余韻を 線やトレイルで表現する方法を学びました
- 今回は UI 上で発生する数字や表示のエフェクトを扱います
今回の授業の目的
情報表示に気持ちよさを加える
- ダメージ数字
- 回復数字
- コンボ数字
- クリティカル表示
- ミスやガードなどの状態表示
- ゲームの情報を、読みやすく気持ちよく伝えることが目標です
今回の授業内容
ダメージ数字、回復数字、コンボ数字
- UI エフェクトの役割
- 数字表示の基本構成
- 移動、拡大縮小、フェード
- 色とサイズの使い分け
- Canvas と World Space 表示
- 授業内課題
UI上の文字情報
プレイヤーに状況を知らせる短い表示
- ダメージや回復の数字
MISS、GUARD、CRITICALなどの状態表示Level Up、Quest Clearなどの結果表示Reload、Warningなどの注意表示- ゲームの状態をすばやく伝えるために 文字情報の併用は有効です
文字表示と演出
ただ出すだけでは読まれない
- 出現、拡大、移動、フェードで視線を誘導することで ゲーム状態を端的に伝え、ユーザーの期待を煽ることができます
- 色や大きさで重要度や種類を分けられれば 機能的な情報伝達が可能です
- もちろんただ動かせばよいわけではなく、見やすさと ゲームのテンポに合った調整が必要になります
- この授業では、いくつかの端的な使用例に触れ その実装方法を学びます
数字表示を扱う
出番の多い UI エフェクトの一つ
- 演出を伴った数字の表示は、 ダメージ、回復、経験値、コンボ、スコアなどに使われます
- ただ派手にするだけでなく、目的にあわせて配色や字体、動きなどを調整します
- 漫然と表示するだけでは野暮ったい印象になってしまいます 読みやすく、邪魔にならないことを前提に組み立てましょう
UI エフェクトの構成要素
時間、移動、拡大縮小、フェード
- 時間変化: 出現、滞在、消失の流れを制御
- 移動: 小気味の良いポップアップ、横へのスライドなどで視線を誘導
- 拡大縮小: 出現直後のインパクトや、重要な情報の強調に使用
- フェード: 後半で透明度を下げて自然に消します
Unity の Canvas モード
大きく二つの表示モード
Screen Spaceモードは、UI を画面座標で表示します 全ての描画が終わったあとの最上段に描画を行うオーバーレイと カメラの位置に合わせて描画するカメラスペースがあります- カメラスペースはUIにサイズを保ちながら奥行きを与えることができ 3Dモデルと同じ空間に配置可能なため、使いこなせば面白い表現が可能です
World Spaceモードは、UI を 3D 空間内の位置で表示します 個別のキャラクターへのダメージ表示など、ゲーム内のオブジェクトの位置と 関連付けて表示したい場合に有効です- https://docs.unity3d.com/ja/2023.2/Manual/class-Canvas.html
Screen Space Canvas
画面に固定された UI


上がオーバーレイ 下がカメラスペース 表示サイズはともに同じ
Screen Spaceの Canvas は 画面座標で UI を表示しますOverlayでは常に最前面に表示されます メニューの表示に適していますCamera Spaceでは UI を3D空間上に サイズ固定で配置できます 上手く使えば有用です
World Space Canvas
ワールド座標で自由に表示

ワールド空間に配置されたUI 使いこなすためにはプログラムでの制御が必要
World Spaceの Canvas は 3D 空間内に UI を配置します- 敵の頭上、ヒット位置、アイテム位置などに UI を表示する場合はこちらが適しています
- 便利ですが、扱いが3D オブジェクトなので 距離によって大きさが変わり、カメラに見え やすいよう向きも制御する必要があります
World Space Canvas の文字を 2D 化する
キャンバスを カメラへ向け続ける
- World Space の UI は 3D 空間に置かれる ため、カメラの向きによっては傾いて 表示されてしまいます
- オブジェクトをカメラ正面に向け続けると 3D 空間上に 2D オブジェクトを配置できます こうした 2D 表示物を ビルボードと呼びます
- 右は
LateUpdateでカメラの向きに合わせて 自身を回転させるスクリプトの例です
csharp
using UnityEngine;
// カメラに向かうビルボード
public class FaceCamera : MonoBehaviour
{
[SerializeField] private Camera targetCamera;
private void LateUpdate()
{
if (targetCamera == null)
{
targetCamera = Camera.main;
if (targetCamera == null)
return;
}
transform.rotation = targetCamera.transform.rotation;
}
}Animation と Script
Animator はやや面倒くさい
- Unity には Animator という強力なアニメーション再生システムがありますが 設定はやや煩雑で大掛かりです
- UI エフェクトの多くはシンプルかつ短時間で完了するため、 逐一 Animator を持ち出してステートマシンを設定するのも手間です
- ここでは簡単なスクリプトでのアニメーションの 実装方法を紹介します
AnimationCurve
Inspector から調整可能なカーブ

スクリプトを使用したアニメーションの実装例 座標とスケールにカーブを適用している
AnimationCurveを使うと、Inspector 上で時間変化のカーブを調整できます- 例えば、移動の速さや拡大縮小の変化を カーブで表現することで、様々な アニメーション表現が可能です
Animatorは補間など細かな制御が可能ですが、 それらが必要ないのであればAnimationCurveを使ったスクリプトの方が アニメーションを手軽に実装できます
AnimationCurve の利用方法
AnimationCurveをSerializeFieldで宣言します- Inspector 上でカーブを編集して、時間変化のパターンを作ります
- スクリプト内で、時間の経過に応じて
Evaluateメソッドを呼び出し、 カーブから値をUI の位置やスケール、アルファなどのプロパティに適用します
csharp
// カーブの宣言
[SerializeField] private AnimationCurve positionXCurve = AnimationCurve.Linear(0f, 0f, 1f, 0f);
// 時間の経過に応じてカーブから値を取得
float t = elapsedTime / lifeTime; // 0から1の範囲で
float x = positionXCurve.Evaluate(t); // カーブから値を取得
// 取得した値をUIの位置に適用
rectTransform.anchoredPosition = startPosition + new Vector2(x, 0f);Curve で調整するポイント
同じ処理でも印象が変わる
moveCurve: 最初を速くすると弾けるような動きになりますscaleCurve: 一瞬だけ大きくして戻すとインパクトが出ますalphaCurve: 前半を 1 のまま、後半でフェードするのがおすすめです- Curve を変えるだけで様々な表現が可能になります 試行錯誤してみてください
実装例
生成時に表示内容を変更する
csharp
// ダメージ数字と色を設定する
public void Setup(int value, Color color, Vector2 offset)
{
text.text = value.ToString();
text.color = color;
move += offset;
}
// 実際に生成する例
DamageNumber number = Instantiate(damageNumberPrefab, canvasTransform);
number.Setup(damage, Color.red, new Vector2(Random.Range(-30f, 30f), 0f));Instantiateの直後にSetupを呼ぶことで、毎回異なる数字や色を表示できます 回復なら+80、クリティカルなら大きい Scale など、用途に応じて値を変えます
DOTween を使う
スクリプト完結で簡単にアニメーションを実装できるライブラリ
- DOTween は、移動・拡大縮小・フェードなどを簡潔に書ける Tween ライブラリです
- 「どの値を・何秒で・どう変えるか」をコードだけで完結に指定できます UI エフェクト以外でも非常に便利なライブラリです
- Asset Store で無料版が配布されています 利用を検討してもいいでしょう
https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676
DOTween の実装例
Sequence で複数の動きをまとめる
csharp
using DG.Tweening;
using TMPro;
using UnityEngine;
public class DamageNumberTween : MonoBehaviour
{
public TMP_Text text;
public float lifeTime = 0.8f;
public Vector2 move = new(0f, 80f);
public bool destroyOnFinish = true;
private RectTransform _rectTransform;
private Vector2 _startPosition;
private void Awake()
{
_rectTransform = GetComponent<RectTransform>();
_startPosition = _rectTransform.anchoredPosition;
}
public void Setup(int value, Color color)
{
text.text = value.ToString();
text.color = color;
var sequence = DOTween.Sequence();
sequence.Append(_rectTransform.DOScale(1.4f, 0.08f));
sequence.Append(_rectTransform.DOScale(1f, 0.12f));
sequence.Append(_rectTransform.DOAnchorPos(
_startPosition + move, lifeTime).From(_startPosition));
sequence.Insert(0.55f, text.DOFade(0f, lifeTime - 0.55f));
if(destroyOnFinish)
sequence.OnComplete(() => Destroy(gameObject));
}
}Appendは動きを追加する指定です 直前の動きの後に再生されますInsertは指定した時間から動きを開始しますOnCompleteには再生完了時のコールバックを 追加可能です- 処理を数珠繋ぎにできるため、慣れると 直感的にアニメーションを作成可能です
実習
ダメージ数字を作る
目的別で色や動きを 変えてみよう
実習1:数字用 UI を作る
TextMeshPro を配置する
- Canvas を作成する
Text - TextMeshProを追加する- 表示内容を
120にする - フォントサイズ、色、アウトラインを調整する
- Prefab 化できるよう整理する
実習2:出現アニメーションを作る
少し大きく出して戻す
- 出現時の Scale を大きめにする
- 短時間で通常サイズへ戻す
- ダメージ数字らしい色にする
- クリティカル用に大きめのバリエーションを作る
- Game ビューで読めるか確認する
実習3:移動とフェードを作る
上へ流れて消える
- 数字を上方向へ移動させる
- 後半でアルファを 0 に近づける
- 表示時間を 0.6〜1.2 秒程度で調整する
- 横方向に少しランダムなばらつきを加える
- 消えたらオブジェクトを破棄する
実習4:種類を増やす
回復とコンボ表示を作る
- 回復数字は緑系にする
+80のように記号をつける- コンボ表示は画面上部や中央に置く
- 数字が増えた瞬間に少し拡大する
- 重要度に応じてサイズと色を変える
授業内課題
ダメージ、回復、コンボの いずれかの UI エフェクトを 提出してください
スクリプトでも DoTween でも
課題の条件
以下を満たしてください
- TextMeshPro を使って数字または短い文字を表示している
- 出現・滞在・消失の時間変化がある
- 移動・拡大縮小・フェードのうち2つ以上を使っている
- 色やサイズで意味や重要度を表現している
- 背景上で読めるように調整している
- スクリーンショットまたは動画で提出する
提出時の説明
調整の意図を添えてください
- 何を表す数字か
- どのように出現して消えるか
- 色やサイズをどう決めたか
- 読みやすくするために調整した点
- 改善したい点
今回のまとめ
UI エフェクトは情報と手応えをつなぐ
- ダメージ数字や回復数字は、状態変化をプレイヤーに伝えます
- 出現・滞在・消失の時間変化で、読みやすさとインパクトを両立させられます
- 色・サイズ・動きで意味や重要度を表現できます
- 派手さだけでなく、情報の読みやすさも考慮して演出してみましょう