ロゴ ロゴ

【Den3夏のGameJam】武器をコレクションするゲームを作りました

はじめに

こんにちは、watanabeです。8月末に行われた電算のゲームジャムに参加しました。テーマはコレクションでした。このブログでは、作ったゲームの紹介と、使ったシステムの紹介をしていきます。

ゲームのアイデア

コレクションがテーマなので、集めることを活かしたゲームを作りたいと思いました。そこでいくつかゲームのアイデアを考えました。
 
アイデアの一つは、コレクションしたものを鑑賞するゲームです。プレイヤーは頑張って何かを集めて、集めたものを鑑賞します。現実の世界でも、フィギュアなどのグッズを集めて、綺麗に飾って眺めるのはとても楽しいです。このように、コレクションを鑑賞するゲームというのは、自分で集めたものが美しく並んでいるという満足感を味わうことができるので、面白そうです。しかし、このようなゲームを作るには集めるものを魅力的なものにしなくてはいけません。集めていて楽しいものを、綺麗なイラストやグラフィックで用意する必要があります。
他に考えたアイデアは、コレクションしたものを使って戦うゲームです。プレイヤーはキャラクターや武器を集めることでどんどん強くなっていきます。現実の世界での例としてカードゲームが挙げられます。自分が集めたカードでデッキを組んで、お気に入りのカードが活躍すればとても嬉しいです。このように、コレクションしたものを使って戦うゲームというのは、強くなるためにコレクションを充実させたいという欲を搔き立てられたり、自分が集めたものが戦いで活躍するという気持ちよさも味わうことができます。
他のアイデアとして、コレクションすること自体を目的とするゲームも考えました。プレイヤーは何かを集め、全て集めたらクリアとなるゲームや、集めた個数によって点数が決まるゲームなどです。このようなゲームでは、何をコレクションするかよりも、どうやってコレクションするのかが大切になると思います。例えば、ステージに散らばったアイテムを集めるアクションゲームにしたり、パズルを解いてアイテムを手に入れる謎解きゲームにしたり、色々な種類のゲームにすることができます。
 
このようなアイデアを出して考えた結果、武器をコレクションして戦うゲームを作ることにしました。ゲームの内容は次のように考えました。
①プレイヤーはガチャを回すことで、ランダムに武器を手に入れます。
②武器を手に入れることで主人公のステータスが上昇します。
③ステータスが上昇することで、バトルに勝ちやすくなります。
④バトルに勝つことでガチャを回すためのアイテムが手に入り、またガチャを回すことができます。

ゲームの紹介


「コレクション」「バトル」「ガチャ」「ステータス確認」の4つのモードで成り立つゲームです。画面右下の?マークをクリックするとヘルプが表示されます。画面上部にはダイヤモンドの所持数を表示しています。ダイヤモンドの説明はあとでします。
 

「ステータス確認」をクリックするとプレイヤーのステータスを確認することができます。ステータスはバトルの際に利用されます。
 

「バトル」をクリックすると敵とのバトルが自動で行われます。
バトルでは、「素早さ」が高い方から順番に攻撃を行います。攻撃側の「攻撃力」から防御側の「防御力」を引いた値だけ防御側の「HP」が減ります。どちらかのHPが0になったら決着です。
 

バトルに勝利するとダイヤモンドがもらえ、バトルを続けるかどうかが選べます。バトルを続けると、先ほどよりも強いステータスの敵と戦います。従って、連勝するほど敵が強くなっていき、勝つのが難しくなります。
 

 

強い敵に勝つためにはステータスを上げる必要があります。そこで使うのが「ガチャ」です。
ガチャではダイヤモンドを消費して、ランダムに武器を手に入れることができます。武器はいくつかの種類を用意し、それぞれにレアリティを設定しました。レアリティが低いものほど出やすく、高いものほど出にくいようにしてあります。
 

「コレクション」をクリックすると手に入れた武器を見ることができます。画像では、先ほど手に入れた武器のアイコンが表示されています。ガチャを回して新しい武器を手に入れていくたびに、表示される武器が増えていきます。
 

 

武器のアイコンをクリックすると、武器のステータスを見ることができます。この武器のステータスぶん、プレイヤーのステータスも上昇します。例えば、この武器は「攻撃力」が5なので、プレイヤーのステータスを確認すると、「攻撃力」が5上がっていることが分かります。
 
