私文大学生がUnityいじってみた ~時短編

これはKCS AdventCalendar2020 15日目の記事です。

←14日目 | 16日目→

まんたあにどです。

この記事は15日目ですが、19日目の続きになります。授業も終わって最終課題以外は一段落ついたので、今年度4つ目(2日目7日目、19日目、15日目)の記事をもって自身の一年の総括にしたいと思います。最終課題で忙しいのでテキトーに書きます。一段落とは…

ちなみに、アドベントカレンダーの枠がまだ空いていたら、無駄に頑張ってネタをひねり出して、もう少し書くかもしれません。止まるんじゃねえぞ…

春休みから矢上祭までの半年以上の月日をもってゲームを初めて制作したのち、僕はある危険思想を抱きました。

「更新頻度は短いほうが良いから、より少ない月日でゲームを制作してみよう」

unityroomではUnity1Weekが開催されていたり、DTM界隈では深夜の2時間DTMが開催されていたりと、ある定まった期間をもってお題に沿ったものを作ってみようという企画はたくさんあります。僕の中には、創作期間の短さ=更新頻度の短さ=善という考えがあったので、当然そういった企画への挑戦は視野に入りました。そこで、ゲームの作り方も一通りわかったところで、三田祭までの2か月弱でゲームを作ってみようというセルフチャレンジ企画、通称「うにてぃーみたちゃいちゃれんじ」なるものを勝手にやってみました。その時のことについて書いていきます。

早速申し訳ないのですが、制作期間は2か月弱とか言っておきながら、実際にUnityで制作したのは三田祭直前の7~3日前でした。というのも、間に合わなかったら矢上祭で作ったゲームを展示すればいいという逃げ道もあって、気持ち全体を100としたら、10ぐらいが「完成させなければ」、20ぐらいが「完成させたいな」、残り70ぐらいが「別に完成させなくてもいいかな」、という感じの気持ちで制作していました。じゃあ残りの50日ぐらいは何をしていたかというと、3日ぐらいは絵を描いて、残りの45日以上はコタツムリになって冬眠していました。

まあ、その描いた絵も結局使わなかったので無駄になりました。この場を借りて、供養させておきます。南無阿弥陀仏。

また、そんな感じで過ごしていたのでゲーム内容もブレブレになりました。企画書なるものを書いたのですが、これとは全然違うものが生まれました。

本当は五人の中からプレイアブルキャラを選べるという感じにしたかったのですが、二人だけ用意して、残りの右三人についてはゲームに登場できませんでした。彼女たちは犠牲になったのだ。

あと、前作でいろいろ設けた隠し要素とかも全部取っ払って作りました。Sceneの数も1つだけに抑えたり、ゲーム性は的当てゲームという一点に絞ったりして、なるべく最低限の機能を備えたゲーム作りに集中することで、短期間での制作を実現させました。また、前作で使ったスクリプトや素材を使うことで大幅な時間短縮も行いました。素材の数もなるべく少なくして、それを作る時間の代わりにデバッグに労力と時間を注ぎました。結果的に前作とは比べ物にならない速さで三田祭期間中にゲームの完成を可能にさせました。自分でもよく仕上げられたな、と思っています。

完成したゲームは、色に惑わされないように形を見極めてキーを押すという単純明快なものになり、一周60秒でランキングも備えている、周回を意識したものになりました。例によってランクも付けましたが、設定があまりにも簡単だったらしく、あまり機能していないかもしれません。

以上で、ゲームが出来るまでと、短い期間でのゲーム制作を実現するために工夫したこと、ゲーム内容やその感想について簡単に書きました。来年は期間とか更新頻度とかを気にせずに、自分の納得するまで一つのゲームに集中して制作をしていきたいです。

もう書きたいことは全部書いたので、この辺で記事を終わらせたいと思います。ここまで読んでくださり、ありがとうございました。あけましてメリークリスマス。今年はよろしくお願いしました。来年もよろしくお願いします。それでは。バイバイ。じゃあね。(@^^)/~~~

←14日目 | 16日目→

 

Posted on: 2020年12月25日, by : 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

とはいっても、まだ1700語ぐらいしか書いていないらしいです。ヤバい…。惰性を極めている。誠に遺憾である。

