個人ゲーム開発日報|コインの出現とアニメーション

ゲーム開発
スポンサーリンク

前回は、敵キャラクターの設置と、敵のアニメーションを実装しました。

今回は、敵キャラクターをタップしたらコインが飛び出るアニメーションを実装します。

敵から飛び出るコインの実装

実現したい機能はこうです。

  • 敵をタップするとコインが出現する
  • コインは、勢いよく敵から飛び出し、少し上に弾んで、落下する
  • コインは敵より全面に描写する。

こんな感じです。

コインのイラストは、以前に買ったUnityのアセットを利用しました。

コインのプレハブを作成

コインのプレハブを作ります。

  1. コインのスプライトをプロジェクトにインポートします。
  2. コインのスプライトをシーンにドラッグし、新しいGameObjectを作成します。
  3. コインのGameObjectに必要なコンポーネント(SpriteRendererRigidbody2Dなど)を追加します。
  4. コインのGameObjectをプレハブとして保存します(Prefabsフォルダにドラッグします)。

コード

コードの方は、前回作成したClickDamageHandler.csで使ったDOTweenを利用すれば、シンプルに実装できそうです。

ClickDamageHandlerを改良します。

using UnityEngine;
using DG.Tweening;

public class ClickDamageHandler : MonoBehaviour
{
    public GameObject coinPrefab; // コインのプレハブ
    public Transform coinSpawnPoint; // コインが飛び出す位置
    private int damageCount = 0; // ダメージ数のカウント
    private Vector3 originalPosition; // オブジェクトの元の位置
    private bool isAnimating = false; // アニメーション中かどうかを示すフラグ

    void Start()
    {
        // オブジェクトの元の位置を保存
        originalPosition = transform.localPosition;
    }

    void OnMouseDown()
    {
        if (!isAnimating)
        {
            damageCount++; // ダメージ数を増加
            LogDamage(); // ダメージ数をコンソールに表示
            ShakeObject(); // オブジェクトを揺らす
            SpawnCoin(); // コインを生成して飛ばす
        }
    }

    void LogDamage()
    {
        Debug.Log("Damage: " + damageCount); // コンソールにダメージ数を表示
    }

    void ShakeObject()
    {
        // アニメーション中フラグを設定
        isAnimating = true;

        // 左にもっと動かしてから元の位置に戻す
        transform.DOLocalMoveX(originalPosition.x - 0.2f, 0.05f) // 移動の幅を0.2fに設定
            .SetLoops(2, LoopType.Yoyo)
            .OnComplete(() => isAnimating = false); // アニメーションが終了したらフラグをリセット
    }

    void SpawnCoin()
    {
        // コインを生成
        GameObject coin = Instantiate(coinPrefab, coinSpawnPoint.position, Quaternion.identity);

        // コインを敵キャラクターより上に表示
        coin.GetComponent<SpriteRenderer>().sortingOrder = 10;

        // コインに飛び出すアニメーションを適用
        float dropHeight = Random.Range(-2.0f, -4.0f); // 落下先
        Vector3 peakPosition = new Vector3(
            coinSpawnPoint.position.x,
            coinSpawnPoint.position.y + 1.0f, // 一度上に上がる
            coinSpawnPoint.position.z
        );
        Vector3 targetPosition = new Vector3(
            coinSpawnPoint.position.x + Random.Range(-1.0f, 1.0f), // 横の範囲を広げる
            coinSpawnPoint.position.y + dropHeight,
            coinSpawnPoint.position.z
        );

        Sequence coinSequence = DOTween.Sequence();
        coinSequence.Append(coin.transform.DOMove(peakPosition, 0.15f).SetEase(Ease.OutQuad)) // 上に上がる動き
                    .Append(coin.transform.DOMove(targetPosition, 0.25f).SetEase(Ease.InQuad)) // 下に落ちる動き
                    .OnComplete(() => Destroy(coin, 1.0f)); // 1秒後にコインを破棄
    }
}

SpawnCoinがコインの動作に関する関数です。

SpawnCoin関数の詳細な説明をChatGPTにより以下に示します。

SpawnCoin関数の説明

