Unityに関連する記事です

ーバルーンを切り離す処理の実装ー


 この手順では、バルーンを切り離す処理と、切り離されたバルーンが上空へとふわふわしながら移動していく制御を実装します。

<実装動画>
https://gyazo.com/7f6555b1f075e7aec3b5d88572f83d36


 ・バルーンを切り離す処理
 ・切り離されたバルーンをふわふわさせながら上空へと移動させる処理



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

 ・GameObject.AddComponent メソッド
 ・Rigidbody2D クラスの持つ変数をスクリプトから操作する
 ・Rigidbody2D.MovePosition メソッド
 ・Mathf.PingPong メソッド
 ・Listの使い方◆(List.Clear メソッド)


1.設計


 バルーンの管理を PlayerController スクリプトが行っていますので、こちらのスクリプトを修正して、ユーザーがバルーンを切り離せる処理を追加します。
この制御は、画面上のボタンとキーボードのキーの両方で操作を行えるようにします。
 
 ロジックとしては、バルーンが1つ以上あり、かつキャラが空中にいる間にしか切り離せない、という条件にします。
これは1つのボタンを2つの操作に利用するためでもあります。

 Detach/Generate ボタンを操作すると、条件によって、以下のように振る舞いを変更します。

 1.バルーンが1つ以上あり、かつ、キャラが空中にいる間にボタンを押す         => バルーンをすべて切り離す
 2.バルーンが最大値よりも少ない数であり、かつ、キャラが床の上にいる間にボタンを押す => バルーンを1つ生成する
 3.上記以外はボタンを押しても処理はない

 上記の日本語をロジック化して、PlayerController スクリプトを修正してみましょう。
ボタンの操作に対応するメソッドはすでに OnClickDetachOrGenerate メソッドがありますので、この中で分岐を作り、上記の2つの条件に合わせて処理を制御するようにします。

 バルーンを生成する処理にはメソッドがありますので、バルーンを切り離す処理も新しく DetachBallons メソッドを用意して、この中で切り離す処理を行うように考えます。

 また切り離されたバルーンは、現実の世界と同じように上空へ向かって上昇していくようにしたいですね。
その制御については、Ballon スクリプトを修正して、新しい FloatingBallon メソッドを作成して、処理を追加します。
こちらで、左右にふわふわしながら上昇させる制御を行いましょう。

 バルーンの制御処理については PlayerController スクリプトが Ballon 型の List ですべてのバルーンを管理していますので、
これを利用して FloatingBallon メソッドを呼び出す設計にすれば命令を出しやすいです。この管理を行いやすくするために前回 List への変更処理を行っています。

 順番としては、Ballon スクリプトを修正して処理を追加し、その後、PlayerController スクリプトを修正して処理を追加します。


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


 この実装は一例ですので、自由に実装をおこなってみてください。

 バルーンを操作するにあたり、新しく FloatingBallon メソッドと FixedUpdate メソッドを作成して、その中で制御を行います。

 PlayerController スクリプトより、FloatingBallon メソッドを呼び出して、バルーンを「切り離された」状態を作り出します。
そして、「切り離された」状態になったバルーンを FixedUpdate メソッド内で上昇させる処理を実行します。

 バルーンのゲームオブジェクトに Rigidbody2D コンポーネントを追加して、移動の制御を行うようにします。
バルーンはこのコンポーネントを持っていませんので、スクリプトから動的にコンポーネントを追加して移動処理を実行します。
追加されたコンポーネントは初期設定の状態で追加されます。そのため、重力の影響を受ける状態になっているため、それを制御して重力の影響をなくします。

 Rigidbody2D を利用した移動処理は FixedUpdate メソッド内に MovePosition メソッドを記述し、ふわふわと浮遊する処理については、Mathf.PingPong メソッドを利用します。

 ふわふわとさせる処理については、Start メソッドで実行している DOTween のループ処理と競合してしまって上手く挙動が制御できなくなるため、
最初に、DOTween のループ処理を終了させてから、ふわふわとさせる処理を実行するようにします。


Ballon.cs

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



3.<GameObject.AddComponent メソッド>


 指定したゲームオブジェクトに <クラス名> のコンポーネントをスクリプトから追加するメソッドです。
このメソッドは、追加したクラスと同じ型を戻り値として持ちます

  // Rigidbody2Dコンポーネントをバルーンに追加して代入
  rb = gameObject.AddComponent<Rigidbody2D>();

 上記の命令は、バルーンのゲームオブジェクトに Rigidbody2D コンポーネントを追加し、戻り値にも Rigidbody2D 型を持っているため、それを左辺へ代入処理しています。

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


4.<Rigidbody2D クラスの持つ変数をスクリプトから操作する>


 インスペクターで設定できる変数は、スクリプトからも動的に変更することが出来ます。今回は Rigidbody2D について設定を行っています。

 AddComponent メソッドによって追加された コンポーネントは、そのコンポーネントの初期値を持った状態で追加されます。
