質問: Unityでスプライト画像を大量に描画したいのですが、なかなか方法が見つかりません。 互換性の広いShaderもしくはC#スクリプトを使いたいと思っています それぞれのスプライトにはパラメータを格納しセーブできるようにしたく、各スプライトは移動したりできるようにしたいです。 簡単に言ってしまうと下の画像のようにさまざまな画像を描画したいのです ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/658afc008e88d0c4f987ff86e72ba01e.jpeg) 地面なんかは上下左右に同じ種類のマテリアルが有る場合につなげる用のスプライトに切り替えてやればよさそうですし キャラクターアニメーションは、テクスチャUVのオフセットを使って高速化できそうです。 しかし、これだけのテクスチャを個別に書くとドローコールは何百となってしまいます。 おそらくあまり動かす必要の無いオブジェクトはひとまとめのテクスチャにしていたりするとは思うのですが これらのベースとなるシステムはShaderでは厳しいでしょうか? shaderの出力はテクスチャで受け取る以外に方法が見当たらず GPGPUを使うとしても、コンピュートシェーダを使う必要がありそうです。。 なにかアドバイスいただけたらと思っています。
回答: 参考画像を見る限り、同じ画像も多いのでバッチングを上手くやれば大分ドローコールを抑えられる気もしますが...... まとめ記事があったのでリンクしておきますね。 おもちゃラボ:Unityでドローコール(Set pass call)を減らす方法まとめ なお、端末の性能アップに伴いドローコールの影響はそこまで大きくなくなったという見方もあります。 専用のシェーダーを書くのも1つの手ですが、実際の画面作りの方法(ヒエラルキー上でのオブジェクトの並べ方等)やプログラム設計の方も重要です。この辺りが上手くいかないとどっちにしろ動作が重くなります。 テスト用のプロジェクトを用意し、想定している対象の端末でドローコールがどこまで影響するか確認してみるのもよいかと思います。 > > それぞれのスプライトにはパラメータを格納しセーブできるようにしたく、各スプライトは移動したりできるようにしたいです。 > > > こちらについては、C#でそういうクラスを作るといいです。 具体的に何をしたいか分からないのでざっくりとですが、こんなイメージで出来るのではないかと。 ``` //マップチップ1つ分のクラス public class MapChipClass { public Sprite sprite; //画像ファイル public Vector3 position; //位置 public int param1; //適当なパラメータ public void Move () { //位置を移動する処理 } } //マップチップを制御するクラス public class MapChipController : MonoBehaviour { private List mapchips; //使用するマップチップをリストとして持っておく public void Save () { //マップチップの各値をセーブする処理 } } ``` 実際に表示用のコンポーネント(ImageやRenderer等)に適用させるのはどのクラスか? 移動処理がマップチップクラスじゃなくて制御クラスの方がいいかも? など考えることは色々ありますが、そこは何をどう作りたいのかによるので割愛します。