ベクトルとTime.DeltaTimeを用いたコイン獲得時のアニメーション演出処理の作成

Unity 放置インフレ系クリッカーゲームの作り方 (スマホ化対応)


Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

前回はShopオブジェクトの作成と、羊パラメータの増産をして、一通り遊べる状態にできました。

前回の記事↓

羊を購入できるお店スクリプトの作成とGrid Layout Groupを用いたUI画面整形
前回は、SheepButtonを作成して、羊購入処理等を作りました。 前回の記事↓ 今回はそのSheepButtonを複数並べるためのShopオブジェクトを実装していき、一通りクリッカーゲームとして遊べる状態を目指していきます。 ...

今回はコイン取得演出の追加と、セーブ・ロードを追加して一通りの完成を目指します。


【Unity入門の森の最新ゲーム開発講座もお届け】

コイン取得演出の追加

今は売却ボタンを押すと即座に所持金に加算されています。

もちろんこれでも問題はないのですが、所持金の表示が一番上で視界に入りづらい事もあり、若干「増えている感」が薄いという欠点があります。

そのため、あくまでも演出ですが、「コインが所持金TEXTのところまで飛んでいき、金額が増える」ようにします(よく見るやつですね)

コインオブジェクトの作成

では Assets/Images フォルダ内の coin をSceneにドラッグアンドドロップして、coinオブジェクトを作成してください。
作成されたcoinオブジェクトにはCoinスクリプトを新規で追加します。

Coinオブジェクト

  • WalletTextの所へ飛んでいく(できれば最初速く、後半遅く)
  • WalletTextまで到着したら、所持金に金額を加算

としたいので、まずメンバ変数として

  • 加算する金額
  • Walletオブジェクト

を宣言しておきます。(これらは、後ほどWoolスクリプトからセットするように修正します。)

次にUpdateメソッドの中をこのように修正します。

コメントにも書いてありますが、ベクトルを求めていますね。

ベクトルの計算については

【敵の移動処理の作成2】目的地の設定とベクトルを用いた経路設計
前回(第4回)では、敵の経路を作成しました。 前回の記事↓ 第5回である今回は、その経路に沿って実際に敵オブジェクトが移動する仕組みなどを作っていきます。 どんどんタワーディフェンスらしくなってきますね。 敵(Enemy)スクリ...

でも少し触れていますが、ある地点(From)から、ある地点(To)移動するベクトルを求めるには、

var v = To – From;

2つのベクトルの引き算をしてあげればよいので

var v = wallet.transform.position - transform.position;

と、ローカル変数v今の場所からWalletオブジェクトへ移動するベクトルvを求めています。

これを、直接 transform.position += v; とすると、coinオブジェクトの位置はWalletオブジェクトまで一瞬にして移動してしまいます。

そこで、Time.deltaTime を使います。 Time.deltaTimeには「前回フレームから今回フレームまでの秒数」が入っているので、

transform.position += v * Time.deltaTime;

とすることで、「1秒間で目的地(Walletオブジェクト)にたどり着く速度で移動」という意味になります。

ただ、それだと遅すぎるのと、毎フレームローカル変数vが再計算されるので、目的地に近づくにつれて移動ベクトルvが短くなってしまい、1秒経っても辿り着かないほどの速度になってしまいます。

そのため、ある程度の速度までかさ上げをしてあげるため、適当な数値(今回は20倍にしました)をかけてあげたので

transform.position += v * Time.deltaTime * 20;

となっています。

こうして移動した後、ある程度まで近づいたら所持金を増やしたいので

v.magnitudeでベクトルの長さ=このcoinオブジェクトからWalletオブジェクトまでの距離を求めています。 ある程度より小さくなったら到着したとしたいので if文で0.5fより小さいかどうかで判断しています。( if(v.magnitude < 0.5f) )

到着していたら所持金を増やし( wallet.money += money; )

自分自身を削除しています。( Destroy(gameObject); )

ではスクリプトは保存し、UnityEditor上で、coinオブジェクトAssets/Prefabs にドラッグアンドドロップしてプレファブ化し、Scene上のcoinオブジェクトは消してしまいます

Woolスクリプト修正

次にWoolスクリプトを修正します。今のWoolスクリプトはこのようになっています。

22行目で売却処理が呼ばれたら直接walletのmoneyを増やしていますが、この箇所をcoinオブジェクトを作るように修正をしたいです。

そのために、まずcoinプレファブをInspectorでセット出来るようにメンバ変数を用意します。

次に、売却処理 Sellメソッドも以下のように修正します。

coinプレファブを複製(Instantiate)してローカル変数 coin に格納し、金額(value)と所持金オブジェクト(wallet)をそれぞれセットするようにしてあげています。

なおInstantiateメソッドに transform.positiontransform.rotateion を渡すことで、woolの位置、回転状態でcoinオブジェクトを作るようにしています。

修正したWoolスクリプト全体はこのようになります。

スクリプトの保存をし、UnityEditorに戻ります。

いつもの流れですが

  1. Sceneビューのwoolオブジェクトを選択し
  2. InspectorビューでWool(Script)のCoin Prefabが None になっているので、Assets/Prefabs の中の coinプレファブをセット
  3. woolプレファブに変更を適用したいので、OverridesApply

します。

では、プレイボタンを押して実際に確認してみましょう。

コインによる取得演出が確認できました!が、ちょっと微妙ですね。

全てのcoinオブジェクトが一斉に集まりすぎている気がします。 ちょっとばらついていた方が見栄えが良いので、もうちょっとCoinスクリプトを修正します。

Coinスクリプト再修正

修正後のCoinスクリプト全体は以下のようになります

移動待ち時間用のメンバ変数 waitTimeを用意して、Startメソッド内で0.1f~0.3fのランダムを指定しています。
これを、各Coinオブジェクトの「生成」から「移動」し始めるまでの待機秒数とし、Updateメソッド内の先頭でwaitTimeからTime.deltaTimeを引くことで、待機時間を減らしていく=すなわちカウントダウン処理のようなことをしています。

ではスクリプトを保存してもう一度挙動を確認してみましょう。

どうでしょうか、バラツキがでて、見栄えが良くなったのではないでしょうか。

副次的効果として、所持金のText表示も若干ばらついて更新されるのでカウントアップ処理をしているようにもちょっと見えます。

移動速度や待機時間などは各自好みがあると思いますので調整してみてください。

おさらいと次回予告

今回はコイン取得演出を追加しました。

ここまででゲームのメインシステムは出来上がりです。

が、まだインフレ系クリッカーゲームに必須のセーブ・ロードシステムができていません。

次回はセーブ・ロードシステムやインターフェース機能を用いたデバッグシステムの実装を行います。

PlayerPrefsを用いたセーブ・ロード処理とインターフェースを使ったデバッグシステムの開発
前回でコイン獲得時のアニメーション処理を作り、ゲームのメイン処理ができあがりました。 前回の記事↓ ですが、インフレ系クリッカーゲームは一度のプレイで完結しないため、セーブシステムが欠かせません。 ここでは、PlayerPrefs...

 


【Unity入門の森の最新ゲーム開発講座もお届け】

コメント

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