Unity上でスプライトおよびデータ管理用クラスを作る-1.概要
はじめに
一応メモです。将来的にはフレームワーク公開もしようかな、と考えてます。
2Dスプライト用のクラス作成中
現在Unity上で2Dグラフィックを使ったゲームを作ってます。
そのためにはUnityのSprite使えばいいじゃんと思うのですが、色々問題があって使うのやめてます。
- UnityのUpdate処理はVsyncとは非同期で行われるため、これを制御して60FPS(固定フレームであれば何FPSでも同じ)制御にしようとすると制御が困難
- アニメーションをフレームに同期させようとするとズレが生じる
- ColliderのOn~処理を使うとフレーム非同期で処理が走るので更に描画がズレる
- 文字列でSprite指定するのでGCの温床になるので指定の方法を数値とかにしたい
んじゃあUnityやめればいいのでは、と思うものの、Unity使うことは以下の利点があるわけです。
- 最初からグラフィック・サウンド周りは楽に使えるよう整備してある
- C#書くとマルチプラットフォーム対応できる
- Inspector使った調整が楽
ということでUnity上で自作のスプライトクラスを作ってます。
実際のところデータ管理も兼ねて作ってますが、最終的には描画だけを担当する形にしたいなと考え中です。
スプライト+オブジェクト管理クラスの仕様
現在は、以下の仕様で作ってます。
- データは「ステータス-キャラクター-テクスチャ」の3要素から成立
- ステータスはデータを入れ替えし、毎回のUpdate時に描画コマンドを呼び出す
- 描画は特定レイヤーに直接記載するように指定、ついでにズームや自動で回転できるようにしてる
1.については、大きく分けると、以下のようになる。
- ステータス=動作しているオブジェクト情報を登録する。タスクシステムみたいなの
- キャラクター=HPや動作パターンを登録する。描画するテクスチャやUVの情報を登録している
- テクスチャ=マテリアルを登録する。実質スプライトを登録している。スプライトの切り取り方やフレーム数によって利用するスプライトを指定する等アニメーションの設定を管理している
処理順番としては以下の通り。
- ステータスを登録する。このときに利用するキャラクターを登録する。キャラクターには初期に反映するテクスチャの番号が入っているのでこれをステータスに登録
- ステータスの情報によってキャラクターが管理するテクスチャの大きさ、および利用するテクスチャを呼び出す
- 移動処理と描画を行う
- オブジェクトが管理の範囲外に出ていたら消す
これによって、オブジェクト管理のデータを無駄に定義せずに済むようになってます。
別の案としては、単に描画をコールするだけでもいいのかな?と思ってますが、
まぁ小規模なゲームでそこまでのライブラリが必要か?とも思ったのと、そもそも構成どうすればいいのかわからん状態で書き始めたのでこのような仕様になりました。
あと描画タイミングをバラバラにするのも怖いので(後述)すべて一緒のクラスで管理することにしました。
いざとなったら描画部分を外だしにして終わりってのもひとつです。
描画方法
描画についてはDrawMesh命令で行ってます。
これなら余計にGameObjectを出さずに済みますので。
ただその代わり自動で描画することはできず、描画命令を忘れると画面が点滅するなど影響がでかいです。
それでもこの方法を行うメリットは「描画以外の処理が行われないので、処理自体が高速」ということが挙げられます。
自分は面倒くさがりなので、オブジェクトの移動から描画まで全部一気に行ってます。
Forループを何度も行わずに済むし、なによりバッチで描画がまとまるのでそれほど描画ズレを心配する必要もないです。
そうじゃない場合は描画処理だけ外だしでも良いと思います。
高速化
BatchRendererGroupを使って大量の物体を効率的に描画する | VirtualCast Blog
つまりJobSystem用の描画処理が存在するのでこれをぶん回せば描画自体は高速化される。
ただメンテの関係上今の所DrawMeshで描画させてるだけです。
終わりに
もうちょっと説明書きたいな。