ゲーム作りを始めた人
WASD移動の作り方からもう分からない…。
Character Controllerとかも付けてみたけど動かないじゃん、結局スクリプトかよ。
こんな疑問にお答えします。
本記事の内容
●UnityでのWASD移動の設定方法
●WASD移動のアルゴリズム
●よくWASD移動に使われるその他のコンポーネント
この記事を書いている私は12才からフルスクラッチでゲームを作っています。
またコンパイラを専門として情報理工学の博士まで進学、中退をしており、プログラミング言語の文法にも関わる論文を書いていました。
本記事ではコピペで使える実行済みのコードと設定方法を紹介しつつ、コピペから卒業して自力で作るための考え方も説明します。
※実行環境
Unity2021.3.1f1
Windows 10
WASD移動のソースコード
とにかくまずは作ってみましょう。
理解のしやすさを第一に書いているため少しムダがありますが、最近のパソコン、C#であれば問題はないハズです。
慣れてきたら高速化にチャレンジしてみてください。
using UnityEngine; public class WASD : MonoBehaviour { //移動速度 private float _speed = 3.0f; //x軸方向の入力を保存 private float _input_x; //z軸方向の入力を保存 private float _input_z; void Update() { //x軸方向、z軸方向の入力を取得 //Horizontal、水平、横方向のイメージ _input_x = Input.GetAxis("Horizontal"); //Vertical、垂直、縦方向のイメージ _input_z = Input.GetAxis("Vertical"); //移動の向きなど座標関連はVector3で扱う Vector3 velocity = new Vector3(_input_x, 0, _input_z); //ベクトルの向きを取得 Vector3 direction = velocity.normalized; //移動距離を計算 float distance = _speed * Time.deltaTime; //移動先を計算 Vector3 destination = transform.position + direction * distance; //移動先に向けて回転 transform.LookAt(destination); //移動先の座標を設定 transform.position = destination; } }
UnityでのWASD移動の設定方法
「Assets」フォルダ直下に「Scripts」フォルダを作る
- 「Project」ウィンドウで「Assets」フォルダを選択する
- 「Assets」フォルダの余白で「右クリック > Create > Folder」
- 名前を「Scripts」に変更
「Scripts」フォルダに「WASD」スクリプトを作る
- 「Project」ウィンドウで「Scripts」フォルダを選択
- 「Scripts」フォルダの余白で「右クリック > Create > C# Script」
- 名前を「WASD」に変更
「WASD」スクリプトを編集する
- 「WASD」をダブルクリック
- エディタが立ち上がるので、サンプルコードをコピーペースト
- 「ctrl+s」などで保存
スクリプト作りとは要するに、コンポーネントを作る作業だと思ってください。
Rigidbodyコンポーネントを使うと物理演算が出来るようになるのと同じように、WASDコンポーネントを使うと操作が出来るようになる、という発想です。
動かすキャラクターを追加する
「Hierarchy」ウィンドウの余白を「右クリック > 3D Object > Cube」
「Inspector」ウィンドウで「Position」を「x:0, y:0, z:0」に設定
3Dの物体であれば何でもいいですが、Sphereなどは向きが分かりづらいので注意です。
もちろん動かしたいキャラクターや自作のキャラクターがあればここで使いましょう!
自分の作りたいものを動かした方が圧倒的に学習効率がいいハズ。
動かすキャラクターにWASDをアタッチする
- 「Hierarchy」ウィンドウで追加したキャラクターをクリック
- 「Inspector」ウィンドウ最下部の「Add Component」ボタンをクリック
- 「wasd」と入力すると先ほど作った「WASD」が出てくるのでクリック
実行して確認する
動作が確認できるハズ!
実行は「ctrl+p」と覚えておくと便利です。
WASD移動のアルゴリズム
WASDのキー入力を受け取る
UnityではInputクラスのGetAxis関数で、様々なキー入力を-1から1の間で受け取れるようになっています。
キーボードは0か1では、と思うかもしれませんが、ゲームパッドなどにも同時に対応できる設計でしょう。
今回のコードも特殊な設定をしていない限りはゲームパッドでそのまま動きます、試してみてください。
キー入力に合わせて、移動の方向を計算する
Unityでは座標や向きなどは全てVector3で管理されています。
GetAxis関数でx方向、z方向が取得できているので、そのままVector3にしてしまいましょう。
数学などでx,yに慣れているかもしれませんがUnityの3D空間はx,z平面なので、変数名も徹底して合わせることをオススメします。
最終的に向きが欲しいので、Vector3の変数normalizedで取得してしまいましょう。
参考:【コピペでUnity】ややこしい実装もVector3の標準機能でサクっと解決!
移動させる
移動距離の計算は算数で慣れ親しんだように以下のとおりです。
$$きょり = はやさ \times じかん$$
これをそのままコーディングしましょう。
ふざけているようですが、極端な話プログラミングの作業はすべてこれに尽きます。
作りたい動作を考えたら言葉で表したり計算式にして、それをコードに書きかえていく作業です。
回転させる
Transformクラスに便利なLookAt関数があるのでぜひ活用しましょう。
移動のように計算式から実装するのもよいですが、キチンと動かすためはジンバルロックなどの数学的なポイントも知っておくなど、割と予備知識が求められます。
よくWASD移動に使われるその他のコンポーネント
Rigidbody
これは物理演算を扱うコンポーネントです。
参考:【コピペでUnity】Rigidbody(リジッドボディ)の分かりづらいスクリプト制御を攻略
Rigidbodyの中にvelocityというパラメータがあるので、サンプルコードのtransoformの部分をRigidbodyのインスタンス変数に置き換えれば実装出来ます。
逆にいえばそれ以外の処理を自動化するワケではありません。
要するに基本は同じです。
Character Controller
名前から分かる通りキャラクターをコントロールしそうなコンポーネントですがその実、坂がどの程度急だと登れない判定にするかなど、当たり判定の側面が強いコンポーネントです。
もちろんキー入力を制御してくれるものでもありません。
Move関数で移動先の計算は出来ますが、それ以外は自前です。
要するに基本は同じです。
ここまで読んでいただければ、Unityでの移動の理解がかなり深まったのではないでしょうか。
結局は作りたいゲームに合わせて、必要なコンポーネントを選んだりコーディングをしていくことが大事です。
このソースから改造していくのも勉強になると思います。
今回は以上です。
ユニティちゃんはいいぞ
コメント