困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

Luaの話~で、商用に使えるのどうなのよ?~

筆者は、まだLua歴半年なのであまり偉そうな事は言えないが、思った事をメモしておく。

まず、Luaを使う場合も2パターン存在すると思う。
・UnityC#側があくまでメインで、Luaを一部の計算式等だけに使う方法
・ゲームロジック全てをLua側に逃がす方法
上記2種だ。
後者の方が、所謂筆者が言っている「アプリ更新無しでゲームの振舞を変える実装方法」の方法だ。

 

前者は、商用にでもすぐに使える内容だと思う。
マスターデータ代わりにできるし、その辺りを全て計算した結果を取得する事だって可能になる。

 

後者は、正直言ってすでにUnityの開発ノウハウを溜めてきた企業に新しく導入するというほどの価値はないのではないかと思う。
まず、間違いなく一人、Unity側とLua側の橋渡しをする部分の設計をし、Lua側の記述方法のルールを決める人が必要になる。
開発メンバーは、そのルールに則り、メジャーとは言い難く、Utility関数にも乏しい「Lua」という言語を1から勉強し、開発に臨むことになる。

Unityを導入することに決めて、そこからノウハウを蓄積していった軌跡を、今度はLuaで同じことをすることになるのだ。

Unityの場合は、今はもう日本語のドキュメントや情報がたくさん出ているし、そもそもC#はかなり親切な言語なので、調べながらでも何とか開発できたと思うが、それがLuaで同じ事が出来るかと言われると、正直どうなんだろうかと思う。


かといって、これから新規でUnity開発を始める企業にも、似たような理由でお勧めしない。
仮にLuaでの開発のノウハウが蓄積できたとして、企業規模を拡大しようとしても、Luaが出来るエンジニアなんてものは早々いるとは思えないし、需要も供給も少ないと思う。

 

結局の所、開発メンバーも資金も豊富で、技術開発という名目が行える企業なら、試してみてもいいんじゃないのかなという感想。

 

Luaがもう少しメジャーになって情報が出ない限りは、主流にはなりえないんだろうな―。

と思いつつ、次のUnity開発案件があったら、がっつりLua側に処理全部書いてやろうと思っている事は内緒。

その為に、自作アプリをアップル申請通して、実際にアプリ更新無しで内容変えられるかの実績を積もうと頑張っている。

がんばろ。

-----

2017/6/23現在、ひとまずApple申請は通ったので、使えそうではある。
その辺りの詳細は、また来週以降少しずつ情報を書いていく予定。

仕事の話~人に問題を伝える~

※デザイナーさんをディスってるわけではないのであしからず
※ゲームアプリ開発の話だと思ってください

仕事をしていると、たまにこういう事がある

-----
デザイナーAさん「この画像データ、ジャギが酷くて問題あるんですよ」

筆者「はぁ」
-----


筆者は、「画像がジャギってるからって、何の問題があるの?」といつも思う。
これは極端な例だが、今回はこのようなやり取りから得られる物を見ていく。

まず、ここで言う「問題」とはなんなのだろうか。
問いかけに対して答えが欲しいわけではないだろう。

仕事上で問題問題と言われるの物を定義すると

・その事柄を解決しないことによって、将来的に不利益・不利・マイナス・悪い事が起こる

としておくのが良さそうだ。
つまり、あまりみんなが幸せになれない事が起こるというのを問題があるというのだろう。

とすると、上記の例は以下のように置き換えられる

-----
デザイナーAさん「この画像データ、ジャギが酷くて「将来的に悪いことが起きる」んですよ」

筆者「はぁ」
-----

なるほど、どうやらAさんは、画像のジャギを直さないと、将来みんなが不幸になると思っているようだ。
だが、ここまで来ても、筆者としては

筆者「で、なんでそれがみんなの不幸になるの?」

となってしまう。

