【第27回】timeScaleを使ってボールを加速させるUnityチュートリアル

【第27回】timeScaleを使ってボールを加速させるUnityチュートリアル

前回のチュートリアルでは、ゴルフゲームのゴールを作成し、ゲーム全体の進行を制御するスクリプトを作成しました

全体の進行を考慮するだけあって、結構なボリュームの変更でした。

このチュートリアルもいよいよ終わりが見えてきましたが、今回はボールが停止するまでの時間を早送りさせるボタンを作ります。物体のスリープまで時間がかかるので結構気になるんですよね。

プレイヤーのストレスを軽減するという視点で今回の実装を行います。

前回のチュートリアルはこちらから。

 

今回の目的

Time.timeScaleを使って、ボールが停止するまでの時間を早送りさせるボタンを作ります。

プロジェクトの準備

前回のチュートリアルで作成したプロジェクトをそのまま使います。

このページに先にたどり着いた方は、チュートリアルの初回から追っていただけるといいかもしれません。

timeScaleについて

Unity世界の時間を操作する方法として、TimeクラスのtimeScaleを変更する方法があります。

通常、Unity世界ではtimeScaleが1になっていますが、これを0.5fなどにすれば、スローモーションが実現できます。そして0にすると、なんとUnity世界の時間が止まることに。

??「ザ・ワールド! 時よ止まれ!」

逆にtimeScaleを1より大きくすれば、今回やりたい物体の運動の加速ができるはず。

と言う訳で、今回はこの機能を追加します。

ボタンの追加

まずは早送りボタンを追加するところから。以下の画像を右クリックから保存し、Unityにインポートします。

早送りボタン
早送りボタン

 

ダウンロードしたファイルはいつものように『Project』ウィンドウにインポートします。今回は[Assets] -> [Images]フォルダにドラッグ&ドロップしましょ。

ドラッグ&ドロップ
ドラッグ&ドロップ

 

インポートした『fast_forward』ファイルを選択し、インポート設定を変更します。変えるのはTextureTypeで、[Sprite (2D and UI)]を選択します。

インポート設定
インポート設定を変更

 

設定を変更したら忘れずに[Apply]をクリック。

Applyを忘れずに
Applyを忘れずに

 

設定が終わるとこんな感じに表示されます。透過部分もちゃんと表示されていますね。

インポート設定後の画像
インポート設定後の画像

 

次はボタンのオブジェクトを作成します。『Canvas』オブジェクトを選択し、右クリックまたは二本指タップからコンテキストメニューを開いたら[UI] -> [Button]をクリック。

ボタンを作成シタマエ
ボタンを作成シタマエ

 

オブジェクトの名前は[FastButton]にしました。Rect TransformコンポーネントでPositionを設定する前に、アンカーの設定を行います。[alt(option)]キー+[shift]キーを押したまま、右下[bottom – right]を選択します。

アンカーの設定
[alt(option)]キー+[shift]キーでアンカー設定

アンカーの設定が終わったら、Pos Xを[-500]、Pos Yを[50]、Widthを[100]、Heightも[100]に設定します。Boostボタンの左側に来るように並べましょ。

FastButtonのTransform
FastButtonのTransform

 

Source Imageには今回インポートした『fast_forward』をセットします。

Imageの設定
Imageの設定

 

ボタン作成時に一緒に作成される『Text』オブジェクトは削除しておきます。『Text』オブジェクトを選択した状態で、コンテキストメニューを開き[Delete]をクリックします。

Textは外す
Textは外す

 

設定が終わると、画面にはこんな感じに表示されます。ちょうどBoostボタンの左側にきていますね。

早送りボタンが表示された
早送りボタンが表示された

 

早送り機能の追加

timeScaleを変更するのはスクリプトから。

なので、またしてもスクリプトを編集していきます。

方針は、

  • ボタンを押している間は早送りにする
  • ボタンを離したら通常のスピードにする
  • ボタンはいつでも押せるようにする
  • スピードは『Inspector』ウィンドウから調整したい

