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

仮想空間上でアバターに触れるシステム

こんにちは。ナルキタです。 現在私はVRとタッチケアを合わせた研究に携わっています。 今回はその概要を軽く紹介したいと思います。 まず使用機器一覧です。 Oculus Quest 2 Unityインストール済みのPC Webカメラ マイク マネキン まずは上記の機器を以下の図のように配置します。 上図の様に、ユーザにOculusを装着してもらい、VRアプリを実行します。 この時に、目の前のマネキンと仮想空間上のアバターの座標が合致するように注意します。 座標調整が済んだらVRアプリを実行します。 アプリ実行後、ユーザの目の前のアバターが椅子に座ります。ユーザは仮想空間上でアバターに触れたり撫でることができます。仮想空間上の手は、Oculusのハンドトラッキングによって表示されています。 またユーザの手の動きを後ろからwebカメラで撮影し、ハンドトラッキング及び手の座表を取得します。 上の画像では手の座標を緑の点で示しています このように、仮想空間上のアバターをユーザが触れたり撫でることができるVRアプリを制作致しました。 手の速度を検出するシステムは少々複雑ですが、それ以外は簡単なアセットで構成されているUnityシーンですので、皆さんもぜひお試しくださいませ。 それでは~
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityとROSで移動ロボットを動かしてみる

やったこと WindowsPCでUnityとROSをつかって、移動ロボットを操作するUIを作成。 チュートリアルが充実しているので初心者でも十分実行できます。 ・Unity⇔ROSの通信 ・マウスでUnity上のボタンをクリック。移動ロボットが動く。 ・移動ロボットの軌跡(赤)、LiDAR点群(黄)、ロボット視点の画像(Unity画像右下window) Unity ROS(Gazebo) 実行環境 ・PC (windows10)  構成は下記図通り。 内容 こちらのチュートリアルを実施 ・UnityとROSで学ぶ移動ロボット入門 UI作成編 所感 チュートリアルがきちんと整理、記述されているので トラブル等はなく実行できた。 UnityやROSの基本がつかめる良い教材でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity で WebCamTexture を使用する際には初期化完了待ちが必要な件