理由は簡単。筆者はその分野の専門ではないからだ。
その領域に対しての「知識」が無い。「知識」が無いために、「問題」を「認識」も「理解」もできない。
理解できない物を問題と捉えるのは、思考停止状態でもなければとても難しい。



更に、上記の例はもっと根本的な問題がある。
Aさんが思っている問題の理由が、適切ではない可能性が高い。

もし仮に、Aさんが思っている問題が
「ジャギが酷くて、とてもじゃないが絵のクオリティが低いから問題だ」
とする。

なるほど、確かに理由としては真っ当である。
だが、個人的にはこれは根本的な理由ではないと思う。

一番の問題は
「ジャギが酷過ぎて、絵のクオリティが低く見えるので、商品のクオリティが下がって、収益に影響が出る
から、問題なのである。

ここから得られる教訓と、明日から使える手法にまとめるとすると

1. 問題は、その領域の「知識」が無い人には、理解も認識もされない
2.問題の理由が、根本的な物を指していない可能性がある

1に関しては、問題提起する側は、それを聞かせる人の知識を汲み取って、その人が理解できる言葉で話すことを心掛ける事。
特に、分野が違う人に問題を話に行った時に、どうもピンと来ていない様子だったら、間違いなく問題を理解してもらえていないので、言葉を変える必要がある。
上記の例で言えば

-----
デザイナーAさん「この画像データ、輪郭がギザギザして見栄えが悪いんですよね」
-----

くらいになれば、とりあえず見た目を気にしているという事は伝わる。

-----雑談
ちょっと、話が逸れるが、上記のように知識が無い人に伝える言葉で話す事を
「レベルが低すぎてやってられない」と、否定的な人がいるが、
筆者はこれはあまりよろしくないと思う。

気持ちはわかるが、チームで作業する以上、最終目標が「商品のリリース」なのだとしたら、
その様な個人的な感情はチーム作業には必要ないので、例えレベルが低くても
作業が一番効率よくでき、成果が出るような方法を取るのが一番だと思っている。
-----雑談終わり

2に関しては、その問題が引き起こす根本的な不利益を探るというのは、癖にしておいた方がいいという事だ。
問題の根底にあるものが見えないと、解決策が正しい物ではない可能性が出てきてしまう。

例えば、上記の例で、デザイナーAさんのジャギが気になるという事に対して、
ひとまず時間をかけて直したとする。
しかし、そのせいで描画負荷が上がりゲームの動作が重くなったとしたら
根本の解決すべき問題である

「商品のクオリティが下がって収益が下がる」

が、結局解決されていないのである。

もしかしたら、その商品に責任を持つ人が、そのジャギ自体を全く気にしていない可能性だってある。
これは、プログラムのバグ修正などにも同じ事が言える。
表面に見える物だけ見て、それだけの修正を重ねていくと、
本来解決すべき問題が何も解決されずに、作業量だけが増えるといった事態になる。

なので、何かしら問題が発生したら、「それが引き起こしている一番の問題はなんなのか」というのを良く考えるようにした方がいい。
それが出来て、妥協案なども出せるようになる。


ここまでした話は、大半の人は、1,2のステップを経験則などで無意識に思考して行っていると思うが、
たまにチーム作業という事を忘れて、上記のようなコミュニケーションを取ろうとする人が居るので、
ドキッとした人は、是非明日から初心に返って業務に取り組んで欲しい。

