【cluster】Logic使ったゲームワールドを作ろう パターン編2
Cluster Creator Kit Advent Calendar 2020の5日目の記事です。
(※この記事は「パターン編2」です。よくあるLogicのパターンとかを説明します。「準備編」「本編」ほど丁寧な解説ではないです。。。)
できたワールド
この記事は12/5に書いたのですが、12/14にこの記事のワールドをclusterにアップロードしました。
PlayerLocalUIつかったワールド
↑こちらからどうぞ。
ダウンロードして改変できます
Googleドライブ - 改変できるUnityプロジェクト本体
↑こちらからダウンロードしてください。改変OK。
こういう画面になったら、右上の赤くマルをしたとこのボタンでダウンロード
こんな画面になることもありますが、構わず「ダウンロード」ボタンを
導入方法
zipファイルを解凍 → 解凍したフォルダをUnityで開いてください。
その他
無事Unityで開けても最初はカラのシーンが表示されるんで、↑の画像の場所にあるGameSceneを開いてください。
この記事で作るのは……
ここまで使っていなかったPlayerLogic
、GlobalLogic
を使ってみましょう。
さらに、ワールドの中にUIがあるんじゃなくて、フツーのゲームみたいにHPとかが画面の固定された位置に表示されている新タイプのUIも作ります。
長丁場になるんで、まずは流し読みして、ジワジワと進んでいくといいです。
- ボタンを押すとゲームスタート
- Playerはトゲに当たるとダメージを受け、HP0になるとスタート地点に戻される
- 薬をとると、Playerはスピードアップする
- ワールドにあるボールを全部とるとクリア。ボールを取るのは誰でもいい(複数人プレイ対応)。
ゲームの中身は↑って感じです。
まずはモノを作る
トゲ(Toge)、薬(Kusuri)、ボール(Boru)を用意します(ボタンは後で)。
Unity Asset Storeで何か無料のを探してくると良いでしょう。
ちなみに、モノを配置したときPrefabになっている(水色で表示される)なら、
これのTogeとか
UnpackPrefabCompletelyをして、PrefabではなくしておくとUnityからゴチャゴチャ言われることが減るので良いです。
右クリックでこれを選びます
トリガー・ギミック・Logicをつけていく
つけるモノはこんな感じ。
SetGameObjectActiveGimmick とは
SetGameObjectActiveGimmick
は、表示させたり消したりするギミック。
なお、このギミックはSignal
ではなくBool
のメッセージを送るというちょっと変わったスタイルになっています。
Bool
でONを送れば表示される。OFFを送れば消える。
だから、OnCollideItemTriggerから送られているKusiriHyojiとBoruHyojiとTogeHyojiはBool
になっているわけです。
コライダーとか
さて、もしToge・Kusuri・BoruにBoxCollider
とかのコライダー(当たり判定)が付いていなかったら付けましょう。
そうしないと、OnCollideItemTrigger
が発動しませんからね。
このとき、MeshCollider
は重いのでオススメできません。Box(箱)かSphere(球)かCapsule(カプセル型)で十分です。
コライダーのサイズは適当に調整しましょう。
「1人称視点」でプレイしている場合、かなり近づいたつもりでもアイテムに当たらないことがあるのでいくらかサイズを大きくしたほうがいいかもしれません。
そして、RigidBody
からUseGravity
をOFFに。
コライダーのIsTrigger
をONにします。
今のclusterだと……
今のclusterだと、IsTrigger
がOFFのオブジェクトがPlayerに当たってもUnity上だとトリガーが発動してくれないっぽいのです……
clusterにアップロードしてプレイすると大丈夫なんですけどね。
Globalから呼ばれるItemLogic!
さて、Kusuri・BoruにはItemLogic
がついてます。これは前回もありましたが……
今回はTarget
がGlobal
になってます!
再掲。Global
は初めてですね
やりたいことは、「ゲーム開始時に全てのクスリとボールとトゲを表示させる」です。
これがどうやって呼ばれるのかは、また後で説明します。
アイテムをPrefabにする
さて、Toge・Kusuri・BoruをPrefabにしましょう。
Prefabにするやり方は、[cluster公式の的当てゲーム]((https://creator.cluster.mu/2020/06/11/howto_shootinggame/)の弾と全く変わりません。
その後で、ワールドに好きなようにコピペしてステージを作ってみましょう。
ただ、Boruの数は10個にしておいてください。
こんな感じにしました
なお、変なアイコンがアイテムについていて見づらい場合は、上のほうにあるGizmos
ボタンをクリックするとスッキリして見やすいかもしれません。
そして、アイテムを非表示に!
配置が済んだら、ぜんぶアイテムを非表示にしてしまいます!
ゲーム開始ボタンを押したら、それが全部表示されるという仕組みにするからです。
こんな風に
ボタンを作る
次はゲーム開始のボタンを作ります。今回はCylinder(円柱)を太め・低めの形にしただけです。
これはワールド内に1つだけなんで、Prefabにする必要はありません。
中身はこんな感じ!
クリックするとゲーム開始のメッセージを送り、ボタン自体は非表示にします(で、ゲームが終わったらまた表示)。
Kanri系のオブジェクトを作る
つづいて、Kanri系のオブジェクトを作ります。
これは、Logicとかだけ付けたEmptyObject
(カラッポのオブジェクト)です。
こうやってメニューから作ればOK
GemuKanriを作る
まずはGemuKanri。ゲーム開始時、終了時の処理を担当します。
あまり大したことはしてないですが。
中身はこんな風になっています。
ゲーム全体を管理するんで、GlobalLogic
ばかりついていますね。
これまでのようにItem
ごとに変数とかを保存するんじゃなく、Global
というゲーム全体を仕切っているトコに変数を保存したりメッセージを送受信したりします。
PlayerKanriを作る
つぎはPlayerKanriです。
ここにはPlayerLogic
やPlayerTimer
を書きます!
初めてですね。
作り方はGemuKanriと全く同じ、EmptyObject
を作ってLogicとかをつけていきます。
中身はこんな感じ。
さらに、ちょっと長すぎるのでクスリに関する処理は分けてPlayerKanri2を作りました。
PlayerLogic
を使っているので、Playerごとに保存されたHPや速さを使って色々できるわけです。
OnJoinPlayerTrigger
は、プレイヤーがワールドに入ったときに呼ばれるトリガーです。すでにゲームが始まった後に誰かが入ってくるとその人のHPや速さの初期化がされないので、このトリガーも入れました。
:::message:::
最初はPlayerLogic
ってどこに書けばいいの? って思うかもしれませんが、適当なEmptyObject
を作り、ソコにつけておけば問題ありません。
:::
OtoKanriを作る
さて、音についても管理しましょう。
といっても、OtoKanriはゲームスタート・終了のLogicが入っているだけのEmptyObject
。
その子もEmptyObject
で、AudioSource
とPlayAudioSourceGimmick
のセットが5つ入っているだけですが。
こんな構造
ならす音もAudioSource
から適当に選んでおきましょう。
Togeなら痛そうな音、KusuriやBoruなら嬉しそうな音がいいですね。
BGMOtoだけ、AudioSourceのLoop
をONに。ParameterType
をBool
にしときましょう(再生・停止ができるようになります)。
PlayerLocalUIを作る
今回の本題ですかね?
つい最近clusterに加わったばかりのPlayerLocalUI
を作ります。
これまでのようにワールド内にLVとかHPバーが表示されているんじゃなくて、フツーのゲームみたいに「常に画面の左上にHPが表示」とかできる奴ですね。
ベースの作り方
まず、ヒエラルキーで右クリックして「UI」「PlayerLocalUI cluster」を選びます。
すると、こうなります
↑のようにPlayerLocalUI
というのができるんですが、その子にSafeArea
というのもできます。
このSafeArea
の子に、UIを付け加えていってください!
テキストをつけていく
SafeArea
を右クリックし、「UI」「Text」を選んでテキストを追加します。
HPとボールと速さについて、それぞれこんな風に設定
SetTextGimmick
のTarget
にLocalPlayer
があるのが新しいトコですね。
ただBoruSuujiはGlobal
なので注意。
画像をつけていく
同じように、SafeArea
を右クリックし、「UI」「Image」を選んで画像を追加します。
今回はトゲに当たったときの画像、アイテムを取ったときの「Get!」という画像を追加しています。
なおUIの画像は、Unityに読み込んだ後、↑のように「Sprite(2D and UI)」にする必要があるので気をつけて!
設定はこんな風になってます。
で、これもTogeとかと同じく非表示にしておきます。ゲーム開始時にダメージとかGetとかの画像が出てたらおかしいですからね。
SafeAreaの設定
ひととおり設定したら、SafeAreaをクリックし、「Anchor自動設定」ボタンを押します。
コレでUIの位置をいい感じに調整してくれる……はずです。
じゃあ、動かしてみよう
これで↓のように動く……はずです。
ですが、やっぱりトリガー・ギミック・ロジックとかのつけ忘れ、Key
の書き間違え、そしてすっごく多いParameterType
とかTarget
の設定ミスなどなどでヘンな動きになることも多い。
1つずつバグをつぶしていきましょう。
そもそもどういう流れなの?
今回はやることがすごく多かったんで、流れが後回しになってました。
全体の流れはこういう感じです。
ゲーム開始ボタンを押したとき
Global
のGemuKaisiメッセージが送られます。
ボタンが非表示になります。
GameKaisiが送られると |
---|
Toge・Kusuri・Boruが全部表示されます。 |
PlayerのHPや速さが初期値に戻ります。これはワールド内にいる全てのPlayerに発生します。(また、誰かが途中でワールドに入ってきたときもこれは行われます) |
Global のBoruKazu が10になります。 |
BGMがなり始めます。 |
Togeに当たったとき
そのPlayerのTogeMuteki
がOFFなら、Global
のTogeButu
メッセージが送られます。
TogeButuが送られると |
---|
痛そうな音がなります。 |
PlayerのHPが1減ります。TogeMuteki がONになります。これは1秒後にOFFになります。 |
tiという画像がしばらく表示されます。TogeMuteki がOFFになると消えます。 |
HPが0になったらSinuTaima メッセージが送られます。 |
SinuTaimaが送られると(その0.3秒後に) |
---|
そのPlayerが初期位置にワープします。 |
ダメっぽい音がなります。 |
そのとき、PlayerのHPを3に戻します。 |
Kusuriに当たったとき
Global
のKusuriButu
メッセージが送られます。
クスリは非表示になります。
TogeButuが送られると |
---|
いい感じの音がなります。 |
クスリを取ったという画像がしばらく表示されます。 |
PlayerのHayasa が+1され、実際にスピードが速くなります。 |
Boruに当たったとき
Global
のBoruButu
メッセージが送られます。
ボールは非表示になります。
(この記事の終わりにあるオマケを実装すると)エフェクトが出ます。
BoruButuが送られると |
---|
楽しそうな音がなります。 |
Global のBoruKazu が-1されます。 |
もしBoruKazu が0以下になると、Global のGemuOwari メッセージが送られます。 |
GemuOwariが送られると |
---|
BGMが止まります。 |
クリアしたっぽい音がなります。 |
Togeが全部消えます。 |
ボタンが再び表示されます。 |
その他の知識
その他の知識として……
Player関係やGlobal(Logic)について他に知っておくべきこと
よく混乱するんですが、
「Global
のメッセージをItemが受けて、そのItemに変数とか保存したい」ならItemLogic
を使い、Target
をGlobal
にします。
↑のときはGlobalLogic
は使えません。
-
PlayerLogic
からItemやGlobalに何かメッセージを送ることは今のところできないようです。 -
ItemLogic
からGlobalに何かメッセージを送ることは今のところできないようです。
この辺の制限で、地味にできないことがあります。
オマケ・エフェクトをつける
ちょっと長い上にしょぼいエフェクトなのでオマケに。
「GameObject」「Effects」「ParticleSystem」でパーティクルを作ります。
パラメータはこんな風
ポイント |
---|
DurationとStart LifeTimeは0.5くらいに |
Start Speedはいくらか速く |
Loopingさせない(重要) |
Stop ActionをDestroyに(重要) |
EmissionはRate over Timeを0にして BurstsのほうでCount30~50くらいにする |
ShapeのShapeをSphereにして、Radius Radius Thicknessを0に(実際にはRadiusは0.0001とかになります) |
Limit Velocity over LifetimeのSpeedを1くらいに、Dampenを0.1くらいに |
で、Item
コンポーネントをくっつけて、Prefabにします。
そのPrefabを、BoruにつけたCreateItemGimmick
から呼べばOKです。
まあ、Unity Asset Storeとかでエフェクト探したほうがいいとは思いますが。
これであなたもLogic初心者を脱出!
さあ、長らく書いてきましたが、これくらいのモノが作れればあなたもLogic初心者脱出と言っていいでしょう!
冬のGameJamとかにも参加して、じゃんじゃんゲームワールドを作っちゃってください!
最後まで読んでくれてありがとうございました!!
Discussion