Unityに関連する記事です

ー設置型アイテムの実装ー


 この手順では、ゲーム内にアイテムを設置して、キャラと接触すると効果を発揮できるように制御を行います。
アイテムの種類は色々と考えられますが、今回はキャラを上空へと跳ね上げるアイテムを設置し、
そこにキャラが侵入した場合に、キャラを上空へと跳ね上げ(バウンドさせ)、しばらくの間、ゆっくりと降下できる制御を実装します。

 アイテムの効果がわかりやすいように、オブジェクトにはトランポリン(ジャンプ台)に見立てたゲームオブジェクトを配置します。

<実装画像 トランポリンの設置>


 ・設置型アイテム(トランポリン)の実装


<実装動画 トランポリンに接触すると上空へ跳ね上がって、ゆっくり降下できる>
https://gyazo.com/6513bf536c23c08b96ae4c0ab190c637



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

 ・DOTween.To メソッド


1.アイテムの目的


 アイテムをゲームに登場させる目的は色々ありますが、総じていえるのは、ゲームに奥行きを持たせ、取得することで有利な状況を生み出すことが出来ます。
そのため、ユーザーはアイテムを取得するために、どのように立ち回ればよいか、取得したらどうするか、という行動の選択肢に分岐を作りだせます。
 
 今回は取得すると、その場で効果が発揮されるタイプのアイテムです。キャラはバウンドし、上空へ跳ね上がってしばらくの間ゆっくりと落下するようになります。

 他にも色々なアイテムがあっていいと思いますので、考えてみていただいて、実装するためのロジックを考えてゲームに登場させてください。


2.アセットをインポートする


 トランポリン、あるいはバウンドするアイテム(ジャンプ台など)として扱うためのゲームオブジェクトを考えます。
今回は無料のアセットにマット型のゲームオブジェクトがありますので、そちらをインポートして利用します。
もちろん、別のゲームオブジェクトであってもいいですし、自作していただいても構いません。

 Meshtint Free Boxing Ring



 アセットストアへ移動して、上記のアセットの名前で検索をしてください。対象のアセットが見つかります。

Meshtint Free Boxing Ring



 このアセットをクリックするとアセットの詳細が画面に表示されますので、 画面の右側にある Add to My Assets という青いボタンを押します。




 Unityのアカウントでのサインインを求められますので、自分のアカウントを利用してストアへサインインしてください。
 
 再度ページが読み込まれて、先ほどのボタンのメッセージが変わり、 Open in Unity となりますので、またこの青いボタンを押します。
あるいは、画面の上部にウインドウが表示されて、その中に Open in Unity のボタンがありますので押します。





 自動的にUnityのエディター画面に遷移します。アセットストアのサイトは閉じてしまって問題ありません。



 エディターのPackageManagerビューが開いて、対象のアセットが表示されますので、右下にある Download ボタンを押します。

PackageManagerビュー Download



 Download が終了すると左隣にある Import というボタンが押せるようになりますので、そちらを押します。

PackageManagerビュー◆Import



 インポートするアセットの一覧がポップアップウインドウとして表示されますので、そのまま右下にある Import ボタンを押します。


Import確認のポップアップ



 待機するようにプログレス表示が出て、しばらくするとアセットのインポートが終了します。


 Project内を確認しましょう。Meshtint Free Boxing Ring Mega Toon Series という新しいフォルダが追加されていれば無事にインポートされています。


Meshtint Free Boxing Ring Mega Toon Series



 これでアセットのインポートは完了です。


3.設計


 バウンド用のゲームオブジェクトを作成して、そちらに ItemTrampoline スクリプトをアタッチして、制御を行うようにします。
また、バウンドした後のキャラの制御処理に関しては、キャラの制御クラスである PlayerController スクリプトを修正して処理を実装します。

 イメージとしては、障害物用のゲームオブジェクトの食べられる際の処理と流れは同じです。
