ものづくりのブログ

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

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

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

やりたいこと

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

準備するもの

宝箱の画像

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


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

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

設定

宝箱の画像編集

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

宝箱の画像を[Project]の[Assets > sample]にドロップ&ドロップして配置します。

宝箱の画像をスライス

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

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

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

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


スライス処理が成功すると画像が分割されます。

クエスト作成

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

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

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」というスクリプトをアタッチします。
アタッチしたスクリプトに以下の画像のように登録したクエスト名等々を設定します。

開ける前の宝箱のGameObject作成

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

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

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

開けた後の宝箱の GameObject 作成

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

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

スクリプトを作成し宝箱を開けた時のメッセージを登録します。
開ける前

開けた後

(社長はこのゲームの主人公である猫の名前です)

動作確認

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

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