見出し画像

UnityのアセットFirst person narrative adventures + complete puzzle engineでゲームの作り方を覚えていくメモ

最終更新:2021/05/31 部屋の作り方、部屋のつなげ方を追記

First person narrative adventures + complete puzzle engine、というアセットがある。
(長いので以下、APと略す)
https://assetstore.unity.com/packages/templates/systems/first-person-narrative-adventures-complete-puzzle-engine-131623?aid=1101l3btI&utm_source=jppt&utm_medium20191218

リンクを見れば分かる通り、いわゆる脱出ゲームがコードレスで作れますよ、作り込みもGUIでちゃんとできますという機能とそのための素材が一通り揃ったアセット。

ツール自体は素晴らしい出来だと思うんだけど、周辺でけっこう躓いたので日記的に更新するメモを残していく。
ちなみにボクのスキル自体はクソ雑魚です。
基本はプログラマーに任せつつ、許された作業をunityで触った経験がそれなりにあるという感じ。prefabとかinstanceとかの意味は分かっている程度。

■インポート
unity2019~2020.03系色々試したけど、素の3Dプロジェクトでもインポートするときコンソールがそれなりに汚れます。いちおうちゃんと起動はできる。

・FBX Warning
直さなくても特に異常はなかったけど気持ち悪いので直しました。
import settingsはモデルごとに設定する必要があるらしいので、(拡張子ごとに一括とかあるはずだけど)
とりあえずimportしたAssetsのModelsの中のModelを一通り選んでから、以下のURLの通りにしました。で、reimport ALLしたら治った。
http://glassdice.jugem.jp/?eid=2187

・GUIDとかの黄色エラー

ツール内で新しいシーンを生成すると出る。分からん。勝手にリネームとかするとそれこそメタファイルとか大変なことになりそうなので動くうちは放置。


■マニュアル
・URLを直接指定して批判するようで大変申し訳ないんですが、unityに自信がない人は以下を見ながらやらないほうがいいです。
https://www.karvan1230.com/entry/2020/03/31/215319
これを見てアセットの購入を決めた。のだけどこれの通りにすると何故か上手くいかなかった。英語マニュアルをいい感じに端折っており作業イメージを掴む分にはいいんだけど、このアセットマニュアルが懇切丁寧。なので素直に英語を読んで順番にやろう。多分英語はほとんどできなくても図のアルファベットに沿っていけば大丈夫。

マニュアルの言うことを聞く
チュートリアルが本当に入門者向けで、positionのXYZを指定してきたりしてつい適当に飛ばしたくなるんだけども、意外と、この後に続く章の別のオブジェクトの位置と関係したりするので、ちゃんと数値を入力してあげよう。

■ビルド関係
作業自体は大したこと無いけど、これが一番待機時間かかった。
なんか変える度にリソースが変換される?ので…

・WebGLビルドのために必要なこと1
作業環境はwinなのに、見せたい人がMacなので、お互いに同じものが見れるであろうwebGLでビルドする時の障壁。
まず、そのままビルドするとunity roomsで公開するためのファイルでWebAssembly(wasm)ではなくasm.jsになってしまうのでそれを直します。
https://programming.sincoston.com/unity-build-wasm-asmjs/
0を1に治すだけとはいえGUIではなくコードの編集をしなきゃいかん。
記事の通り、おそらくこのアセットのインポートでproject settingsが書き換わっている。
これを直さずともBuild&Runはできてしまうので注意。

・WebGL~その2
Player settingでplayer>(settings for webGLタブ)>other settings>Rendering>Color space をLinear からGammaにする。
これは多分アセットと関係なくみんなやってることかな。

・そもそもWebGLを共有する場所
Google DriveからEditeyを使用する方法を試したけど上手く行かなかったので素直にUnity roomsの限定公開で共有しています。



