しがないエンジニアのブログ

技術的な内容をメモ代わりにつらつら

[Unite2018] 新機能Shader Graphを使えばプログラミング無しにシェーダーが作れるようになります!

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session52

講演者

高橋 啓治郎 (ユニティ・テクノロジーズ・ジャパン合同会社)

SlideShare

資料なし(ライブデモのみ)

Github

https://github.com/keijiro/ShaderGraphExamples

概要

  • Unity2018から使えるShader Graph入門
    • 基本的な使い方
    • 動作原理
    • テクニック

内容

  • シェーダグラフ
    • ノードベースのエディタ
      1. かんたんにシェーダが組める
      2. シェーダの互換性を高める
        • カメラのrendering pathごとにシェーダを組む必要
          • scriptable render pipelineの追加対応など


  • セットアップ手順
    • Lightweight RPをインストールする
      1. package manager 経由でインストール
      2. Light weight PBR Graph
    • Create > Shader > PBR Graph, Sub Graph, ...


  • シェーダグラフの基礎
    • PRB
      • ライティングあり
    • Sub
      • 割愛
    • Unlit
      • ライティングなし(出色を直接指定)
    • ex)
      • Input > Basic > Color 色を作成
      • UI左上 Save Assetで保存→shaderとして登録
      • propertyを追加して、エディタ上で編集することも可能


実装例

  1. ディゾルブエフェクト

    • Alpha Cutout
      • cutoff値を生成
        • それより低い値が透明になる
      • 線形
        • なめらかなグラデーション
      • ノイズ
        • もや〜っとした感じ
    • Step Node
    • Time, Fraction
      • アニメーション処理を自動管理
  2. エネルギーゲージ

    • グラデーション素材とthresholdの組み合わせ
    • Remap
      • In Min ~ Maxの値がOut Min ~ Maxで出力される
        • ex) in 0, 1 out 1, 0とすると、
          0 ~ 1を入力すると1 ~ 0で出力される
    • Smooth Step
      • 2つのedgeを指定してthresholdのedgeをなめらかにする
    • Lerp
      • 値の補間、2点の間をつなぐ
  3. 古風なTVエフェクト

    • Sin, (Split, Combine), Saturate
      • Sinで櫛状の縞模様を作成
      • SplitのG成分でUVのY軸の値を取り出す
      • Saturateでsinの0以下の値を切り捨て
    • Gradient Noise
      • 画像を揺らがせる
      • CombineでU値にAdd
      • Remapで出力を調整
      • Timeをかませることで、ゆらぎの強弱をつける


カスタムシェーダも作成可能

[Unite2018] エディター拡張マニアクス2018

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session36

講演者

安藤 圭吾 (ユニティ・テクノロジーズ・ジャパン合同会社)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyo2018-96373327

概要

  • ここ3年の間に実装された機能について
    • 公開済・非公開含む

内容

赤文字は開発段階

  • Scripted Importer
    • 未対応ファイルのインポートを自動化
      • 拡張子ごとに作成
        • Unityがサポート済の拡張子には対応できない
      • OnImportAsset()
        ※アセットIDは変更しないこと


  • UI Elements
    • UnityエディタはIMGUIで設定されている
      • UIが複雑になるほどコード量が増える
      • 処理が1箇所にまとまってしまう
    • RMGUIであるUI Elementsの開発
      • まだinternal customer (Unity社員)向け
    • 概要
      f:id:turgure:20180618084539j:plain
      • web知識に当てはめて考えられる
      • 覚えることは4つ + 1つ
        • 4つ
          • Visual Tree
            • Visual Elementと呼ばれるノードからなるグラフ
            • 要はXML
          • UXML
            • Visual Treeの構造をテキスト化し、ファイルとして扱う
            • 要はXMLファイル
          • USS
          • UQuery
        • +1つ
          • Visual Container
            • Visual Treeを格納する領域
            • RMGUIのOnGUIみたいなもの
    • UI Elementsの今後
      • 色々課題が多い
        • Custom Editor
        • Property Drawer
        • Performance
      • おそらく2019.x 後半


  • Graph View
    • 現状
      • まだ社員向け機能
      • まだdocumentもない


  • Shortcut System
    • ex) Shift + A のショートカットコマンドを実装
      • 特定のEditor Windowでショートカットを実装する場合
        • Eventからショートカットコマンドを検知
      • Menu Itemで実装する場合
        • グローバルなコマンドとして実装
    • ショートカット機能の実装は難易度が高い!
      • OSによるキーの違いも考慮する必要
      • ショートカットキーのコンフリクトを調べられない
      • ショートカットのリスト化が困難
    • Unity2018.2から新しいシステムを実装
      • まだプレビュー段階
      • できるようになること
        • ショートカットのリスト化
        • ユーザによるショートカットキー変更
        • ショートカットキーがコンフリクトした場合の修正
    • 実装方法
      • Menu Itemのような実装方法


  • Preset
    • UnityEngine.Objectのプロパティを保存/復元する機能
    • Preset Asset
      • Serialized Propertyを保持している
    • スクリプトで生成/操作が可能
    • Presetに保存した値をデフォルト値として扱える
    • 一番役立つのがインポータ設定


  • Package Manager
    • Assetを配信するシステム
    • Module Managerとの違い
      • コンセプトは同じ
      • 失敗点を改善
        • 扱うモジュールがcore部分に強く依存していて切り離しが難しい
    • 最終的にModule Managerがなくなり、Package Managerに完全移行
    • 基盤システムはnpm
      • そのためパッケージ情報はpackage.jsonで管理
    • 今後
      • unitypackageは過去のフォーマットになる


  • Unity C# Reference
    • 標準機能をエディタ拡張で使いたい
    • 特定のプロパティにアクセスしたい
    • 公式でc#ソースコードを公開
      • 2017.1~2018.2
    • Unity Reference-Only License
      • 再配布・改変は不可
    • 活用法
      1. UnityCSReferenceをクローンする
      2. 必要な機能を調べる
      3. 目的のコードを探す
        • ex) project browser(エディタのUI分割)
      4. どのように実装されているか学ぶ