侵入判定→メソッド実行→キャラの制御、となります。

 ・バウンド用のゲームオブジェクトにコライダーを用意し、IsTrigger に設定し、侵入判定を行えるようにする
 ・コライダーに侵入したゲームオブジェクトについては、キャラ以外は判定を行わないようにする
 ・侵入したゲームオブジェクトがキャラのゲームオブジェクトである場合、バウンドさせる処理を行うメソッドを呼び出す。

 ・バウンド処理のメソッドでは、以下の処理を上から順番に行う

 1.バウンド用のゲームオブジェクトのコライダーをオフにし、重複判定を防ぐ
 2.キャラを上方向へ移動させる(バウンド)。このとき、跳ね返る力はランダムな範囲にする
 3.キャラを回転させる(バウンドして上空へ跳ね上がっている演出)
 4.障害物用のゲームオブジェクトを破壊する(演出を考えてみましょう)
 5.☆ キャラの回転が終了してから、キャラの空気抵抗の値をバウンド用ゲームオブジェクトに設定した値に変更する
 6.☆ 空気抵抗の値を徐々に減衰させて、指定した時間後に 0 に戻す
 7.☆ キャラの姿勢が直滑降でない場合には、回転制御を行って、直滑降の姿勢に戻す

 3つある ☆ の部分については、キャラ側での制御が必要になる部分ですので、PlayerController スクリプトに処理を追加します。

 それ以外の部分については、すべてバウンド用のスクリプトに用意し、制御を行うようにします。
 
 どの部分でどのような処理が必要になるか、後程スクリプトを作成しますので、自分なりの制御の方法を考えておいてください。

 例えば、「キャラの回転が終了してから、〜」という処理は、別の考え方をすると、「キャラの回転が終了してから、次の処理が実行されるようにする」必要がありますので
以前のように、この部分はコルーチン処理を利用して一時処理を中断させる、あるいは、DOTween の OnComplete メソッドを利用する、というように、制御するための情報を元にロジックをイメージしてみましょう。

 今回の場合は、侵入したゲームオブジェクトの判定には OnTriggerEnter メソッド、そのメソッド内でキャラが侵入したと判定された場合には
バウンドさせる処理を行うメソッドを呼び出すように設定しています。そしてバウンド処理のメソッド内で、上記の番号順に処理を制御しています。
 
 「キャラの回転が終了してから、〜の」処理は、今回はコルーチンメソッドを利用していませんので、DOTween の OnComplete メソッドを利用して実装しています。

 バウンド用のゲームオブジェクトの作成と設定を行います。続いて、PlayerController スクリプトの修正、新しいスクリプトの作成の順番で実装していきます。


4.バウンド用のゲームオブジェクトである Trampoline ゲームオブジェクトを設置して設定を行う


 先ほどインポートしたアセットの中からバウンド用のゲームオブジェクトを選択して利用します。
ここでは以下のパスにあるゲームオブジェクトを利用していますが、他のゲームオブジェクトでも構いません。


パス
Assets/Meshtint Free Boxing Ring Mega Toon Series/Prefabs/Stage.prefab


フォルダ画像



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



 選択したStage ゲームオブジェクトをヒエラルキーにドラッグアンドドロップしてゲームに追加します。


ヒエラルキー画像




 名前を Trampoline に変更してください。


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



Trampoline ゲームオブジェクト Sceneビュー画像(高さが 0 であるため、水中に入っています)



 これでゲームオブジェクトの作成は完了です。続いて、設定を行います。

 ※ もしも、リングの形状でゲームオブジェクトを作成したい場合には、インポートしたアセットに部品がありますので、自作するか、
  あるいは、サンプルシーンである BattleArena シーンを開いて、その中にある完成しているリングのゲームオブジェクトをプレファブにして利用してください

  インポートしたアセットのサンプルシーンには有益や情報や、利用できるものが多く含まれています。ゲーム製作の役に立ちますので、一度は確認しておきましょう。