AP自体の操作関係(以下を、ドキュメント読んでテストするごとにメモしていきます)
playボタン非推奨
unityを改造してチーム内で規格化していくとありがちな気がするんだけども、playボタンが非推奨で、tool内の専用のボタンを使うことが推奨されている。じゃないとコンソールでエラーが出るんだとか。停止はいつものボタンでOK。

作業手順を守る
ちょっとunityを触り慣れていると、マニュアルのごく一部を読んで分かった気になりガンガン進めたくなる。
しかしそうすることで後々ドアとパズルのフラグのつながりが上手く行かなくなったりするので、やめよう。
APのマニュアルの手順を覚えよう。
自力でcs開いて直すならこのアセットがモデル素材集になってしまう。

というか部分的にcsで直すと後でフラグを整理するとき絶対めんどくさいぞ。神GUIを活用しよう。

・各オブジェクトのTransform
基本的にグループ(ヒエラルキーで_grpとなっているもの)はスケールなど含めてグループごとTransformをイジるように推奨されている。
例外は、グループの子のcameraと、Action Trigger(APのw_ObjCreatorで作るイベント関係オブジェクト)の子がもつオブジェクトかと思われる。
これらは親は原点に置いて? 子の座標をいじる。

・ドア、パズルの追加
Tools>w_ObjCreator>select Category>ドアかパズル。
設定を選んでドア、パズルをCreateするとヒエラルキー上に出現。
パズルを追加した場合は、w_UpdateSceneからUpdate Current Sceneをする…らしい。(チュートリアルにそんな手順なかったのだが、リファレンスでは「追加したパズルをセーブシステムに統合するため」必要…らしい。うーむ)

・パズルのピースをカスタムする
自前の画像やモデルをパズルに使用できる。
画像はパズルのinspector>Customizationから1ピースづつ画像を指定。(256x256推奨で、scale可能)
モデルは実にシンプルで、ヒエラルキー上のパズルの1ピースの子にそのモデルを置いて(Coliderは削除する)自動生成されたオブジェクトの非アクティブにするだけ。(非表示ではなくinspector最上部のチェックを外す。英語で言われるとピンと来なかった…)
見た目盛りたい派(アセット利用ごまかしたい派)も安心。

・パズルにヒント(clue)を追加する
パズルを作る時と同じ要領。
ヒエラルキー上のパズルを選択し、
Tools>w_ObjCreator>select Category>01 Puzzlesの最下部、
「Clue system」という項目があるのでCreateを押す。すると、選択していたパズルの子に「Clue box」というオブジェクトが追加されるので選択。

ここでパズルのヒントとしてテキストと画像を設定できる。
(テキストのみ、画像のみも可能)
設定したヒントは、インゲームでパズルを選択時、電球マークを押すと表示。複数設定も可能で、複数設定してある場合はページ切り替えで見ることができる。
「Lock」にチェックをいれるとプレイヤーのクリックを待ってヒントを表示するが、正直なところ使い道を思いつかない。ここ「Lock」だけ、このアセットにしては珍しく、「アイテムを持っている場合」などの条件設定ができない。=アセット外の改造を前提とした機能である。

・ヒント(clue)に広告によるロックをかける
ほんとこのアセットすげえな。
Admobなどのマネタイズまでコードレスで面倒みてくれるのか…と思いきや、ここはcsをイジる必要がある。ただ、非常にカンタンな部類。非プログラマーも挑戦してみよう。

まず、広告の対象にするヒントをLockしておく(要するに完全に広告用の機能だったのだ)。
その上で「AP_ClueUIManager.cs」を開く。
(Assets → AP → Assets → Script → Puzzles → Clue →
AP_ClueUIManager)
42行目を「//」でコメントアウトするか消す。(コメントアウト推奨)
43行目に再生される広告のメソッドを記述する。
広告側には、以下のメソッドを記述して広告の終わりにヒントをアンロックするように設定する。

ingameGlobalManager.instance.currentP
uzzle.GetComponent<conditionsToAccess
ThePuzzle>().objClueBox.AP_UnlockClue
();

