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

読者です 読者をやめる 読者になる 読者になる

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

プログラミング初級者。歴1年。ポンコツアプリを量産しています。現在の総ダウンロード数:45000

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

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

 

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

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

 

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

 

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

 

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

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

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

 

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

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

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

 

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

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

 

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

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

 

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

 

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

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

 

これはあれだ。

 

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

AdMobのバナー広告をGoogle神が自動で最適化してくれるようになってた件

 

今さらな話題かもしれないんですが、AdMobのバナー広告の更新頻度が、自動化出来るようになってます。

これまではデフォルトが60秒、つまり60秒に1回、広告が切り替わる仕様でした。

 

んで、僕はこれを45秒に変えてたんですよ。なんかもう少し頻繁に切り替わるほうが、クリック率が上がるかもしれないと思って。

ただ、今は自動化されてるんで、もうGoogle神にお任せですね。

 

f:id:gevvoihorry:20170424192853p:plain

 

具体的にはここですね。ここにある「カスタム更新頻度」ってところで、更新時間を設定していたんですが、「Googleによる最適化」っていうのが出来たんで、今はほぼ全部これにしています。

 

f:id:gevvoihorry:20170424193006p:plain

 

Googleによる最適化、過去のAdMobデータに基づいて算出なんていう、頼もしいことが書いてありますからね。これはもうお任せの一択でしょう。神の判断が一番ですよ。

 

なんか前からこうしてる風に書きましたけど、これ本当は今日変更しました。

神の手があるってことに気付いてなくてw

 

まだデータは出ていないんですが、元々60秒のデフォルトで設定していたアプリは、自動的に「Googleによる最適化」に切り替わっています。んで、そのアプリのインプレッション収益がいいんですよね。

だから、今さらながら急いで変えた次第です。

 

これ、試してみる価値ありですよ。

 

P.S.

前にUnityにAdMobを貼る方法を書きました。これかなり簡単なんでおすすめです。

UnityにAdMobのバナー広告を実装してみました - ホーリーのプログラミング日記

 

んで、上記のはAndroidのそれなんですが、iPhoneはこの記事を参考にしました。

[Unity] AdMob広告をiPhoneアプリに貼る | Unity 3DCG

 

どちらも簡単なんで、まだやったことのない人は試してみてください。

僕の場合はNendよりAdMobの方が単価高くなってますね。

UnityAdsを導入したんだけど、インプレッション数が少なすぎて収益0円だった件

 

こないだ出した「命の時間」てアプリにUnityAdsを実装してみました。Unityが提供してる動画広告ですね。

 

 

 

有名なところで言うと、「クロッシーロード」ってゲームが、このUnityの動画広告だけで、3.6億円の売上を達成しています。

無料ゲーム『クロッシーロード』、Unityの広告システムで約3.6億円の売上げを達成。

 

なので、「これは大金持ちへの最短ルートじゃ!!」ってテンションで実装してみたんですが、あれなんですよね。

 

売上が0円なんです

 

何度見ても0円。朝見ても夜見ても。昼に突然見ても0円のままなんですよ。

 

f:id:gevvoihorry:20170423195456p:plain

 

「お前インプレッション数168で何言ってんだよ」ってツッコミが入りそうなんですが、僕にとっては「すでに168」なんですw これで1円にもなってないのはツライ。

 

んで画面をよく見ると、「チャートを表示するための十分なデータがありません。しばらく時間が経った後でもう一度ご確認ください」なんて書いてるので、どんだけ見られたらデータが出てくるのか調べてみました。

てかこれ「請求」ってところにあるんですよね。「収益化に関するFAQ」って項目がそこにありました。

 

んで、その文章がこれですよ。

 

Unity Ads を組み込み、100 インプレッション( started )を記録したのに、まだ収益がありません。なぜですか?

通常、あなたのアプリから送出されるユーザーの品質を判断するのに、5000またはそれ以上のインプレッションが必要になります。つまり、質の高いユーザーとインプレッションに基づいて収益を得ることになります。 

 

