公開日:2023/07/08  更新日:2023/07/08

Unityでの宝箱の実装とアセットのおすすめ

 Unityのゲーム制作で開くとアイテムを入手できる宝箱を作りたいと考えている人は多いはず。特にRPG制作の場合にはほぼ必須の機能だ。
 以前の記事でアイテム管理やインベントリシステムを制作してきた。
アイテム管理のやり方
インベントリシステム
 この2記事の内容をベースに宝箱を開けてアイテムが入手できる仕様の実装方法を紹介していく。
 具体的にはプレイヤーと宝箱との距離が一定以下の時に「調べる」に該当するキーを押すと宝箱が開き、アイテムを手に入れてもインベントリのスロット制限やアイテム自体んの制限数を超えないことがわかったらアイテムが手に入るようにしていく。

Unityでの宝箱作成目次

宝箱の無料アセット
宝箱作り
スクリプトを記述
宝箱作成に役立つアセット
目次にもどる

宝箱の無料アセット

 まずは宝箱のアセットがなければ話にならない。今回は以下の無料アセット(2023年6月現在無料)を使うことにした。

 Stylized Treasure Chest by Gamertose


目次にもどる

宝箱作り

 前述したアセットをインポートしたら、プロジェクトビューのTreasureChest/ModelsにあるchestFinal_0を選択する。

 chestFinal_0をヒエラルキー欄へドラッグ&ドロップし、名前を今回はtakarabakoとした。
 takarabakoへBox Colliderをアタッチし、takarabakoの大きさに合うように当たり判定を調整する。
 次にプロジェクトビューで右クリック→create→Animator Controllerのように選択する。
 作成したAnimator ControllerにTakarabakoと名前をつけ、以下のようにcloseとopenのステートを作成する。

 closeについてはAnimationClipはなしでいい。openについてはプロジェクトビューで先ほどドラッグ&ドロップしたchestFinal_0を開いた中にあるopenのAnimationClipを選択する。

 intのパラメータを作成する。1と同値の時にopenに遷移し、0と同値の時にcloseに遷移するように設定。
 アニメーションの設定方法がわからない場合は以下の記事へ。
アニメーションの基本

 作成したtakarabakoのゲームオブジェクトには最初からコンポーネントとしてanimatorがアタッチされている。animatorのControllerの項目で先ほど作成したTakarabakoのAnimator Controllerを指定する。


 続いて宝箱を開けた際に表示されるメッセージを作っていく。
 以下のようにtakarabakoの子要素としてCanvas、その子要素としてimageを作成する。また、Canvasの子要素としてTextMeshproを作成し、名前をitemnyusyuとする。

 imageとitemnyusyuの位置をお好みで調整。今回はプレイヤーが隠れないように以下の位置に配置した(表示させている文字は位置調整のためなので適当)。

 位置調整後にCanvasを非アクティブにして最初はメッセージが見えなくする。

 今回は調べるキーをFキーにしようと思う。
 上のメニューのEditを選択し、Project Setting→InputManagerを選択する。
 Axesを押して中身を展開する。
 Submitを右クリックしてDuplicate Array Elementを選択することでSubmitを複製できる。

 複製したSubmitの名前をshiraberuに変更し、Positive Buttonの項目にfを入力する。
目次にもどる