ただし注意点として、広告によるヒントロック解除はプレイヤーによるマニュアルセーブでしか記録されない。従来型のモバイルゲーム的なモデルとしては自然な仕様だ。そのため、プレイヤーのマニュアルセーブを禁止するようにしておく必要がある。

・アイテム類の追加
Tools>w_ObjCreator>select Category>02 Items(3DViewer)
ヒエラルキーでアイテム化したいprefabを選び、設定を選んでApply
ドアなどと違い、アイテムは既存のprefabにApplyする方式。

・アイテムの編集
ヒエラルキー上にApply済みのアイテムを選んで、
Text Propertiesコンポーネントのボタンからw_itemウインドウを開く。
アイテム名や説明文、インベントリ上のサムネイルなどを編集できる。
サムネイルの画像は256 or 512正方形画像をspritesとして用意する必要がある…めんど
うまいことアイテムのスクショを量産できればいいね。

・3D Viewer用の調整とプレハブ化(プレハブ化は必須)
該当するアイテムをw_itemで選んだ状態で、createボタンを押す。アセットに新しくprefabが加わる。
3D Viewer用にアイテムの初期角度を調整する。
Create an instance~ボタンを押すことでヒエラルキーにテストオブジェクトが追加されるので、シーンビュー上でFを押す。
すると3Dビュー用の空間グループにインスタンスが作成されておりそこにカメラが合う。生成されたインスタンスのスケールとローテーションをイジろう。Gameビューを参考に調整するのだが、その際3D view用のカメラ(ヒエラルキーのCamShowObject)をGameビューと一致させたほうが良い。(CamShowObjectを選んで、エディター上部のGame Object>Align view to selected)
いじり終えたら忘れずw_itemに出現しているボタンUpdate and finish modificationを押す。ポップアップはcontinue。こうすることでテスト用のinstanceがヒエラルキーから消え、3Dview時の初期角度やスケールがprefabに保存されるようだ。