はじめに WebCamTexture には Play() というメソッドがありますが、このメソッドは実は非同期で実行されるメソッドです。 非同期実行されるため初期化を待つ必要があるのですが、それを待つ方法を WebCamTexture にはありません。 では、どうするかというと… WebCamTexture.width の変化をポーリングする(※WebCamTexture.height でも良い) という方法を取ります。 この WebCamTexture.width ですが、Play() を呼び出す前には正確な値が入っておらず、また、Play() を呼び出した直後も非同期実行されるためポーリングで変化を待つ必要があります。 私の環境では初期化が完了するまでは常に 16 という値が入っておりましたが Unity 公式の Answers では 100 以下の値が返される間というのがありましたので、同じように設定しました。 ソースコード 初期化完了をポーリングするソースコードは以下のようになります。 using UnityEngine; public class WebCamTextureSample : MonoBehaviour { WebCamTexture _webCamTexture; IEnumerator Start() { _webCamTexture = new WebCamTexture(); // WebCamTexture のプロパティは起動後でないと取得できないため、 // まず、最初にカメラを起動させる。 _webCamTexture.Play(); // WebCamTexture.width が 100 以下の状況の場合は、 // 初期化が完了していないので、100 以上になるまで待機 while (_webCamTexture.width < 100) { yield return null; } // これ以降でカメラの情報が正しく取得可能 } } 初期化が完了後に正確なカメラの解像度などが取得できます。 おわりに 対応方法は簡単なのですが、意外とネット上にある情報では WebCamTexture の初期化を待っているソースコードがなかったので、みなさんはどうしているのか?と思ったりしていたのですが、ある程度決め打ちでカメラを制御するのであれば、気にする必要はないかもしれません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity初級]Prefab Variantを作成する時に勘違いしやすい事

概要 Prefab Variantを作成する時、作り方によって少し挙動が変わるところがあります。 Unityを使い慣れている人にとっては当たり前の事ですが、初心者の方にとっては混乱の原因になるポイントだと思います(自分含む) 本文 このbox prefabのPrefab Variantを作りたい時 Hierarchy上のbox(box prefab)をProjectビューへドラッグ&ドロップして、ポップアップメニューから"Prefab Variant"を選択するとHierarchy上のbox(box prefab)はbox(Prefab Variant)に切り替わります。 Hierarchy上のboxをbox prefabのままにしておきたい時は Projectビュー上にあるbox prefabの右クリックメニューからPrefab Variantで作ります。 Original Prefabの場合 先程の例の中でHierarchy上のbox(box prefab)をProjectビューへドラッグ&ドロップする時に表示されるポップアップ 選択肢の"Original Prefab"も同様です。 Hierarchy上のbox(box prefab)をProjectビューへドラッグ&ドロップして"Original Prefab"を選択すると、Hierarchy上のbox(box prefab)はbox(Original Prefab)に切り替わります。 Hierarchy上のboxをbox prefabのままにしておきたい時は、改めてbox prefabで置き換える等の操作が必要になります。 補足 Projectビュー上のPrefabを選択した状態でctrl+D(macならCommand+D)で複製することもできます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】TextMeshProのAutoSizeは重いと聞いたので、フォントサイズをまとめて調整できる便利メソッドを作った

概要 TMP の AutoSize は処理負荷が重いと聞いたので、TextMeshPro を任意のタイミングで AutoSize(を模した処理)をする拡張メソッドを作りました。 また画像のように、複数の TextMeshPro から一番文字列の長い要素を探して AutoSize を行い、そのフォントサイズを全ての TextMeshPro に適応する便利メソッドも作りました。AutoSize を1回に抑え、見た目の統一感も保てます。 TextMeshPro の拡張クラスや便利クラスに追加してご利用ください。 コード TMProExtension.cs TMProExtension.cs using UnityEngine; using TMPro; /// <summary> /// TextMeshProの拡張クラス /// </summary> public static class TMProExtension { /// <summary> /// TextがRectに収まるように、フォントサイズを調整する /// </summary> /// <param name="text">Text</param> /// <param name="scale">Rectに対しての大きさ</param> /// <param name="maxSize">最大フォントサイズ</param> public static float FitFontSize(this TMP_Text text, float scale = 0.9f, float maxSize = 1024f) { text.fontSize = 1f; float textWidth = text.preferredWidth; float textHeight = text.preferredHeight; Rect rect = text.rectTransform.rect; float rectWidth = rect.width; float rectHeight = rect.height; if (text.text.Length == 0 || Mathf.Approximately(textHeight, 0f) || Mathf.Approximately(rectWidth, 0f) || Mathf.Approximately(rectHeight, 0f)) return 0f; float rateX = textWidth / rectWidth; float rateY = textHeight / rectHeight; if (rateX > rateY) text.fontSize = Mathf.Min(maxSize, scale / rateX); else text.fontSize = Mathf.Min(maxSize, scale / rateY); return text.fontSize; } } TMProUtility.cs TMProUtility.cs using System.Collections.Generic; using TMPro; /// <summary> /// TextMeshProの便利クラス /// </summary> public static class TMProUtility { /// <summary> /// 一番文字列の長いTextを探し、自身のRectに収まるフォントサイズを計算。それを全てのTextのフォントサイズに適応する /// </summary> /// <param name="text">Text</param> /// <param name="scale">Rectに対しての大きさ</param> /// <param name="maxSize">最大フォントサイズ</param> public static void FitsAllFontSize( this TMP_Text[] texts, float scale = 0.9f, float maxSize = 256f) { // 最長文字列の TMP_Text を探す TMP_Text t = null; int maxLength = 0; foreach (var item in texts) { if (item.text.Length > maxLength) { t = item; maxLength = item.text.Length; } } // フォントサイズを決定 float size = t.FitFontSize(scale, maxSize); // 全てのTextに適応 foreach (var text in texts) { text.fontSize = size; } } } 使い方 AutoSize(を模した処理)は下記で実行できます。重い処理です。 text.FitFontSize(); 引数は2つ用意されています。 text.FitFontSize(scale: 0.9f, maxSize: 256f); FitsAllFontSize を使うと、複数の TextMeshPro から一番文字列の長い要素を探して AutoSize を行い、そのフォントサイズを全ての TextMeshPro に適応できます。たくさん改行する文字列は上下にはみ出す恐れがあります。 TMProUtility.FitsAllFontSize(texts); こちらにも FitFontSize と同様の引数が用意されています。 TMProUtility.FitsAllFontSize(texts, scale: 0.9f, maxSize: 256f); 補足 以前作った任意のタイミングでフォントサイズを調整できるコンポーネントは、AutoSize の使用頻度を抑えられていない失敗作だと気づいたため、改良したものを作りました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む