用語

[Unite2018] その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session32

講演者

Valentin Simonov (Unity Technologies Field Engineer)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyo-96358722/UnityTechnologiesJapan/unite-2018-tokyo-96358722

概要

  • メモリの種類について
  • Dirty Memoryを最小限に抑えるべし
  • 最適化ツールの紹介

内容

  • メモリ消費の管理
    • ツールごとに値が様々
    • what kind of memory?
    • RAM(物理メモリ)
      • 物理的なメモリ
      • 上限を超えられない
        f:id:turgure:20180614083307j:plain
    • Virtual Memory(VM)
      • RAMの一部を借りる
      • iOSのアプリはVM上で動く
      • pageとしてメモリのアロケートをする
        f:id:turgure:20180614083356j:plain
    • Resident Memory
      • VMの一部
      • 使用せず、確保するだけ
        f:id:turgure:20180614083415j:plain
    • Clean and Dirty Memory
      • Clean Memory
        • readonlyなメモリ領域
          • binaryファイルなど
      • Dirty Memory
        • そのた
          f:id:turgure:20180614083650j:plain f:id:turgure:20180614083657j:plain
    • Graphics Memory(VRAM)
      • GPUとCPUが共有する物理メモリ
      • ほとんどがResident or Dirty memory
        f:id:turgure:20180614083749j:plain
    • Malloc Heap
      • VMの一部
      • malloc/callocで確保される
        f:id:turgure:20180614083756j:plain
    • Swapped(compressed) Memory
      • 圧縮されていないDirty Memory
      • 圧縮されたDirty Memory
        f:id:turgure:20180618083329j:plain
    • Native(Unity) Memory
      • Native Memory
        • malloc heap(VM)の一部
        • すべてのassetはNM上で管理
          f:id:turgure:20180618083458j:plain
    • Native Plugin
    • Mono Heap
      • NMの一部
      • .NETバーチャルマシンの一部
      • 連続したものではなく、断続的なもの
        f:id:turgure:20180618083539j:plain f:id:turgure:20180618083600j:plain


  • iOSメモリ管理
    • iOSマルチタスクメモリ
    • 物理メモリが少なくなると、物理メモリを開放しようとする
      1. Clean Memoryの削除
      2. Dirty Memoryの使用が多い場合、警告を発する
      3. 確保できなかった場合、Dirty Memoryを削除
    • Dirty Memoryのサイズを最小限に抑える!
      • Dirty Memoryの使用量を把握する
      • Dirty Memoryを使用しているオブジェクトを減らす
      • Note. 圧縮のやりやすさ、やりにくさがある


  • Tools
    • Unity Profiler
      • 内部ツール
      • Simple View
        • Mono(used)
          • Mono Heapサイズ(ピンクと緑の総和)
        • Mono(total)
          • Mono Heapに対してcommitされた総量
        • GfxDriver
          • 2Dの総量 – renderターゲット
        • FMOD
          • audioがリクエストしたサイズの総量
        • 他の値は使い物になっていない
      • Detailed View
        • Native Memory上のオブジェクト名
        • Native Memory上でアセットをどれくらい消費しているか
    • Memory Profiler
      • 外部ツール
      • BitBucket
        • Assets(VM)
        • Asset(GPU)
        • Managed object(Mono)
          • コンテンツリストの確認
        • オブジェクト参照ができる
        • 相対的サイズの確認が用意
    • Memory Profiler Extension
      • Github
        • Mono Heapのブロックを確認できる
    • Xcode Debug View
      • メモリ管理
        • Dirty Memory + Swapped Memoryだと思われる
        • 黄色いゾーンに入ってきたとき、終了される確率が高まる
    • VM Tracker
      • アプリケーションのメモリの消費量
      • 扱いが難しい
        • www dcのカンファレンスを見る
        • 他のuniteの講演を見る
      • Dirty Memory/Graphics Drive/Mono Heap/Malloc Heapなどの確認が可能
      • いつ、なぜの確認ができない
    • Allocations Instrument
      • stack traceが可能
        • ex) asset bundleのロードの確認、metadataの初期化の確認
        • parsing JSON
      • すべてVM