スイカゲーム風「ベジタブルゲーム」の作り、2回目の今回は、InputSystemを使って、野菜を左右に運ぶクレーンの動きを作成します。
ユニティルーム サンプルの投稿ゲーム
2.クレーンの作成
2.1,オブジェクトの作成
Vol.01 の最後に取得した素材から「クレーン(閉)」を選択し、Hierarchy上にドラッグ&ドロップしオブジェクトを作成します。
Inspector から以下のように指定します。
❶ 名前を Crane (クレーン) ❷ Position(座標):x座標を 0、y座標を 4.5 ❸ Scale (大きさ):X Y ともに 0.2
この段階では以下のような状態になっていると思います。
2.2,InputSystemキー設定
「06_Other」フォルダの InputAction を立ち上げます。
ここに新たなActionを追加します。
❶ Acton Maps に Player を選択 ❷ Action の右側のプラスボタンをおしてActionを追加、「Horizontal」という名前に変更 ❸ Action Type に「Value」に指定
表示された Control Type を「Axis」に指定
作成したAction「Horizontal」を編集
❶ 右側のプラスボタンを押して「Add Positive¥Negative Binding」を選択
⇒ [1D Axis] が作成されます。 ❷ 右側のメニュー「Binding」 ・Path に「RightArrow[KeyBord&Mouse]」を選択 ・Positive を指定 ・Keybord&Mouse にチェック
同様に上の図の様にKeybord、Gamepad、それぞれのPositive、Negative の値を追加します。お好みのボタンを指定してください。
最後は右上の「×」ボタンを押して編集メニューを閉じます。「Save」を押して保存します。
2.3,Craneのプログラム
続いて Clane のプログラムを作成します。「02_Scripts」フォルダに CraneController というスクリプトファイルを作成します。
CraneController.cs を立ち上げて、NameSpace にInputSystemを使用するためのコードを入力します。
CraneController.cs
using UnityEngine.InputSystem;
ここでは、InputSystemからPositive、Negativeの信号を受け取るための変数と移動速度を管理する変数を用意します。
変数名 | 型 | アクセス | 説明 |
---|---|---|---|
stepX | float | private | InputSystemから受け取る値を管理 |
speed | float | private | 移動速度を管理する変数 |
変数の宣言と初期値の代入、及び Start()関数 でCraneの初期位置を指定します。
CraneController.cs
float stepX; //nputSystemから受け取る値を管理
float speed; //移動速度を管理する変数
void Start()
{
transform.position = new Vector2(0, 4.5f); //Craneの初期位置
speed = 0.05f; //移動速度に0.05を代入
}
続いてInputSystemから情報を入力する関数を用意します。
CraneController.cs
public void Move(InputAction.CallbackContext context)
{
//InputSystemからfloat型の値を取得、変数:stepXに代入
stepX = context.ReadValue<float>();
}
今回は context.ReadValue() で folat型 のデータを取得しています。このことによりPositiveに指定したキーが押されたときは +1が渡され、Negativeに指定したキーが押されたときに -1 が渡され、それぞれ 変数:stepX に代入されます。
最後は取得した値を使って FixedUpdate()関数 でCraneを左右に移動させます。FixedUpdate() を使うことで、どのデバイスでも均等の移動速度を維持することが出来ます。
CraneController.cs
void FixedUpdate()
{
//水平方向の移動
transform.position += transform.right * stepX * speed;
}
作成した「CraneController」は Crane にアタッチしておきます。
最後は InputSystem オブジェクトの PlayerInput コンポーネントの Events ⇒ Player を展開し、作成したAction「Horizontal」に Crean の CreanController、Move() 関数を指定します。
2.4 フレームの作成
落下する野菜を受け止める左右と下の壁を作成します。尚、この作品は野菜がテーマとなっているので、受け止める壁はお鍋をイメージして作成します。
まずは全体をまとめるオブジェクトを作成します。Hierarchy上で右クリック、または左上のプラスボタンから Create Empty で空のオブジェクトを作成します。
名前を「Wall」に変更し、座標を全て 0 にしておきましょう。
作成したWallの上で右クリック、2D Object ⇒ Sprites ⇒ Square から四角形のオブジェクトを作成します。
作成したオブジェクトを以下のように修正します。
❶ 名前:BottomWall Tag:Wall タグを作成しセット ❷ Transfomコンポーネント Position:x:0、y:-4、z:0 Scale:x:10、y:1、z:1 ❸ SpriteRendererコンポーネント Collor:グレー系の色 任意です ❹ BoxColliderコンポーネント 新たに追加、各プロパティは初期値のままで結構です。
作成した「BottomWall」を複製し、「RightWall」「LeftWall」 をそれぞれ作成します。
名前と座標、大きさのみ下の図のように変更します。 他のプロパティ値はそのままでOKです。
2.5 次の野菜の場所
次の野菜が表示されることにより、どこに野菜を落とすのか戦略を立てることができるようになります。その次の野菜が配置さる場所を作成しておきます。
取得済みの素材から[tray]を選択し、Hierarchyにドラッグ&ドロップ、Inspectorで次のように修正します。
名前:Tray 座標: x座標 6.8、y座標 3.5
ここまでで、以下のような配置になっていると思います。
2.6 クレーンの移動制限
上のフェーズで左右の枠を作成しましたが、野菜が枠の外や枠の上に落下しないように、クレーンの移動範囲を制限します。
上のフェーズで作成した枠の幅は2、横位置(x座標)は左右それぞれ -6 , 6 となっています。従って枠の内側の座標は -5 , 5 となっているはずです。
今回はクレーンの水平方向の移動領域を -4.7 から 4.7 にしてみたいと思います。
作成済みの CraneControllerクラスの FixedUpdate()関数 を以下のように修正します。
CraneController.cs
void FixedUpdate()
{
transform.position += transform.right * stepX * speed; //記述済み
float posX = transform.position.x; //Craneのx座標
posX = Mathf.Clamp(posX,-4.7f,4.7f); //posXを-4.7~4.7の範囲におさめる
transform.position = new Vector3(posX, 4.5f, 0); //座標を再調整
}
ここで使用した Mathf.Clamp() メソッドは、第一引数で指定した値を、第二引数(最小値)、第三引数(最大値)の範囲に収める関数です。
Mathf.Clamp(float value, float min, float max)
float型の変数:value に対し、最小値(min)、最大値(max)の間の制限を付ける
「VegetablGameの作り方」その他の記事はこちらから
ファイブボックスでは、Unityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
Comments