見出し画像

【Unity】Unity1Week【つたえる】に参加!【備忘録】

しょう@ゆっくり学ぶチャンネルです。
今回もunityroom主催のゲームジャム、unity1weekに参加しました。

自分は4回目の参加です。今回は期間が2023年3月20日(月) 0時〜2023年3月26日(日) 20時でお題は【つたえる】でした。
今回、自分は「あたしのメッセージ!崩して!崩して!受け取って!」というゲームで参加しました(2日遅刻してしまいましたが)。

まず、OpenAIくんに「『つたえる』というテーマでゲームを作りたいが、どんなゲームが考えられるか。」と問いかけて、脱出ゲームがよさそうと思いましたが、挫折しました(3か月ぶり2度目)。

理由は上記の講座を参考にしていたのですが「素材用意するのめっちゃ時間かかるな」と思ったからです。
AIで背景を作ればいいと思い、生成していたのですが、なかなか上手くできず…。ただ、美少女イラストは量産しやすいので、これをゲームに使うことにしました。

Udemyセールの時にブロック崩しの講座を買っており、ブロックで美少女のあんなところやこんなところが隠れていて、それを崩して見えるようにするゲームを思いつきました!
(ヒントになったのはダンシングアイというどうかしてるゲーム)

↓参考動画・ダンシングアイ

が、当然それはゲームジャムに投稿できないので、お題の「伝える」を満たすために、美少女にメッセージボードを持たせて、ブロックを崩すとメッセージが見えるゲームを作ることにしました。以下、今回詰まったところ、勉強になったところについて、まとめていきます。

トレイル(軌跡)の導入

これは簡単でした。というのも、デフォルトでTrail Rendererコンポーネントが用意されています。以下の記事を参考にすれば問題なく実装できるでしょう。
なお、参考にしたブロック崩し講座では、弾を発射する前にパドルを左右に動かすとトレイルが出ていたので、これを弾が発射してからTrail RandererがOnになるように修正しました。

public class Ball : MonoBehaviour

/////////////////中略////////////////////

    void Update()
    {
        //スタート前は、パドルのトランスフォームを取得し、パドルの中心にボールが常に乗っているようにする
        float posY = transform.position.y;
        if (!isStart) {
            transform.position = new Vector3(bar.transform.position.x,posY,0);
        }

        //スタート前かつ左クリックしたとき
        if (!isStart && Input.GetMouseButtonDown(0)) {
            isStart = true;
            GetComponent<TrailRenderer>().enabled = true;//TrailRendererをオンにする
            rb.AddForce(new Vector3(1, -1, 0) * speed, ForceMode.VelocityChange); //ForceModeは力のかけ方を変えられる
        }
    }

エフェクトアセットの利用

Epic Toon FXというエフェクトがいっぱい入っているアセットをセールの時買っていたので、使ってみました。
ボールがブロックを壊したとき、パドルがボールを跳ね返したときに、それぞれエフェクトが発生するようにします。
デフォルトの状態でもエフェクト発生時にSEがなりますが、Prefabのインスペクタから「出力」を変えると簡単に変更できました。

SEのボリュームと連動させたいので、出力先をSEにする

UI配置の崩れとClearCameraの導入

ブロック崩しの講座のとおりにプロジェクトを作成していき、細かい調整はあとでやろうと思っていましたが、これが失敗でした。
アスペクト比は初めに整えなければなりません。

何回も紹介している記事なのですが、自分自身が軽視していたかもしれません。まあ修正はできましたが。今回のゲームは3Dですが、アスペクト比を一定にする方法は今までの2Dゲームと共通でした。

また描画範囲外に、シーンの一部が拡大されて映ったりすることがあったので、上記のUnity入門の森さんの記事を参考に、ClearCameraを導入し、SkyBoxが描写されるようにしました。

MainCameraより優先度を下げることで、オブジェクトやUIが映らなくなることはない

Time.TimeScale=0→シーン遷移の罠

Time.timeScaleを0を利用したポーズ(一時停止)中に、シーン遷移を行うと遷移先のStart関数やAwake関数は反応しません。
理由はTimeScaleはシーン遷移しても引き継がれるからです。
このことが頭から抜け落ちており、リリース直前になってだいぶ焦りました。
遷移直前にTime.TimeScale=1;とすることで、問題は解決しました。

    public void GoToScene() {
        Time.timeScale = 1;
        SceneManager.LoadScene(scene);
    }

SkyBoxをランダムでスクリプトから変える

Skyboxだけでなく、背景の美少女とBGMもランダム選択されるようにして、リトライ時も単調にならないようにし、何度も遊んでもらいやすいようにしました。

SkyBoxをスクリプト上から変えるのは、以下の記事を参考にしてください。とても簡単でした。

//シーン開始時に、背景(GameObject(Panel))とBGM(Audio)とSkyBox(Material)をそれぞれランダムに選択する。
)

///////////////////略////////////////////     

 
    public GameObject[] girlsCG;
    public AudioClip [] rundomBgm;
    public Material[] rundomsky;    

  void Start()
    {
///////////////////中略////////////////////
        //配列内の美少女背景をランダム選択
        int rnd = Random.Range(0, girlsCG.Length);
        girlsCG[rnd].SetActive(true);

     //配列内のBGMをランダム選択
        int rnd2 = Random.Range(0, rundomBgm.Length);
        soundManager.PlayBgm(rundomBgm[rnd2]);

     //配列内のSkyBoxをランダム選択
        int rnd3 = Random.Range(0, rundomsky.Length);
        RenderSettings.skybox = rundomsky[rnd3];
    }

どの画面からでも音量調節ができるようにした

以前までは音量設定はスタート画面にしか置いていませんでしたが、調節したいのはプレイ中だよなあ、と思い、ポーズ画面でも調節できるようにしました。結局同じ設定を複数シーンで行うだけだったので特に迷うことはなかったです。

今まで通りスタート画面でも音量設定は可能
今作はポーズ画面でも音量設定可能

汎用アセット及びゲームジャム用汎用アセットの作成(課題)

結局ゲームジャムに参加するときは、過去の参加と共通の作業が多いし、ゲームを作るときは過去のプロジェクトと同じ部品やスクリプトを使いまわしたいことが多いです。
それをあっちのプロジェクトやファイルを開いて、こっちの記事を読んでってやっていると、あまりに非効率なので、汎用アセットとゲームジャム参加時の作業リストを早急に作成しようと思います。
ゲームがアップロードできた解放感と次に行きたい気持ちを抑えつつ、あらゆることを覚えている今のうちに取り掛かろうと思います。

↓汎用アセットの大切さを説いた記事

↓オリジナルボタン

この記事が気に入ったらサポートをしてみませんか?