5.Trampoline ゲームオブジェクトの設定を行う


 Trampoline ゲームオブジェクトの設定を行います。まずは最初に、プレファブ状態を解除し、通常のゲームオブジェクトに戻しておきます

1.Transform

 次の作業を行いやすくするために、Position を (0, 80, 0) のようにして、空中に設置するようにしてください

 また大きさを調整します。Scale の値を (0.3f, 0.3f, 0.3f) にしてください
この値はゲームを実行して遊びながら適宜な大きさに変更にしてください。


Trampoline ゲームオブジェクト Transform コンポーネント



Sceneビュー画像



2.BoxCollider

 インスペクターの一番下にある Add Componet ボタンを押して、BoxCollider コンポーネントを追加してください。

 追加した BoxCollider コンポーネントを確認し、最初に IsTrigger のスイッチのチェックを入れてオンにしてください

 続いて、Sceneビュー、あるいは BoxCollider の Edit Collider の部分で、BoxCollider の大きさを変更します。
ゲームオブジェクトの大きさを基準に、下記の画像を参考にしてください。(この値である必要はありません)


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



BoxCollider Sceneビュー画像



BoxCollider Sceneビュー画像



BoxCollider Sceneビュー画像



 以上で、BoxCollider コンポーネント、および、Trampoline ゲームオブジェクトの設定は完了です。


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



 新しい変数の追加はありません。また、既存のメソッドへの修正や追加もありません。

 新しいメソッドを1つ作成します。DumpingDrag メソッドにより、キャラの空気抵抗の値を徐々に減衰させながら 0 にするように制御します。
値を徐々に減算する処理は Update メソッドを利用したり、while 文を利用しても制御できますが、今回は DOTween.To メソッドを利用しています。

 また空気抵抗の値が 0 になった際に、キャラの姿勢が直滑降の姿勢でない場合には、姿勢を戻す制御を行います。
このメソッドを、新しく作成するトランポリン用のスクリプトより呼び出して処理を行います。


PlayerController.cs

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



 スクリプトの修正が完成したら、Penguin ゲームオブジェクトのインスペクターから PlayerController スクリプトを確認します。
新しく SerializeField属性や public 修飾子で宣言している変数はありませんので、元からある各変数のアサインが外れていなければ問題ありません。


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



 次に、ItemTrampoline スクリプトを作成します。


6.<DOTween.To メソッド>


 DOTween には多くのメソッドが用意されていますが、そのメソッドでは処理が実装できないものもあります。
今回の Rigidbody クラスの持つ drag 変数もその1つで、これは、DOTween が持つメソッドでは Tween 処理ができません。

 そういったケースに備えて用意されているものが、DOTween.To メソッドです。
こちらのメソッドを利用すると、drag 変数のような、従来のメソッドに定義されていないクラス変数であっても制御することが出来ます。

DOTween.To 
(
    () => rb.drag,        // 何に(getter)
    (x) => rb.drag = x,   // 何を(setter) この x は変数なので自由に設定できる
    0,                    // 最終的な値(end value)
    3.0f                   // 最終値に変化するまでの時間(duration)
);

 処理はラムダ式で記述します。引数のオーバーロードが非常に多いメソッドですが、この4つの引数を指定すれば問題なく処理が動きます。

 今回は、空気抵抗の値である Rigidbody クラスの drag 変数の現在値を徐々に減らしていて、最終的に 3 秒後に 0 にする、という処理になります。


7.ItemTrampoline スクリプトを作成する


 新しいスクリプトを作成します。このスクリプトは、バウンド用の Trampoline ゲームオブジェクトにアタッチするためのものです。

 Scripts フォルダ内で右クリックをしてメニューを開き、Create => C# Script を選択します。名前を ItemTrampoline に変更して、スクリプトを記述します。

 このスクリプトには、バウンド用のゲームオブジェクトの制御(バウンド時の処理)、PlayerController 側の制御(キャラの空気抵抗の値を変更など)が用意されています。
