【CEDEC2018】ココが変わる!Unityの新しいエディタワークフロー

>100 Views

October 05, 18

スライド概要

2018/8/22に開催されたCEDEC2018の講演資料です。
講師:山村 達彦(ユニティ・テクノロジーズ・ジャパン合同会社)

profile-image

リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

ココが変わる! Unityの新しいエディターワークフロー 山村 達彦 ユニティ・テクノロジーズ・ジャパ ン

2.

Unityの代表機能

3.

Unityの代表機能 Prefab を始めとしたアセット管理、コンテンツ配信

4.

最初は簡単、ただ規模が大きくなるとしんどくなる

5.

Prefabのおさらい GameObjectのアセット化 (インスタンス) (アセット)

6.

Prefabのおさらい GameObjectのアセット化 Prefabの更新で他の全てのアセットに反映

7.

Prefabのおさらい GameObjectのアセット化 Prefabの更新で他の全てのアセットに反映 値のオーバーライド ATK : 50 DEF : 40 ATK : 100 ATK : 120 DEF : 30 DEF : 30

8.

Prefabのおさらい GameObjectのアセット化 Prefabの更新で他の全てのアセットに反映 値のオーバーライド 参照するアセットの収集

9.

Prefabのおさらい GameObjectのアセット化 Prefabの更新で他の全てのアセットに反映 値のオーバーライド 参照するアセットの収集 何故そんなに一気にしんどく?

10.

編集が面倒くさい 1階層しか表示されない 編集のためには、 編集用シーンを用意する(面倒)

11.

編集が面倒くさい 1階層しか表示されない 特別なスクリプトを作って解決! 編集のためには、 編集用シーンを用意する(面倒)

12.

Prefabを階層化できない GameObject1 Prefab3 Prefab1 Prefab2 元Prefab1 元Prefab2 GameObject1を Prefab化 子PrefabはPrefabではなくなる 大本を更新しても反映されなくなる

13.

Prefabを階層化できない GameObject1 Prefab3 Prefab1 元Prefab1 特別なスクリプトを作って解決! Prefab2 元Prefab2 GameObject1を Prefab化 子PrefabはPrefabではなくなる 大本を更新しても反映されなくなる

14.

Prefab量産後に一括更新が面倒くさい prefab1 prefab2 prefab3 prefab4 prefab5 同じ構成、同じ機能、同じ用途、しかしパラメータが少しずつ違う、別のPrefab 異なるPrefabの為、一括更新が 少々面倒になる

15.

Prefab量産後に一括更新が面倒くさい prefab1 prefab2 prefab3 prefab4 prefab5 特別なスクリプトを作って解決! 同じ構成、同じ機能、同じ用途、しかしパラメータが少しずつ違う、別のPrefab 異なるPrefabの為、一括更新が 少々面倒になる

16.

アセットを直接参照すると、自動的にロードされてしまう Prefab

17.

アセットを直接参照すると、自動的にロードされてしまう Texture Model Prefab Material Audio Prefab Shader Texture

18.

アセットを直接参照すると、自動的にロードされてしまう Texture Model Prefab Material Audio Shader 特別なスクリプトを作って解決! Prefab Texture

19.

AssetBundleに移行すると、確認作業が大変 規模が大きくなると AssetBundleを生成 すごく時間がかかる アセットの調整 動作を確認

20.

AssetBundleに移行すると、確認作業が大変 規模が大きくなると AssetBundleを生成 すごく時間がかかる 特別なスクリプトを作って解決! アセットの調整 動作を確認

21.

AssetBundleの配信が面倒くさい • バージョン、キャッシュ、依存関係、アセット格納先、開放タイミング等、考えることが多い • ローカルのアセットと依存関係を構築できない • ビルドする為にコードが必要

22.

AssetBundleの配信が面倒くさい • バージョン、キャッシュ、依存関係、アセット格納先、開放タイミング等、考えることが多い • ローカルのアセットと依存関係を構築できない 特別な人を作って解決! • ビルドする為にコードが必要

23.

“ 特別なコードが必要なケースが 多すぎる!!! ”

24.

“ もっと開発で 楽したい! ”

25.

New Prefab Workflow Addressable Asset System

26.

柔軟に New Prefab Workflow 複数人で作りやすく 編集結果が一致して 直感的で 使いやすく 効率的で 安全

27.

面倒な追加コード無しに直感的に操作が可能になるということ

28.

新しいPrefabのUI

29.

GameObject Prefab アイコンが追加、視覚的に区別される

30.

変更したパラメータには青い線がつく

31.

Prefabの変更オブジェクト 一覧表示される

32.

変更内容をプレビュー

33.

フィールド毎に個別に反映

34.

Prefabエディターが追加

35.

Prefabエディターが追加

36.

“ DEMO ”

37.

