Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

【Unityの集い in大阪】Unity最新情報

421 views

Published on

最近Unityの新機能が追いきれない、そんな声にお答えして最近のUnityの機能をまとめて紹介します。

Published in: Technology
  • Be the first to comment

【Unityの集い in大阪】Unity最新情報

  1. 1. Unity 最新情報 Tatsuhiko Yamamura @ Unity
  2. 2. お品書き • Addressable • UIElement • Visual effect graph • DOTS
  3. 3. Addressable
  4. 4. アセットワークフローの更新
  5. 5. アセットの配置の
 外部配置・内部配置を
 出来るだけシンプルにする
  6. 6. Addressables.LoadAssetAsync<GameObject>(“Warrior"); Warrior(アドレス) archer(アドレス) Warrior(ロード済) ローカルリソース warier.prefab(ファイル名) archer.prefab(ファイル名) 指定のアドレスで
 アセットをロード
  7. 7. Warrior(アドレス) Addressables.LoadAssetAsync<GameObject>(“Warrior"); archer(アドレス) Warrior(ロード済) アプリに最初から含まれるリソース(ローカル) warier.prefab(ファイル名) archer.prefab(ファイル名) 追加でダウンロードしたコンテンツ(リモート) リモートとローカルの
 区別なくアセットをロード
  8. 8. Warrior(アドレス) warier.prefab(ファイル名) 追加でダウンロードしたコンテンツ [Serializable] AssetReferenceGameObject Warrior; スロットだけ用意 GUIベースでの登録
  9. 9. warier(アドレス) warier.prefab(ファイル名) 追加でダウンロードしたコンテンツ ドラッグ&ドロップ
  10. 10. Warrior(アドレス) warier.prefab(ファイル名) 追加でダウンロードしたコンテンツ Warrior(ロード済) [Serializable] AssetReferenceGameObject Warrior; warier.LoadAssetAsync() ドラッグ&ドロップで アセットを登録して 遅延ロードもできる
  11. 11. DEMO
  12. 12. アセット バンドル2 アセット バンドル1 ローカルのアセット Webから取得するアセット コンテンツカタログ archer [アセットバンドル1] warier [アセットバンドル2] カタ
 ログ コンテンツカタログは アドレスが指すアセットが 何処にあるかを知っている コンテンツの更新
  13. 13. アセット バンドル2 アセット バンドル1 ローカルのアセット Webから取得するアセット archer [アセットバンドル1] warier [アセットバンドル2] カタ
 ログ Addressables.LoadAssetAsync<GameObject>(“warier"); コンテンツカタログのお陰で ロードするアセットが 何処にあるかを
 気にしなくても良い コンテンツカタログ
  14. 14. アセット バンドル2 アセット バンドル1 ローカルのアセット Webから取得するアセット コンテンツカタログ archer [アセットバンドル1] warier [アセットバンドル2] カタ
 ログ キャッシュと比較して
 ダウンロードする
 データ量を取得 Addressables.GetDownloadSizeAsync("default") Addressables.DownloadDependenciesAsync("default")
  15. 15. アセット バンドル2 アセット バンドル1 ローカルのアセット Webから取得するアセット カタ
 ログ 新しいコンテンツを追加 アセット バンドル3 カタ
 ログ NEW NEW カタログを更新
  16. 16. アセット バンドル2 アセット バンドル1 ローカルのアセット Webから取得するアセット カタ
 ログ アセット バンドル3 カタ
 ログ NEW NEW archer [アセットバンドル1] warier [アセットバンドル2] rider [アセットバンドル3] 新しいコンテンツカタログで アセットの情報を取得 コンテンツカタログ
  17. 17. アセット バンドル2 アセット バンドル1 ローカルのアセット Webから取得するアセット カタ
 ログ アセット バンドル3 カタ
 ログ NEW NEW archer [アセットバンドル1] warier [アセットバンドル2] rider [アセットバンドル3] Addressables.LoadAssetAsync<GameObject>(“rider”); 追加/更新したアセットも
 スムーズに取得できる コンテンツカタログ
  18. 18. DEMO
  19. 19. ビルド時間を短縮 ビルド時間
  20. 20. アセットの
 収集 アセットの
 変換 アセットの シリアライズ コンパイル IL2CPPで
 変換 パッキング
  21. 21. アセットの
 収集 アセットの
 変換 アセットの シリアライズ コンパイル IL2CPPで
 変換 パッキング アセットの更新のみの場合、 コンテンツの更新のみを行う
  22. 22. アセットの
 収集 アセットの
 変換 アセットの シリアライズ コンパイル IL2CPPで
 変換 パッキング スクリプトの更新のみの場合、 スクリプトのビルドのみ行う
  23. 23. アセットの
 収集 アセットの
 変換 アセットの シリアライズ コンパイル IL2CPPで
 変換 パッキング Androidのパッチビルドの場合は パッキングもスキップ
  24. 24. おもしろポイント • 毎回コンテンツの更新に長時間またなくても良い • コンテンツを足したり配置を動かしたりがやりやすい • ビルド時のパッキングルール周りが拡張しやすい
  25. 25. UIElements
  26. 26. エディターUI拡張の更新
  27. 27. UIの拡張の何が良いの? • 入力を制限してミスを減らして 楽ができる • 操作を自動化して
 楽ができる • 複合的な操作を単純化して
 楽ができる
  28. 28. UIElement = DOMベースのUI Root Element Label <Title> Image Button
 [Row] Label
 [ボタンn]
  29. 29. UIElement = DOMベースのUI Root Element Label <Title> Image Button
 [Row] Label
 [ボタンn]
  30. 30. UIElement = DOMベースのUI Root Element Label <Title> Image Button
 [Row] Label
 [ボタンn]
  31. 31. UIElement = DOMベースのUI Root Element Label <Title> Image Button
 [Row] Label
 [ボタンn]
  32. 32. DEMO
  33. 33. var title = new Label{ text = "タイトル" }; var button = new Button(); var image = new Image(); var buttonText = new Label{text = "ボタン01"}; rootVisualElement.Add(title); rootVisualElement.Add(button); button.Add(image); button.Add(buttonText); title.style.fontSize = 20; button.style.flexDirection = FlexDirection.Row; image.style.width = image.style.height = 80; image.image = AssetDatabase.LoadAssetAtPath<Texture>("Assets/01.png"); buttonText.style.fontSize = 15; button.clickable.clicked += ()=>{ Debug.Log("message"); }; UI要素の定義 レイアウトの設定 スタイルの調整 イベントの登録 少し整理すると…
  34. 34. レイアウトやスタイルをUXML(XML似)や USS(CSS似)で記述して使う 外部ファイルを使う 外部ファイルを使用するので、変更時にコンパイルが必要ない
 (XMLはウィンドウの再起動が必要)
  35. 35. MyLayout.uxml MyStyle.uss XML文法の外部ファイルで
 レイアウトを設計 特定のUIのスタイルを
 CSSっぽい記述で調整 <UXML xmlns="UnityEngine.Experimental.UIElements"> <Label text="タイトル" name="title"/> <Button class="rowModule" name="mybutton"> <Image name="foo"/> <Label text="ボタン1"/> </Button> </UXML> .rowModule{ flex-direction: row; } Image{ min-width: 80; min-height:80; } Image#foo{ background-image:url("/Assets/01.png"); } Label#title{ font-size: 20; }
  36. 36. 名前が”mybutton”のボタンを 押したときの挙動を定義
  37. 37. おもしろポイント • 直感的に作りやすい(※IMGUIと比較して) • XMLやCSSになれてると使いやすいかも? • 大量にUIを描画したときに軽い
  38. 38. Visual
 Effect
 Graph
  39. 39. 様々な表現に使える • パーティクル表現 • 点像 • インタラクティブな表現
  40. 40. 様々な表現に使える
  41. 41. 様々な表現に使える
  42. 42. 様々な表現に使える
  43. 43. 様々な表現に使える
  44. 44. 特徴 • 次世代パーティクルジェネレーター • 非常に大量のパーティクルを生成できる • パーティクル以外にも、「表現」なら色々と使える • 複雑なシミュレーションをGPUで高速に実行
 (Compute Shaderを自動生成) • 複雑な表現を実現可能 • コーディング無し(スタックとノードのハイブリットツール)
  45. 45. Particle System
 (2018.1以降) VFX Editor 描画座標計算 Particle System
 (2018.1未満) CPU CPU CPU GPU GPU GPU オブジェクトの生成以外はほぼGPUで動作 パーティクル生成 CPU CPU GPU
  46. 46. 適正パーティクル数 シミュレーション 接触の表現 接触判定 ParticleSystem Visual Effect Graph 1000 particles 10,000,000 particles シンプル 複雑 物理演算ベース 擬似的な表現 あり なし 動きの計算 CPU GPU
  47. 47. 動きはノードベースで構築 ノードを元にComputeShaderを生成
  48. 48. 処理のスタック(積み上げ)は
 Spawn、Initialize、Update、Output
 この4つのカタマリが基本
  49. 49. パーティクル数はいくつか 指定された頻度で実行 初期値をどうするか 一度だけ実行 どのように変化するか ほぼ毎フレーム実行 どのようにレンダリングするか 毎フレーム実行
  50. 50. DEMO
  51. 51. 注意点 • LWRPかHDRP限定
 (既存のレンダリングパイプラインでも動くが、メンテされない) • Compute Shader(GPUを利用した演算)が
 使用できないAndroid端末はソコソコ存在する
  52. 52. おもしろポイント • 大量にパーティクルを出せるのは気持ちがいい • 発想次第で、本当に色々できる
  53. 53. DOTS
  54. 54. スクリプト周りの更新
  55. 55. Burst C# Job
 System ECS CPUコアを
 活用する 高度に最適化した
 マシンコードを出力 メモリアクセスの
 最適化 CPUに優しい CPUに優しい CPUに優しい
  56. 56. Monobehaviourで実装
  57. 57. メインスレッド:2.15ms
  58. 58. 処理の内容 ジョブの発行 Job System対応
  59. 59. ジョブの発行:0.6ms (メインスレッド) ジョブ発行:合計1.59ms(ワーカースレッド)
  60. 60. Burst C# Job
 System ECS CPUコアを
 活用する 高度に最適化した
 マシンコードを出力 メモリアクセスの
 最適化 CPUに優しい CPUに優しい CPUに優しい 2018.1から 利用可能 2019.1から 利用可能 in preview
  61. 61. ECS データレイアウト を意識して、
 効率的な
 プログラムを実現
  62. 62. CPUに優しい ECSは何が良いの?
  63. 63. ECSがやりたいこと • 同じ処理を繰り返す • 連続したデータを操作する
  64. 64. int2 Position void Update() { trs.Position += Speed;
 } Transform Component Transform trs MoveComponent int2 Speed GameObject 今までのアプローチ 参照
  65. 65. GroundCheck
 System MovingSystem GravitySystem
  66. 66. Query<Position, Speed> q void OnUpdate() { ForEach(Position p, Speed s) { p.Value += s.Value; } } int2 Value int2 Value Speed Position int2 Value int2 Value Speed Position int2 Value int2 Value Speed Position MoveSystem 希望する組み合わせを持つオブジェクトを集める 集めたデータを一斉に処理 Componentが参照を揃えるのではなく、
 必要なComponentが揃っているオブジェクトを処理する
  67. 67. 利用 更新 条件が揃うオブジェクトを操作
  68. 68. DEMO
  69. 69. おもしろポイント • 新しい設計で試行錯誤が楽しい • 量が多いとパフォーマンスが良い • 慣れてくると確かに楽
 (触りだすのは機能がもう少し揃ってからでも良いかも)
  70. 70. Visual Scripting 来るもうすぐ具体的には2019.2から触れる
  71. 71. おしまい

×