ゲームの紹介は以上のようになります。
ゲームで使用した主人公や敵、背景のイラストは自分で描きました。武器のイラストは、上で紹介した「始まりの剣」については自分で描きましたが、他の武器はAIに描いてもらいました。自分は絵が下手で、かっこいい武器のイラストがなかなか描けなかったのでAIを頼りましたが、思い通りのイラストが自分で描けたら楽しそうだなと思います。
また、このゲームはUnityで作り、UIはFree Platform Game Assetsというアセットを使って作りました。

武器データの管理

ここでは、ゲームの内容ではなくて、ゲームを作るときに使ったUnityのシステムについて簡単に書きたいと思います。
 
ゲームに登場する武器のデータを設定する際、ScriptableObjectを使いました。これを使うことで武器の攻撃力や防御力などの設定をインスペクターから行うことができます。まずは、次のようなスクリプトを用意します。

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

[CreateAssetMenu(fileName = "NewCollectionData", menuName = "GameData/Collection")]
public class CollectionData : ScriptableObject
{
    public string collectionName; // 武器の名前
    public Sprite collectionIcon; // 武器のアイコン
    public int collectionHP;      // 武器のHP
    public int collectionAttack;  // 武器の攻撃力
    public int collectionDefense; // 武器の防御力
    public int collectionSpeed;   // 武器の素早さ
}

これで武器のデータを設定できるようになります。このスクリプトはどのオブジェクトにもアタッチする必要はありません。
 
次に、メニューバーからAssets→Create→GameData→Collectionを押すと、ProjectのAssetsフォルダにNewCollectionDataが追加されます。
 

 
これに名前を付け、インスペクターからデータを入力し、アイコンを設定します。
 

 
このデータを参照するには、スクリプトの名前と同じ型の変数を用意してデータを入れます。今回はCollectionData型です。では、ボタンをクリックしたら武器のデータを表示させる仕組みを作ってみたいと思います。
 
まずは、表示するUIなどを用意します。Button、空のGameObject、Image、Textを用意して、ImageとTextの親にPanelを設定します。Panelは透明にして、非アクティブにします。また、ButtonやImage、Textの位置を見やすいように調節します。従って、次のような画面になります。

Imageには武器のアイコン、Textには武器のデータを表示させます。Buttonを押すとPanelがアクティブになってImageとTextが表示されるような仕組みを作ります。
 
次に、二つのスクリプトを用意します。ButtonにアタッチするButtonControllerと、空のゲームオブジェクトにアタッチするUIManagerです。

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

public class ButtonController : MonoBehaviour
{
    // このボタンに対応する武器のデータ
    public CollectionData myCollectionData;

    // UIManagerへの参照
    public UIManager UIManager;

    // ボタンがクリックされたときに呼び出される
    public void OnButtonClick()
    {
        // UIManagerのDisplayCollectionDataにmyCollectionDataを渡す
        UIManager.DisplayCollectionData(myCollectionData);
    }
}

 

using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class UIManager : MonoBehaviour
{
    public GameObject collectionPanel;     // ImageとTextの親のPanel
    public TextMeshProUGUI collectionData; // データを表示するText
    public Image collectionIcon;          // アイコンを表示するImage

    // ボタンをクリックしたら呼び出される
    public void DisplayCollectionData(CollectionData collection)
    {
        // panelを表示
        collectionPanel.SetActive(true);

        // 受け取った武器のデータを表示
        collectionIcon.sprite = collection.collectionIcon;
        collectionData.text = collection.collectionName + "\n" +
                              "HP  " + collection.collectionHP + "\n" +
                              "攻撃力 " + collection.collectionAttack + "\n" +
                              "防御力 " + collection.collectionDefense + "\n" +
                              "素早さ " + collection.collectionSpeed;
    }
}

スクリプトをアタッチしたら、インスペクターで設定をします。

 

 
ボタンに武器のデータを設定しておき、そのデータをUIManagerのDisplayCollectionDataメソッドに渡します。DisplayCollectionDataメソッドではPanelをアクティブにして、渡されたデータをTextとImageに反映させます。よって、ゲームでボタンをクリックすると、次のように表示されるようになります。

おわりに

このブログでは、ゲームジャムで作成したゲームの紹介と、ScriptableObjectの使い方について書きました。
ゲームについて、ガチャを回したり能力を参照してバトルをさせたりと基本的なことは実装できました。しかしガチャで武器を入手するときの演出がなかったり、バトルが完全に自動でプレイヤーの操作がなかったり、ゲームとして面白いものにはなりませんでした。面白いゲームが作れるようになりたいです。
最後まで読んでいただきありがとうございました。

コメント入力

関連サイト