かな。これを盛り込んで、新しくスクリプトを追加しました。『Project』ウィンドウから『Scripts』フォルダを開き、コンテキストメニューの[Create] -> [C# Script]を選択します。

スクリプトを作成
スクリプトを作成するのだポッター

 

作成されたスクリプトは『FastForward』としました。

FastForward
FastForwardができた

 

このスクリプトをエディタで開いて編集しましょ。今回は新規スクリプトなので全文をここに掲載。

一通りざっくりと解説を。

メンバ変数には『Inspector』ウィンドウから調整できるscaleと、ボタンが押されているかのフラグを用意しています。

Update()から呼んでいるCheckTimeScale()は時間のスケールをセットしています。ボタンが押されていればTime.timeScaleにscaleの値をセットし、そうでなければ通常のスケールをセットしています。

SphereBoosterと同じように、ボタンを押された時のイベントと、ボタンが離された時のイベントを用意し、EventTriggerで呼ぶようにしています。

各イベントの内容は単純で、isButtonPressedのフラグをtrueまたはfalseにセットしています。外から呼ぶのでpublicを忘れずに。

……前回の鬼のようなスクリプト更新を乗り切った後だと、ボーナスステージのようですね。

EventTriggerの設定

スクリプトを保存してUnityに戻ったら、スクリプトのアタッチとEventTriggerの設定を行います。『FastButton』オブジェクトを選択し、[Add Component] -> [Scripts] -> [FastForward]をクリック。

スクリプトのアタッチ
スクリプトのアタッチ

 

一緒にEventTriggerコンポーネントもアタッチします。[Add Component] -> [Event] -> [EventTrigger]をクリック。

EventTriggerのアタッチ
EventTriggerのアタッチ

 

EventTriggerコンポーネントでは、PointerDownイベントとPointerUpイベントを拾います。[Add New Event Type]から[PointerDown]を選択して設定用フィールドを追加します。

PointerDownを追加
PointerDownを追加

 

同じく[Add New Event Type]から[PointerUp]を選択します。

PointerUpを追加
PointerUpを追加

 

続いて呼び出すメソッドの設定をします。[+]ボタンを押して設定項目を表示したら、オブジェクトフィールドに『FastButton』オブジェクトを設定します。

ドラッグ&ドロップ
ドラッグ&ドロップ

 

PointerDownではFastForward.csのOnPressedFastButton()を設定し、PointerUpではOnReleasedFastButton()を設定します。

メソッドを設定
メソッドを設定

 

Buttonコンポーネントの設定

あとは細かい点ですが、Buttonコンポーネントでボタンが押された時の色を変更します。今ボタンを押していることが分かるようにしたいんですよね。

なのでPressed Colorの項目で[80FFFFFF](水色)を選択します。

ボタンを押した時の色を変更
ボタンを押した時の色を変更

動作確認

んじゃ確認しましょ。『Inspector』ウィンドウからscaleを[3]にして実行しています。

空中で早送りボタンを押しており、通常より早くボールが停止します。

ボール自体の運動に影響はなく、時間のみが早くなっています。

また、timeScaleが影響しているのは物理演算で、メーターの上下には影響を与えていない点にも注目。メーターの上下にはTime.deltaTimeなど、Timeクラスを使った計算が入っていないので、timeScaleの影響を受けていません。

 

これで止まるまでの時間を待つストレスが軽減されるかな。

あとは、落下時にすぐ元の位置に戻っている所にちょっと演出を加えてみましょうか。具体的には、カメラの動きを止めて、ボールだけが落ちていくイメージ。『ミス』と画面に表示するのもあったほうがいいかも。

それが終わったら、ゲームをビルドしてみて、チュートリアルの総まとめ。なのであと3回でこの初心者向けチュートリアルが完了です。

まとめ

今回は、ボールの動きを早送りする機能を追加しました。

単純にボールが止まるのを待つのはストレスがたまるので、プレイヤーが操作できる箇所を増やすのも大事だと思います。

次回は落下時の動作について演出を加えてみましょ。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?