ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

Unityで2DのRPGを作る - 宝箱を設置してみる

Unity で 2DRPGを作成中に宝箱ってどうやって設置したらいいんだろ?という素朴な疑問から、今回は宝箱を開ける処理に挑戦してみました。

やりたいこと

  • 宝箱を設置したい
  • 宝箱を開けたい(開ける動作つき)
  • 一度開けた宝箱はシーンが切り替わっても空のままにしたい

準備するもの

宝箱の画像

宝箱の画像は、以下からお借りしました。
ドット絵世界:キャラ素材-照明等


操作できるキャラクタの設定

キャラクターの設定は以下のものを使用します。
a1026302.hatenablog.com

設定

宝箱の画像編集

宝箱の画像をUnityにインポート

宝箱の画像を[Project]の[Assets > sample]にドロップ&ドロップして配置します。
f:id:a1026302:20200926231003j:plain

宝箱の画像をスライス

宝箱の画像クリックし「Inspector」から編集を行います。

  • [Sprite Mode]を[Multiple]に切り替え
  • [Pixels Per Unit]を[32]に変更
  • [Sprite Editor]クリック

f:id:a1026302:20200926231412j:plain

[Sprite Editor]というサブウィンドウが出てくるので、ここでスライスの編集を行います。

  • [Type]を[Grid By Cell Size]に変更
  • [Pixel Size]を[x:32 / y:32]に変更
  • [Slice]をクリック

f:id:a1026302:20200926231914j:plain
スライス処理が成功すると画像が分割されます。
f:id:a1026302:20200926232244j:plain

クエスト作成

「GameManager」というGameObjectに「QuestManager」というスクリプトをアタッチしてそこに宝箱のクエストを登録します。
(QuestManagerについては別の機会にブログにのせようと思います)
f:id:a1026302:20201202154906j:plain

クエストを処理するスクリプトを作成

QuestObjectActivatorというスクリプトを準備します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class QuestObjectActivator : MonoBehaviour
{
    public GameObject objectToActivate;

    public string questToCheck;
    
    public bool activeIfComplete;

    private bool initialCheckDone = false;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if(!initialCheckDone)
        {
            initialCheckDone = true;
            CheckCompletion();
        }
    }

    public void CheckCompletion()
    {
        if(QuestManager.instance.CheckIfComplete(questToCheck)){
            objectToActivate.SetActive(activeIfComplete);
        }
    }

}

宝箱のGameObject設定

宝箱を開く行為をクエストとしゲームオブジェクトを作成します。
クエストと宝箱のゲームオブジェクトを親子関係で配置します。
また、宝箱の入っている場合と空の状態のGameObjectを準備します。

開ける前の宝箱のクエストのGameObject作成

「Hierarchy」に「QuestObject(chest_close)」という名前でGameObjectを作ります。
このGameObjectの「Transform」の「Position」で宝箱の位置を指定します。
このGameObjectに「QuestObjectActivator」というスクリプトをアタッチします。
アタッチしたスクリプトに以下の画像のように登録したクエスト名等々を設定します。
f:id:a1026302:20201202160041j:plain

開ける前の宝箱のGameObject作成

「Hierarchy」に「Chest_0」という名前でGameObjectを作ります。
「SpriteRenderer」の「Sprite」に開く前の宝箱の画像を指定します。
「BoxCollider2D」のコンポーネントを追加します。
メッセージ表示用に「DialogActivator」というスクリプトをアタッチします。
f:id:a1026302:20201202161512j:plain

開けた後の宝箱のクエストのGameObject作成

「Hierarchy」に「QuestObject(chest_empty)」という名前でGameObjectを作ります。
このGameObjectの「Transform」の「Position」で宝箱の位置を指定します。
このGameObjectに「QuestObjectActivator」というスクリプトをアタッチします。
f:id:a1026302:20201202162135j:plain

開けた後の宝箱のGameObject作成

「Hierarchy」に「Chest_1」という名前でGameObjectを作ります。
クエスト完了前は無効かしておきます。
「SpriteRenderer」の「Sprite」に開いた後の宝箱の画像を指定します。
「BoxCollider2D」のコンポーネントを追加します。
メッセージ表示用に「DialogActivator」というスクリプトをアタッチします。
f:id:a1026302:20201202162445j:plain

宝箱を開けた時のメッセージの登録

スクリプトを作成し宝箱を開けた時のメッセージを登録します。
開ける前
f:id:a1026302:20200928160107j:plain
開けた後
f:id:a1026302:20200928160208j:plain
(社長はこのゲームの主人公である猫の名前です)

動作確認

なんとなく、それっぽい感じになったと思ってます。
www.youtube.com

ほかの方法でも実装できないか考えてみます。