今回は、UnityのスタンダードアセットのUtilityにあるAutoMoveAndRotateを使ってみたいと思います。
このスクリプトをゲームオブジェクトに取り付け、Vector3の値を指定して実行すると、そのゲームオブジェクトが時間経過と共に移動や回転をするようになります。
使い道としては何がありますかね・・・・思い浮かばない・・・。
ゲーム内のオブジェを回転させたい!といった時に使えるかもしれません(;一_一)
AutoMoveAndRotateの設置
AutoMoveAndRotateはAssets→StandardAssets→Utilityにあるので、自動で移動と回転をさせたいゲームオブジェクトに取り付けます。
Move Unit Per Secondは1秒間に動く値でVector3でそれぞれの軸を指定します。
SpaceはSelfでローカル移動、Worldはワールド移動になります。
Rotate Degrees Per Secondは1秒間に回転する値でVector3でそれぞれの軸を指定します。
SpaceはSelfでローカル回転、Worldでワールド回転になります。
Ignore TimescaleはTimeScaleを無視するかどうかです。
TimeScaleはゲームの流れのスピードで通常は1です。TimeScaleを0にすると時間計測が止まりますが、Ignore Timescaleにチェックを入れている場合はTimeScaleを無視するので、ゲーム上中断していても時間の計測をして動きを止めないようにします。
サンプルを作って動きを確認
説明だけだと解り辛いので簡単なサンプルを作成し動かしてみましょう。
Cubeを2つ作成し名前をMoveCube、IgnoreTimeScaleCubeとします。空のゲームオブジェクトを作成し名前をRotateCubeとしTransformの角度でX軸、Y軸に20を入れます、その子要素にCubeを作ります(X軸、Y軸、Z軸の角度は全て0にする)。
MoveCube、IgnoreTimeScaleCube、CubeにはAutoMoveAndRotateスクリプトを取り付けます。
次にTimeScaleを操作する為に空のゲームオブジェクトを作成し、名前をStopGameとします。
このStopGameオブジェクトにStopGameという新しいスクリプトを作成し取り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | using UnityEngine; using System.Collections; using UnityEngine.UI; public class StopGame : MonoBehaviour { // TimeScaleを表示するテキストUI [SerializeField] private Text timeScaleText; void Start () { timeScaleText.text = "TimeScale:" + Time.timeScale; } // Update is called once per frame void Update () { // マウスの左クリックでTimeScaleを変更 if (Input.GetButtonDown ("Fire1")) { // 1だったら0、0だったら1 Time.timeScale = (Time.timeScale == 1f) ? 0f : 1f; timeScaleText.text = "TimeScale:" + Time.timeScale; } } } |
マウスの左クリックをしたらTimeScaleを1と0で切り替えてUIに表示します。
TimeScaleを表示するUIのテキストを作成し、StopGameスクリプトのtimeScaleTextに設定します。
これでサンプルの作成が完了しました。
ここまで作成したサンプルの階層は
↑のようになります。
それでは実行し確認してみます。
左のCubeがMoveCube、真ん中がIgnoreTimeScaleCube、右がRotateCubeになります。
↑のようになりました。
IgnoreTimeScaleCubeはTimeScaleが0になっても動き続けていますね。
TimeScaleを0にした場合でも、Updateメソッドを呼び続けられるのでAutoMoveAndRotateの中ではゲーム開始からの経過時間Time.realtimeSinceStartupと最後にUpdateを実行した時の時間Time.realtimeSinceStartupとの差異で自前の経過時間(Time.timeScaleが0だとTime.deltaTimeも0になる為、自分で計算する必要がある)を計算しIgnore Timescaleの機能を実現しています。