- 投稿日:2021-04-26T21:26:30+09:00
【MRTK】PC Holographic Remoting をやりました
HoloLens 2 PC Holographic Remoting のチュートリアル をやりました。 開発環境 HoloLens2 Windows 10 pc Unity 2019.4.1f1 やり方 HoloLens 2 PC Holographic Remoting のチュートリアルの通りにやればできました。 引っかかる部分も特になかったです。 完成 MRTK PC Holographic Remoting のチュートリアルやりました。FPS高い状態維持できるのでいいですね#HoloLens2 #MRTK pic.twitter.com/0nQqcRrIZr— 原口昂弥 (@k_haraguchi55) April 21, 2021 3DモデルをPCで描画してHoloLens2に送っています。 PCで描画するので重いモデルでも描画することができます。 他にはビルドせずにUIやモデルをHoloLensで確かめられるのが便利ですね。 Holographic Remoting と 実機ビルドの違い カメラとマイクはHoloLensではなくPCのものを使う。 PC上で動作させるため、ビルド時と動作が異なることがある。
- 投稿日:2021-04-26T18:24:16+09:00
【MRTK】MRTKInputFieldが使いづらい 解決案
はじめに 開発中のHoloLens2アプリのログイン周りの入力がやりづらかったので解決策を探りました。 環境 HoloLens2 Windows 10 pc Unity 2019.4.1f1 仕様 アプリの仕様 E-mailとパスワードを半角英数字で入力してログインする仕様です。 HoloLens2標準キーボード+MRTK標準InputFieldを使用していました。 MRTK標準InputFieldの仕様 InputField ContentType は指定した形式以外の入力が確定したときにブロックします。 ContentType Email を指定したときも全角文字を入力することができてEnterを押したときに消えます。 問題点 Email、パスワードの半角英数字が入力しづらい状態です。 理由は下の問題があるためです。 全角入力から始まる。 全角の文字を入力すると二重に表示される。 全角の文字を入力すると1文字ずつしか表示されないことがある。 HoloLens2を慣れていないユーザーから見ると半角文字と全角文字の区別が難しい。 対処法 対処法として以下の方法を考えました。 入力文字を無理やり半角に変える。 全角文字が入力されたときにユーザーに知らせる。 半角英数字しか入力できないキーボードを使用する。 ログイン方法を変更する。 入力文字を無理やり半角に変える やり方 Validation.cs using Microsoft.MixedReality.Toolkit.Experimental.UI; using UnityEngine; public class Validation : MonoBehaviour { [SerializeField] MRTKTMPInputField InputField = default; FullWidthToHalfWidthConverter converter = new FullWidthToHalfWidthConverter(); private void Awake() { if(InputField == null) InputField = GetComponent<MRTKTMPInputField>(); InputField.onValueChanged.AddListener(ConvertToHalfWidth); } private void ConvertToHalfWidth(string text) { if (!converter.IsHalfWidth(text)) { InputField.text = converter.Convert(text); } } } FullWidthToHalfWidthConverter.cs public class FullWidthToHalfWidthConverter { private Encoding encoding = Encoding.GetEncoding("Shift_JIS"); private Dictionary<char, char> FullWidthToHalfWidthDictionary = new Dictionary<char, char> { { 'ー','-'}, { '「','['}, { '」',']'}, { '、',','}, { '。','.'}, { '・','/'}, }; private const int FullWidthHalfWidthDifference = 65248; private const int StartFullWidthCharSetByte = 65281; private const int EndFullWidthCharSetByte = 65374; public string Convert(string text) { string output = ""; foreach (int c in text) { if (StartFullWidthCharSetByte <= c && c <= EndFullWidthCharSetByte) { output += (char)(c - FullWidthHalfWidthDifference ); continue; } if (FullWidthToHalfWidthDictionary.Keys.Any(k => (int)k == c)) { output += FullWidthToHalfWidthDictionary[(char)c]; continue; } output += (char)c; } return output; } public bool IsHalfWidth(string text) { return text.Length == encoding.GetByteCount(text); } } 上のコードをプロジェクトに追加して Validation を MRTKInputField にアタッチする。 デメリット 入力中の文字が二重に表示される、一文字しか表示されないなどの問題は解決できない。 全角のaなどの入力はひらがなに変換されてしまう。 全角文字が入力されたときにユーザーに知らせる やり方 ValidationMessage.cs using System.Text; using TMPro; using UnityEngine; public class ValidationMessage : MonoBehaviour { [SerializeField] TextMeshProUGUI Text = default; private Encoding encoding = Encoding.GetEncoding("Shift_JIS"); public void CheckText(string text) { if(!IsHalfWidth(text)) { Text.text = "全角入力中です"; } else { Text.text = ""; } } private bool IsHalfWidth(string text) { return text.Length == encoding.GetByteCount(text); } } 上のスクリプトをプロジェクトに追加して適当なオブジェクトにアタッチする。 Inspectorから表示先のテキストを ValidationMessage.Textプロパティに設定。 バリデーション対象の MRTKInputField の OnValueChanged に ValidationMessage.CheckTextを追加。 デメリット 扱いづらさを軽減することはできるが、解決はできない。 半角英数字しか入力できないキーボードを使用する やり方 NonNativeKeyboardを使用する。 デメリット 変換機能を使用することができない。 キーボードを表示する場所等の調整が大変。 ログイン方法を変更する PINやQRコード等を使用し、文字入力を使用せずにログインできるようにする。 デメリット HoloLens2単体でのログインが困難。 バックエンドにも変更が必要。 セキュリティ面に注意する必要がある。 結論 現在開発中のアプリでは NonNativeKeyboardを使用したログインと PIN認証を選択できるようにすることにしました。 理由はHoloLens2単体でのログインとストレスのないログインを両方サポートしたかったからです。 まだログイン周りの入力方法は検討を続ける予定です。 他の方法ご存じの方いらっしゃいましたらご教授いただけると幸いです。
- 投稿日:2021-04-26T16:54:01+09:00
#7「VIVE Pro Eyeのアイトラッキングを有効化(セットアップ)する」【初心者】HTC VIVE Pro Eyeを使ってUnityでVRの開発を行ってみる.
はじめに 研究費でHTC VIVE Pro Eyeを購入した.16万なので個人で買うには高すぎる代物だが今後は安くなるかもしれないし一応メモ書きしていく. 環境一覧 SteamVR 1.15.19 Unity 2020.1.17f1 SRanipalRuntime 1.3.2.0 SDK SteamVR Plugin 2.7.2 sdk1.14.15 Vive SRanipalRuntime Plugin 13.3.0 インテル® Core™ i7-7700K NVIDIA GeForce GTX 1070 環境作成編 #1 Unityのセットアップをする 2021年 1月更新 #2 プロジェクトを作ってみる 2021年 1月更新 #3 VR開発のための環境を整える 2021年 2月更新 コントローラやHMDから入力を得る #4 VIVEコントローラのボタン入力を取得する 2021年 2月更新 #5 トリガーの押し具合やトラックパッドの位置情報の入力を取得する 2021年 2月更新 #6 ヘッドマウントディスプレイとコントローラの位置座標と回転を取得する 2021年 2月更新 #7 VIVE Pro Eyeの視線トラッキングを有効化(セットアップ)する (この記事)2021年 4月更新 今回の記事では, 1.SDKのダウンロードとインストール. 2.アイトラッキングのキャリブレーションを行う. 3.サンプルを動かしてみる. という流れ. 1.SDKのダウンロードとインストール. ここか「VIVE Eye and Facial Tracking SDK」と調べてSDKのダウンロードページを開く. ログインを求められるのでVIVEポートのアカウントでログインする. SDKのダウンロードページを開くとVIVE_SRanipalRuntimeとSDKのダウンロードあるので規約に同意してダウンロードする. まずダウンロードしたVIVE_SRanipalRuntimeをインストールする. 特に何をいじらず先に進む. ロボットがアイコンのSRanipalRuntimeがインストールされる. SRanipalRuntimeが動いているかはタスクバーのインジケータから確認ができる.ロボットのアイコンが表示されていれば問題なく起動している. 2.アイトラッキングのキャリブレーションを行う. SteamVRを起動し,メニューを開き「VIVE PRO EYE」アイコンを選択する. アイトラッキングの設定画面が表示されるのでアイトラッキングを使用を有効にする. 初回起動時には注意事項等が表示されるのでチェックした後「今すぐキャリブレーション」を選択. アイトラッキングが有効になっているので「キャリブレーション」を選択する. キャリブレーションのための指示が表示されるのでそれに従って設定していく. すべて終了するとキャリブレーションに成功しましたと表示される. しっかりとキャリブレーションされていれば視線を合わせた点が点灯するので確認してみる(精度は相当いいので違和感があればキャリブレーションしなおしてみる). 3.サンプルを動かしてみる. 次にUnity上でアイトラッキングのデータを使用するために先ほどダウンロードしたSDKを解凍する. あらかじめSteamVR Pluginがアセットに追加されているUnityプロジェクトを開きAsetsタブからImport Package→Custem Packageを開く. 先ほど解凍したSDKの..SDK(v1.3.3.0等)/SDK/2_Unity/にある「Vive-SRanipal-Unity-Plugin.unitypackage」を追加する. 確認画面が表示されるので「import」を選択する. ViveSRというフォルダが追加されていれば問題なく追加されている. 追加されたViveVR/Scenes/Eyeフォルダ内にあるEyeSampleを開いて実行するとおっさんが自分の目と連動して動く(正直キモイ). 解凍したフォルダ内の..SDK(v1.3.3.0等)/SDK/2_Unity/Document/EyeにあるDocument_Unityから開発のためのドキュメントを見ることできる(次回は実際にこれを使ってプログラミングします). とりあえずこれでHTC VIVE Pro Eyeを使ったアイトラッキングのセットアップと開発環境の準備ができました.次回は実際にデータを瞳孔や瞼の開き具合,注視点等のデータを取得していきます.
- 投稿日:2021-04-26T15:23:03+09:00
【MRTK】NonNativeKeyboard の使い方
環境 HoloLens2 Windows 10 pc Unity 2019.4.1f1 Mixed Reality Toolkit ver2.5.3 NonNativeKeyboard を使う上での注意点 日本語入力はできません。 InputFieldを使用すると標準のキーボードと二重に表示されてしまうのでInputFieldっぽいものを自作する必要があります。 ソースコード NonNativeInputField.cs using Microsoft.MixedReality.Toolkit.Experimental.UI; using System; using TMPro; using UnityEngine; using UnityEngine.EventSystems; public class NonNativeInputField : MonoBehaviour, IPointerDownHandler { [SerializeField] private TextMeshProUGUI Text = null; [SerializeField] private NonNativeKeyboard keyboard = null; private void Awake() { if (keyboard == null) { keyboard = GameObject.FindWithTag("NonNativeKeyboard").GetComponent<NonNativeKeyboard>(); } } public void OnPointerDown(PointerEventData eventData) { keyboard.PresentKeyboard(Text.text); for (int i = 0; i < Text.text.Length; i++) { keyboard.MoveCaretRight(); } keyboard.OnClosed += DisableKeyboard; keyboard.OnTextSubmitted += DisableKeyboard; keyboard.OnTextUpdated += UpdateText; } private void UpdateText(string text) { Text.text = text; } private void DisableKeyboard(object sender, EventArgs e) { keyboard.OnTextUpdated -= UpdateText; keyboard.OnClosed -= DisableKeyboard; keyboard.OnTextSubmitted -= DisableKeyboard; keyboard.Close(); } } 使い方 Hierarchy に NonNativekeyboard を追加する。 (project > Mixed Reality Toolkit Foundation > SDK > Experimental > NonNativeKeyboard > prefabs) NonNativeKeyboard に "NonNativeKeyboard" タグをつける。 NonNativeKeyboard子要素の InputField の Interactable をオフにする。 (Hierarchy > NonNativeKeyboard > keyboard_Background > search > InputField) InputField の Disabled Color を 255,255,255,255 に設定 Hierarchy に UI > image を追加する。 Source Image を InputFieldBackground に設定 Imageの子要素として UI >Text-TextMeshPro を追加する。 Image に上のスクリプト(NanNativeInputField)をアタッチ。 Inspector から Text 及び NoNnativeKeyboard プロパティを設定。 説明 ポインターで操作できるように IPointerDownHandler インターフェイスを実装しています。 各種イベント keyboard.OnClosed 閉じるボタンを押したときに呼び出される。 keyboard.OnTextSubmitted Enterey を押したときに呼び出される。 keyboard.OnTextUpdated テキストが更新されたときに呼び出される。 公式ドキュメント : NonNativeKeybaord
- 投稿日:2021-04-26T11:29:33+09:00
【C#、Unity】簡単にプリプロセッサをつかってみよう
プリプロセッサというものをご存じだろうか。 #regionなんかは、変数を綺麗にまとめられる、ということで知っている人もいるかもしれないが、簡単に言うとそういった#~と始まる物たちのことだ。 環境:Visual Studio 2019、Unity 2020 きっかけ たまたまC# の本を眺めてた際に、#if、#elseなんて文字を見つけた。 ・・・ifじゃないのん?#ってなんやねん!! ってことで調べてみたところ、記事が少なかったように感じたので、同じく疑問に思った人も使えるようにと思い書いてみた。 プリプロセッサとは では、プリプロセッサとは何か。 プリプロセッサと調べてみると、以下のような説明が出てきたが、正直小難しくて何言ってるかわからん!!ってなる人は、コンパイルよりも前に行われる、コードのデバッグや可読性が向上する程度に覚えておいてもらえればいいと思う。 条件付きコンパイルや、VS.NETでの表示領域の制御などを処理するプリプロセッサ。 ... プリプロセッサは、ソース・コードをコンパイルする前に、前処理を行う機能である。 これにより、ソース・コードでは表現しがたい多くの便利な機能が実現されている。 例えば、テストやデバッグ時には便利な、条件付きコンパイルなどが利用できる https://www.atmarkit.co.jp/ait/articles/0301/08/news002.html で、結局どんなことが出来るのか。 要はデバッグ時のコードはこっち、本番ではこっちのコードを使う~っといったようにコードを状況によって使い分けることが出来るのだ。 #define #defineはシンボルを定義する。 まあ、シンボルってなんぞや。定義?って感じだと思うが、簡単に言ってしまえばプリプロセッサで使う用の変数みたいなものという認識でいいと思う。 これ自体に意味はなく、後で使う#ifや#elseなんかと組み合わせて使う。 #defineを使うときは以下のように書く。 //このように先頭に定義する。 #define Test1 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //ーーーーー 略 ーーーーーー usingよりも上、つまりコードの一番上で定義しなくちゃいけないのが注意。 ※以降、定義した物をシンボルと記述しています(上のコードだとTest1のこと)。 #undef シンボルをソースコード上で無効にする。 これも#define同様、コードの先頭で定義しなければいけない。 #undefを使うときは以下のように書く。 //このように先頭に定義する。 #undef Test1 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //ーーーーー 略 ーーーーーー #ifシリーズ これは通常のif文と同じだ。 シンボルの有無によってコンパイルする部分を指定することが出来る。 #if、#elif、#else、#endifの4つがあり、それぞれ以下のような内容になっている。 #if・・・通常のif文と同じくシンボルがあるか確認する。||や&&も使える。 #elif・・・else ifと同じ。ifが違った場合にさらに条件分岐したい場合に使う。 #else・・・通常のelseと同じ。ifの条件が違った場合に入る。 #endif・・・if文がここまでですよーという宣言。これが無ければエラーになる。 例 #define TEST #define AA #define BB using UnityEngine; public class Test : MonoBehaviour { void Start() { #if TEST//TESTがあるかどうか //ここに入る #elif GG//else ifと同じ //ここには入らない。 #else//elseと同じ //ここには入らない。 #endif//if文がここまでという宣言。 } } #region 最初でも少し触れたが、#regionを使用すると、コードの領域分けが出来る。 領域分けってなんぞや?って人のために簡単に説明すると、メソッドなんかを閉じたり開いたりできる-を自分で好きな位置に作れるということだ。 (説明下手ですみません・・・) 使い方は簡単で、#regionで開始位置を指定して、#endregionで終了する。 例 #region int a; int b; int c; #endregion int d; int e; //↓ //こんな感じに閉じることが出来る。 #region int d; int e; Conditional属性 Conditional属性は、メソッドをコンパイルするかどうかを指定することが出来る。 簡単に言ってしまうと、処理は#ifで分けてたのに対して、メソッドはConditional属性を書くだけで実行するかどうか指定できる。 又、Conditional属性を使用する際には、以下のような条件がある。 ・using System.Diagnostics;が存在する。 ・戻り値がvoidであること ・オーバーライドしていないこと。 例 #define TEST //必要 using System.Diagnostics; public class Test { [Conditional("TEST")] void TES() { //TESTが存在する際に実行される処理 } //戻り値がvoidじゃない為、エラーになる [Conditional("TEST")] int TESInt() { } } 最後に(Unityでの使用) 以上がだいたいのC#におけるプリプロセッサだ。 プリプロセッサはデバッグなどにおいては、非常に使い勝手がいいので徐々に開発にも取り入れていきたい。 又、実はUnityにはあらかじめ幾つかのシンボルが定義されており、buildやeditorでのコードのコンパイル分けなどが出来るようになっている。 Unityのシンボル一覧 https://docs.unity3d.com/ja/2018.4/Manual/PlatformDependentCompilation.html 以下参考にさせていただいたサイト様 https://programming.pc-note.net/csharp/preprocess.html
- 投稿日:2021-04-26T00:10:59+09:00
【Unity】アスペクト比維持してUIのimageをCanvasにフィットさせる
1 「Canvasにフィットさせる」とは? imageのUIを、元の画像のアスペクト比そのまま、はみ出ないようにピッタリに、というイメージ。 Rect Transformを弄ってもできることはできるのだが、それだとimageがCanvasめいっぱい覆う感じになってしまうので、もう少し端に寄ってもらう方法とかないかな、と考えた次第。 2 スクリプトですべて解決 色々とインスペクター弄るの面倒なので、アタッチして実行したら即完成するスクリプトを作った。 より詳細な使い方、応用的な活用方法などは、こちらの記事にまとめてます。 ImageSizeManager.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ImageSizeManager : MonoBehaviour { private float scaleRate; // Start is called before the first frame update void Start() { this.GetComponent().preserveAspect = true; this.GetComponent().SetNativeSize(); Vector2 CanvasSize = transform.root.GetComponent().sizeDelta; Vector2 ThisImageSize = this.GetComponent().sizeDelta; if(CanvasSize.x<CanvasSize.y) { scaleRate = CanvasSize.x / ThisImageSize.x; } else { scaleRate = CanvasSize.y / ThisImageSize.y; } this.GetComponent<RectTransform>().localScale = new Vector3(scaleRate, scaleRate, 1); } }