20210730のUnityに関する記事は3件です。

大規模ゲームのアートアセットプロジェクトの管理方法

今回の主な話題:大規模ゲームのアートアセットプロジェクトの管理方法、GooglePlayがAppを強制的に64ビットにする問題、散在するAssetBundleアセットの再パッケージ化に関する質問、UnityのApi Compatibility Level .net 4.xと.NETStandard2.0の違い、SRP BatcherがUnity2020バージョンOpenGLES3で失効する質問。 Asset Q:プロジェクトの制作人数の増加により、様々なアートアセットの数も急増しています。さまざまな仕様やさまざまなアセットのインポートおよび検査ツールがあっても、一定期間実行した後も、プロジェクト内さまざまな破棄されたアセットがクレアされていない状況があって、アセットとパッケージのサイズの増加し続きを引き起こします。 例えば、 1、各種類のアセットが作成中に生成するいくつの中間ファイル; 2、元々使用されていたが、後でビジネス要件が変更されたために放棄されたアセット; 3、元々効果を見るためにゲームに入れるつもりでしたが、実際に実装されていないアセット。 皆さんがこの種の問題を対処する時の解決方法を知りたいです。 ① 問題主が提出して質問は、テクノロジーと関係なし、プロセスとは関係があります。 (1)監督作業の責任は、具体的に誰かが取るまで明確します。この世の中には、事前準備があれば万事が易くなりますが、なければ無駄になりやすいです。 すべてのプロジェクトには、パフォーマンス、アセットなどの問題を管理するために1人のPerformance Ownerが必要です。この人がいなければ、ツールと開発チームがどれほど強力であっても、何の意味もありません。この人は、プロジェクトのプロデューサーさん、メインプログラマーさん、QA LeaderまたはPM(一般的な小規模チームではこの役職はないかもしれません)が担当することができます。UWAが合作したチームの経験から見ると、QA LeaderがPerformance Ownerを担当するチームが多いです。 (2)監督プロセスは同期する必要がある チームの中の誰かがアセット問題とパフォーマンス問題に責任を取る必要があり、そしてチームに「継続的な監視」と「継続的な改善」の習慣を身に付けるように強制するための固定プロセスを確立する必要があります。三日坊主の形で物事を成し遂げるのは難しいです。ゲーム開発にも同じです。ですから、監視することをチーム開発中の習慣になさせたいと、プロセスでコントロールし続き必要があります。プロセスが完備になれると、すべては順調になります。 上記の2点が達成されれば、問題主の質問は自然に解決されます。 ② 監督責任者は通常PMです。なぜなら、一部のQAには常識や権利がないためです。PMがビジネスを理解するのが最善です。PMがない場合は、クライアントにメインプログラマーにこの権利を与えるのが最善です。バージョンロックは非常に必要であり、ほとんどの大手会社はこうやっています。 ツールを使用してアートデザイナーの操作を制限し、すべての誤りをエラーとして報告してから、明確にプロンプ​​トをします。バージョンロックを使用してコミットノードを制限します。そして、規則を従わない人に立ち去ることを要求します。なぜエラーが報告されていることを問うことも許しません。もちろん、これはプロデューサーさんからサポートする必要があります。簡単に言えば、アートデザイナーもプランナーさんも、誰かがツールの使い方を知らず、学ぶことを望まず、協力する価値がありません。 Build Q:Unityはアセンブリを介して対応するコードをロードでき、Google Playは64ビットAPPを強制しましたが、Assembly.Loadを介したコードのロードをサポートしなくなりましたか? 下図のように、UnityのMonoバージュンはまだARM64をサポートしていないため、Google Play(64ビット要件)にリリースできるためにIL2CPPを採用しなければなれません。IL2CPPはAssembly.Loadをサポートしていません。 こちらを参照することができます。 AssetBundle Q:UnityのAssetBundleアセットが散在するAssetBundleアセットをZip(例えば、1つづつを300MBにする)にする必要がありますか?AssetBundleをパッケージする時に、圧縮形式を選択できるから、総サイズを減らすためではありません。AssetBundleが散在する場合、ダウンロードする時にパフォーマンスへの圧力はありませんか?皆さんは活用中にどのように対処しますか?(AssetBundleの数は10万以上で、総サイズは約4Gです。) ① 大量の散在するファイルのダウンロードは、当然、1つの大きなファイルほど高速ではありません。Http接続にも時間とアセットが必要です。AssetBundleが実際には数KBしかない場合もあり、割に合わないです。Zipにして計算することはもっと便利で、圧縮せずにZipにすることを考慮できます。もちろん、フォーマットをカスタマイズして行うこともできますが、大きなファイルに合併すると更新するのは面倒になり、ある程度の管理と取り換えが必要です。 ② つい最近、この機能を実現しました。複数のパッケージをZipにすることは、確かにダウンロード効率に役に立ちます(特に海外ネットワーク環境の場合)。 1、AssetBundleパッケージ化はまだ断片化のAssetBundleパッケージです。(AssetBundleは特殊効果やUIなどのモジュール区別を行います。) 2、ホットアップデートが必要な場合は、生成されたAssetBundleパッケージ情報を以前バージョンのAssetBundleパッケージと比較し、各モジュールの変更AssetBundleパッケージをZipパッケージにします。 3、ホットアップデート中に、更新の必要なAssetBundle情報(Zipマークがあり、アセットがZipパッケージに含まれていることを示します)を収集してダウンロードします。Zipマークのない場合、AssetBundleパッケージを直接ダウンロードします。これにより、複数のバージョンを超えるホットアップデート機能もサポートできます。 4、ダウンロードしたZipパッケージは、クライアント側でAssetBundleに解凍されます。 ③ 1つの答えを追加します。 ハッシュの欠点はより集中しています。ダウンロードが遅く(cdnを使用すると、ossバックエンドのパフォーマンスを考慮する必要がありません)、ossへのアップロードもはるかに遅いです。 Zipの場合、パッケージ管理もダウンロードの冗長性も面倒なことであり、動的ダウンロードはさらに不可能です。ですから、ハッシュよりも高いossコストが発生する可能性があります。 ④ 初期開発に分散ファイルを使用し、ファイルが小さいならネットワークの送信再開問題も回避できます。後の期間で時間が余裕であれば、大きなパッケージに拡大する方式になさせます。バージョン番号に応じて増分更新パッケージを生成することもできます。 サーバーに置いても影響はあまりなく、定期的に清掃すれば大丈夫です。 ⑤ 前のプロジェクトでZipパッケージを採用しましたが、長時間運営すれば、冗長なアセットがますます増えていきます。ホットアップデートのアセットは完全性を保証するために、パッケージを変更しない限り削除することはできません。パッケージが頻繁に変更されている場合、Zip方式が最適です。 Editor Q:UnityのApi Compatibility Level .net 4.xと.NETStandard2.0の違いは何ですか? NET Standard 2.0は、プラットフォームのサポートが広く、互換性がより高いです。.NET Standard 2.0のAPIは.NET 4.xのサブセットであります。つまり、.NET 4.xがサポートしているAPIのほうがより多く、.NET Standard 2.0と互換性がありますが、一部のAPIは一部のプラットフォームで互換性がありません。 Unityはデフォルトで.NETStandard 2.0を選択します。クロスプラットフォームの互換性が欲しい場合には、Standard2.0を選択する必要があります。使用している外部ライブラリまたはスクリプトでコールされるAPIはStandard 2.0にサポートされていない場合、4.xに変更して試すことができます。 公式ドキュメントを参照してください。 https://docs.unity3d.com/Manual/dotnetProfileSupport.html Rending Q:Unity 2020バージョンでは、SRPBatcherはOpenGLES3で失効し、lit.shaderを確認したらSRPと互換性がないことが表示します。どうすればよいですか? 調査の結果、Unity 2020.2の一部のバージョンでは上記の問題は発生しませんが、後続のバージョンでは問題が発生します。2020.3.9f1のRelease notesにこの問題が記載してあることが確認しました。 ここで確認できます。 UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービスを提供している会社でございます。 今なら、UWA GOTローカルツールが15日間に無償試用できます!! よければ、ぜひ! UWA公式サイト:https://jp.uwa4d.com UWA GOT OnlineレポートDemo:https://jp.uwa4d.com/u/got/demo.html UWA公式ブログ:https://blog.jp.uwa4d.com
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Timeline形式でスキルエディターを実現する方法