ゼネラリストになるだとか、チームの潤滑油になるだとかいう人は(ry

仕事の話~「何でもいいです」の無責任~

これは筆者の個人的考えであり、考え方は人それぞれ持っているというのは理解している前提を記載しておく。

 

表題だが、何の事を言っているかというと、そのまんまの意味だ。
ぶっちゃけ、ただの気遣いレベルの話でしかないが、こういう細かい所で効率が上がったりミスが減ったりするから、覚えておいて損はないと思う。

ちなみに、ここでする話は、仕事で発生する「何でもいい」に対しての話であり、プライベートではないのであしからず。

 

仕事に限らず、こういう経験はないだろうか。
こちらが何かを相談を持ちかけたことに対して

 

「何でもいいよ」

 

という回答に困ったことだ。

筆者も全く使っていないわけではないが、この「何でもいい」という回答は安易にすべきではないと思っている。

「何でもいい」とは、質問した側の人間を思って、良かれと思って言っている人が多いと思うが、それは間違いである。

理由としては、やり取りの中で「結論の確定」がなされないからだ。

 

そもそもとして、質問者側の視点に立つと、相談する内容を予め揉んだ上で、その内容を踏まえて「相談」を持ちかけている。それに対しての「何でもいい」という回答は、その相談を拒否・放棄していることと同じである。

 

例1)

A:ここの実装、1と2の設計考えたんだけど、どっちがいいと思う?

B:何でもいいんじゃない?

 

例2)

A:仮データのモデル、何がいいですか?

B:何でもいいです

 

1に関しては、文面だけでコミュニケーションが破綻しているのがわかるし、何も確定しない
2に関しては、質問者の質問もよくないが、やはり何も確定しない

 

確定しない事の何が問題かというと、その後に「で、結局どうするの?」というのが間違いなく発生する。つまり、確定をあと延ばしにして忘れ去られる可能性を増やしているだけなのである。

 

これの解決策は簡単だ。「何でもいい」のであれば、その「何でもいい」中から一つ指定をすることだ。

 

上記の例2に関しては、問いかける側の問いの問題もあるとは思う。「何がいい?」ではなく「どれがいい?」と選択肢を予め絞るべきだ。それに対しても「何でもいい」と答える輩は、もはや論外だ。

 

この手の「何がいい」「何でもいい」は、仲が良かったりお互いの事を良く知っている間柄であれば通用するかもしれないが、仕事をする上でそれを前提で頼るのはよろしくない。
何でもいいと言った物は、何でもよくない事の方が多いので、後々トラブルの原因になる。故に、潰せるのであれば潰すべき。

ゼネラリストになるだとか、チームの潤滑油になるだとか言う人は、この「何でもいい」という回答に関して、上記のような事を感じられるといいのではなかろうか。

Luaの話~LuaStateを作ると、どの程度メモリを消費するのか1~

▼検証コードメモ
    void Start () {
        Application.targetFrameRate = 60;

        StartDebugLog += "↓↓↓↓↓start↓↓↓↓↓\n\n";

        uint monoSize = Profiler.GetMonoHeapSize();
        uint monoUsed = Profiler.GetMonoUsedSize();
        uint tempSize = Profiler.GetTempAllocatorSize();
        uint totalUsed = Profiler.GetTotalAllocatedMemory();
        uint totalSize = Profiler.GetTotalReservedMemory();

        StartDebugLog += string.Format("mono:{0}/{1}kb\ntotal:{2}/{3}kb\ntemp:{4}kb\n\n", monoUsed/1024, monoSize/1024, totalUsed/1024, totalSize/1024, tempSize/1024);
        StartDebugLog += "↑↑↑↑↑start↑↑↑↑↑\n\n";

        StartCoroutine(CoroutineStart());
    }

    private IEnumerator CoroutineStart() {
        GameSceneManager.Instance.Initialize();
        GameObjectCacheManager.Instance.Initialize();
        AssetBundleManager.Instance.Initialize();
        ResourceManager.Instance.Init();
        RijindaelManager.Instance.Init();
        VersionFileManager.Instance.Initialize();

        yield return null;
        yield return StartCoroutine(LuaInit());
        yield return null;

        ClickDebugLog = "↓↓↓↓↓click↓↓↓↓↓\n\n";

        uint monoSize = Profiler.GetMonoHeapSize();
        uint monoUsed = Profiler.GetMonoUsedSize();
        uint tempSize = Profiler.GetTempAllocatorSize();
        uint totalUsed = Profiler.GetTotalAllocatedMemory();
        uint totalSize = Profiler.GetTotalReservedMemory();

        ClickDebugLog += string.Format("mono:{0}/{1}kb\ntotal:{2}/{3}kb\ntemp:{4}kb\n\n", monoUsed/1024, monoSize/1024, totalUsed/1024, totalSize/1024, tempSize/1024);
        ClickDebugLog += "↑↑↑↑↑click↑↑↑↑↑\n\n";
        OutputText.text = StartDebugLog + ClickDebugLog;
//        yield return null;
    }

▼UnityEditor上(ターゲットはAndroid
〇LuaState作成をする
mono:4940/20852kb
total:48811/205184kb
temp:16384kb



mono:5312/20852kb
total:49065/205184kb
temp:16384kb

〇LuaState作成をしない
mono:4944/20852kb
total:49083/205184kb
temp:16384kb



mono:5028/20852kb
total:49323/205184kb
temp:16384kb

約300kbくらい?

Android実機
〇LuaState作成をする
mono:0/0kb
total:5748/8823kb
temp:1024kb



mono:0/0kb
total:5844/9249kb
temp:1024kb

〇LuaState作成をしない
mono:0/0kb
total:5751/8828kb
temp:1024kb



mono:0/0kb
total:5843/8991kb
temp:1024kb

ほぼ変わり無し…?

 

▼タスクマネージャのリソースモニターで調べてみた

仕方ないので、EXE版をビルドし、PC上からリソースモニタでメモリの遷移を確認。

結論からかくと、ワーキングとプライベートがおよそ400kb増えていた。

10000個作ると、300mb程増えていた。

何にせよ、一個LuaVM立ち上げる程度だったら、そこまで神経質になるほどではなさそうだ。

▼ここまでの結論
参照の仕方が悪いのか、とりあえずメモリ使用量プロパティ上には明確に変化が現れる数値は確認できなかったが、リソースモニターで見た所、大幅にメモリ使用量が増えるような挙動は見せなかった。


アプリリリースの話~Androidアプリのストア登録2~

つづき。

その前に、リリース用APKを作成して、アルファ版の方でいいのでアップロードしておく事。そうしないと、この先の話の内容が設定できません。

リリース用アプリの作り方がわからない人は、keystoreとかでGoogle先生に聞いてみましょう。

ーーーーー

まずは、「コンテンツのレーティング」の設定。

これは、画像で説明する事が無いので、画面の指示にしたがって入力を進めていってください。

 

次に、「価格と販売/配布地域」

1. 無料か有料かの設定と、公開する国の設定。

f:id:mochimoffu:20170505163403p:plain

 

2.その他、各種ガイドラインや規約チェック関係のチェック

f:id:mochimoffu:20170505163408p:plain

f:id:mochimoffu:20170505163413p:plain

 

詳細が分からないところは、会社の法務の人と相談してみてください。俺にはよくわかりません(おい

大人のVRの話~自分なりに色々試して、いったん結論を出した~

大人のVRを体験して一週間。
この間に、色々思考を巡らせたり試行錯誤を繰り返して、いかにクオリティの高いVRコンテンツを得る事が出来るか、という部分を調査してみた。

結論からいうと、「VR対応動画を出している場所から、お金を出して買え」という、至極当たり前な結論に至った。
以下に、その結論に至った経緯を記載していく。


○試したこと
まず、VRコンテンツを得るには、以下の方法が考えられた

1. VR対応動画のサンプルで満足する
2. VR対応動画を公式で買う
3. 既存の2D動画を、3DVR化する
4. アップロードされているVR対応動画をキャプチャーに該当する何かをして、VRデバイスで再生できる状態にする

1に関してだが、これで満足できるならそれでいいのだが、
そもそも、PC向けには前回記事にアップした「Adult Festa」さんか「AVVR」さんくらいしか、まともなサンプルが見れるところが無い。
つまり、サンプルを探すにも一苦労というわけだ。
スマフォ向けには、他に数社あるみたいだが、個人的にはPCでないと臨場感が無いと勝手に思い込んでいるので、ここではスマフォ向けは割愛する。

2に関しては、もうそれ言ったら全部そうじゃん!って感じなので、本題の3,4の説明に入る。

3に関して、
まず、そもそもVR対応動画を取り扱っている会社も少なく、作品自体も多くない。
であれば、通常のAVをどうにか変換をかけて3D化してしまえれば、VR動画の本数が増えるまでの繋ぎになるのではないか?
という発想に至った。

早速、動画を左右に分割してくれるソフトをインストールし、編集し、VRで再生してみることに。



・・・・・


色々とおかしい
具体的には、画面の上下がVRデバイスで見ると引き延ばされたりしている。

VR対応動画と比べて気づいたのだが、VR対応動画の方には、3D化する為の左右に微妙に違う描画をするのと同時に、その動画自体に「パノラマ加工」が施されているように思えた。
つまり、ただ動画を左右に並べれば3D立体視はできるかもしれないが、VRデバイスで見た時は変な引き伸ばしのされかたをする。
動画自体がパノラマで撮影されていないのであれば、その動画をパノラマ加工をしなければ、VR上での臨場感は得られないという結論に至った。

そして、パノラマ化してくれるソフトは全く見当たらなかったので、通常動画のパノラマ加工というのは、一般的ではないのかもしれない。

結論を述べると、通常の動画を3DVRとして見れるようにするのは、今の段階では不可能に思える。



4に関して、
そもそも、やっていることがブラックに近いグレーというかブラックな気がするが、一旦それは置いておく。誰もダウンロードをしてるともしろとも言ってないからね!
そもそも、違法合法含めアップロードされているコンテンツは、解像度が低いし画質が荒過ぎる。
中には、きちんとVRデバイスで見れる物もあったが、荒すぎて画面全体にモザイクがかかっていると言っても過言ではなかった。

じゃぁどうするか。

画質を上げればいいじゃない!

という事で、解像度を上げるソフトと画質補正をするソフトをインストールして色々試した。



・・・・・



結論から述べると、あまり効果的な結果は得られなかった。
まず、「解像度を上げる≠画質が綺麗になる」と気が付いた。
元が汚い画像の解像度を上げるというのは、その汚い画像を引き延ばしても、綺麗に汚い画像を引き伸ばせる、という事だ。
何を言っているかわからないかもしれないが、そういう事なのだ。

なので、次は「画質を上げる」という発想に至り、これも色々試してみた。

こっちは、一定の効果があったのだが、やはり元の画質が汚すぎるとあまり意味をなさないのと、
公式が出しているVRサンプルに比べると、ツキとスッポンというレベルで綺麗になったとは言い難く、あくまでやらないよりマシな程度という結果に収まった。


以上の結論から、3DVRコンテンツとしてちゃんとした物を楽しみたい場合は、公式からお金を出して買う事をおすすめする。
(筆者はお金を出して購入した)



ここからは、個人の趣向が入るが、人によっては有益な情報に成り得るので戯言を書いていく。

まず、通常の2D動画だが、VRコンテンツには「シアター」と呼ばれる、映画館のような大画面で見ているかのような体験をさせてくれるソフトが多数存在し、
そこにAVを流して見ると、これはこれでなかなか有りな感じだったので、興味があれば調べてみるといい。

次に、3DVRコンテンツを買う時のコツというか、これは完全に個人の趣味の話になると思うのだが、
主観なだけだと、ただのAV見ているのとあまり変わりがないので、
よりシチュエーションが求められる物を選んで見てみるといい。

痴○物や強○物は、その気が強く表れると思われる。

今はまだコンテンツが少なく、作品を作っている会社が、撮影方法、動画編集、女優さんの演技や良く映る見せ方に四苦八苦し試行錯誤を繰り返している印象を受けるが
このシチュエーション物にはかなり期待をしているので、是非ノウハウを積んでいい作品を出して行って欲しいと思う。