20210621のUnityに関する記事は5件です。

ランタイム(exe)でVRM(MToon)をHDRP(Lit)表示

概要 ランタイム(exe)でVRM(MToon)をHDRP(Lit)表示します。 環境 Unity 2020.3.11f1 UniVRM 0.66.0 実装 using System.IO; using System.Collections.Generic; using UnityEngine; using VRM; public class MToonToLit : MonoBehaviour { [SerializeField] string FilePath; [SerializeField] Material Opaque; [SerializeField] Material Transparent; void Start() { // VRM読み込み var bytes = File.ReadAllBytes(FilePath); var context = new VRMImporterContext(); context.ParseGlb(bytes); context.Load(); context.ShowMeshes(); // MToonをLitに置き換え var renderers = context.Root.GetComponentsInChildren<Renderer>(); for (int i = 0; i < renderers.Length; i++) { var materials = new List<Material>(renderers[i].materials); for (int j = 0; j < renderers[i].materials.Length; j++) { if (renderers[i].materials[j].GetFloat("_BlendMode") != 2) { materials[j] = new Material(Opaque); } else { materials[j] = new Material(Transparent); } // 通常と透過を使い分けて色とテクスチャを反映 materials[j].color = renderers[i].materials[j].color; materials[j].mainTexture = renderers[i].materials[j].mainTexture; } renderers[i].materials = materials.ToArray(); } } } 補足 HDRPで作成したプロジェクトのシーンのどこかへ前述のスクリプトを張り付けて、FilePathに読み込みたいVRMファイルのパス、Opaqueに新規作成したHDRP/Litのマテリアルを設定、Transparentには新規作成したHDRP/LitのマテリアルのSurface TypeをTransparentにしてから設定すれば動くと思います。 既知問題として、このままだとUnlitが来た時に失敗して真っ黒になるので、_BlendModeの判定辺りをちゃんとやる必要があります。どうやれば良いかは調べれてません。 参考 左がHDRP、右がMToonです。 モデル:リンツちゃん改変 https://booth.pm/ja/items/1255264 サンプルアプリ https://120byte.booth.pm/items/3062310
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity]Animatorを任意のフレームレートで動作させる

E3で公開された「SABLE」の世界観素敵ですね・・・。 このゲームの魅力を支えているたくさんのテクニックの内のほんの一つですが、モーションのフレームレートをあえて落としてトゥーンシェーディングのグラをよりアニメ調に見せる方法 を以前Qiitaの記事にしました。 この記事ではPlayableAPIを使った実装を紹介していて、普通にAnimatorControllerを使って動かすモデルにはそのまま適用できず扱いづらいものだったので、AnimatorControllerをそのまま使ってフレームレートを落とす機能を作ったので、話題に便乗して紹介します! こんな感じになります ※シェーダーはユニティちゃんシェーダーを当ててます スクリプト Animatorコンポーネントを持つオブジェクトに付与するAnimatorFPSController.csを作っています。 AnimatorFPSController.cs using UnityEngine; [RequireComponent(typeof(Animator))] public class AnimatorFPSController : MonoBehaviour { [SerializeField, Range(1, 30)] int _fps = 30; Animator _animator; /// <summary>しきい値時間</summary> float _thresholdTime; /// <summary>スキップされた更新時間</summary> float _skippedTime; private void Awake() { _animator = GetComponent<Animator>(); _animator.enabled = false; InitializeThresholdTime(); } /// <summary> /// しきい値時間の初期化 /// </summary> void InitializeThresholdTime() { _thresholdTime = 1f / _fps; } private void Update() { _skippedTime += Time.deltaTime; if (_thresholdTime > _skippedTime) { return; } // アニメーションの時間を計算する _animator.Update(_skippedTime); _skippedTime = 0f; } /// <summary> /// Inspectorの値変更時の処理 /// </summary> private void OnValidate() { InitializeThresholdTime(); } } 動作フレームレートを指定する変数_fpsに応じて計算される更新頻度(秒)変数_thresholdTimeの間だけ、Animatorの更新を止めています。 更新頻度の時間に到達したら、更新を止めていた時間を込みでAnimatorのUpdateを進めて、モーションによって作られるポーズに更新する仕組みです。 雰囲気作り・絵作り以外の用途 高負荷になりがちなAnimatorの更新頻度を抑えて負荷削減する用途にも使えます。 市場のゲームだと、 マリオオデッセイのニュードンクシティの街の人々 モンハンワールドの一部の敵 ドラクエモンスターズ2 3DS版のフィールドの敵シンボル などのモデルがカメラからの距離に応じてアニメーションのフレームレートを落とすような仕組みが施されていることが確認できました。 LODの一環としてこの仕組みを入れるのも良いかもしれません。 Animator以外にも、大量のオブジェクトやインスタンスの更新処理で負荷が高い場合、この手法で負荷を減らすこともできそうです。 負荷削減として扱う場合 更新頻度を減らすオブジェクトが大量にある場合、更新処理に到達するタイミングをズラす必要があります。 ズラさなかった場合、全てのオブジェクトの更新が同一フレームで走るため、一定間隔でスパイクしてしまいます。 AnimatorFPSController.cs void InitializeThresholdTime() { _thresholdTime = 1f / _fps; // 更新タイミングがバラつくように初期値に乱数を与える _skippedTime = Random.Range(0f, _thresholdTime); } このように_skippedTimeに_thresholdTimeを最大値とする乱数を与えることで、更新タイミングを散らすことができます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity実行時のマウスによるカメラ操作例

概要 Unity実行時のマウスによるカメラ操作例を記載します。 実装 オブジェクト構造 スクリプト using UnityEngine; public class CtrlView : MonoBehaviour { [SerializeField] Transform TargetCam; [SerializeField] Transform ViewPoint; [SerializeField] float Angle_Speed = 0.5f; [SerializeField] float PosXY_Speed = 0.005f; [SerializeField] float PosZ_Speed = 5; Vector3 MousePos; void Update() { // マウスの移動量を取得 var diff = MousePos - Input.mousePosition; MousePos = Input.mousePosition; if (Input.GetMouseButton(0)) { // 左クリック(回転) var tmp = diff; diff.x = +tmp.y; diff.y = -tmp.x; ViewPoint.eulerAngles += diff * Angle_Speed; } else if (Input.GetMouseButton(1)) { // 右クリック(移動) var tmp = diff; diff.x = -tmp.x; diff.y = +tmp.y; ViewPoint.position += diff * PosXY_Speed; } // スクロール(拡縮というか前後) var scroll = Input.GetAxis("Mouse ScrollWheel"); var pos = TargetCam.localPosition; pos.z += scroll * PosZ_Speed; TargetCam.localPosition = pos; } } 補足 スクリプトは同クラス名でファイルを作成してそのままコピペしたら、どこかテキトウなオブジェクトにアタッチして、TargetCamに操作したいカメラ、ViewPointに視点とするカメラの親オブジェクトを設定すればそのまま使えます。 対象を中心にカメラどうやって回せばいいの?と思って良く分からない計算しようと思ったりしたこともありましたが、カメラをオブジェクトの子にしてオブジェクトを回せば良いのでは?という方法になります。 利用シーンは多そうな気がするんですが基本的過ぎる?せいか、あまりド直球な例は見かけないため、自分用としてのメモもかねて記事にしました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[unityメモ] オブジェクトをキーで動かす方法!

unityメモ オブジェクトをキーで動かす方法! ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー using System.Collections; using System.Collections.Generic; using UnityEngine; public class Movenezu : MonoBehaviour { // Update is called once per frame void Update() { if (Input.GetKey("up")) {         transform.Rotate(-2, 0, 0); } if (Input.GetKey(KeyCode.Space)) { this.transform.Translate (0.0f,0.0f,0.05f); } if (Input.GetKey("down")) { transform.Rotate(2, 0, 0); } if (Input.GetKey("right")) { transform.Rotate(0, 2, 0); } if (Input.GetKey("left")) { transform.Rotate(0, -2, 0); } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity 2020】MRTK 2.6.0の導入

まえがき Unityの2020バージョンでMRTKを導入しようとしたら少し変更されているところがあったので,記述しておく. ついでに新しいバージョンのMRTKも導入してみる. 公式ページも一新されています. P.S.たらたらしてたら最新バージョン2.7.0がでてしまった.? 本題 機器概要 機器名 バージョン Windows10 --- HoloLens2 --- Unity 2020.3.11f.1 (LTS) MRTK 2.6.0 MRTKの動作要件 Unity Hubでユニバーサル Windows プラットフォーム ビルド サポート モジュールが追加された Unityは2020 LTS(現在 2020.3.x)または Unity 2019 LTS (現在 2019.4.x) Unityでアプリケーションの作成,ビルド VisualStadioでHoloLens2にビルド(書き込み)という流れ. 導入 ※公式ページのMRTKチュートリアルをもとに進めていきます. 以前の記事の導入でも設定している. ※Unityは導入されている前提とします ※Visual Stadioで必要なモジュールは以下の通りです Unityのオプションはチェック外してください Universal Windows Platformモジュール HoloLens2のビルドに必要なモジュールをインストールしておく やり方はUnityHubのインストールから使用するバージョンのモジュールを加える 必要なモジュール ユニバーサル Windows プラットフォーム ビルド サポート Windows ビルド サポート (IL2CPP) 手順 1.projectの作成 2.HoloLens2用の設定をする 2.6.0バージョンではWindows XR Pluginを使用する File/Build settings...からビルド環境をUWPに変更する. TMPをimportする Windows/TextMeshPro/Import TMP Essential Resourcesからパッケージをimportする 3.MRTKを導入する ※参考:Welcome to the Mixed Reality Feature Tool .NET 5.0 runtimeを導入している必要があると記載されているためしておく方がよい Microsoft Mixed Reality Feature ToolをDLして開く 設定したいバージョンがないならSetting/Feature/Show preview releasesにチェックする必要がある 導入したいUnityプロジェクトを選択する 導入するToolkitとバージョンを選択する(参考) 以下のものを推奨する ・Mixed Reality Toolkit Example:[Foundation,Extensionsに依存],パッケージの機能を使用するデモ、サンプル スクリプト、およびサンプルシーン ・Mixed Reality Toolkit Extensions:[Foundationに依存],MRTK の機能を拡張する追加のコンポーネント ・Mixed Reality Toolkit Foundation:[必須,Standard Assetsに依存],Mixed Reality Toolkit の基礎 ・Mixed Reality Toolkit Standard Assets:[必須],全ての Mixed Reality エクスペリエンスに推奨されるコンポーネントのコレクション ・Mixed Reality Toolkit Tools:[Foundationに依存],MRTKを使った Mixed Reality 開発エクスペリエンスを強化する役に立つツール,Unity Editor の Mixed Reality Toolkit > Utilitiesメニュー Validate(検証)で確認後Import 問題なければApproveする していることはPackage Managerの設定(Package/manifest.jsonに記述)とMixedRealityファイルの中に必要なファイルのDLだと思われる jsonファイルのバックアップもされていると思われる 導入後Unityに戻るとPackageが導入され,以下の画面が出てくるのでApplyする もし出てこなくてもMixed Reality Toolkit/Utilities/Configure Unity Projectからウィンドウを出せる 4.XR Plug-in Manegementの設定 File/Build settings...からPlayer Settings...もしくはEdit/Project Settings...から XR Plugin Manegementウィンドウを開く install XR Plugin Managementを押す AssetsにXRフォルダが追加される Windows Mixed Realityにチェックを入れる 設定は以下の通り Depth Buffer Formatはプロジェクトのグラフィックパフォーマンスの向上のため「16bit depth」が推奨されている またPublishing SettingsのPackage nameでアプリケーションの名前を変更することが可能 5.Sceneの設定 Mixed Reality Toolkit/Add to Scene and Configure...を押す SceneにMixedRealityToolkitとMixedRealityPlayspaceが追加される プロファイルの設定を変更したい場合,クローンを作成する必要がある Copy&Customizeを押して名前を変更し,Clone saveすると保存される これでビルドを行うと何もない空間のアプリケーションが生成される 6.Build 対象のシーンが追加&チェックされていることを確認してBuild Build先のフォルダを選択 APPやBuildなどのフォルダを新規作成すると良い HoloLens2への書き込みはVisual Stadio 以前の記事のビルド以降を参考にしてください USB-TypeCでHoloLens2とLaptopを接続する ※CtoCができない場合はCtoAなど別のUSBケーブルを利用してください Visual StadioがHoloLens2にBuildするように設定を変更する 1.構成をDebugからReleaseに変更 2.ARM64(Windowsx64)もしくはARM(Windowsx32)に設定 ※PCに合わせて設定してください(ほとんどx64でOKです) 3.ビルド先をリモートコンピュータからデバイスに変更 4.デバッグ/デバッグなしで開始をクリック これでビルドをしてHoloLens2に配置までを自動で行う 初回のビルド時はPINコードによる認証が必要,入力を促される 7.デバイス同士のペアリング アプリケーションのビルドを行うためにHoloLens2で設定する必要がある(私はエラーで気づかされた) 開発者モードの設定を有効にする ・HoloLens2 ペアリングからPINコードを表示 それをVisual Stadioで打ち込む しかし私はここでエラーが発生 8.リモートでビルド USBからではなくリモートで行う デバイス→リモートコンピュータに変更 HoloLens2のWi-Fi設定からIPアドレスを取得,プロジェクトのプロパティからデバイス名にIPアドレスを入力,デバッグなしで開始 するとPINコード入力画面が出現 開発者モードのペアリングからPINコードを取得,Visual Stadioで入力 配置正常終了と出て,HoloLens2でアプリが起動! あとがき 次はTutorialを進める
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む