ホーリーのプログラミング日記

ホーリーのプログラミング日記

エキセントリック・スーパーアプリクリエイター / アプリ総DL数 約180万 / 全然分からない 俺は雰囲気でアプリを作ってる / iOS : apple.co/3m3HxSm / Android : bit.ly/3ma0liZ

Unityで効果音が遅れる問題を解決してみた

 

こないだUnityで作ってるゲームに音を付けたんですが、何でだが遅れてました。ボタンを押してから、その効果音が鳴るまでにタイムラグが発生してたんですよ。

これを書いてる今日まで、Unityで音の出るゲームは、Androidしか作ったことがありませんでした。んで今回のエラーはiPhone

最初は音楽ファイルが重いせいだと思ってたんですが、少々無駄なものを消去しても変わりなし。「な、なんじゃこれは?神のイタズラか?」って感じで途方に暮れてたんですが、参考になるサイトを見つけました。

 

それがこちら。

親子の取得、非表示設定、音ズレ解消【Unity】 - (:3[kanのメモ帳]

 

効果音等を鳴らす時、モバイル上だとズレる場合には以下の様に設定すれば直ります。
Edit->ProjectSettings->Audioを選択、
AudioManagerのDSPBufferSizeをBest Latencyに設定。

 

この記事の最後の方に書いてるやり方をやってみたところ、ちゃんとジャストタイミングで音が鳴るようになりました。

 

いやー、よかったですよ。神のイタズラじゃなくて。

 

そんなこんなで一安心したって話でした。

ゲームをテストプレイしてくれる人の大切さ

 

ホリエモンこと堀江貴文さんが、近畿大学で講演されてる動画があるんですが、これ僕好きなんですよ。

 

 

んで、この冒頭で行ってる言ってるわけです。「あなたたちはスマートフォンでゲームばかりしてるのかもしれないけど、その間にも世界は猛スピードで変わってるって」

ウル覚えで見返すのも面倒なんですが、こんなニュアンスのことを言ってました。

 

これは僕も賛成で、車とスマホは、結局使う人次第なんですよね。それを活かすも殺すも。

スマホは今どきみんな持ってますが、これで消費のゲームをするのか、自分のための勉強をするのか、これが人生の分かれ道になると思っています。

 

ただ、ただですよ。ここで一言だけ言っておきたい。

 

スマホでゲームばかりしてる人は大切だぞ

 

と。

 

僕の周りにはスマホゲーム廃人が多いんですが、そういう人たちに、いつも自分の新作ゲームをプレイしてもらってます。んで感想を聞くって感じですね。これどう?って。

 

スマホでゲームばかりしてる人って、世間的にはいいイメージないんでしょうが、アプリ開発者にとっては、最高の人たちです。

これ正直、頭のいい人は少ないですよ。ゲームばかりしてる人と、そうでない人を比べたら、ゲームばかりしてる人のほうが、アホが多いでしょう。

 

でも、

 

ゲームに関しては鋭いんですよ

 

これマジで。

 

具体的に言うと、僕はいつもこの人にプレイしてもらってます。ゆーじみやもとに。

宮本雄司のGLAMOROUSDAYS

 

ブログの文章を読んでもらえれば、多分に漏れずアホなのが伝わると思うんですが、本人ゲームには鋭いんですよ。

彼の意見を参考に実装することは多いし、彼にテストプレイしてもらって、「いいね!」って言われるとマジで嬉しくなります。

 

やっぱ自分で作ったゲームって、自分ではよく分からないんですよ。面白いのか、そうでないのかはもちろん、何が足りないのかが分かりません。

そんなときに、スマホゲーム廃人が頼りになるんですよね。

 

自分のゲームをテストプレイしてくれる人っていうのは、本当にありがたい。大切な存在だと思っています。

【Unity】EasyMakingTransitionを使って、画面遷移のアニメーションを作ってみた

 

ゲームを作ってるときって、画面遷移するときにアニメーションがほしくなりますよね。パッと切り替わるのは味気ないんで、なにかアニメーションしてほしい。

 

えー、そんなわけで、こんなものを作ってみました。

 

 

ツイッターに動画を載せたんですが、こんな感じですね。グルグル回りながら画面遷移しています。

 

これ、EasyMakingTransitionっていうアセットを使って作ったんです。生まれて初めて、アセットストアなるところで買い物をしてみましたよ。

Asset Store

 

このEasyMakingTransitionには、画面遷移のアニメーションが40種類揃っています。

またそのアニメーションスピードを変えたりと、色々カスタム出来るようになってますので、色んなことが出来ますね。

画面遷移する際には、当分これを使おうと思います。

 

☆☆☆

 

そもそもこれの存在を知ったのは、この本を読んだからでした。

 

Unity5 3D/2Dゲーム開発実践入門 作りながら覚えるスマートフォンゲーム開発

Unity5 3D/2Dゲーム開発実践入門 作りながら覚えるスマートフォンゲーム開発

 

 

この本の最後の方に「アセットストアの利用」って章があるんですけど、そこで著者の方のおすすめアセットとして、EasyMakingTransitionが紹介されてたんです。

画面遷移といえばこれ、みたいな紹介だったので、安心して購入することが出来ました。紹介がなかったら、アセットってやつにビビって、購入しなかったに違いありませんw

 

ちなみにこの本は3Dゲームがメインの本です。なので、2Dメインの僕にとっては、そこまで参考にはならなかったんですけど、おすすめアセットのことや、アプリのリリース方法については詳しく書いてありました。いまだにUnityでアプリをリリースするときは、この本を見ながらやっています。

あと、2Dゲーム作りの紹介が1個だけあるんですけど、それが横スクロールゲームなんですよ。僕でいうところの泳げおっさんですね。

なので2Dの横スクロールゲームを作りたいって人にはバッチリかもしれません。

 

☆☆☆

 

さて、ここからはEasyMakingTransitionの使い方について、ちょっと書いてみます。

案の定、最初はよく分からなかったんですよ。んで今でもそんなに分かってるわけではないんですが、最低限のことは出来るようになりました。

 

とりあえずEasyMakingTransitionをインストールすると、なんかDEMOがついてるんですよ。作者の方の。なので、とりあえずそれを参考にするといいと思います。

DEMOをイジってるうちに、なんとなくのことは理解出来るかと。

 

あと、参考にしたサイトはこちらです。最低限の基礎知識はここで学びました。

【Unity】トランジション(画面遷移)する方法 Easy Masking Transition - CGメソッド

 

上記のサイトを見ていただければ、分かるんですが、まずはCanvasの中にEasyMakingTransitionを作ります。これ、EasyMakingTransitionをインストールしたあとだと、自動的にその項目が出てきました。

 

んで、ここからあれこれと設定するんですが、まず先に僕のコードを貼っておきましょう。これ多分鈍臭いことになってるとは思うんですが、こんな感じに書きました。

 

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class TransitionManager : MonoBehaviour {

    public EMTransition transition1;
    public GameObject button;
    float delay = 0.5f;
    bool isCloseScene = true;

    string sceneName;
    int changeFlg = 0;

    public void OnTransitionStart()
    {
        if(!button) return;
        if(isCloseScene) {
            button.gameObject.SetActive(false);
        }
    }

    public void OnTransitionComplete()
    {
        if (changeFlg == 1) {
            MoveScene ();
        } else {
            button.gameObject.SetActive (true);
        }
        if(!button) return;
        if(isCloseScene) {
            isCloseScene = false;
            //            Invoke ("OnStartAnimation", delay);
        } else {
            button.gameObject.SetActive(true);
            isCloseScene = true;
        }
    }

    public void OnStartAnimation()
    {
        transition1.Play();
    }

    public void ChangeName(string name){
        sceneName = name;
        changeFlg = 1;
    }

    void MoveScene(){
        SceneManager.LoadScene (sceneName);
    }
}

 

f:id:gevvoihorry:20170428173537p:plain

 

これゲームのタイトル画面なんですが、そこに新しいCanvas、CanvasTransitionを作り、EasyMakingTransitionを、その中に作ります。

ついでに、トランジション(画面遷移のアニメーション)を管理する、TransitionManagerも作りました。空のオブジェクトって言うのかな?まあそれです。

それで上記のコードファイルを、TransitionManagerに付けます。まあこれで最初の準備はOK。

 

てかもう終わりです。そんなに説明出来ることがないなw

 

えー、あれだ。Canvas内にあるEasyMakingTransitionは、ストレッチみたいなことにして、画面サイズに合わせました。

 

f:id:gevvoihorry:20170428173821p:plain

 

その他のEasyMakingTransitionの設定はこんな感じ。

 

f:id:gevvoihorry:20170428173921p:plain

 

f:id:gevvoihorry:20170428173931p:plain

 

Textureに画像をセットしてるのは、キャンバスごと消えるコードを書いてるので、その背景を出しておきたくて、設定しました。

これタイトル画面の画像と全く同じなんですけどね。EasyMakingTransitionのアニメーションを、キャンバスの上に表示するのが分からなかったんで、こうした次第です。

 

上記のコードは、DEMOのそれをちょっとイジってまして、画面遷移のコードを付け加えました。

なんかもっといいやり方がありそうなんですが、現状はこんな感じです。

 

あとそうそう。これ遷移する先にも、アニメーションを実装しないといけないんですよ。

上記したツイッターの動画では、グルグル回って遷移したあと、また反対にグルグル回ってるじゃないですか。グルグル2回。

これは、遷移先のシーンにもEasyMakingTransitionをセットしています。

 

実装方法は上記のそれと同じですね。反対のグルグルになるので、トランジションカーブってやつを逆にしています。Flipってボタンを押して。

実装したことは、このくらいです。

 

しかしEasyMakingTransitionいいですよ。これがあることで、ゲーム作りが今まで以上に楽しくなった気がします。

あんまりUnityのこと分かってない僕でも実装出来たので、初心者の方にもおすすめですね。

Asset Store

超初心者の僕がやってるUnityで音を出す方法

 

実はアプリに音(サウンド)を付けるのが苦手です。とりあえずいい音楽(BGM)だったり、効果音が見つからないんですよね。

使うのは基本的にフリー素材で、そんなにこだわって探してるわけでは、ないんですが、いつも適当なのが見つからずに苦労しています。

ザックリの幅で探してるんですけどね。大体こんな感じでいいやって風に。それでも常に困難を極めますw

 

ちなみに、よく使ってるフリー素材のサイトはこの辺です。

 

BGM

フリーBGM(音楽素材)無料ダウンロード|DOVA-SYNDROME

 

効果音

無料効果音で遊ぼう!

生活[3]|効果音ラボ

トップページ -フリー効果音素材 くらげ工匠

 

これ以外だと魔王魂くらいですかね。まあここ使ったのは一度だけですけど。

(魔王魂に不満があったわけではないですよ。何となく探しにくい感じがして、やや敬遠してるだけです。ここ使ってる人は多いですよね)

 

んで、このサウンドの実装方法ですよ。「Unity BGM 効果音 実装」みたいにググると、結構沢山出てくるんですが、ポンコツプログラマの僕には、どうにも分かりにくい。

んで、いつも適当な感じに実装してるんですが、ちょっとそれを紹介してみようと思います。

 

☆☆☆

 

まず空のオブジェクト、SoundManagerみたいなやつを作ります。これはゲームのスタート画面、最初に起動する画面に1つ作るだけですね。あとはこれをシングルトンて言うのかな?それにして、このオブジェクトがシーンをまたいでも消えないようにしています。

 

実際のコードはこんな感じ。これをSoundManagerにタッチして、あとはそれぞれのシーンで呼び出しています。

フラグを設定して、それを呼び出す関数を作ってるのは、BGMの切り替えのためですね。

 

using UnityEngine;
using System.Collections;

public class SoundManager : MonoBehaviour {

    public GameObject soundManager;

    public AudioClip BGM1;//タイトル画面
    public AudioClip BGM2;//ゲーム画面
    public AudioClip BGM3;//オープニング 
    public AudioClip buttonSE;
    public AudioClip shortButtonSE;
    public AudioClip digSE;
    public AudioClip upSE;
    public AudioClip stopSE;
    public AudioClip justStopSE;
    public AudioClip notStopSE;
    public AudioClip bombSE;
    public AudioClip coinSE;
    public AudioClip drumRollSE;
    public AudioClip rollFinishSE;
    public AudioClip cardYesSE;
    public AudioClip cardNoSE;
    public AudioClip sceneChangeSE;

    private AudioSource audioSource;

    int BGMFlg = 1;

    //シングルトンの処理
    void Awake ()
    {

        DontDestroyOnLoad (soundManager);

        audioSource = gameObject.GetComponent<AudioSource> ();

    }

    public void StartBGM1(){
        audioSource.clip = BGM1;
        audioSource.Play ();
        BGMFlg = 1;
    }

    public void StartBGM2(){
        audioSource.clip = BGM2;
        audioSource.Play ();
        BGMFlg = 2;
    }

    public void StartBGM3(){
        audioSource.clip = BGM3;
        audioSource.Play ();
        BGMFlg = 3;
    }

    public int GetBGMFlg(){
        return BGMFlg;
    }

    public void StopBGM(){
        audioSource.Stop ();
    }

    public void SoundButton(){
        audioSource.PlayOneShot (buttonSE);
    }

    public void SoundShortButton(){
        audioSource.PlayOneShot (shortButtonSE);
    }

    public void SoundDig(){
        audioSource.PlayOneShot (digSE);
    }

    public void SoundUp(){
        audioSource.PlayOneShot (upSE);
    }

    public void SoundStop(){
        audioSource.PlayOneShot (stopSE);
    }

    public void SoundJustStop(){
        audioSource.PlayOneShot (justStopSE);
    }

    public void SoundNotStop(){
        audioSource.PlayOneShot (notStopSE);
    }

    public void SoundBomb(){
        audioSource.PlayOneShot (bombSE);
    }

    public void SoundCoin(){
        audioSource.PlayOneShot (coinSE);
    }

    public void SoundDrumRoll(){
        audioSource.PlayOneShot (drumRollSE);
    }

    public void SoundRollFinish(){
        audioSource.PlayOneShot (rollFinishSE);
    }

    public void SoundCardYes(){
        audioSource.PlayOneShot (cardYesSE);
    }

    public void SoundCardNo(){
        audioSource.PlayOneShot (cardNoSE);
    }

    public void SoundSceneChange(){
        audioSource.PlayOneShot (sceneChangeSE);
    }

}

 

シングルトンの処理、なんてコメントがありますけど、これ最初どこからか持ってきたんですよ。元になるコードを。その名残ですね。

元のコードは僕には難解だったので、もう跡形もなくなるくらいイジりましたw

 

DontDestroyOnLoadっていうのが、画面遷移してもオブジェクトがなくならないようにする処理ですね。

これ宣言するとなくならなくていいんですが、テストのときに困ります。いちいち、そのオブジェクトがないってエラーが出るんで。

(例えばタイトル画面にサウンドマネージャーをセットしてるときは、タイトル画面からビルドするのはいいんですが、他の画面からビルドすると、サウンドマネージャーが見つからないぞって言われます)

 

まあまあ、僕がUnityで音を出すときは、現状こんな感じにしています。

ボリュームの調整とかは出来ませんよ。そういう難しいことは、他のサイトを参考にしてくださいw

 

以上、超初心者の僕がやってるUnityで音を出す方法って話でした。

 

【追記 2017.05.05】

シングルトンを覚えたので、もうちょっと安全に実装出来るようになりました。

Unityでシングルトンなオブジェクトを作ってみた - ホーリーのプログラミング日記

 

上記のコードだと、シングルトンを使わないと、多重再生される可能性があるみたいなんですよね。この記事の最後のコメントによると。

シーンを遷移してもBGMを継続して再生する方法 - Qiita

 

なので、こんな風にコードを変えてみました。

 

using UnityEngine;
using System.Collections;

public class SoundManager : MonoBehaviour {

//    public GameObject soundManager;
    static public SoundManager instance;

    public AudioClip BGM1;//タイトル画面
    public AudioClip BGM2;//ゲーム画面
    public AudioClip BGM3;//オープニング 
    public AudioClip buttonSE;
    public AudioClip shortButtonSE;
    public AudioClip digSE;
    public AudioClip upSE;
    public AudioClip stopSE;
    public AudioClip justStopSE;
    public AudioClip notStopSE;
    public AudioClip bombSE;
    public AudioClip coinSE;
    public AudioClip drumRollSE;
    public AudioClip rollFinishSE;
    public AudioClip cardYesSE;
    public AudioClip cardNoSE;
    public AudioClip sceneChangeSE;

    private AudioSource audioSource;

    int BGMFlg = 1;

    //シングルトンの処理
    void Awake ()
    {

        if (instance == null) {

            instance = this;
            DontDestroyOnLoad (gameObject);
        }
        else {

            Destroy (gameObject);
        }

//        DontDestroyOnLoad (soundManager);

        audioSource = gameObject.GetComponent<AudioSource> ();

    }

    public void StartBGM1(){
        audioSource.clip = BGM1;
        audioSource.Play ();
        BGMFlg = 1;
    }

    public void StartBGM2(){
        audioSource.clip = BGM2;
        audioSource.Play ();
        BGMFlg = 2;
    }

    public void StartBGM3(){
        audioSource.clip = BGM3;
        audioSource.Play ();
        BGMFlg = 3;
    }

    public int GetBGMFlg(){
        return BGMFlg;
    }

    public void StopBGM(){
        audioSource.Stop ();
    }

    public void SoundButton(){
        audioSource.PlayOneShot (buttonSE);
    }

    public void SoundShortButton(){
        audioSource.PlayOneShot (shortButtonSE);
    }

    public void SoundDig(){
        audioSource.PlayOneShot (digSE);
    }

    public void SoundUp(){
        audioSource.PlayOneShot (upSE);
    }

    public void SoundStop(){
        audioSource.PlayOneShot (stopSE);
    }

    public void SoundJustStop(){
        audioSource.PlayOneShot (justStopSE);
    }

    public void SoundNotStop(){
        audioSource.PlayOneShot (notStopSE);
    }

    public void SoundBomb(){
        audioSource.PlayOneShot (bombSE);
    }

    public void SoundCoin(){
        audioSource.PlayOneShot (coinSE);
    }

    public void SoundDrumRoll(){
        audioSource.PlayOneShot (drumRollSE);
    }

    public void SoundRollFinish(){
        audioSource.PlayOneShot (rollFinishSE);
    }

    public void SoundCardYes(){
        audioSource.PlayOneShot (cardYesSE);
    }

    public void SoundCardNo(){
        audioSource.PlayOneShot (cardNoSE);
    }

    public void SoundSceneChange(){
        audioSource.PlayOneShot (sceneChangeSE);
    }

}

 

今のところ感度良好。こっちの方がいいですね。安心感が違うでしょう。

【Unity】バックグラウンドでも時間の経過を取得する方法

 

前にUnityで時間を求める記事を書いたんですが、これ盛大に間違ってましたw

アブラカタブラの難所を超えてきました - ホーリーのプログラミング日記

 

いや、ちゃんと動くんですけど、アプリがバックグラウンドになったり、また終了してしまうと、時間の取得が出来ないっていう、ポンコツ仕様だったみたいです。昨日気が付いたんですけどね。。

 

んで初心に立ち返って考えたら、何かアイディアが出てきました。

そもそも僕、PHPではそれ出来てるんですよ。ビルメンネットには、案件の掲載期日があって、時間の経過を取得していました。

また、こないだ出した「命の時間」もそうですね。あれも時間の取得がちゃんと出来ています。

 

そんなわけで、ゼロベースで考えた結果、何かが見えてきましたよ。

ここから少々分かりづらいので、根性のある方のみ、読み進めていただけると幸いです。

(読んだ結果、何かを得られる保証はありませんw)

 

まずC#で現在時間を取得する方法は非常に簡単なんですが、これをセーブする方法が分かりませんでした。

時間はDateTime型になるんですが、これをPlayerPrefs.Setなんとかでセーブする方法が分からなかったんです。PlayerPrefsに、そういう型が見つからなくて。

 

なので、PHPでやってたような、1970年1月1日から、今までの秒数を取得して、それをセーブすることにしました。

これならInt型でもいけるんで、そうしてみた次第です。

 

「基準となる時間」の、1970年1月1日からの秒数。また1970年1月1日から「現在時間」までの秒数。この2つを求めて、基準の秒数から、現在の秒数を引けば、その差分が出てくると思い、この方法を選択しました。

これ数値はマイナスになるので、−1を掛けてプラスの値にしています。

 

baseTime = new DateTime (1970,1,1);
startTime = DateTime.Now;
startdiff = (startTime - baseTime).TotalSeconds;
PlayerPrefs.SetInt ("STARTDIFF",(int)startdiff);

 

とりあえず、ゲームのタイトル画面みたいなところで、startTimeを設定します。これが基準の時間ですね。んでstartdiffが基準の秒数。

 

これを設定してる前提で、ゲーム画面へ遷移します。

 

using UnityEngine;
using System.Collections;
using System;
using UnityEngine.SceneManagement;

public class TimeManager2 : MonoBehaviour {

    int life;

    DateTime startTime;
    DateTime nowTime;
    DateTime baseTime;

    double startdiff = 0;
    double nowdiff = 0;
    double seconddiff = 0;

    double minute = 0;
    double second = 0;
    double num = 30; //秒数。

    int result = 0;

    int beforeSecond = 0; //30秒で回復するんだけど、画面遷移したときに、秒数が余ってたら、ここに入れる。これないと、常に30秒スタートになる。


    // Use this for initialization
    void Start () {
        
        life = PlayerPrefs.GetInt ("LIFE");

        baseTime = new DateTime (1970,1,1);
        if (life < 5) {
            startdiff = PlayerPrefs.GetInt ("STARTDIFF");
        } else {
            startTime = DateTime.Now;
            startdiff = (startTime - baseTime).TotalSeconds;
            PlayerPrefs.SetInt ("STARTDIFF",(int)startdiff);
        }

    }
    
    // Update is called once per frame
    void Update () {

        if (life >= 5) {
            startTime = DateTime.Now;
            startdiff = (startTime - baseTime).TotalSeconds;
            PlayerPrefs.SetInt ("STARTDIFF",(int)startdiff);
        }

        nowTime = DateTime.Now;
        nowdiff = (nowTime - baseTime).TotalSeconds;

        seconddiff = (startdiff - nowdiff) * -1;
        seconddiff = Math.Floor(seconddiff);

        if (life >= 0 && life < 5 && seconddiff > 0) {

            result = (int)seconddiff / (int)num;
            if (result >= 1) {
                beforeSecond = (int)seconddiff % (int)num;
                life += result;
                startTime = DateTime.Now;
                startdiff = (startTime - baseTime).TotalSeconds;
                if (life > 5) {
                    life = 5;
                } else {
                    startdiff -= (double)beforeSecond;
                }
                PlayerPrefs.SetInt ("STARTDIFF",(int)startdiff);
                PlayerPrefs.SetInt ("LIFE",life);

            }

        }

    }
        
} 

 

他人が見て分かるか疑問なんですが、こんな感じで実装することが出来ました。

アプリがバックグラウンドになったときはもちろん、アプリを終了させても、ちゃんと時間を取得して、ライフの回復を行っています。

ちなみにライフは5ですね。5が最大値の設定です。

 

なんとなく心配なのは、Update ()の中でセーブを行ってることですね。これ、処理重くならないかと気にしています。無知なので分かりませんが。

 

まあまあ、こんな感じで、バックグラウンドでも時間の経過を取得出来るようになったって話でした。

ゴリゴリかスマートか

 

僕がプログラミングで行き詰まるときっていうのは、2パターンあります。

 

① そもそもどうやって書いたらいいのか分からない

② スマートな書き方が分からない

 

この2つです。

 

おかげさまで最近では、1の方はなくなってきたんですよ。段々。

そもそもどうやって書いたらいいのか分からないって状況は減ってきました。

 

ただ、2の方はよくありますね。スマートなやり方が分からないってときは。

 

そんなときにどうしているのかと言えば、あれ。

 

ゴリゴリに書くんです

 

スマートの対極にあると言われるゴリゴリ。それを発動するしかないですね。

 

 

これ僕が中学生の頃に、塾の先生がよく言ってたんですよ。公式が分からずに、無理矢理計算で解くことを、ゴリゴリって。

「きみはゴリゴリだね。脳みそ筋肉で出来てるんじゃないの?」なんて言い方をしていました。

 

さて、それで今ですよ。当時ゴリゴリと言われてた僕ですが、いまだにゴリゴリのままでございます。

スマートな書き方が分からないこと山の如しなんですが、常にゴリゴリを発動しております。

 

ゴリゴリ書けば、なんとかなりますからねw

 

まあみんな分かってることでしょうが、ゴリゴリに書く欠点は、コードが冗長になることと、メンテナンスがしにくくなるってことです。

とにかく無駄に長いコードになるので、いいことはないんですが、当面の実装は出来るってことですね。

 

ゴリゴリゆけよ。ゆけば分かるさ。

 

こんな名言を残して終わりたいと思います。

70%でリリースしようと思っても製作期間は長くなる

 

done is better than perfect(完璧を目指すより、まず終わらせろ)っていうのが僕のモットーなんですけど、この言葉に沿って、アプリはいつも70%の出来になったらリリースするようにしています。

(ごめんなさい。本当は50%でも出してますね。。)

 

ようは、完璧を目指してると時間ばかりかかっちゃうし、そもそも僕の完璧なんてもんは非常にレベルが低いのでこうしてるんですが、それでも時間がかかるんですよね。

70%でいいと思っていても、実際の制作日数は当初思ってた2倍くらいかかることが普通です。

 

てかこれを書いてる今もあれなんですよ。

 

アブラカタブラがめっちゃ遅れてます

 

本当はブログなんて書いてる場合じゃないんですが、現実逃避の一環として書いてる次第です。ああ。。

「油田採掘ゲーム アブラカタブラ」を作ります - ホーリーのプログラミング日記

アブラカタブラの難所を超えてきました - ホーリーのプログラミング日記

 

これ完全に自分に向けての文章なんですが、もっと早くリリース出来るようにならないといけないんですよね。

早くリリースして、周りの意見や、アプリのレビューを見ながらPDCAを回していくのが、クオリティを高めていく一番の近道でしょう。

(今日までレビュー書かれてるのは、職安へ行こうしかないですけどw)

 

正反する言葉のようですが、クオリティを高めるためには、スピードを高めること。これなんですよ。

前に「佐藤オオキ」さんがそう言ってたんで、間違いありませんw

 

400のプロジェクトを同時に進める 佐藤オオキのスピード仕事術

400のプロジェクトを同時に進める 佐藤オオキのスピード仕事術

 

(この本の中でそう言ってました) 

 

えー、そんなわけで年内に30本リリースする計画に、早くも遅れが出ています。

今年のアプリ目標的な何か - ホーリーのプログラミング日記

 

これはあれだ。

 

簡単に出来るしょーもないアプリを量産して巻き返すしかないぜ。