void SpawnCoin()
{
    // コインを生成
    GameObject coin = Instantiate(coinPrefab, coinSpawnPoint.position, Quaternion.identity);
  • GameObject coin = Instantiate(coinPrefab, coinSpawnPoint.position, Quaternion.identity);
  • この行は、coinPrefabから新しいコインのインスタンスを生成します。
  • Instantiateメソッドは、指定されたプレハブを指定された位置(coinSpawnPoint.position)に生成し、回転を指定(ここではQuaternion.identity、すなわち回転なし)します。
  • 生成されたコインのインスタンスはcoinという変数に格納されます。
    // コインを敵キャラクターより上に表示
    coin.GetComponent<SpriteRenderer>().sortingOrder = 10;
  • coin.GetComponent<SpriteRenderer>().sortingOrder = 10;
  • 生成されたコインのSpriteRendererコンポーネントを取得し、そのsortingOrderプロパティを設定します。
  • sortingOrderはスプライトの描画順序を決定するプロパティで、値が大きいほど前面に表示されます。ここでは、10という値を設定することで、コインが敵キャラクターより前面に表示されるようにしています。
    // コインに飛び出すアニメーションを適用
    float dropHeight = Random.Range(-2.0f, -4.0f); // 落下先を2倍に伸ばす
  • float dropHeight = Random.Range(-2.0f, -4.0f);
  • コインの最終的な落下位置の高さをランダムに決定します。
  • Random.Rangeメソッドは、指定された範囲内のランダムな浮動小数点数を返します。ここでは、-2.0fから-4.0fの間でランダムな値を取得します。
    Vector3 peakPosition = new Vector3(
        coinSpawnPoint.position.x,
        coinSpawnPoint.position.y + 1.0f, // 一度上に上がる
        coinSpawnPoint.position.z
    );
  • Vector3 peakPosition
  • コインが一度上に上がる位置を決定します。
  • coinSpawnPoint.position.xcoinSpawnPoint.position.zはそのまま使用し、coinSpawnPoint.position.y1.0fを加えることで、コインが一度上に上がる位置を設定します。
    Vector3 targetPosition = new Vector3(
        coinSpawnPoint.position.x + Random.Range(-1.0f, 1.0f), // 横の範囲を広げる
        coinSpawnPoint.position.y + dropHeight,
        coinSpawnPoint.position.z
    );
  • Vector3 targetPosition
  • コインの最終的な落下位置を決定します。
  • coinSpawnPoint.position.xに対してRandom.Range(-1.0f, 1.0f)を加えることで、コインが左右にランダムに移動する位置を設定します。
  • coinSpawnPoint.position.ydropHeightを加えることで、コインの落下位置の高さを設定します。
    Sequence coinSequence = DOTween.Sequence();
  • Sequence coinSequence = DOTween.Sequence();
  • DOTweenのシーケンスを作成します。シーケンスは複数のアニメーションを連続して実行するためのコンテナです。
    coinSequence.Append(coin.transform.DOMove(peakPosition, 0.15f).SetEase(Ease.OutQuad)) // 上に上がる動きを2倍速に
                .Append(coin.transform.DOMove(targetPosition, 0.25f).SetEase(Ease.InQuad)) // 下に落ちる動きを2倍速に
                .OnComplete(() => Destroy(coin, 1.0f)); // 1秒後にコインを破棄
}
  • coinSequence.Append(coin.transform.DOMove(peakPosition, 0.15f).SetEase(Ease.OutQuad))
  • コインが上に移動するアニメーションをシーケンスに追加します。
  • DOMoveメソッドは、指定した位置(peakPosition)にコインを移動させます。アニメーションの時間は0.15f秒で、Ease.OutQuadイージングを適用します。これにより、アニメーションが始めは速く、終了時にゆっくりとなります。
  • .Append(coin.transform.DOMove(targetPosition, 0.25f).SetEase(Ease.InQuad))
  • コインが下に移動するアニメーションをシーケンスに追加します。
  • DOMoveメソッドは、指定した位置(targetPosition)にコインを移動させます。アニメーションの時間は0.25f秒で、Ease.InQuadイージングを適用します。これにより、アニメーションが始めはゆっくりで、終了時に速くなります。
  • .OnComplete(() => Destroy(coin, 1.0f));
  • シーケンスが完了したときに実行するコールバックを設定します。
  • ここでは、コインのオブジェクトを1秒後に破棄するように設定しています。Destroyメソッドは、指定されたゲームオブジェクトを破棄します。

このSpawnCoin関数により、クリック時に生成されたコインが一度上に上がり、その後ランダムな位置に落下する動きを実現しています。また、コインは敵キャラクターより前面に表示されるように設定されています。

インスペクターでコインPrefabを設定

最後に、敵オブジェクトにコインプレハブをアタッチします。

  • 敵キャラクターのGameObjectを選択します。
  • インスペクターでClickDamageHandlerスクリプトのコンポーネントを見つけます。
  • Coin Prefabフィールドに、先ほど作成したコインのPrefabをドラッグしてアタッチします。
  • Coin Spawn Pointフィールドには、コインが飛び出す位置を設定するためのTransformを設定します。このTransformは敵キャラクターの一部であることが多いですが、新しいGameObjectを作成してそれを使用してもかまいません。

これで、敵にダメージを与えると、コインが飛び出る機能を実装できました。

今回はここまで。

<以前の記事>

タイトルとURLをコピーしました