ここが変わった! 一覧表示 プレビュー 個別反映 Prefab エディター どのオブジェクトが変更されたのかを確認する手間が変わる Prefabの更新を最小限に抑えやすい(マージが楽) 編集用シーンを用意しなくても編集が楽に

38.

Prefabの階層化(Nested Prefab) prefab1 prefab2 +

39.

Prefab Prefab Prefab Prefabの階層化(Nested Prefab)

40.

Prefabの階層化(Nested Prefab)

41.

Prefabの更新で 複数の階層がある場合 Prefab Prefab Prefab

42.

どのPrefabを更新するか 指定する

43.

Nested Prefabの階層化 Prefab1 Prefab2 X=1 Y=1 Prefabを階層化しても、Prefabは維持される X=1 Y=1

44.

Nested Prefabの階層化 Prefab1 Prefab2 X=2 Y=1 X=2 Y=1 オリジナルPrefabを変更すれば、使用してるPrefabにも反映される

45.

Nested Prefabの階層化 Prefab1 X=2 Y=1 Prefab2 Prefab3 参照する全てのPrefabが反映してしまう X=2 Y=1 X=2 Y=1

46.

Nested Prefabのオーバーライド Prefab1 Prefab2 X=2 Y=1 X=2 Y=1

47.

Nested Prefabのオーバーライド Prefab1 Prefab2 X=2 Y=1 親のPrefabが子のPrefabの値を上書きする X=2 Y=4

48.

Nested Prefabのオーバーライド Prefab1 X=2 Y=1 Prefab2 Prefab3 他のPrefabには反映されない X=2 Y=4 X=2 Y=1

49.

Nested Prefabのオーバーライド Prefab1 X=2 Y = 12 Prefab2 Prefab3 X=2 Y=4 X=2 Y = 12 オーバーライドした値が優先される点には注意

50.

“ DEMO ”

51.

Prefabのバリアント Variant =本質的には同じものだが、 少しずつ異なるPrefab Prefabを元にPrefabを生成 大体同じだが、 異なる設定を持つPrefab

52.

Prefab1 X=1 Y=1

53.

Prefab1 Prefab2 X=1 X=1 Y=1 Y=1 Variantを作成

54.

Prefab1 Prefab2 X=1 X=2 Y=1 Y=1 個別に値をオーバーライドできる

55.

Prefab1 Prefab2 X=1 X=2 Y=5 Y=5 大本Prefabを更新すると、反映される

56.

“ DEMO ”

57.

モデルの更新 Prefab Prefabを自動生成 Model (FBX) メッシュ ボーン構造 追加した 子オブジェクト コンポーネント

58.

モデルの更新(いままで) 元Prefab メッシュ ボーン構造 追加した Prefab メッシュ ボーン構造 追加した 子オブジェクト 構造が異なると作り直し 子オブジェクト コンポーネント コンポーネント

59.

モデルの更新 元Prefab メッシュ ボーン構造 追加した Prefab メッシュ ボーン構造 追加した 子オブジェクト 子オブジェクト モデルのオブジェクトが独立 コンポーネント オブジェクトを更新すると反映 コンポーネント

60.

ここが変わった! Nested Prefabを細かく分割しやすくなった! Prefab 編集した時の動作 バリアント Prefabの一括更新がやりやすくなった バリエーションを作るときにスクリプトとか無くてもなんとかなる モデルの更新もやりやすくなった

61.

Addressable Asset System 動的なメモリマネジメント 依存関係の制御 ダイナミックなコンテンツの配信 アセットの参照をもっと簡単に 繰り返し確認しやすく

62.

Resources 普通にアセットを参照するのはすごく簡単

63.

アセットを参照すると、自動的にロードされてしまう Texture Model Material Prefab Audio Prefab • とはいえAssetBundleにすると途端に面倒くさい事になる Shader Texture

64.

直接参照か、ResourcesかAssetBundleか • 直接参照 SceneやPrefabからアセットへ直接参照する 関連するアセットが速やかに根こそぎロードされる • Resources 名前ベースで指定したアセットをロードする。(現在非推奨) • AssetBundle アセットを外部ファイルにまとめて配信する バージョン、キャッシュ、依存関係、アセット格納先、開放タイミング等、考えることが多い

65.

直接参照か、ResourcesかAssetBundleか • 直接参照 完全に関係のあるアセット 即座にアセットがロードされる • Addressable Asset System 関係の薄いアセット 格納場所を気にせずアセットをロードできる

66.

直接参照、Resourcesの使いやすさを AssetBundleの環境に提供

67.

導入はPackageManager経由

68.

アセット参照のためのコード [SerializeField] GameObject player;

69.

アセット参照のためのコード [SerializeField] GameObject player; [AssetReferenceTypeRestriction(typeof(GameObject))] public AssetReference player;

70.