…このままだと終われないし、仕方がないので、制作過程の話でもして中身を盛っておきます。

草を用意します。

wwwwww

背景と木を用意します。

||||||

もっと大きな草を用意します。

wwwwww

子どもを二人召喚します。

❤ ♠

モーションを作ってAnimatorを開きます。

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

public class MiliaAnim : MonoBehaviour
{
    Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
        animator.SetBool("Damage", false);
        animator.SetBool("Shock", false);
        animator.SetBool("Attack", false);
    }

    // Update is called once per frame
    void Update()
    {
        if (Playing.mDamage) //スペードで間違えた時の動き
        {
            animator.SetBool("Damage", true);
        }
        else
        {
            animator.SetBool("Damage", false);
        }

        if (Playing.mShock) //ハートで間違えた時の動き
        {
            animator.SetBool("Shock", true);
        }
        else
        {
            animator.SetBool("Shock", false);
        }

        if (Playing.mAttack) //当たった時の動き
        {
            animator.SetBool("Attack", true);
        }
        else
        {
            animator.SetBool("Attack", false);
        }
    }
}

スクワ…動きをつけます。(これはUnityとは関係ないGIFアニメ)

((❤)) ((♠))

タイトルを作ります。

全部合体させます。

アイコンが完成しました。

影を作ります。

_((❤)) ((♠))_

でっかいハートとスペードを作ります。

❤ ♠

Translateで降らせるようにします。

Obj[num].transform.Translate(0, speedY * Time.deltaTime, 0);

Input.GetKeyDownとAnimatorでアクションをつけます。(コード直すの途中で面倒くさくなった)

 switch (num)
 {
     case 0:
         if ((Input.GetKeyDown(KeyCode.LeftArrow) || 
              Input.GetKeyDown(KeyCode.A)) && 
              !(mShock || TorF[0].enabled || 
              (Input.GetKeyDown(KeyCode.RightArrow) || 
               Input.GetKeyDown(KeyCode.D))))
             {
                 score += 200 * bonus;
                 combo++;
                 mAttack = true;
                 TorF[0].enabled = true;
                 playOn = false;
                 PlusMinus[plusminusNum].enabled = true;
             }
          else if (((Input.GetKeyDown(KeyCode.RightArrow) ||               Input.GetKeyDown(KeyCode.D)) ||               timeLimit >= 7.0f) &&
                         !(mAttack || TorF[1].enabled || 
                        (Input.GetKeyDown(KeyCode.LeftArrow) || 
                         Input.GetKeyDown(KeyCode.A))))
                    {
                        score -= 500;
                        combo = 0;
                        kDamage = true;
                        mShock = true;
                        playOn = false;
                        TorF[1].enabled = true;
                        PlusMinus[12].enabled = true;
                    }
                    else if ((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) && (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) 
                        && !(mShock || kShock))
                    {
                        score -= 500;
                        combo = 0;
                        mShock = true;
                        kShock = true;
                        playOn = false;
                        TorF[1].enabled = true;
                        PlusMinus[12].enabled = true;
                    }
                    break;

                case 1:
                    if ((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) 
                        && !(mShock || TorF[0].enabled || (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D))))
                    {
                        score += 200 * bonus;
                        combo++;
                        mAttack = true;
                        playOn = false;
                        TorF[0].enabled = true;
                        PlusMinus[plusminusNum].enabled = true;
                    }
                    else if (((Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) || timeLimit >= 7.0)
                        && !(mAttack || TorF[1].enabled || (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A))))
                    {
                        score -= 500;
                        combo = 0;
                        kDamage = true;
                        mShock = true;
                        playOn = false;
                        TorF[1].enabled = true;
                        PlusMinus[12].enabled = true;
                    }
                    else if ((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) 
                        && (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D))
                        && !(mShock || kShock))
                    {
                        score -= 500;
                        combo = 0;
                        mShock = true;
                        kShock = true;
                        playOn = false;
                        TorF[1].enabled = true;
                        PlusMinus[12].enabled = true;
                    }
                    break;

                case 2:
                    if ((Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D))
                        && !(kShock || TorF[0].enabled || (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A))))
                    {
                        score += 200 * bonus;
                        combo++;
                        kAttack = true;
                        playOn = false;
                        TorF[0].enabled = true;
                        PlusMinus[plusminusNum].enabled = true;
                    }
                    else if (((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) || timeLimit >= 7.0) 
                        && !(kAttack || TorF[1].enabled || (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D))))
                    {
                        score -= 500;
                        combo = 0;
                        mDamage = true;
                        kShock = true;
                        playOn = false;
                        TorF[1].enabled = true;
                        PlusMinus[12].enabled = true;
                    }
                    else if ((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) 
                        && (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) && !(mShock || kShock))
                    {
                        score -= 500;
                        combo = 0;
                        mShock = true;
                        kShock = true;
                        playOn = false;
                        TorF[1].enabled = true;
                        PlusMinus[12].enabled = true;
                    }
                    break;

                case 3:
                    if ((Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D))
                        && !(kShock || TorF[0].enabled || (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A))))
                    {
                        score += 200 * bonus;
                        combo++;
                        kAttack = true;
                        playOn = false;
                        TorF[0].enabled = true;
                        PlusMinus[plusminusNum].enabled = true;
                    }
                    else if (((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) || timeLimit >= 7.0)
                        && !(kAttack || TorF[1].enabled || (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D))))
                    {
                        score -= 500;
                        combo = 0;
                        mDamage = true;
                        kShock = true;
                        playOn = false;
                        TorF[1].enabled = true;
                        PlusMinus[12].enabled = true;
                    }
                    else if ((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A))
                        && (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D))
                        && !(mShock || kShock))
                    {
                        score -= 500;
                        combo = 0;
                        mShock = true;
                        kShock = true;
                        playOn = false;
                        TorF[1].enabled = true;
                        PlusMinus[12].enabled = true;
                    }
                    break;

                default:
                    num = 0;
                    break;
            }

