ぐーるらいふ

底辺。

【Unity】第16回「ふえる」私のアクアリウムについて【unity1week】

お疲れ様です。ぐーるです。
Unity1Weekの時だけ浮上してくる稀有な存在です。

今回は開催に全く気づかなくて木曜日に気付いて「あ、やべぇ」って冷や汗かきました。

毎回参加した記事をこのブログに書いてますが、実は読まれた回数50回もいきません。
やるだけ時間の無駄なのかもしれませんが、止める機会を失いダラダラと続けています。

お題について

xxxして人口を増やすゲーム!みたいなR-18オーバーキルするゲーム
を思いつきましたが、流石にヤバイだろうということで早々に諦めました。

私のアクアリウムについて

今回のゲームはとてもシンプルなゲームです。
謎の生物にエサを与えてその反応を見るゲームとしました。
少しずつ増えていく図鑑を眺めたり、ドット絵のアニメーションを眺めるのんびりとしたゲーム。
それだけです。

比較gif

開発当初のversion
f:id:ghoul_life:20200817171606g:plain

最終version
f:id:ghoul_life:20200817172227g:plain

クイズ番組のコンテンツみたいですね。
こうして見るとわかりやすいでしょうか。
細かくアニメーションを追加してたり、全体的なスピードを上げてたりしてます。
(それでもマッタリしたゲームですが)

ホラーゲーム?

最初はそんな設定なかったです。
「全て揃ったら終わり」それだけでしたが、
エンディングを用意することにしました。

見て下さった方はわかるでしょうが、
もう何もかも壊したい。そういう黒い感情です。

開発について

正直シンプルすぎてシステム面で話すことは少ないのですが、簡単に。

ランダムタイマーシステム

水槽の計器類であったり、背景のモニター、手のアニメーションの制御、
モンスターのアニメーションタイミングなどなど、色んな事を担うタイマーを用意しました。

public class RandomTimer : MonoBehaviour
{
    private float _waitTime = 0f;
    private float _nextTime = 0f;

    private float _randomMin = 0f;
    private float _randomMax = 0f;

    private System.Action _timerEvent = null;

    public void StartTimer(System.Action timerEvent , float min , float max)
    {
        _timerEvent = timerEvent;
        _randomMin = min;
        _randomMax = max;
    }

    void Update()
    {
        _waitTime += Time.deltaTime;

        if (_waitTime >= _nextTime)
        {
            _waitTime = 0;
            _nextTime = Random.Range(_randomMin, _randomMax);

            if(_timerEvent != null)
            {
                _timerEvent.Invoke();
            }
        }
    }

    void Destroy()
    {
        _timerEvent = null;
    }
}

使う側はこんな感じの一例です。

/// <summary>
/// ランダムな時間で点滅する
/// </summary>
[RequireComponent(typeof(RandomTimer))]
public class Blink : MonoBehaviour
{
    [SerializeField] Image _image = null;
    [SerializeField] RandomTimer _randomTimer = null;

    private bool _isOn = true;

    // ちょっとわかりやすく固定値としている。
    private const float RANDOM_WAIT_MIN = 0.5f;
    private const float RANDOM_WAIT_MAX = 3.0f;

    void Start()
    {
        _isOn = true;
        _randomTimer.StartTimer(TimerEvent, RANDOM_WAIT_MIN, RANDOM_WAIT_MAX); 
    }

    private void TimerEvent()
    {
        _isOn = !_isOn;

        if (_isOn)
        {
            _image.color = Color.white;
        }
        else
        {
            _image.color = Color.clear;
        }
    }
}

これを色んな所で組み替えて使ってます。

ドットっぽいアニメーション

昨今ハードウェアも凄く性能が高いので、枚数が多い滑らかなアニメーションでも問題ないのですが、
ドット風のゲームだと違和感が出ます。

位置の移動、ブラックアウトといったドット絵とは関係ないシステム面も
ドットっぽくカクつくような動きになるように補完を計算しないシステムにわざとしています。
移動も似たような感じです。

    // ブラックアウト部分、一部抜粋。
    private void FadeOutExecute()
    {
        if(_nowAlpha < 1)
        {
            _time += Time.deltaTime;
            if (_time >= FADE_TIME)
            {
                _time = 0;
                _nowAlpha += FADE_VALUE;
                SetBlackOutAlpha(_nowAlpha);
            }
        }
        else
        {
            SetBlackOutAlpha(1);
            _blackOutMode = Mode.NONE;

            if(_finishCallback != null)
            {
                _finishCallback.Invoke();
            }
        }
    }

イラストについて

ドット絵を書くならEDGEとかAsepriteとか色々有名なツールがありますが、
自分は慣れているCLIP STUDIOのドットペンで描いてます。

f:id:ghoul_life:20200817212744p:plain

アニメーション関係

ドットアニメーションを作るならCLIP STUDIOでも出来ますが、Pixakiというツールを使ってみてます。

f:id:ghoul_life:20200817174545p:plain
https://rizer.co/jp/pixaki/

めちゃくちゃ高いです。なんとお値段3000円!

ドットアニメーション作成に特化したツールでオニオンスライスや速度変化、コマ別の長さ調整などが簡単にできるようになってます。
レビューコメントではあんまり良い評価ではありませんが…。(色周りは特に使いにくい)
アニメーション作るならまぁまぁ楽が出来るのではないでしょうか。
それにしてもお値段が強気。ガチャ10連爆死したと思って買うとか…。

あと言えることはドット絵アニメーション作るのめっちゃ楽しいです。

f:id:ghoul_life:20200817212759p:plain

リリース直前で焦ったやつ

音が鳴らない

Chromeだけ音が鳴らない!なんで!?
とアワアワしたが、セキュリティの問題だった。

文字が表示されない

「あれ、フォント入れてるのに言葉がヘンだぞ!?」
と思ったらフォントが表示出来ない文字を結構使ってしまっていた。
文字をひらく(漢字をひらがなに変える、別の言葉に変える)で対応

以上

次はエッチなR-18ゲームでも出して
思いっきりBANされようかな…。