【Unity】一晩でUnityを使ってゲーム作ってみた!

この記事は『 ョョョねこ Advent Calendar 2020 - Adventar 』の7日目の記事です。

ョョョねこ要素はあります!いや、逆にそれしかないです...

はじめに

皆さん、特にVRChatをやっているそこのあなた!Unity使ってますか?

うんうん、アバター改変で使ってる。そうだよねー、Unityでアバター改変できるのいいよね~

あ、あなたはワールド作成で使ってる。そうだねー、アセットストアで色んなアセット使って自分だけのワールド作るの素敵だよね~

...

……

ってちがーーーーーーーーーーーーーーーーーーう!!!

Unityでゲーム作ってますかーーーー???

VRChatやっていると忘れがちですが、Unityは ゲーム開発エンジン です。

決して、VRChat用のアバター改変ツールやワールド制作ツールとして使うことがメインのツールではない...いや、なかったはずです。少なくとも2017年ぐらいまでは...

とは言いつつ、実は私もUnityでちゃんと1つのゲームを作って公開したことはありませんでした。

そこで、今回は初のゲーム開発に挑戦しました!

期間は最近色々といそがしいので 半日 でできるものを作ることにしました。

題材決め

まずは何を作るかを決めなければなりません。

丁度ョョョねこアドベントカレンダーに登録してたので、その題材となりそうなものでかつ半日でできそうな何かを見つけることにしました。

ん…

ョョョねこかぁ...

あれ、「ョョョ」と「ねこ」って2つの単語に分かれるな

これ色々レパートリー作れるのでは...?

...

...

よし 「ョョョねこ」を使ったガチャ作ろう!!

いや、今考えればどうしてそうなった...

できたもの

f:id:sansuke05:20201208221114p:plain
ョョョねこガチャ

できたゲーム(?)のような何かはこちらのUnityRoomというところで一般公開しています。

ブラウザで遊べるのでぜひ遊んでSSR獲得目指してください!!(排出率1%)

unityroom.com

開発について

ここからは軽く制作過程について書いていきます。

ゲームの機能

機能としてはこんなものがあるかなーと考えました。

  • タイトル画面

  • ガチャ演出

  • ガチャ結果

操作は、タイトル画面のボタンを押すとガチャ演出が始まりガチャ結果がみえて、タイトルに戻るというシンプルなものにしました。

使ったもの

環境

  • Unity 2019.4.11f

ガチャ演出

フェードアウト演出は自作のフェードアウトするシェーダーを使って作りました。

ガチャ演出

今回一番凝ったのがガチャ演出です。

やってることはパーティクルをスケール変更してカメラに近づけるというアニメーションを作ってるだけではありますが、せっかくなので普段あまり使わないTimelineという機能を使ってこの部分を作成しました。

f:id:sansuke05:20201208223956p:plain
タイムラインはこんな感じ

これぐらいの規模のものを作るのであればアニメーション1つでも実現できますが、タイムラインを使うことでどのオブジェクトがどんな状態にあるということが視覚的に分かるので、1つのアニメーションでごりおすよりは作業しやすかったです。

ガチャシステム

ガチャのデータは GachaData というクラスを作成して、そこに表示する名前、レアリティ、レアリティのカラーなどの情報をプロパティとして持つようにしています。

今回はハードコーディングしてますが、ゲーム開始時にこのクラスを使ってデータを作成し、リストに保持するようにしています。

    private void InitGachaData()
    {
        _gachaDataList = new[]
        {
            new GachaData("ョ", "Normal", Color.blue),
            new GachaData("ねこ", "Normal", Color.blue),
            ... (略) ...
        };
    }

ガチャを引くボタンを押すと、以下のような手順でガチャ結果のデータを取得します。

  1. 乱数を使ってレアリティを決定

  2. ガチャデータのリストから該当するレアリティのデータのグループを取り出し

  3. 最後にそのデータグループから1つの結果データをランダムに取り出し

コードはこんな感じ

    private GachaData ChoseGachaResult()
    {
        var rarity = ChoseRarity();

        var gachaDataGroup = ChoseRarityDataGroup(rarity);
        
        return gachaDataGroup[Random.Range(0, gachaDataGroup.Count)];
    }

    private string ChoseRarity()
    {
        var randValue = Random.Range(0, 100);
        if (randValue == 0)
        {
            return "SSR";
        }
        if (randValue <= 2)
        {
            return "SR";
        }
        if (randValue <= 42)
        {
            return "Rea";
        }
        return "Normal";
    }

    private List<GachaData> ChoseRarityDataGroup(string rarity)
    {
        return _gachaDataList.Where(gachaData => gachaData.Rarity.Equals(rarity)).ToList();
    }

最後に

今回はこんなものを半日で作ってみましたが、ゲーム作り楽しいです!

作ってる最中にここもっと凝りたいなぁという部分や、追加でやりたいことも色々と出てきました。

せっかくガチャの演出やシステムを作ったので、今回の一発ネタだけで終わらせずに今後ゲームを作る際にどこかでつかえたらなと考えています。

そんな感じで、いかがでしたか? 最後まで読んでいただきありがとうございました!

もしいいと思ったら、 高評価とチャンネル登録よろしくおねがいします! ブックマークやツイートいただけると励みになります。