今回の主な話題:Timeline形式でスキルエディターを実現する方法、AddressableがGroup Nameを介してGroupのKeyを取得する方法、UnityでSpriteがSprite PackerにあるUV値を取得する方法、UnityEditorでAnimatorControllerのすべての状態名を取得する方法、UnityはUGUIのMaskにどのような処理をしますか? Editor Q:プロジェクトはTimelineの形でスキルエディターを実現する必要がありますが、Timelineの形式はどうやって実現できますか?スキルエディター全体に何か参照できるものありますか? ① Timelineの使用方法と伝統的なスキルエディターの実現方法を学び、それらを組み合わせる方法を検討することをお勧めします。 ② 公式のTimeline相関を参照でき、2017年のUniteにも関連トピックがありました。 https://assetstore.unity.com/packages/essentials/default-playables-95266 ③ FIRST、Timelineの形はどのように実現されますか? いくつかのUnityプラグインを参照できます。 https://assetstore.unity.com/packages/tools/animation/cinematic-sequencer-slate-56558 このSLATEをお勧めします。拡張する方が便利です。 https://assetstore.unity.com/packages/tools/animation/flux-18440 SECOND、スキルエディターのアイデア。 上記のTimelineフレームワークがあったら、残った仕事はTimelineに基づいて様々タイプのフレームを開発することです。例えば、再生特殊効果フレーム、アニメーションフレームやヒットポイントフレームなどです。 特殊効果の例をあげます。 1、スキル特殊効果は、いくつかのパラメーターにすぎません。特殊効果名、オフセット情報、フックポイントなどです。 2、次に、このキーフレームを執行する時に具体的な執行方法を表示するビジネスコードを実現する必要があります。例えば、フレームに配置された特殊効果パラメーターによりこの効果をロードすること、オフセット情報とフックポイントパラメーターが設定する特殊効果のTransform。 3、フレームの長さは、この特殊効果のライフサイクルです。フレームが執行終了すると、フレームの破棄作業は必要です。 Addressable Q:Addressableは、Group Nameを介してこのGroupにあるKeyを取得できますか? ホットアップデートをゲームの始める時に置いました。更新のプロセスは大体このように:ロードインターフェイスを作成し(アセットはAddressableに独立のGroupであり、しばらくstartGroupと呼びます)、そしてCatalogに更新があるかどうかを確認し、すべてのKey値を手に入れてアセットをダウンロードします。 このプロセスに問題はありません。しかし、更新中にネットワークが中断されると、Addressableは更新リストのアセットメモリを全部解放し、すべてのKeyを使用してダウンロードを行ったローディングインターフェイスアセットが失います(黒くなる)。 テスト後、startGroupにあるKeyを手動で除外したら、この問題はなくなります。だからGroup Nameを介してどうやってこのGroupのKeyを取得できますか?または、よりいい更新方案ありませんか? ① 内部関数があります。 internal bool GetResourceLocations(object key, Type type, out IList<IResourceLocation> locations) 具体的な実現を参照できます。これもGetDownloadSizeAsyncのような関数が内部にコールしたものです。 資源の失い問題については、情報が足りなくて判断できません。 ② startGroupにあるアセットのLabelをすべて「start」に設定し、Lableを介してLocationリストを取得し、そしてこのリストのKey値を合計リストから除外することができます。 public static List<string> GetAllKeys(string labelName) { var t = Addressables.ResourceLocators; List<string> keys = new List<string>(); foreach (var location in t) { if (!(location is ResourceLocationMap)) continue; ResourceLocationMap locationMap = location as ResourceLocationMap; locationMap.Locate(labelName, typeof(object), out var startLocationList); foreach (var info in locationMap.Locations) { if(info.Value.Count == 0) continue; string str = info.Value[0].PrimaryKey; bool isHas = false; foreach (var startLocation in startLocationList) { if(startLocation.PrimaryKey == str) { isHas = true; break; } } if (isHas) continue; string key = info.Key.ToString(); if (int.TryParse(key, out var num)) { continue; } if (!keys.Contains(key)) { keys.Add(key); } } } /*foreach (var locator in t) { foreach (var key in locator.Keys) { int value = 0; string str = key.ToString(); if (!int.TryParse(str, out value)) { keys.Add(str); } } }*/ return keys; } Texture Q:Sprite Packerのアトラスを使用しています。実行時にどうやってSpriteのあるアトラスのUV値を取得できますか? この方式でできます。 Sprites.DataUtility.GetOuterUV(activeSprite) Animation Q:AnimatorControllerはUnityEditorの下に配置されていますが、すべての状態名を取得するにはどうすればよいですか? これを参照できます。 https://stackoverflow.com/questions/41709325/retrieve-all-animator-states-and-set-them-manually-in-code さらに、Unity5.2以降のAnimatorControllerは常にEditor命名空間の下にあります。 UGUI Q:ある原因で、UGUIのMaskコンポーネントを逆コンパイルし、コードをコピーして、テストのために名前を変更しました。 しかし、コピーされたMaskは無効であることがわかりました。 オリジナルなMaskはコンポーネントのマテリアルを変更することでクリッピングを実現すると、それは自身とすべての子ノードのマテリアルを変更します。コピーされたMaskは、自分のマテリアルのみを変更し、子ノードにはまったく影響しません。 UnityはどのようにMaskをすべての子ノードマテリアルを影響させますか? ① Maskコンポーネントは、コンポーネントに通知し、カット情報を識別するクラスです。コンポーネントをオンにすると、子ノード内のすべてのTextとImage(これらのコンポーネントはMaskableGraphicから継承されます)にカット計算を開始するように通知し、 MaskableGraphicは、親ノードで最も近いものを見つけます。Maskコンポーネントはカット情報を取得するため、単にMaskをコピーするだけでは意味がありません。 ② MaskableGraphicのコードによると、親ノードではなく、現在のノードのMaskコンポーネントのみが検出されます。 ソフトクリッピング用のAlphaMaskコンポーネントを作成しましたが、親ノードがMaskにぶら下がっている場合、このコンポーネントは異常であることがわかりました。 調査の結果、Maskが資料を置き換え、元の資料の情報を失ったことが判明しました。 次に、Maskの実現を参照してAlphaMaskを調整します。 プロジェクトには多くの動的ノードがあるため、主な目的は子ノードのマテリアルを置き換えることです。次に、各動的ノードに独自のコードをコールしてマテリアルを置き換える必要があります。 最後に、MaskabelGraphicは、GetComponentInParentを直接使用する代わりに、MaskUtilities.GetStencilDepthをコールすることにより、親ノードMaskの情報を取得することがわかりました。 UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービスを提供している会社でございます。 今なら、UWA GOTローカルツールが15日間に無償試用できます!! よければ、ぜひ! UWA公式サイト:https://jp.uwa4d.com UWA GOT OnlineレポートDemo:https://jp.uwa4d.com/u/got/demo.html UWA公式ブログ:https://blog.jp.uwa4d.com
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