スクリプト記述

 takarabakoのゲームオブジェクトに以下のようにスクリプトを記述してアタッチする。
 大量にシリアライズしている。インスペクター欄で指定。

 Updateメソッドでやっているのは大まかにプレイヤーと宝箱の距離の確認し、距離が設定した起動距離(今回はインスペクター欄で2と記述)以内でFキーを押すと宝箱を開くようにしている。
 宝箱にいれたアイテムと数を使って「〇〇を〇個手に入れた」というメッセージ文章を作成し背景となるimageと一緒に出している。
 一定時間後にメッセージが自動で消えるようにコルーチンで設定。今回は待機時間としてmoziteruzikanについてインスペクター欄で1.5と記述している。
 アイテムを追加してインベントリのアイテムスロットやアイテムの所持限界を超えないかどうかについて、itemkanriスクリプトのアイテム追加メソッドを呼び出して確認している(その際に配列に要素番号と追加するアイテムの数を入れて送っている)。アイテム追加メソッドの内容のみ以下で紹介する。
 まず確認しているのはアイテムを追加することでそのアイテムの処理限界を超えないかどうか(itemdataでアイテムの所持限界を持っている)。
 (所持数+追加数)と所持限界を比べて、所持限界を超えるなら返り値をfalseにしてリターンしている。
 続いて所持数が0かどうか確認し、所持数が0でないならインベントリのアイテムスロットが増えることはない。アイテムを実際に増やし、以前の記事で作成した持ち物更新処理メソッドを呼び出し、返り値をtrueにしてリターンしている。
 続いて所持数が0かどうか確認し、所持数が0でないならアイテムスロットが増えることはないので返り値をtrueにしてリターンしている。
 所持数が0ならここから追加することでアイテムスロットが増加することが確定する。アイテムスロットが28個(自分の作ったインベントリでの最大スロット)埋まっているかを確認し埋まっているなら返り値をfalseにしてリターン。28個埋まってないなら、アイテムを実際に増やし、持ち物更新処理メソッドを呼び出し、返り値をtrueにしてリターンしている。
 リターン後の処理について、takarabakoのゲームオブジェクトのスクリプトを再び確認する。
 IEnumerator mozideruzikan()のコルーチン処理を見てほしい。
 指定した時間の待機後にitemkanriスクリプトのアイテム追加メソッドからの返り値を確認し、trueの場合はメッセージ文章を消しopenパラメータを2にして終了。
 返り値がfalseだった場合には「バックがいっぱいだ・・・」のメッセージ文章を出しつつ再びコルーチン処理を行う。
 IEnumerator mozideruzikan2()のコルーチン処理で指定した時間待機した後にメッセージ文章を消し、openパラメータを0にして宝箱を閉じている。

 以上の作業を行うことで以下のように宝箱を開いてアイテムを取得することができるようになる。

 古文書Aが入った宝箱を開けるとアイテム取得メッセージが表示され、アイテムスロットが増えたのを確認できる。
 ポーションが2つ入った宝箱を開けると元々ポーションを2つ所持していたので4つに増える。
 だがもう一つのポーションが2つ入った宝箱を開けるとポーションが6つになってしまい、ポーションの所持限界が5つなので宝箱を閉じ、ポーションの数は4個のままである。

 続きの記事は以下。
装備システム

目次にもどる

宝箱作成に役立つ有料アセット

 特にRPGの場合、宝箱は重要な要素だ。様々なバリエーションのものを用意したい場合も多い。例えばアイテムにレアリティをつける場合は、良いレアリティのアイテムが入っている宝箱は豪華にしたいということもある。
 そこでおすすめの宝箱アセットを紹介していく。

 Treasure Chest Set - Animated

 4種類の宝箱が入ったアセット。
 普通の宝箱が1種、ガイコツなど様々な装飾が施された宝箱が3種。
 宝箱が開く際には箱が揺れつつ蓋が開くアニメーションが再生され、宝箱の中には蜘蛛の糸のようなものが張っている。リアルに宝箱が再現されている。
 宝箱を見つけた時のプレイヤーの感動やワクワクを高めてくれる優秀な商品だ。ぜひ確認してみてほしい。

 Treasure Chest Bundle

 作りの凝った5種類の宝箱が入ったアセット。
 どの宝箱もトゲや角などの細かい装飾が施され、鎖が巻き付いていたり、骸骨が取りつけてられていたりする。
 様々な宝箱が欲しい人におすすめの商品だ。ぜひ確認してみてほしい。

 Fantasy Skull Treasure Chest

 1種類の宝箱が入ったアセット(ただしトゲや装飾の一部の色を別パーツに変えることで数パターンは作れる)。
 細かいデザインや開く時のアニメーションまでよく作り込まれている。
 素材量は少ないが、その分低価格となっている。ちょっと豪華な宝箱が1つ欲しいという場合に特におすすめだ。

 Mimic Collection 1 - Treasure Chest

 1種は普通の宝箱。もう1種は宝箱トラップ(ミミック)となっている。
 「やった!宝箱だ!」と思ったら、グロテスクな歯と舌を持つモンスターだった!プレイヤーに与える衝撃はなかなかのもの。
 ミミックはかなり作り込まれていて、噛みつき、歯をすり合わせる、左右を見回す、吠えるといったアニメーションが用意されている。モンスターとしてプレイヤーと戦わせることが可能だ。
 スリルやホラー要素を重視するゲームを作るつもりなら特におすすめだ。

おすすめアセットまとめへ

Unityのゲーム制作まとめへ戻る

page top