・アイテムを鍵にする
ヒエラルキーから鍵にしたいアイテムを選んで、
Text PropertiesコンポーネントのManager IDを確認する。
(Action Triggerのテキストなどで使われている、UIなどのText ListのIDとは別なので注意
次のドア。鍵の対象となるdoorをヒエラルキーから選ぶ。
5-Lock Options、Player needs an object in the inventoryのobject IDに確認したIDを記入する。
鍵は消費されるので注意。(消費されない鍵の方法は調査中)

・イベントのテキスト編集(Action Trigger)
例えばゲームクリアの文章を編集する場合のヒエラルキー上の場所
Grp_TheEnd(Clone) → Canvas_TheEndScreen → Screen →
Text_End
-InspectorのTextProperties script
-「Open Window Tab : w_UI to edit」クリックして編集するエントリーを選ぶ
-IDごとにテキストが管理されているのでいじる
-Text_EndなどText_ほげほげのinspector>Text Properties(script)>Manager IDに使いたいIDを指定する

・棚や引き出しの作り方と使い方
Tools>w_ObjCreator>select Category>05→引き出しの数を選んでCreate
棚の中に配置したいものをGrp_Followの子にする。
マニュアルで以下の英文があったけど、、ちょっと良く分からなかった…
 ・引き出しにRigidbodyを追加するのはまあしないだろうしいいか…
 ・で、中に入れたものにColiderがあるならIsTriggerをチェックしてね
ということだと思う…

IMPORTANT: Object with Rigibody can’t be added
to the folder Grp_Follow.
If an Object inside folder Grp_Follow use a
Collider. The toggle isTrigger inside the collider
need to be checked (true) (spot 1

諸々のセットアップが済んだ「Ready to use」Prefabがあるのでそっちを使うのもあり。

・棚や引き出しのインタラクト注目カメラを作る
Createした棚などのGrpの一番上の子のInspector>Obj Translate Rotate(Script)>4-Focus Mode parameters
デフォルトではMobileのみDesktopのチェックがオフになっているので、オンにしよう。
カメラ位置の編集は後のチュートリアル…らしい。

・字幕付きの音声イベントを作る
※音声は鳴ったけど字幕でつまづいたため、問い合わせてみます。
→「Unity 2020.3以降は最新verのアセットを使って!」と言われて確認したものの、最新verのアセットなんだよなあ…再度問い合わせ。Unityのバージョンは古めのほうがこのアセットはいいかも。

Tools>w_ObjCreator>select Category>07>Actions>Trigger:Play a voice

開始アタリをシーン上で移動させる。
Createしたオブジェクトのインスペクターからw_textnVoiceを開く
(ここは慣れたらw_textnvoice側から制御しても良さそう)
w_textnvoice側で、自動的に割り振られたIDが選択されているので、
タイトルと字幕を記入し、再生される音声を選ぶ。

字幕を記入したらEdit subtitleをクリックして、タイミングを編集する画面が追加される…はずなんだけど何も起きないので、問い合わせます。

日本語テキスト表示について
ゲーム中に登場させるテキスト入力は各inspectorの値として入力することになるけど、unityのせいかこのアセットのせいか、日本語入力が成功しない。
入力途中まではいくものの、エンター押すと消える。
開発元に問い合わせたところ、コピーペーストで行けることが分かった。
ここで長文を編集することはないから問題はなさそうだけど、多数のテキスト管理を行う場合に不便になりそうだね…

ローカライズについてはゲーム内にツールがあるみたいなので、どれくらいの苦行になるかはそれ次第。(未検証)
それこそcsvやエクセルを経由してIDごとに反映とかできると楽でいいけどね…

・パズルがロックされている時のフィードバックテキストを表示する
和製英語に毒された我々は「フィードバック」と聞いてピンとこなくなっているけども、要するに「反応」のこと。
パズルをヒエラルキーで選ぶ>インスペクターのconditions access the puzzle(script)コンポーネント>Display feedback
チェックを入れて該当IDを入れる。Open Window Tab:w_Feedbackボタンを押せばその場でテキスト群を確認、テキスト生成も可能。

・部屋を作る(準備編)
特に、AP内蔵のアセットを使う場合の準備。

 ・スナップ設定をする
 Edit>Grid and Snap Settings
(古いunityだと単にSnapsettingsとなっている)
 XYZ=1.5 Rotation=90。
 エディタの操作はCenterではなくPivot,Global座標。
 こうすることで床や壁の配置が上手くいくらしい(上手くいった)
 もちろんCTRLキーを押しながらobjectを移動する。

・部屋を作る(ライティング編)
一通りものを置いたらライティングを行う。
結構やることがあるが、AP用に標準化されているっぽい。

 ・Directional lightのmodeをbakeにする(Intensityは2が推奨されている)
 ・Window > Rendering> Lightings Settingsから Generate Lightings
 (Auto generateは非推奨らしい
 ・焼けるのを待つ。これで静的オブジェクトはOK
 ・動的オブジェクトは、
  GameObject > Light >Light Probe Group
  で作ったlightprobeで囲むことでライティングされる。
  Light Probe Groupは、
  ・複数作ると勝手に間を補完する
  (シーン内でバラバラに存在出来ない
  ・編集するにはInspectorからEdit Light Probesを選択して
   ボールをイジる(CTRL+Dでボール追加可能)
 ・反射用の Reflection probeを追加する
  GameObject > Light > Reflection Probe
  ・Reflection probeのBox Projectionをチェックし、
  部屋全体を包み込むようにBox sizeを変える
  (部屋ごとに必要)(Transformではない点に注意)

・部屋を作る(メッシュ合成編)
かなり気の利いた機能で、静的な描画メッシュを全て合成できるスクリプトが付属している。アセット作者オススメの機能。効果は、
 ・描画呼び出しを劇的に軽くする
 ・ライティングのレンダリングが早くなる

とのこと。

使い方は簡単。
 ・カラのゲームオブジェクトを作成し、
  合成したいオブジェクト達を子にしたグループを作る。
 (壁や置物などは別々の親にしてまとめて個別に合成したほうが良い)
  ・ただし、動的オブジェクトはグループに加えないように分離する。
  (例えばチェストは静的だがチェストの引き出しは動的なので、
   チェストグループ内の子の引き出しだけ外に出す。
   ぶっちゃけprefabの整理がめんどくさくので、
   こういうのは合成しなくて良いと思う)←作者に聞いときます

 ・Projectウィンドウから以下を親にD&D
  Assets → AP → Assets → Script → MeshCombiner →
  Meshcombinervtwo
 ・ヒエラルキー上の親グループに追加されたコンポーネントを選択し、
 「Combine」ボタンでレッツコンバイン。
 ・グループ内に合成されたメッシュが生成される。
 「Combine_hogehoge」のような具合。
 元になったオブジェクトのMesh Rendererは自動的にoffになる。

 ・Resetボタンで戻せるのも便利。
  いくつかのグループに分けて合成されるが、
  おそらく隣り合っているオブジェクトを探して合成している。

 ・ただし、一度に合成できるオブジェクトの頂点数は65000まで。
  
Show Verticesにチェックを入れれば子のオブジェクトの頂点数が分かる

・部屋を繋げる(シーンA→B)
 ・まず、繋げる先(B)のシーンを作成する。
 Tools>AP>w_ProjectManager>2.Current project~
 で作業中のプロジェクトにドロップボックスをあわせた後、
 5.List of Scene~  名前を入れて「Create new scene for the project」
 その後、必ず「Update the list of scene」を押す。(すぐ下にある)
 これがVERY IMPORTANT……らしい。
 
 ・シーンがビルドに含まれているのを確認する
 File>Build Settings シーンファイルの右側の数字に注目。

 ・繋げる前のシーン(A)の出口を作る
 APのやり方でシーンを作っていればヒエラルキーに
 Manager>Grp_SpawnPos>Teleporter
 があるはず。これがこのシーンの出口であり、他のシーンへの入り口。
 Teleporter=触るとワープ
 ドアの先など、ワープを発生させたい場所に置く。
 TeleporterのコンポーネントTrigger Managerを見る。
 Scene in build indexが飛び先のシーンナンバー。
 さっき確認した数字を入れる。
 そして、Spawn point nameには飛び先のシーンのゲームオブジェクト名を    いれるのだが、特に分岐とか複数出口とかやらないなら「Spawn_0」のままでよい。(デフォルト名)シーン生成時に一緒に生成されてManager>Grp_SpawnPos>に入っている。

・繋げた先のシーン(B)でAから来た時の位置を調整する
Manager>Grp_SpawnPos>Spawn_0(変更してなければ)で移動してきた時の座標や向きを調整する。

以上。
このままだとA→Bの一方通行。
普通の部屋の繋がりなら、B→Aも同様に作る必要があるが、
おそらくSpawn_0とTeleporterを同じ位置に置いては行けない。
無限地獄になるだろうから。(ためしてない)

文字で位置関係を表すと、こんな感じにしている。
■→□
□Spawn_0(A)
■Teleporter(A)
■Teleporter(B)
□Spawn_0(B)

分かりづらい。
現実空間で例えるなら、出口専用の扉を入り口の前に置く……って感じかな。もちろん同じ座標に置く方法もあるだろうけど、アタリの制御がめんどくさいのでやーらない。

・「調べる」ポイントを作る
Tools>AP>w_ObjCreator>11 Focus Info
でCreate。あとは調べるポイントに置くだけ。
カメラ位置の調整や、テキスト、ボイスの追加はインスペクターで行う。


この記事が気に入ったらサポートをしてみませんか?