Unityに関連する記事です

 この手順ではキャラの姿勢を変更する処理を実装します。
最初にキーボードを利用して姿勢の変更処理が動作するかを確認し、その後、画面にボタンを設置して、そのボタンから姿勢の制御を行えるようにします。

<完成画像>



<完成動画>
https://gyazo.com/b36a21caecf622ea47227f0b8c25fc1f


 以下の内容で順番に実装を進めていきます。

手順15 −キャラの姿勢変更の制御−
24.スクリプトを使って、キャラの姿勢変更の制御を実装する



 新しい学習内容は、以下の通りです。

 ・enum(列挙)型
 ・Rigidbody.drag 変数
 ・switch 文による分岐処理



24.スクリプトを使って、キャラの姿勢変更の制御を実装する

1.設計


 キーボードのスペースキーを操作した際に、ボタンを押すたびにキャラの姿勢を変更する処理を考えます。
姿勢の変更の処理とは、次の3つを実装を行うことを指します。

 1.enum(イーナム)型の attitude 変数の値の変更   => キャラに「姿勢」という状態を追加して変更を行います
 2.Transform の Rotation.x の値の変更            => キャラの回転情報を変更して、ゲーム画面上のキャラを回転させます
 3.Rigidbody の drag プロパティの変更            => drag(空気抵抗)の値を変更して、ゲーム画面上のキャラの落下速度を変更させます

 enum とは列挙型のことです。あらかじめゲーム内で利用する特定の値を登録しておいて、その範囲でのみ値を指定できるようにします。
ここでは、「キャラの姿勢」についての enum である AttitudeType 型を作成して運用します。
キャラの姿勢には「直滑降」と「伏せ」の2種類を用意して、それを登録しておきます。
そうすることでキャラの姿勢はこの2種類の中からのみ選択するように制御が行えます。

 実際にキャラの姿勢を変えるのは、Transform コンポーネントの Rotation の値を変更することによって制御します。
Rotation の X 軸をボタンを押すたびに操作して、キャラの角度を回転させて現在の姿勢とします。
このとき、すぐに回転角度を変えてしまうと急に姿勢を変えてしまうので、DOTween を利用して
キャラが前の姿勢から次の姿勢へとアニメーションしながら姿勢を変えるように演出を行います。


<姿勢の変更>
https://gyazo.com/b36a21caecf622ea47227f0b8c25fc1f


 キャラの姿勢が「伏せ」状態になったとき、キャラは頭と体を水平に伸ばした姿勢になります。
そのため、空気に接触する部分が増えますので空気抵抗が増えると考えられます。
そこでこれを部分をゲーム内にも反映して、「伏せ」の姿勢になったら、空気抵抗の値を変更して
落下速度を低減させる制御を加えるようにします。これにより、ゆっくりと落下しますので
プレイヤーは通過できそうにない遠くの花輪をくぐるチャンスを得ることが出来ます。

 ただしずっと「伏せ」の状態でいるのは大変ですので、一定時間後に、強制的に元の姿勢に戻します。
この部分は先の手順で実装しますので、まずこの手順ではキーボードを押すたびに姿勢を変更するように制御をします。


2.PlayerController スクリプトを修正する


 宣言フィールドには、enum キーワードを持つ AttitudeType 型を宣言して、キャラの姿勢の種類を登録します。
今回は「直滑降(Straight)」と「伏せ(Prone)」だけですが、自由に増やすことが出来ます。

 合わせて、この AttitudeType 型の変数を宣言します。こちらの変数で、「現在のキャラの姿勢」を制御します。

 また伏せの姿勢用に回転角度を設定した proneRotation 変数を用意しておいて、それを利用します。
何回か利用する値がある場合には、こうして初期化して用意しておくことで処理を記述する際に省略出来る上に、打ち間違えを防止できます。


 Start メソッド内には処理を追加して、現在のキャラの初期の姿勢を「直滑降(Straight)」に設定します。

 新しくメソッドを2つ追加して、キャラの姿勢の制御を行えるようにします。
  
 Update メソッドではキーボードからのキー入力を受け付ける処理を記述しています。

 ChangeAttitude メソッドではキャラの姿勢を変更する処理を行っています。
スペースキーを押すたびにこちらのメソッドが呼び出されて、現在のキャラの姿勢を判定値とし、姿勢を変更します。
条件の分岐には attitudeType 変数と swtich 文を利用します。

switch 文はいずれかの case 分岐の処理が実行されると break でswitch 文を抜けるため、他の case 分岐には入りません。


PlayerController.cs

 <= クリックすると開きます

 

 スクリプトの修正が終了したら、インスペクターを確認して、新しく宣言した attitudeType 変数が追加されているか確認しましょう。
