Unityに関連する記事です

 空中に床を設置し、キャラが移動できるようにします。また、床とキャラの制御も行います。


<実行動画 ゞ中床の移動に合わせてキャラも移動する>
https://gyazo.com/29c5f93f884d36e584f54f0916339d24


<実行動画◆_萍務阿砲魯ャラはついていかない>
https://gyazo.com/ea46c86fe90b03f3488ece1247d74c46


<実行動画 空中床を離れたら、今までと同じように移動や空中浮遊ができる>
https://gyazo.com/5b4ad5eaf1c4e99bc451ebd65eed04d9


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

手順11 −床の設置・移動−
16.空中床を設置する
17.スクリプトを使って、空中床を画面端に向かって移動させる
18.キャラの位置を床の移動に合わせる



新しく学習する内容


・SetParentメソッド
・Tagの設定


14.空中床を設置する

設計


 強制スクロールに合わせて画面の右側から左側に向かって移動してくる空中床のゲームオブジェクトを作成します。

 スタート地点として作成した地面用の Ground_Start ゲームオブジェクトを複製することで、空中床を作成します。
つづいてスクリプトを作成して画面の移動を行うように制御をします。


Ground_Start ゲームオブジェクトを複製する


 ヒエラルキーにある Ground_Start ゲームオブジェクトを選択して右クリックをしてメニューを開き、Duplicate を選択します。
ヒエラルキーに新しく Ground_Start(1) ゲームオブジェクトが作成されます。


ヒエラルキー画像



Ground_Start(1) ゲームオブジェクトの名前を AerialFloor_Mid 変更する


 Ground_Start(1) ゲームオブジェクトを選択し名前を AerialFloor_Mid に変更してください。

 地面用のゲームオブジェクトを複製しているので、地面としての役割は備わっています。
Layer が Ground であり、子オブジェクトがコライダーを持っているため、そのまま利用が出来ます。

 親オブジェクトである AerialFloor_Mid ゲームオブジェクトはそのままで問題ありませんので、次に子オブジェクトの設定を行います。


AerialFloor_Mid ゲームオブジェクトの子オブジェクトを設定する


 AerialFloor_Mid ゲームオブジェクトの子オブジェクトに位置が、Ground_Start ゲームオブジェクトのままになっているため
このまま利用をすると、親であるゲームオブジェクトとずいぶんと離れた位置で子オブジェクトが配置されている状態になっています。

 実際に、親オブジェクトである AerialFloor_Mid ゲームオブジェクトをSceneビューの中で動かしてみましょう。
親は画面の中央にあるのに、子オブジェクトが画面の左下にあるため、Ground_Start ゲームオブジェクトとは利用方法が異なるため、このままでは扱いにくいです。


<検証動画 親と子オブジェクトの位置関係の確認>
https://gyazo.com/efbbab04aead781e973c3d4d32c130a9


 まずは最初に4つの子オブジェクトの位置を初期位置に戻します。ヒエラルキーで子オブジェクトをまとめて選択して、
Transform コンポーネントの Position の値を (0, 0, 0) に入れ直してください。すべてのゲームオブジェクトが親オブジェクトの位置になります。


<手順動画 複数のゲームオブジェクトの位置情報をまとめて同じ値に変更する>
https://gyazo.com/a1318df372a08147e54369b6560d731d

 
 子オブジェクトがすべて親ゲームオブジェクトの位置に移動したはずです。
 ここから、4つのゲームオブジェクトを順番にずらして並べてください。今回は、左側を軸に、右側に並べています。


Sceneビュー画像



<手順動画 子オブジェクトをずらして並べる>
https://gyazo.com/103d2be51d602d40bd48d3f3e180dee9


参考用 各オブジェクトのインスペクター画像












 以上の手順で空中床のゲームオブジェクトの作成は終了です。
親オブジェクトである AerialFloor_Mid ゲームオブジェクトを選択して、まずはスタート地点の横に並べて設置してください。


<手順動画 空中床をスタート地点の横へ並べる(子オブジェクトではなく、親オブジェクトである AerialFloor_Mid ゲームオブジェクトを操作する)>
https://gyazo.com/fe3a89f5bcc090490be7c158952f2491


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


 ゲームを実行して動作を確認します。スタート地点から空中床へ移動してください。
その地点でバルーンを生成したり、バルーンがない間はジャンプできないことを確認してください。


<実行動画 バルーンがない間はジャンプできない>
https://gyazo.com/20200a056b265d0c4e15becf7cfea771


<実行動画 バルーンを生成できる = 地面としての判定が取れている>
https://gyazo.com/4fedd3327a636fb1435f01f7eee17eba


 無事に確認が取れましたら、画面内の自由な位置に空中床を移動させてください。ゲームを実行して、空中床まで浮遊して移動してみましょう。


15.スクリプトを使って、空中床を画面端に向かって移動させる

設計


 空中床を配置しましたが、ゲームを実行しても現在はまだ停止しています。