5000

 

なんとビックリの5000インプレッションが必要みたいです。Unityマジか。ハードル高いな。。

 

☆☆☆

 

これを読む限り、最低5000インプレッションを達成したところで、ようやく収益が発生して、それを元に入金がされるみたいです。

ユーザーの品質判断って書いてますけど、これほんとに5000インプレッションもいるんですかね?まあ書いてるからしょうがないんですけど、その時点でいくら発生するのか、非常に興味深いところです。

 

また入金はこっちから請求しないといけないみたいですね。

報酬支払い依頼フォームってところに、そんなことが書いてありました。

 

f:id:gevvoihorry:20170423200521p:plain

 

100ドルを超えた時点で請求することが出来て、そのお金が2ヶ月後に入ってくると書いてあります。

 

今のところ、UnityAdsに関する僕が持ってる情報はこれだけなんですが、早く請求出来るくらいまで、収益が上がってほしいです。

 

いつまでも0円はせつなすぎますよ。マジで。。

ブログの記事下に自作アプリのランキングを作ってみました

 

今日まで記事下で、自作iPhoneアプリとAndroidアプリを適当に紹介してたんですが、これをランキング形式にしてみました。

詳しくは、この記事の画面下をご覧いただくとして、ザックリこんな感じになってます。

(スクロールして見てくださいねw)

 

f:id:gevvoihorry:20170423192706p:plain

 

これはパソコンから見た画面ですね。自分のアプリをiPhoneとAndroidに分けて、それぞれのダウンロード数を書いてみました。これガチのやつです。

 

しかしあれですね。

 

Androidのダウンロード数が少なすぎる

 

1位の職安へ行こうで400。2位の泳げおっさんが50ダウンロードですからね。どんだけダウンロードされてないんだって話なんですが、これは僕が一番言いたいことなんです。

 

Androidどうなってんねん

 

アイフォンとのこの落差。なんでだ。Androidユーザーにマトモな理解者はいないのか。Android、ひいてはGoogleの策略か。俺を陥れようとしてるのか。

などなど、考え出せばキリがないんですが、これは宇宙の大きな力が働いてるんだと解釈しています。

 

僕みたいなエキセントリック・スーパーアプリクリエイターには、色々な業が降りかかってくるんですよね。

まあこれも定めだと思って、受け入れる所存でいます。

【Unity】UGUIのimage colorをスクリプトで変更する方法

 

めっちゃ短い話。

 

UnityでUGUIのimage(イメージ)ってあるじゃないですか。それのカラーをスクリプトで変更する方法が分からなかったんですが、適当にイジってたら出来ました。

適当すぎて、すぐに忘れそうなんで、自分への備忘録として書いておこうと思います。

 

ちなみに参考にさせていただいたサイトはこちら。

UnityのImageのcolorを変えたかった話 - shiro izu blog

 

ただ、これこのまま書いても出来なかったんですよ。Unityの仕様が変わったんですかね?

僕が書いたコードはこんな感じです。

 

imageBackItem [1].GetComponent<Image> ().color = new Color(255.0f, 255.0f, 255.0f);

 

Unityに表示されるカラーの数字を書くと、その色になりますね。

 

f:id:gevvoihorry:20170419074128p:plain

 

これ白なんですが、255って書いてあるので、その数字を代入してみました。

試してないんですが、引数に4番目の数字(float)を代入すると、alpha値(透明度)も変わるんじゃないでしょうか。多分w

 

【追記】

ごめんなさい。間違いがありました。これ代入する数字は0.0f~1.0fの間じゃないといけないみたいです。なので、下の画像のような場合は、こう書けばOK。

 

f:id:gevvoihorry:20170421082628p:plain

 

buttonSerif.GetComponent<Image> ().color = new Color(93.0f/255.0f, 93.0f/255.0f, 93.0f/255.0f, 120.0f/255.0f);

 

93て数値を、255.0fで割っています。

ちなみに、alpha値も設定することが出来ました。