どのような処理が、どのような順番で制御されているかを把握しながら、処理を記述してください。

 OnTriggerEnter メソッドを利用して、ItemTrampoline ゲームオブジェクトにアタッチされている BoxCollider コンポーネントへの侵入時に判定を行えるようにします。
どのゲームオブジェクトが侵入しても判定を行ってしまうため、花輪や水面のゲームオブジェクトについては、判定を行わないように制御し、キャラが侵入したときにだけ判定を行うようにします。

 キャラが侵入した場合には、PlayerController スクリプトを取得して、それを引数として渡して Bounce メソッドを呼び出し、キャラの制御など、一連の制御をすべて実行します。

 このスクリプトを記述する際にも、まずは最初に設計の日本語のコメントだけを書いて、プログラムは書かないでおいてください
その後、その日本語を自分なりにロジックとして考えてプログラムに直して処理を記述できるか、挑戦してみてください。
ObstacleFlower スクリプトを参考にしてみてください。


ItemTrampoline.cs

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





8.Trampoline ゲームオブジェクトに、ItemTrampoline スクリプトをアタッチして設定を行う


 作成した ItemTrampoline スクリプトをヒエラルキーにある Trampoline ゲームオブジェクトにドラッグアンドドロップしてアタッチしてください。
Trampoline ゲームオブジェクトのインスペクターより、スクリプトが正常にアタッチされているかを確認します。


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



 インスペクターから設定する値として、airResitance 変数があります。この値が、バウンド処理をして空中へ跳ね上がったキャラに適用される空気抵抗の値となります。
大きい数値ほど空気抵抗は高くなり、落下速度が低下します。最初は 50 に設定し、ゲームを実行しながら調整を行ってください。


Trampoline ゲームオブジェクト 設定後のインスペクター画像



 バウンド用のゲームオブジェクトの作成はこれで完了です。


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


 すべての手順が完成しましたので、適宜な位置に Trampoline のゲームオブジェクトを移動させてゲームを実行し、キャラを侵入させてください。
キャラが跳ね返って上空へ飛ばされて、くるくる回転すれば制御成功です。その際、キャラの Rigidbody コンポーネントの drag の値を確認し、
ItemTrampoline スクリプトに設定した airResistance の値になり、徐々に減衰して 0 になれば、こちらも制御成功です。
もしも、姿勢変更ボタンを事前に押していて、処理の途中で直滑降の姿勢になっていない限り、姿勢を直滑降の姿勢に戻します。


<実行画像 トランポリンに接触すると上空へ跳ね上がって、ゆっくり降下できる>



<実行動画 Rigidbody の drag の値を確認する>
https://gyazo.com/42b23cc34a93233219f39718f9fd2040



10.Trampoline ゲームオブジェクトをプレファブにする


 挙動に問題がなければ、今後、ObstacleFlower のゲームオブジェクトを増やしたり、スクリプトから生成させることも念頭に入れて
ObstacleFlower ゲームオブジェクトをプレファブにしておきます。

 Prefabs フォルダに ObstacleFlower ゲームオブジェクトをドラッグアンドドロップしてプレファブにします。
その後、プレファブの ObstacleFlower ゲームオブジェクトを選択して、インスペクターの一番上にある Opne Prefab ボタンを押してプレファブ編集モードにします。

 Transform の Position の値をすべて (0, 0, 0)にしておいてください。
このとき、Transform コンポーネントの Reset をかけると、設定してある Scale の値も 1 に戻ってしまうため、Position の値だけを 0 にしてください。


Trampoline ゲームオブジェクト プレファブにした際のインスペクター画像



Trampoline ゲームオブジェクト 編集モード画像



 Trampoline ゲームオブジェクトのプレファブを、自由に設置してみてください。
その場合、フォルダ役のゲームオブジェクトを作成し、その中に Trampoline ゲームオブジェクトを子オブジェクトとしていれて管理するといいでしょう。


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

 次は 発展6 ー障害物とアイテムの自動生成の実装ー です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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