今回バルーンのゲームオブジェクトに追加した Rigidbody2D コンポーネントも初期状態で追加されてしまうため、
重力の設定は 1 (重力ありの状態)、FreezeRotation の設定はオフになっているので、それをスクリプトから変更して、制御するためです。

  // 重力は0にする
  rb.gravityScale = 0;

  // 回転も固定する
  rb.freezeRotation = true;

 インスペクターに見えている情報は public 情報になりますので、スクリプトから制御できることを覚えておきましょう
Unity公式スクリプトリファレンス
Rigidbody2D
https://docs.unity3d.com/ja/current/ScriptReferenc...


5.<Rigidbody2D.MovePosition メソッド>


 物理演算を用いて、Rigidbody2D コンポーネントのアタッチされているゲームオブジェクトの位置を移動させます。

  // バルーンを左右に揺らす
  rb.MovePosition(new Vector2(pos.x + Mathf.PingPong(Time.time, 1.5f), pos.y));

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


6.<Mathf.PingPong メソッド>


 数学関数を扱う Mathf クラスの持つメソッドの1つです。
Update メソッドや FixedUpdate メソッド内に記述することにより、オブジェクトをジグザグに動かすような挙動を制御できます。
今回は Rigidbody2D を利用して移動をさせているので、FixedUpdate メソッド内に処理を記述しています。

  // バルーンを左右に揺らす
  rb.MovePosition(new Vector2(pos.x + Mathf.PingPong(Time.time, 1.5f), pos.y));

 上記の例の場合、第1引数の Time.time は移動スピードを表します。また、第2引数の 1.5f は移動距離を表します。

参考サイト
Unity公式スクリプトリファレンス
Mathf.PingPong
https://docs.unity3d.com/ja/current/ScriptReferenc...
藍と淡々 様
【Unity】知って得するMathfクラス
http://megumisoft.hatenablog.com/entry/2015/08/29/...
Qiita @uroshinse 様
オブジェクトをジグザグに動かしてみる
https://qiita.com/uroshinse/items/f0a98b8e0b99c85c...


7.PlayerController スクリプトを修正して、バルーンを切り離す処理と、バルーン側の制御処理の呼び出しを追加する


 宣言フィールドに新しい変数の追加はありません。

 Update メソッドと OnClickDetachOrGenerate メソッドを修正し、新しく作成する DetachBallons メソッドの呼び出しを追加します。
 
 DetachBallons メソッドでは、バルーンを切り離す処理を行い、また切り離したバルーンの Ballon スクリプトの FloatingBallon メソッドを呼び出す命令を出し、
切り離されたバルーンが上空へふわふわと移動するように制御させます。


PlayerController.cs

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



 スクリプトの修正が終了したら、Yuko_Player ゲームオブジェクトのインスペクターを確認します。
新しい変数の追加はありませんので、アサインが外れていないか確認をしてください。


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



8.<Listの使い方◆(List.Clear メソッド)>


 Clear メソッドを利用すると、List の要素をすべて削除することが出来ます。実行すると、List の要素はなくなり、長さ(Count) は 0 になります。

  // バルーンのリストをクリアし、再度、バルーンを生成できるようにする
  ballonList.Clear();

参考サイト
SamuraiBlog 様
【C#入門】Add、RemoveでListの要素を追加、削除する方法
https://www.sejuku.net/blog/41093


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


 すべての手順が完了しましたので、ゲームを実行して、バルーンが切り離せるかどうか、順番に確認を行います。

 バルーンが1つ以上あるときに空中で、切り離しボタン、あるいは R キーを押すと、バルーンが切り離されます。


<実行動画 バルーンを空中で切り離す>
https://gyazo.com/7f6555b1f075e7aec3b5d88572f83d36



 床にいる間にはバルーンを切り離すことはできません。また、バルーンが1つのときにボタンを押すと、切り離す代わりに2つ目のバルーンを生成します。


<実行動画 床にいる間は切り離せない。バルーンが1つのときは、切り離す代わりに2つ目のバルーンを生成する>
https://gyazo.com/4752c686941c8e1903df7f9ebe8b6c4e



 切り離すのは、その時に背中にあるすべてのバルーンになります。


<実行動画 すべてのバルーンを切り離す>
https://gyazo.com/806ee668e0f7f97e3f78b20491461356



 切り離されたバルーンはふわふわと左右に揺れながら上昇していき、画面外のある程度の位置に行くと破棄されます。


<実行動画 切り離されたバルーンは画面外に行くと自動で破棄>
https://gyazo.com/ef9f9103c806e971ebf27ef99134c21c



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

 次は 発展3 −タイトル演出の追加−

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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