アセット参照のためのコード [SerializeField] GameObject player; [AssetReferenceTypeRestriction(typeof(GameObject))] public AssetReference player; 参照する(予定の)アセットのアドレス

71.

アセット参照のためのコード [SerializeField] GameObject player; 参照する(予定の)アセットの型 [AssetReferenceTypeRestriction(typeof(GameObject))] public AssetReference player;

72.

アセット参照のためのコード [AssetReferenceTypeRestriction(typeof(GameObject))] public AssetReference player;

73.

Addressableにオブジェクトを登録

74.

Addressableにオブジェクトを登録

75.

オブジェクトの生成 今まで GameObject playerInstance; playerInstance = Object.Instantiate(player); Addressable GameObject playerInstance; player.Instantiate<GameObject>().Completed += (op) => {playerInstance = op.Result;}

76.

オブジェクトの生成 今まで GameObject playerInstance; playerInstance = Object.Instantiate(player); Addressable 基本的に非同期で動作するAPI GameObject playerInstance; player.Instantiate<GameObject>().Completed += (op) => {playerInstance = op.Result;}

77.

オブジェクトの破棄 今まで Destroy(playerInstance); Resources.UnloadAsset(asset); Addressable Addressables.ReleaseInstance(playerInstance); Addressables.ReleaseAsset(asset);

78.

“ DEMO ”

79.

AssetBundleに登録したアセットの確認

80.

AssetBundleに登録したアセットの確認 AddressableAssetに登録されているアセットの一覧

81.

AssetBundleに登録したアセットの確認 アセットの所属するグループ グループ毎に配信の形態を設定できる (サーバー上に配置、StreamingAssetsに配置等)

82.

AssetBundleに登録したアセットの確認 参照のために使用する名前(アドレス)

83.

AssetBundleに登録したアセットの確認 検索や絞り込みに使用されるラベル (複数登録可)

84.

ラベルに指定したアセットの事前ロード var preloadOp = Addressables.PreloadDependencies("preload", null); yield return preloadOp; “preload”のラベルを持つアセットを 事前にロードしておく

85.

ラベルを指定したアセット一覧を取得 public AssetLabelReference hazardsLabel; var op = Addressables.LoadAssets<IResourceLocation>(hazardsLabel.labelString, null); yield return op; hazardLocations = new List<IResourceLocation>(op.Result);

86.

アドレスから直接オブジェクトを生成する Addressables.Instantiate<GameObject>("Done_Player");

87.

データの格納場所はグループ単位 グループ毎にAssetBundleを 配置するパスを指定 ローカル or サーバー等

88.

プロファイル 接続先を複数用意しておき、 選択一つで切替可能 ステージング用、本番用等

89.

格納方式もグループ単位 pack Separately pack Together 1Addressable 1AssetBundle 1つのAssetBundleに纏める

90.

Addressable Asset Systemは基本的にAssetBundle 規模が大きくなると すごく時間がかかる AssetBundleを生成 アセットの調整 動作を確認

91.

Fastモード、Virtualモード、Packedモード コンテンツを確認する上で 新しいオプションが追加された

92.

Fastモード、Virtualモード、Packedモード Fast: AssetBundleを構築せず、 AssetDatabaseから直接アセットを取得 パフォーマンス的に若干動作が異なる事がある ゲームの動作を確認する上で便利 アセットの調整 動作を確認

93.

Fastモード、Virtualモード、Packedモード Packed: AssetBundleを構築し、AssetBundleから アセットを取得する。 リリース後の動作と同じ。最終動作確認用 AssetBundleを生成 アセットの調整 動作を確認

94.

Fastモード、Virtualモード、Packedモード Virtual: AssetBundleは作成しない コンテンツのレイアウトやアセットの依存関係を 考慮してロードする。 コンテンツの読込状況や分割の戦略を考える用途 ResourceManager更新 アセットの調整 動作を確認

95.

Resource Profiler ( PM Profiler)

96.

Resource Profiler ( PM Profiler)

97.

ここが変わった! Addressable Virtual / Fastモード メモリ管理 AssetBundleへの参照がResourcesや直接参照並みに簡単に AssetBundleビルド待ちせず調整が可能に 検証がやりやすくなった 参照カウンターで自動的に開放される 色々考えなくても良い感じによしなにしてくれるようになった

98.

Addressable、ResourceManagerの拡張 AddressableはC# PackageManagerで提供されている つまり改造できる

100.

“ 今までアセット制御のために 多くのスクリプトを要求していた ”

101.

“ AddressableとNew Prefab Workflowで 特別なコードを書かなくとも 良い感じにアセットを制御しやすくなった ”

102.

“ 今後は、色々面倒なことしなくても、 素直にアセットの作成や量産、読込が可能に! ”

103.

Thank you! ご静聴ありがとうございました