<実行動画>
https://gyazo.com/0bc28ead413011cbce891b4130ecc38b


 背景画像はスクロールしていますが、空中床のゲームオブジェクトにはその制御がありませんので、ゲームを実行しても最初の位置から移動せず停止している状態です。
これを背景画像と同じように画面の右側から左側へと移動するように制御することで、強制スクロールゲームとして成立させましょう。

 新しくスクリプトを1つ作成し、このスクリプトによって、ゲームオブジェクトを画面の左側へと移動させる制御を行います。
これを空中床のゲームオブジェクトにアタッチすることによって、空中床を移動させます。


MoveObject スクリプトを作成する


 スクリプトはその内容に応じて、専用的なものと、汎用的なものに分類できます。
例えば、PlayerController スクリプトは、キャラの移動や、バルーンの生成などを行うため、キャラ専用のスクリプトと言えます。
そのため名前も PlayerController という、名称だけで、どのゲームオブジェクトにアタッチされているかがわかる名称になっています。
 
 今回作成するスクリプトは、アタッチするゲームオブジェクトに対して移動の制御する、というものです。
空中床のゲームオブジェクトにアタッチすることで、空中床を移動させることもできれば、例えば、別のゲームオブジェクトであっても、
このスクリプトをアタッチすることで同じ制御を行うことが出来ます。このようなスクリプトは汎用的なスクリプトであると言えます。

 当然、PlayerController スクリプトも自由にゲームオブジェクトにアタッチすることはできますが、キャラのような振る舞いをさせたいゲームオブジェクトは他にはないでしょう。

 ゲームオブジェクトがアタッチされているコンポーネントによって振る舞い・役割を決定して作成していくのと同じように、
スクリプトにもその内容によって、ゲームオブジェクトの振る舞い・役割を決定していく要素があります。

 今回のスクリプトのように、アタッチしたゲームオブジェクトであればどれでも制御する、という目的のスクリプトについては、
その汎用性を考えて、特定の名称ではなく、汎用性が分かる名称にしておきます。


MoveObject.cs

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



MoveObject スクリプトを AerialFloor_Mid ゲームオブジェクトにアタッチして設定を行う


 MoveObject スクリプトを作成したらセーブを行い、AerialFloor_Mid ゲームオブジェクトにドラッグアンドドロップしてアタッチします。


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



 AerialFloor_Mid ゲームオブジェクトを選択し、インスペクターを確認します。
public 修飾子の情報がインスペクターに表示されますので、こちらの値を設定します。

 ポイントは、背景画像のスクロール速度よりも早くなるように大きな値で設定を行うことです。
そのように設定することによって、空中床の移動の速度の方が背景画像のスクロールの速度よりも早くなれば、2Dゲームではありますが、遠近感を演出することが可能になります。

 そういったことを考えて設定を行うことが、ゲームの見せ方・演出の1つとして、非常に重要な要素になります。
今回は 0.01 で設定します。

 
back ゲームオブジェクト インスペクター画像(ScrollSpeed の値を参考にする)



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


 
 以上で設定は完了です。


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


 設定が完了しましたので、早速ゲームを実行してみましょう。


<実行動画 スクリプトによって床が移動する>
https://gyazo.com/89fc6c1c056c157a95bc56a185e74693


 背景のスクロールと相まって、非常によい感じで空中床が移動をしていることがわかります。
また、ゲーム画面から空中床が消えてしばらくすると、if文による位置情報を判定基準とした制御により、自動的に空中床が破棄されます。


<実行動画 特定の位置まで移動すると破棄される>
https://gyazo.com/aad8491bc90ce93c72786daa3ec64284


16.キャラの位置を床の移動に合わせる

問題点と改善案


 ゲームを実行し、キャラを空中床に移動してみてください。何か、違和感を感じませんでしょうか。


<検証動画>
https://gyazo.com/e439ac9d242b6e87f5791bf976ae0d20

<検証動画>
https://gyazo.com/9f2709babaef5e1879bf8f2cbe1f7893


 空中床は画面の右側から左側に移動していくのですが、キャラは床に乗ったそのままの位置から動きません。
本来であれば床の上に乗っている訳ですから、床の動きに合わせてキャラも画面の左側に一緒に動く方が自然な挙動になるでしょう。


<検証動画 理想図>
https://gyazo.com/c8747a4c83dbe982f81493245cd63094


 このような挙動になるように、問題点を改善していきます。

 考え方としては、移動している床と同じ方向に、同じ速度でキャラも移動させることが出来れば挙動しては問題はなくなると思います。
それを一連の処理として、床にいる間だけ、挙動を制御するようにスクリプトの中に組み込んでもいいでしょう。

 今回は別の方法でアプローチを行います。

 Unityのゲームオブジェクトには親子関係があります。
空中床のゲームオブジェクトですが、親のオブジェクトがあり、そこに子のオブジェクトが4個存在しています。


<親子関係>



 このとき、子のオブジェクトの動きを考えてみてください。親オブジェクトにしか MoveObject スクリプトはアタッチされていませんが
