今回はスマホ向けにunity3Dで開発するさいにバーチャルパッドを使って動かすためのシステムをつくっていきます。
完成イメージ
・画面上のバーチャルpadを動かせばplayer(茶色のキューブ)が動く
・ボタンを押してジャンプなどの動作を行う
InputSystemを導入する
これらの機能を使うためにはunityが出している[inputsystem]をインポートしなければいけません。
インポートの手順は次の通り
1.[window]→[Package Manager]を開きます
2.[Packages ]の部分を[Unity Resistry]に変更します
3.下の方へスクロールすると[Input System]があるのでこれをインポートします。するとなにか聞かれるのでとりあえずNoでダイジョブです。一応補足すると
既存のボタンシステムを使う方→No
既存のボタン入力システムを使わない方→Yes
4.[Edit]→[Project Setting]を開き、
[Player]の中の[Other setting]からActive Input Headingを”Both”へと変更してください。(既存のボタンシステムと併用)
これでInput Systemの導入が終わりました。
ボタンを作ってみる
まずは[Hierarcy]にButtonを配置します。
1.配置したボタンに[On-Screen Button]をアタッチしてください。Input Systemが導入できていればあるはずです。
既存のButtonのアタッチはそのままだとバグの原因になるので使ってないなら消しちゃいましょう。
2.Control Pathというところに今回は[A(Key board)]を指定します。これでこのボタンを押す=A(keyboard)を押す。ということになります。
このままではAになんの機能もないので実際にAにjumpする機能を付けていきたいと思います。
物体をjumpさせる
まずはplayerにあたる茶色いキューブと、地面にそれぞれ[rigidboy]と[box collider]を付けていきます。地面はrigidboyから重力をoffにして落ちない様にしてあげてください。また、回転を防ぐために[rigidboy]のconstrainsをすべてxyzのチェックをつけてあげましょう。
1.地面のTagを”Ground”にする。
タグがない場合はAdd Tagから[+]をおして”Ground”と入力して追加してあげましょう。
2.キャラクターがAを押したらjumpするコードを記述する。
playerに次のコードをアタッチしてあげます。
using UnityEngine;
using UnityEngine.InputSystem;//これを忘れない様に気を付ける
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
private bool canJump = true; // ジャンプ中かどうかのフラグ
private void Start()//rigidboyの情報を取得
{
rb = GetComponent<Rigidbody>();
}
private void Update()
{
// 現在のキーボード情報
var currentkey = Keyboard.current;
// キーボード接続チェック
if (currentkey == null)
{
// キーボードが接続されていないと
// Keyboard.currentがnullになる
return;
}
// Aキーの入力状態取得
var aKey = currentkey.aKey;
// Aキーが押された瞬間かどうか
if (aKey.wasPressedThisFrame)
{
// Aキーが押されたらjump関数を呼び出す
Jump();//↓の水色の関数を実行
}
}
private void Jump()//jump関数の定義
{
if (rb != null && canJump)
{
rb.AddForce(Vector3.up * 10f, ForceMode.Impulse); // ジャンプの力を加える
canJump = false; // ジャンプ中に設定
}
}
private void OnCollisionEnter(Collision collision)
{
// 地面に着地したらジャンプ可能
if (collision.gameObject.CompareTag("Ground"))//Tagが"Ground”のときだけ。
{
canJump = true;
}
}
}
いろいろと処理を書きましたが。緑のハイライトの部分でAがおされたらjumpという処理を行っています。それ以降は、地面に設置していないとジャンプできない様にするためcolliderが”Ground”tagとぶつかっているかどうかを判定している関数です。
これでUI上のButtonを押すとAを押したことになるはずだったのでjumpできるようになります。もちろん、Aを直接入力しても同じです。
playerを移動させる
つぎにバーチャルパッドの作成をしていきます。バーチャルパッドはButtonではなく、Imageを作成します。Imageの下にもう一つイメージを作成し、バーチャルパッドっぽいみためにします。
以下細かい手順です。
1.Imageを作成し、「kadouhai」と名付けました。その子になるようにImageを作成し「stick」と名付けました。こっちはサイズを小さくします。
Imageを丸くするには画像右下の[Image]の[source Image]を◎を押してknobにします。
2.子オブジェクトの「stick」の方にOn-Screen Stickをアタッチします。
3.movementRangeでどのくらいの範囲動かせるか指定します。40~60の間が標準的です。
Control Pathを[Left Stick(Gamepad)]にします。
これで、バーチャルゲームパッドの入力を取得できるようになりました。
4.つづいて同様に、ゲームパッドから受け取った情報から物体を動かすとい処理をしなければいけないのでこれを先ほどのコードに追加していきます。赤色が追加したコードです。
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
private bool canJump = true; // ジャンプ中かどうかのフラグ
public float moveSpeed = 5f; // プレイヤーの移動速度
private void Start()
{
rb = GetComponent<Rigidbody>();
}
private void Update()
{
// 現在のキーボード情報
var currentkey = Keyboard.current;
// キーボード接続チェック
if (currentkey == null)
{
// キーボードが接続されていないと
// Keyboard.currentがnullになる
return;
}
// Aキーの入力状態取得
var aKey = currentkey.aKey;
// Aキーが押された瞬間かどうか
if (aKey.wasPressedThisFrame)
{
// Aキーが押されたらジャンプ
Jump();
}
// 現在のゲームパッド情報。
var currentpad = Gamepad.current;
// ゲームパッド接続チェック
if (currentpad == null)
return;
// 左スティック入力取得
var leftStickValue = currentpad.leftStick.ReadValue();
Move(leftStickValue);
}
private void Jump()
{
if (rb != null && canJump)
{
rb.AddForce(Vector3.up * 10f, ForceMode.Impulse); // ジャンプの力を加える
canJump = false; // ジャンプ中に設定
}
}
private void OnCollisionEnter(Collision collision)
{
// 地面に着地したらジャンプ可能
if (collision.gameObject.CompareTag("Ground"))
{
canJump = true;
}
}
private void Move(Vector3 direction)
{
Vector3 movement = new Vector3(direction.x, 0f, direction.y) * moveSpeed * Time.deltaTime;
transform.Translate(movement, Space.World);
}
}
これでplyaerをパッドで動かした方向に動かせるようになりました。
同じような手順でカメラの方向を右スティックに作成したりして応用が利くと思います。希望があればこれに続けて記事を書くのでコメントに残してください。
コメントを残す コメントをキャンセル