enum 型で宣言した変数は、プルダウンメニューから選択が可能になっています。
Start メソッドで初期値を Straight に決定しますので、ここでの値はどれに設定しておいても構いません。


Penguin ゲームオブジェクト インスペクター画像



3.<enum(列挙)型><switch 文による分岐処理>


 C# には特定の値しか取らないデータに関して、あらかじめ登録しておいて、その範囲内でのみデータを扱うように指定が出来ます。
これを enum (読み方はいくつかありますが、イーナムが一般的です) というキーワードを利用することで作成できます。
enum をキーワードとして宣言し、その後に型名を書きます。その後、{ }ブロックの中に列挙子という形で登録したいデータを宣言します。

    // キャラの状態の種類
    public enum AttitudeType {
        Straight,        // 直滑降(通常時)  列挙子
        Prone            // 伏せ       列挙子
    }

 また enum の列挙子には日本語でも宣言できます。

    // キャラの状態の種類
    public enum AttitudeType {
        直滑降,
        伏せ
    }



 enum には代入処理を行うことで、列挙子に登録している値のみを指定して代入できます。

 // 現在の姿勢を「直滑降」に変更(いままでの姿勢)
  attitudeType = AttitudeType.Straight;

 今回はこちらの attitudeType 変数を switch 文の分岐条件に利用しています。
これは attitudeType 変数の値が現在のキャラの姿勢であるため、それを条件として分岐を作成しています。

  // 現在の姿勢に応じて姿勢を変更する
  switch (attitudeType) {

     // 現在の姿勢が「直滑降」だったら
      case AttitudeType.Straight:    <=  //  条件1

          // 処理
     
         // 処理を抜ける
          break;

      // 現在の姿勢が「伏せ」だったら
      case AttitudeType.Prone:       <=  //  条件2

      // 処理

         // 処理を抜ける
         break;

参考サイト
MicroSoft
列挙型 (C# リファレンス)
https://docs.microsoft.com/ja-jp/dotnet/csharp/lan...
SamuraiBlog 様
【C#入門】enum(列挙型)の使い方総まとめ(文字列/int/foreach)
https://www.sejuku.net/blog/50547


4.<Rigidbody.drag 変数>


 Rigidbody クラスの持つ変数に drag 変数があります。この値はゲームオブジェクトにかかる空気抵抗の値を表します。


Rigidbody コンポーネント



 現在値は 0 ですので空気抵抗はない状態です。今回追加した処理では、この値を姿勢の変更に合わせて変更しています。
その結果として、落下速度がゆっくりになるように制御が行われています。

「伏せ」の姿勢になった場合、空気抵抗の値を増加して落下速度をゆっくりにする
  // 空気抵抗の値を上げて落下速度を遅くする
  rb.drag = 25.0f;

「直滑降」の姿勢になった場合、空気抵抗の値を 0 にして落下速度を戻す
  // 空気抵抗の値を元に戻して落下速度を戻す
  rb.drag = 0f;

参考サイト
Unity公式スクリプトリファレンス
Rigidbody.drag
https://docs.unity3d.com/ja/2019.4/ScriptReference...
YTTMWORK 様
Rigidbodyで出来ることを知ろう
https://yttm-work.jp/unity_beginner/unity_beginner...


5.ゲームを実行して動作を確認する


 ゲームを実行して、ボタン操作でキャラの姿勢が変更になるかを確認します。

 今回はキーボードのスペースを押すたびに、姿勢を切り替えています。
その際、「Enum型の attitude 変数の値の変更」、「Transform の Rotation.x の値の変更」、「Rigidbody の drag プロパティの変更」の3つの項目が
それぞれ変更されているかを確認してください。


<実行動画 ボタンを押すたびに、現在の姿勢の値が変更になる>
https://gyazo.com/31f9475611de264c46a68c98f151ebf5


<実行動画 ボタンを押すたびに、Rigidbody の drag プロパティの値が変更になって落下速度が変更される>
https://gyazo.com/b36a21caecf622ea47227f0b8c25fc1f


 ※ 姿勢の変更がうまく動作しない場合には、スクリプトの見直しを行いましょう。
   スクリプトに問題がないようであれば、ペンギンのゲームオブジェクトの Animator コンポーネントの Apply Root Motion にチェックが入っていないか確認し、
  スイッチが入っていたらオフにしてください。

 
 以上でこの手順は終了です。

 => 次は 手順16 −ボタンによるキャラの姿勢変更の制御− です。
 
 次の手順では、この姿勢変更の操作をスマホアプリからも実行できるように、
画面に姿勢変更用のボタンを設置して、ボタンを押すたびに同じ操作ができるようにします。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます