前回は、敵キャラクターの設置と、敵のアニメーションを実装しました。
今回は、敵キャラクターをタップしたらコインが飛び出るアニメーションを実装します。
敵から飛び出るコインの実装
実現したい機能はこうです。
- 敵をタップするとコインが出現する
- コインは、勢いよく敵から飛び出し、少し上に弾んで、落下する
- コインは敵より全面に描写する。
こんな感じです。
コインのイラストは、以前に買ったUnityのアセットを利用しました。
コインのプレハブを作成
コインのプレハブを作ります。
- コインのスプライトをプロジェクトにインポートします。
- コインのスプライトをシーンにドラッグし、新しいGameObjectを作成します。
- コインのGameObjectに必要なコンポーネント(
SpriteRenderer
、Rigidbody2D
など)を追加します。 - コインの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.x
とcoinSpawnPoint.position.z
はそのまま使用し、coinSpawnPoint.position.y
に1.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.y
にdropHeight
を加えることで、コインの落下位置の高さを設定します。
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を作成してそれを使用してもかまいません。
これで、敵にダメージを与えると、コインが飛び出る機能を実装できました。
今回はここまで。
<以前の記事>