Unityでオブジェクトを操作する

Unityでキーボードを使ってオブジェクトを操作します。まず事前の準備として床だけ作っておきます。

平面を作ってその位置を0にしておきましょう。

次に動かしたいオブジェクトのプレハブを床の上になるように配置しましょう。

この状態からプレイヤーに動かすための処理を追加していきます。

重力を適用する

動かすためにスクリプトを追加する必要がありますが、地面を移動するようにするためまずは、リジットボディコンポーネントを先に追加しておきましょう。実行してみて、壁をすり抜けるようだったらコライダーを追加しておきましょう。今回はBodyなどの部品についてるコライダーでぶつかるようになっているので、コライダーの追加は行いません。

重力の追加はこれで終了です。

プレイヤー用のスクリプトを作る

ここでは、プレイヤー用のスクリプトを作っていきます。ここでは、PlayerScriptという名前でスクリプトを作ります。

プレイヤーを移動させる場合、スクリプトは、一回ではなく複数実行する必要があります。

最初にスクリプトを作成した場合には、Start()関数とUpdate()関数が、用意された状態で作成されると思います。Start()関数は、実行開始時に一度だけ呼ばれます、またUpdate()関数は、実行フレームごとに一度だけ呼ばれます。今回の目的のためには、Update()関数に処理を書いていけばよいのですが、実は処理を実行可能なタイミングはStart(),Update()だけではありません。スクリプトに自動で追加される、二つの関数以外にもいくつか処理を実行可能なタイミングが存在します。

このタイミングは、Unityの公式サイトでは、UnityEngine.MonoBehaviour – Unity スクリプトリファレンス (unity3d.com)等で、確認することができます。Unityの公式サイトの説明は、残念ながら完全に日本語化されていなかったり最新のバージョンでは、日本語の情報がなかったりすることもありますので、英語が苦手な方は、公式サイト以外にも検索すれば、Unityについて解説してあるサイトはいくつか見つかると思うので、知りたい情報は、まず検索してみましょう。

FixedUpdate()とLateUpdate()に関して、簡単に説明します。

FixedUpdate()は、固定間隔で呼ばれます。具体的には、Fixed Timestepの間隔で、呼ばれることになります。Fixed Timestepの値は、Project Settingsから変更することが可能です。どの処理をFixedUpdateで行い、どの処理をUpdateで行うのかは難しい問題ですが、あまりにも低FPSの環境では、Update関数では、オブジェクトの移動がわからないほど遅くなったり、FixedUpdateでは、多少ワープして移動しているように見えたりします。ブラウザ出力する場合には、結構影響あるので、両方試してみることをお勧めします。

LateUpdate()は、Update()の後に呼ばれ、Update()→LateUpdate()→Update()→LateUpdate()→・・・と交互に呼ばれます。

今回の処理は、Update()でもよいのですが、FixedUpdate()に書いていこうと考えています。私自身はブラウザでゲームを出力することがあり、その時、Update()関数に処理を書くと、移動しているのか全く分からないというようなことがあったためです。普通にスマホやPCに出力するのであればそこまで処理が遅くなることはないでしょうが、FixedUpdate()も試してみることをお勧めします。

入力を受け取る

プロジェクト設定の入力マネージャーで受け取る入力を設定することができます。新しく作ってもよいのですが、今回は最初から用意されている、HorizontalVerticalの入力をそのまま使おうと思います。

以下にシンプルな移動処理を記述しました。

    private void FixedUpdate()
    {
        this.GetComponent<Rigidbody>().velocity = new Vector3(Input.GetAxis("Horizontal")*3.0f, this.GetComponent<Rigidbody>().velocity.y, Input.GetAxis("Vertical") * 3.0f);
    }

ここで、GetComponent<Rigidbody>()で、操作オブジェクトに追加されているRigidbodyコンポーネントにアクセスし、そのコンポーネントのvelocityを書き換えることにより、オブジェクトを移動させています。ただし、GetComponent<Rigidbody>()に関しては、処理速度の面から考えるとあらかじめStart()関数で、変数にあらかじめ取得しておいて利用することをお勧めします。

yの要素に this.GetComponent<Rigidbody>().velocity.y としているのは、上下方向の速度を今の速度のままにするためです。入力を受け取りたい場合には、Input.GetAxis(“”)を用います。””の間に入力マネージャーで定義されている文字列を入れることによってボタンやスティックの状態を取得することができます。そのままでは速度が少し遅かったので3倍にしています。

プレイヤーにスクリプトをドラッグドロップして実行してみましょう。

きちんと動いているのですが転がっています。転がしたくない場合にはRigidbodyのConstraintsの回転を固定しておきましょう。このページでは解説しませんが、正面方向に移動する処理を入れることも考えて、Y回転に関してはチェックしません。

以上で移動処理の実装は終わりです。読んでいただきありがとうございます。次の記事では、カメラとプレイヤーの向きに依存した移動について解説するつもりです。

Unityでオブジェクトを操作する” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA