雑談 新年迎えたよ
あけおめ!今年は特に頑張らないと行けない年です。しかし、同時にゲームがシュビドゥバと発売される年でもありますね。
ゲーム
まず、任天堂さんのSwitch. 1月中に発表があるらしいですが、今の所の予定だと発売は3月ですね!WiiUの発売も発売日発表から販売開始の期間が短かったようなので、おそらく3月発売は裏切らないのではとは考えています。僕はスプラトゥーンが出たら買います。(発売があまりにも遅ければ躊躇)WiiUは他の需要がなさすぎて、スプラトゥーンだけの理由で買えませんでした笑 なのでこれからのソフトも期待してSwitchは買うと思いますそのうち。
次に、モンハンXX。これはハードを持っているのでソフトは間違いなく買います。ただどこまでやるかなぁと笑 クロスは勲章があと最小金冠のみでその作業中に虚無感に襲われたのでやめちゃいました笑 新作はスタイルの追加ということで、もうフロンティアを超え、モンハンも超えた別ゲームのようになりそうです。一通りやって終わるかもです。
で、新年早々決心したことがあります。FF15買います。うん。やっぱりFFが好きなんですよ。PS3も結局買わないって言って、13-2が出たとたんゲーム屋に走っていき13と同時購入でした笑 LRも買っちゃったし、PS3で後はゲーム買ってないし笑
なのでPS4も買います笑 これからFF7もリメイクされるし(できればリメイクは出ないで欲しかったけど、出るならやる),12もリマスターされるし(12は一番自分に合わなかった)1~9までのまとめパック?の噂も聞いたし。キットPS4は使うので、ためらいなく買ってこようと思います!
なのでSwitchでスプラトゥーンがすぐ出るなら PS4>Switch>モンハンは諦めか少しだけ。スプラトゥーンおとさだなしなら、PS4>モンハン>最悪Switch買わない。という流れ!夢があっていいね!
雑談 Unity〜PlayerPrefsX少し触った
PlayerPrefsXはとても便利ですね。
ArrayPrefs2 - Unify Community Wiki
こちらのリンクから飛ぶことができますが、Gitに乗っているわけではないので、自分でコピペしてスクリプトを作成してください。
boolean配列を適当な順番で値を変更し、その度にその状況を保存しようとしました。この時、PlayerPrefsXさんのSetBoolArrayを使用したのですが、これだと値を書き換える度にすべての値を読み込み、書き込みしなければなりません。まぁ当然、PlayerPrefsで行なっていたらものすごい処理になってしまうのでXさんをしようさせていただいているのですが。。。
ただ結局コーディングしている側からするとやっていることは相変わらず効率悪く感じてしまって。できればまとめて保存したものを、後から部分ごとに変更できたらなぁと思いました。それ最初は負荷かけてPlayerPrefsでちまちま保存して、後で楽すれば、、あれ?じゃあXさんはどうやっているのさ笑
PlayerPrefsXさんの中身見てきました。
public static bool SetBoolArray (String key, bool[] boolArray) { // Make a byte array that's a multiple of 8 in length, plus 5 bytes to store the number of entries as an int32 (+ identifier) // We have to store the number of entries, since the boolArray length might not be a multiple of 8, so there could be some padded zeroes var bytes = new byte[(boolArray.Length + 7)/8 + 5]; bytes[0] = System.Convert.ToByte (ArrayType.Bool); // Identifier var bits = new BitArray(boolArray); bits.CopyTo (bytes, 5); Initialize(); ConvertInt32ToBytes (boolArray.Length, bytes); // The number of entries in the boolArray goes in the first 4 bytes return SaveBytes (key, bytes); } //------------------ enum ArrayType {Float, Int32, Bool, String, Vector2, Vector3, Quaternion, Color}
えっと、英語でも説明してくれてます。。簡単に見ると、
・bool配列をbitにしてbitsに保持、それをbytesにコピー、bytes型に変換してSaveBytes()メソッドに渡してます。
・bytesの先頭にはbool型ということを記憶させています。スクリプトを見るとわかると思いますが、保存したboolを読み込み際に、boolかどうか確認作業がこれを用いて行われています。
・CopyToメソッドは指定先と指定先から見たインデックス番号を渡すと、その場所へ情報をコピーすることが可能なため、32bit分のboolフラグを先頭にしてbool情報をコピーしていることになります。
・Convertint32ToBytesはごめんなさいわからないです
SaveBytes()メソッドは以下のようになっています。
private static bool SaveBytes (String key, byte[] bytes) { try { PlayerPrefs.SetString (key, System.Convert.ToBase64String (bytes)); } catch { return false; } return true; }
チンケな頭を回転させてわかったことは、boolをそのまま配列で保存していたわけではなく、一度byteに変換しそれをstringにさらに変換してPlayerPrefsで保存をしていたということ!
そりゃ、PlayerPrefsをbool配列文回していたら頭悪いですもんね。素晴らしいスクリプトだと思います。しかし完全に流れを抑えられらわけでもなく、stringでまとめて保存しているため、当初の目的であった一部を変更して保存するという戦略は難しそうですね。保存場所からbit数を計算して、stringをbyteに変換し直し、そこの計算して出した部分だけを書き換え、再びstring型で保存すれば理論上は行けそうですが。。少し僕には厳しい!!
ただ今回も細かいところを見学させていただいた結果、bit系の操作は結構頻繁に行われているんだなと実感しました。これから周りの環境を自分通りに作って行く場合には必要な知識なんですよね!頑張ります。
P.S.
年末年始は風邪で寝込んでいたのでテレビ及び電子機器はほとんど触れませんでした。辛い。。けどモヤさまは見たよ!
Unity 初心者がstaticを少し使いました
unityでstaticを使用した場合、シーンが破棄された場合でもそのデータが残っていました。まぁ周知の事実だとは思いますが笑 いつも通りメモ書きです。
例えば
public class PlayerDataKeeper { public static int i; }
こんな感じなstatic変数を保持しているクラスがあったとします。
で、初めのシーンでこんな風にクラスの中で値を代入したとします。このクラスはどこでもOKです。
void Start(){ PlayerDataKeeper.a=1; }
この後、別のシーンを読み込んでその中のシーンで再び先ほどのクラスの変数を呼び出すと、先ほど代入した1はしっかり保持されています。以下のような感じで呼び出すと確認できます。これを呼び出すクラスは先ほど代入した際に呼び出したクラスでなくてもOK
void Start(){
Debug.Log(PlayerDataKeeper.a);
}
これを軽く応用したものとしてシングルトンなクラスがあります。要はシーンを跨いで保持されるクラスのことです。昔少し調べました笑 詳しくはぐぐってくださいですが、よくこの形を使うのでメモしておきます。
public class PlayerDataKeeper { public static PlayerDataKeeper pInstance; public static PlayerDataKeeper Instance{ get { if( pInstance == null ) pInstance = new PlayerDataKeeper(); return pInstance; } } public int i; } //呼び出す時はこんな感じで使って //PlayerDataKeeper pKeeper =PlayerDataKeeper.pInstance; //こんな感じで呼べば読み書きが可能 // pKeeper.i=1;
Maya パーツの一部がfbxに出力されない
Unityなどにfbxとして出力した時に、例えば人間の足だけが消えて出力されてしまったりする時が時々あった。
この時はだいたい、出力時にエラーを表示してくれます。ヒストリを削除するとこのエラーが消え、fbxもしっかり全て出力されます。
以上、ただのメモでした。
Unity 公開されているUnity道場のスライドがすごくためになる!
いかに面白いものを作るかではなく、どう効率よく実装するかも気になり始めているこの頃。とても素晴らしい資料を発見いたしました。
【Unity道場】パフォーマンス最適化の ポイント // Speaker Deck
Unity道場なんていうイベントがあるんですね!ホームページへはここから飛べます。資料なんかも載っているので興味を引いたものは見ておいて損はないですね!素晴らしい!
で、今回発見した上の資料はパフォーマンスの最適化について書かれていましたので、今の僕の興味範囲にドンピシャな内容でした!が、レベルが高くて全くついていけなさそう。基本的なことがわかっていればついていけるのかも?!ということで、僕のチンケな頭でも理解できるように、専門用語をとことん調べてここに書き出します笑 初心者丸出しな日記になるけど、自分の成長のためなら仕方ない笑 誰かの助けにもなればいいな笑
CPUとGPU
(ここからわからないんかい!とか言わないで笑)
Central Processing Unit と Graphics Processing Unit の略称です。CPU には汎用性でGPUには画像処理で活躍をしてもらっているらしいです。CPU は計算速度が早い、GPU は複数処理を一緒に処理できるがそれぞれの計算自体は CPU ほど早くはない。お互いに適材適所することで共存しているんですねきっと!
スライドの最初に言いたいことは、「1フレームは CPU,GPU の処理が長い方に依存する。全体の性能としてバランスが取れている Unity エディタに対し、実際のプラットホームは CPU が弱い GPU が弱いなど性能差があるため、実機でテストをしながらやるのがトラブルを防ぐ手段だよ」って感じですか?
Unityプロファイラー
パフォーマンスの確認ができるそうです。特に iPhone,Android の実機を繋げば、そのパフォーマンスを確認できるため便利そう!今度使ってみる!詳しくは下のリンクを参照。
Unity - マニュアル: プロファイラー ウィンドウ
GPUの負荷軽減〜LOD
LODとはなんぞや!Level Of Detailの略だそうで、カメラから遠いオブジェクトのポリゴン数をその距離に応じて減らして表示しようという工夫!Unity 自体には元々組み込まれている機能なので、後は自分たちでそのアセットを準備し、設定してやればいいそうです!これにより描画するものが削減され、処理がそのぶん軽くなるとのこと!下に参考になるブログさんのリンクを貼っておきます!
【Unity】LODでパフォーマンスを向上させる - 藍と淡々
GPUの負担軽減〜Occlusion Culling
オクルージョンカリングと読むそうです。カメラの領域外のオブジェクトのレンダラーを無効にすることをフラスタムカリングと言うそうですが、オクルージョンカリングはあるオブジェクトが他のオブジェクトに隠されていて現在カメラに映らないときに、オブジェクトのレンダリングを無効にする機能だそうです。これは自動では行われないので自分で設定する必要があり、少し手間がかかりそうですね笑 ダンジョンを探検するようなゲームではとても有効な手段のように思えます。詳しくは下のりんくから見てください。これは少しレベルが高そうです。ちなみに、このようにカメラから見てオブジェクトが二つ前後で重なっている状態をオーバードローと呼ぶそうです。いかにも無駄な処理っぽい名前。。。まぁ普通の英語ですが笑
Unity - マニュアル: オクルージョンカリング
アセットバンドルとは
Sceneとかがまとめて入っているあれです。きっと
Unity - マニュアル: アセットバンドル
ScriptableObject
ScriptableObjectについて - テラシュールブログ
Create,Load,Clone
Create は AddComponent の処理に時間がかかる。Load は値の流し込みに時間がかかる。Cloneは最速だが、親子関係を操作するのが大変?といった感じ。スライドではScriptableObjectを使用したLoadを解決用の一例にあげていた。
CPU~OnBecameVisible
見えるようにするメソッド。上記の OcclusionCulling をしない場合などは有効だと書いてある。
後は、localPositionを使うなど、比較的わかりやすいものだったかな。。ただ、アニメーションのfbxの部分だけはイマイチわからなかった。Mayaの使い方もしっかりは理解できていないので、この辺りは自分の中で改善できそうな点かなと新ためて思いました。
ただ、OcclusionCullingや特にLODは自分の中で大きな収穫だったかなと思います!すごい良い資料に巡り会えました。