一緒に子のオブジェクトも同じ方向に移動を行っています。これは、子であるオブジェクトは、親の位置情報に対して自分の位置を設定する、という相対的な座標情報を用いているためです。

 この親子関係を利用して、空中床に乗っている間だけ、一時的にキャラと空中床の子オブジェクトとを親子関係にし、
キャラを空中床の子オブジェクトの子オブジェクト(空中床を親とした場合、孫にあたる状態)として制御するようにします。


<空中床に乗っている場合のヒエラルキー画像 Yuko_Player ゲームオブジェクトが子オブジェクト(AerialFloor_Mid ゲームオブジェクトから見て孫)になっている>



 親子関係を構築することにより、キャラは自分の親であるオブジェクトの移動に合わせて一緒に移動(位置情報の更新)を行います。
つまり、空中床と同じだけ移動するようになります。


<検証動画 親子関係での子・孫オブジェクトの移動>
https://gyazo.com/ac5c6a478acb567ea907cd0593654824


 キャラが空中床を離れた際には、この親子の関係を解消します。
こうすることで空中床に乗る前の状態に戻り、今までと同じように、キャラを中心として移動を行うことが出来るようになります。


 この一連の処理は新しくスクリプトを作成して制御を行うようにします。
キャラが空中床に接触したか、あるいは離れたか、という接触判定については、子オブジェクトの持つ BoxCollider2D コンポーネントを利用して判定を行います。
そのため、作成したスクリプトは、4つの子オブジェクトすべてに1つずつアタッチする必要があります。

 また接触判定には Tag 機能を利用します。これは接触したオブジェクトの情報を取得する際に役立ちます。
頻繁に接触の判定を行う必要があるため、キャラのゲームオブジェクトに Tag を設定しておくことで、ゲームオブジェクトの特定をしやすくします。


ParentSwitcher スクリプトを作成する


ParentSwitcher.cs



ParentSwitcher スクリプトを、AerialFloor_Mid ゲームオブジェクトの各子オブジェクトに順番に1つずつアタッチする


 ヒエラルキーにある AerialFloor_Mid ゲームオブジェクトの4つの子オブジェクトに、作成した ParentSwitcher スクリプトをドラッグアンドドロップしてアタッチしてください。
親である AerialFloor_Mid ゲームオブジェクトはコライダーを持っていませんのでアタッチする必要はありません。


子オブジェクトの各インスペクター画像












<SetParentメソッド>


 Transformクラスの持つメソッドの1つです。
この命令を行った Transform を持つゲームオブジェクト(今回はキャラ)に対して、引数で指定した Transform を持つゲームオブジェクト(今回は床役のゲームオブジェクト)を親として設定します。
また親子関係を解消するには引数に null を指定します。親子関係を解消すると、解消されたゲームオブジェクトは親を持たない通常のゲームオブジェクトになります。
(ヒエラルキーで確認するとわかりやすいです)


  // 接触しているゲームオブジェクト(キャラ)を、このスクリプトがアタッチされているゲームオブジェクト(床)の子オブジェクトにする
  col.transform.SetParent(transform);


  // 接触状態ではなくなった(離れた)ゲームオブジェクト(キャラ)と、このスクリプトがアタッチされているゲームオブジェクト(床)の親子関係を解消する
  col.transform.SetParent(null);

参考サイト
Unity公式スクリプトリファレンス
Transform.SetParent
https://docs.unity3d.com/ja/current/ScriptReferenc...


Yuko_Player ゲームオブジェクトを Tag を設定する


 ヒエラルキーから Yuko_Player ゲームオブジェクトを選択し、インスペクターの名前の左下にある Tag の設定を変更します。
左クリックすることでプルダウンメニューが表示されますので、Untagged(Tag なし)の状態を Player に変更してください。


<手順動画 Tagの設定>
https://gyazo.com/65b53f7925891510edd088fa289da74f


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



 以上で設計は完成です。


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


 ゲームを実行して、想定している挙動になっているかどうかを確認していきます。
下記の動画のようになっているか、3つのポイントを確認してください。


<実行動画 ゞ中床の移動に合わせてキャラも移動する>
https://gyazo.com/29c5f93f884d36e584f54f0916339d24


<実行動画◆_萍務阿砲魯ャラはついていかない>
https://gyazo.com/ea46c86fe90b03f3488ece1247d74c46


<実行動画 空中床を離れたら、今までと同じように移動や空中浮遊ができる>
https://gyazo.com/5b4ad5eaf1c4e99bc451ebd65eed04d9


 ヒエラルキーを確認して、キャラと床のゲームオブジェクトに親子関係が構築されている場合と、解消されている場合の違いを見ておいてください。
しっかりとスクリプトによって制御が行われていることが分かります。

 このようにゲーム画面やヒエラルキーによって確認が可能な処理については常に目を配っておきましょう。
万が一、不具合やエラーが発生した際に、どういった挙動であるか、どこで処理が動いているかを把握していればエラーの特定と解決が早くなります。


通常の状態のヒエラルキー



空中床に乗っている場合



空中床に乗っている場合のヒエラルキー



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

 次は 手順12 ーゲームオブジェクトの自動生成処理の実装ー です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

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

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

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

private



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

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