Time.deltaTimeでSliderを制御します。

            slider.value -= Time.deltaTime / 7.0f;

制限時間を設けます。

        if (countDownTime <= 60 && countDownTime > 31)
        {
            Timer.color = new Color(0f, 0f, 0f); //黒のまま
        }
        if (countDownTime <= 31 && countDownTime > 11)
        {
            Timer.color = new Color(1f, 1f, 0f); //黄にする
        }
        if (countDownTime <= 11)
        {
            Timer.color = new Color(1f, 0f, 0f); //赤にする
        }
        if (countDownTime <= 0) //タイムオーバー
        {
            countDownTime = 0;
            TimeUp.enabled = true; //UIの表示
            Panel[0].enabled = true; //暗転
            playOn = false; //操作制御
            if (switchSE)
            {
                SE[4].Play(); //SEが鳴る
                switchSE = false;
            }
        }
        else if (countDownTime > 0 && !Panel[0].enabled)
        {
            countDownTime -= Time.deltaTime;
        }
        int seconds = (int)countDownTime;
        var t = seconds.ToString();
        Timer.text = t;

リザルト画面を作ります。

タイトル画面を作ります。

ランキング機能を追加します。

https://blog.naichilab.com/entry/webgl-simple-ranking

SEを拾ってきます。

https://soundeffect-lab.info/

https://taira-komori.jpn.org/freesound.html

必要に応じてaudacityで加工します。

BGMを作ります。(加工して使いまわした)

オプション画面を作ります。

AudioMixerで音量を調節できるようにします。

using UnityEngine.Audio;

void Update()
{
    _audioMixer.GetFloat("BGM", out volBGM);
    if ((Input.GetKey(KeyCode.RightArrow) || 
         Input.GetKey(KeyCode.D)) && volBGM < 20f)
         {
             volBGM += 10 * Time.deltaTime;
             if (volBGM >= 20f)
                 {
                     volBGM = 20f;
                 }
         }  
     if ((Input.GetKey(KeyCode.LeftArrow) || 
          Input.GetKey(KeyCode.A)) &&
          volBGM > -80f)
         {
              volBGM -= 10 * Time.deltaTime;
              if (volBGM <= -80f)
                  {
                      volBGM = -80f;
                  }
         }
     _audioMixer.SetFloat("BGM", volBGM);
}

ビルドします。

実機で最終確認します。

か~んせ~い。やった~。

 

 

 

…以上です。

←14日目 | 16日目→

 

 

 

Posted on: 2020年12月27日, by :