非エンジニアのためのUnity仕様紹介

✒️背景 エンジニアではない人に Unity の仕様やできることを軽く知ってもらい、円滑な素材提供や修正依頼ができるようになったらいいと思い、本記事を書きました。 ?目次 項目 ?基本 ?️画像の仕様 ?音の仕様 ?3Dモデルの仕様 ?基本 Unity はプロジェクトフォルダが大きくなるほど動きが遅くなります。使う予定のないファイルや、バックアップ目的のファイルを置いたままにしないで下さい。 ?️画像の仕様 ?拡張子 Unity では .png .psd .tga などの基本的な画像形式に対応しています(ただし、Unity はレイヤーを持つ画像を、全て重ねた一枚の画像として扱います)。.gif ファイルの再生はアセットを利用すれば可能です。 ?ピクセル数 ≠ 大きさ Unity では 1メートルあたりのピクセル数を指定して大きさを変えたり、オブジェクト自体の大きさを変えたりできます。2×2px の画像も 24×24px の画像も同じ大きさで表示できます。 ?画像のサイズは2のべき乗 画像の縦横のサイズを 2のべき乗 (...,512,1024,2048...) にすると圧縮が可能になり、容量を大幅に削減できます。余白は透明色で塗りつぶしてください。 画像を縮小すると縦横のサイズが2のべき乗になるケースでも圧縮できます(例えば 1600×400px の画像は 1024×256px の画像として圧縮できます)。 ?UI画像は縁に余白を作る Unity 上でUI画像を加工する際、縁に余白がないと描画が破綻する場合があります(例えばアウトラインの加工をするとき、縁に余裕がないとアウトラインが途切れます)。なお、縁に密着させるUI画像の密着箇所には余白を入れないでください(配置や修正が大変になります)。 ?️加工 Unity には標準でUIを加工する機能があります。 ✂️スライス 一枚の画像を分割して個別に利用できる機能です(例えば歩行グラフィック)。一枚の画像に複数の画像をまとめる事で、編集しやすくなったり読み込み処理が軽くなったりします。 ✂️9スライス 画像を9分割して、引き延ばしたり並べたりする機能です。画像を作りやすく、再利用もしやすく、容量も抑えられる、一石三鳥の機能です。 ?FillAmount 画像の一部を削った表示ができます。体力ゲージや残り時間などのUIに使えます。 ?マスク 画像を他の画像の不透明部分で切り抜いて表示できます。 ?ぼかし ピクセル間を滑らかにできます。 ?色の乗算 画像全体に色を付けたり半透明にしたりできます。画像にカラーフィルムをかけるような機能なので、暗い画像を明るくすることはできません。 ?音の仕様 Unity では、ゲーム内に一つだけ置けるマイクを通して、ゲームの音を聴くことができます。大抵、マイクはカメラにくっつけて使います。 ?拡張子 短い効果音や沢山使う効果音は .wav、長い効果音や音楽は .ogg や .mp3 が好ましいです(.mp3 では最初と最後に一瞬無音が入ります)。 ?音量と音質 音量は、Unity本体とマイクとミキサーと再生機能の4つで調整できますが、音ごとに音量調整はできないので、音量を調整してくれると助かります。 音質は Unity で簡単に調整できるので、.ogg や .mp3 で音質を下げないでください。 ?再生機能 再生機能では音量やピッチなどを変更できます。 ?3Dサウンド 通常、音の出るオブジェクトがマイクの右に置いてあっても、左右の音量は変わらずに聞こえます。 3Dサウンドを有効にすれば、右側からの音は右から、遠くの音は小さく聴こえるようになります。また、3Dサウンドでは音量の減衰具合も細かく設定できます。 ?️ミキサー Unity では BGM や SE などをグループ分けして、個別に音量調整や加工を行えます。 ?3Dモデルの仕様 Unity では「+X が右、+Y が上、+Z が前」になりますが、1つオブジェクトを挟めば座標系の問題は解決できます。 Unity では 1Unit = 1メートルですが、サイズを変更できるオプションがあるので解決できます。 オブジェクトは少ないほど処理が軽くなります(例えばキーボードのモデルを作るとき、キー1つ1つが別のオブジェクトになっていると処理が重くなります)。 ?拡張子 .fbx, .obj などの基本的な形式に対応しています。.blender 等の形式にも対応していますが容量が大きいので、編集用のファイルの他に完成したファイルも用意して下さい。 △ポリゴン数・?頂点数 モバイルでは、300 ~ 1500 ポリゴンで良いパフォーマンスが得られます。 同時に配置するモデルの頂点数はモバイルの場合、合計10万以下が目安です。 ?マテリアル 表示するマテリアルが多くなると、致命的に処理が重くなります。基本、1モデル1マテリアルにしてください。 似たモデルを作る際は共通のマテリアルを使い、同じ部分に同じUVを割り当てれば、手間が省けて処理も軽くなります(例えば車のモデルを作るとき、タイヤやナンバープレートなどは流用できます)。 大体一緒に使う複数のモデルは、同じマテリアルを共有して使うと処理が軽くなります(例えばデスクトップパソコンのモデルを作るとき、マウスやキーボード、ディスプレイに同じマテリアルを共有すると処理が軽くなります)。 ?Shader Unity には ノードベースでシェーダーを作れる Shader Graph という機能がある他、HLSL言語でシェーダーを実装する事もできます。 ?ダイナミックバッチング ダイナミックバッチングとは、モデルの描画処理を圧倒的に軽くして、大量表示を可能にする技術です。 ダイナミックバッチングを利用するには、以下の条件を満たす必要があります。 同じマテリアル 頂点属性が900以下 シェーダーが「頂点位置,法線,UV0」を利用する場合、頂点数300以下 シェーダーが「頂点位置,法線,UV0,UV1,接線」を利用する場合、頂点数180以下 ただし、違うマテリアルのモデルが重なって映るほど、ダイナミックバッチングの効果は薄れます。違うモデルでも同じマテリアルを使っていれば問題ありません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む