20200707のUnityに関する記事は6件です。

全てを暴くSubversionの機能「Blame」を使おう!

今回は以前紹介したSubversionでのUnity管理で伝え忘れていた機能を紹介します。
その名も「Blame(咎める)」。
名前だけ聞くと恐ろしいですが、実はチーム開発では本当に恐ろしい機能になりかねません。
なので恐ろしいことになる前にぜひ知っておいてくださいね。

続きはこちらです。
https://tedenglish.site/subversion-blame/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

古い入門チュートリアルで始めるHoloLens2

HoloLens2開発手始め 準備

公式サイトのことについて記述していきます。
ホロラボの作成した日本語化サイトもあります。
https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/GettingStartedWithTheMRTK.html

このサイトも素晴らしいリンク集です。

なので、この記事自体いるの?という所ではありますが、MSの記事は何か見づらいところがあるので、Qiitaの形式にしてメモを残したいと思います。
※この記事を書いたのが、MRTK v2.4.0が出る前だったので内容に差異があります。
※MSの入門チュートリアルがアップデートされたので内容に差異があります。
https://docs.microsoft.com/ja-jp/windows/mixed-reality/mr-learning-base-01

環境を整える

推奨バージョンは
- Unity 2018.4.x, Unity 2019
- IL2CPP と .NET両方対応しているのは2018
- Visual Studio 2019
- Windows SDK 18362以降.
- Windows 10 の2019年5月以降にWindowsUpdateしていれば SDKが入っているはずです。

MRTKのページより、Microsoft.MixedReality.Toolkit.Unity.Foundation.2.3.0.unitypackage
のパッケージをダウンロード!※現時点ではMRTK2.3.0

そのほかオプション

  • 【サンプルパッケージ】Microsoft.MixedRealityToolkit.Unity.Examples.unitypackage
    • 便利なデモシーン
  • 【ツールパッケージ】Microsoft.MixedRealityToolkit.Unity.Tools.unitypackage
    • MRTK開発者のエクスペリエンスを向上させるExtensionServiceCreatorなどの便利なツールが含まれている
  • 【拡張パッケージ】Microsoft.MixedRealityToolkit.Unity.Extensions.unitypackage
    • 便利なオプションコンポーネントのセット

UnityプロジェクトにMRTKパッケージをインポートする

  • 新しいUnityプロジェクトを作成、テンプレートタイプは「3D」
  • ダウンロードしたMicrosoft.MixedRealityToolkit.Unity.Foundation.unitypackageをProjectビューのAssetへunitypackageを放り込んでインポートします。オプションとして他のunitypackageをインポートするのもアリです。

image.png

プロジェクトのセットアップ

これらのオプションが、推奨されています。
- 現在のプラットフォームでXR設定を有効にします
- テキストのシリアル化を強制する/表示可能なメタファイル
ただし、何もしなくともデフォルトでこの設定になっているので、Applyを押してデフォルトの設定とします。

image.png

TextMesh Proのセットアップ

一部のプレハブおよびアセットにはTextMesh Proが必要です。
インストールは2018.1 以降の Unity で、Window > Package Manager > TextMesh Pro > Install からインストールできます。
インストール後はWindow > TextMeshPro > Import TMP Essential Resources でTMP Essential Resourcesをインポートします。ただしインポートした後に、変更を確認するにはUnityを再起動する必要があります。

ターゲットをUWPに設定

HoloLensアプリケーションを作成するには、ユニバーサルWindowsプラットフォームに切り替えます。
- メニューを開く:ファイル>ビルド設定
- プラットフォームリストでユニバーサルWindowsプラットフォームを選択
- Switch ボタンをクリック

image.png

Unityインストール直後だと
UnitySetup-UWP-IL2CPP-Support-for-Editor-2018.4.18f1.exe
をダウンロードしてUWP設定にスイッチ可能な状態にする必要があります。

再度デフォルトの設定を聞かれるのでApplyで確定します。
image.png

MRTKを新しいシーンまたは新しいプロジェクトに追加する

  • MRTKパッケージをインポートします(FoundationとExamplesの両方がお勧め)。
    image.png

    メニューバーからMixed Reality Toolkit-> Add to Scene and Configureを選択します
    image.png

インスペクターを見ると、現在アクティブなMRTK構成プロファイル等が表示されています。
image.png

MRTKシーンの設定

これには以下が含まれます。

  • Mixed Reality Toolkit
    • ツールキット自体。フレームワーク全体の中心的な構成エントリポイントを提供します。
  • MixedRealityPlayspace
    • ヘッドセットの親オブジェクト。これにより、ヘッドセット/コントローラーおよびその他の必要なシステムがシーンで正しく管理されます。
    • メインカメラは子としてPlayspaceに移動されます-これにより、SDKと連携してPlayspaceでカメラを管理できます
    • 注意: シーンでの作業中は、メインカメラ(またはMixedRealityPlayspace)をシーンの原点(0,0,0)から移動しないでください。これはMRTKとアクティブなSDKによって制御されます。プレーヤーの開始点を移動する必要がある場合は、カメラではなくシーンコンテンツを移動してください。

Playを押し、スペースバーを押して手のシミュレーションをテストします。
image.png

これで、ビルドしてデバイスにデプロイする準備が整いました。MRTKのビルドとデプロイの手順に従ってください。

MRTKの構築と展開

デバイスでスタンドアロンアプリとしてアプリを実行するには(HoloLens、Android、iOSなどの場合)、Unityプロジェクトでビルドとデプロイのステップを実行する必要があります。MRTKを使用するアプリのビルドとデプロイは、他のUnityアプリのビルドとデプロイと同じです。MRTK固有の指示はありません。HoloLens用のUnityアプリをビルドしてデプロイする方法の詳細な手順については、以下をお読みください。Publishing Buildsで、他のプラットフォーム向けのビルドの詳細をご覧ください。
MRTKの構築とHoloLens 1およびHoloLens 2(UWP)への展開

HoloLens 1およびHoloLens 2(UWP)のビルドとデプロイの方法については、アプリケーションをデバイスにビルドするときに説明されています。

ヒント: WMR、HoloLens 1、またはHoloLens 2用にビルドする場合は、ビルド設定の「ターゲットSDKバージョン」と「最小プラットフォームバージョン」を次の図のようにすることをお勧めします。

ビルドウィンドウ

他の設定は異なる場合があります(たとえば、ビルド構成/アーキテクチャ/ビルドタイプ、その他は常にVisual Studioソリューション内で変更できます)。

「ターゲットSDKバージョン」ドロップダウンにオプション「10.0.18362.0」が含まれていることを確認してください。これがない場合は 、最新のWindows SDKをインストールする必要があります。

なにはともあれ、Build and Run で実行します。

image.png

失敗しました。
ビルドセッティングが誤っていたので修正します。
image.png

それに加えて、そもそもHoloLens2がPCに接続されていませんでした。これはRunするわけないですね。
HoloLens2をUSB-TypeCで接続して、http://127.0.0.1:10080/ にアクセスします。
image.png

Request pin ボタンを押して、HoloLens2上に表示されているDevice Portal PIN番号7桁を入力します。
image.png

新しいユーザー名とパスワードを設定し、再度ログインします。
image.png

デバイスポータルに入れました。
image.png

では、ビルドしたものをVisualStudioで開きます
image.png

image.png

HoloLens2はx86からARMに変更になったので、切り替えます。
Deviceに設定して、、、ビルド!

image.png

ビルド時間めちゃくちゃ時間かかります。
.NETの時はこんなにかからなかったような・・・。
で、待った末にビルド失敗です。なんでやねん!!!

先ほどは開始だけでやりましたが、
デバッグなしで開始 を再度行います。
image.png

が、、、駄目!! 'v142' のビルド ツールが見つかりません。と言われてしまう。
image.png

https://qiita.com/souuuuta/items/685e8bf25edac39b67ae

確かに、確認するとツールが入っていない状態になっています。
image.png

修正しました。再度ビルド!
image.png

きたよ!再度HoloLensの設定内の開発者向け内ペアリングを確認します。
image.png

ビルド成功!!
image.png

しかし、毎回ビルドしていると、ものすごく時間がかかるので、Holographic Remoting Playerで確認します。

image.png

WindowsStoreでインストール後に起動させて、IPアドレスを確認。
image.png

EmulationModeをRemote to Device、Device VersionはHoloLens2、RemoteMachineにIPアドレスを入力します。
image.png

Connectを押して、成功すると緑になります。
image.png

この状態でPlayをすると、実際に確認しながら作業ができるようになります。
image.png

いろいろ確認できる準備ができたので、まずは、いつもの豆腐を出してみましょう。
GameObjectからCubeを呼び出します。
image.png

サイズと位置を調整して、、(Unityでの1は1mなので大きさを0.1=10cmに)
image.png

目の前に立方体を確認できました。

ユーザーインターフェースの作成
MSの HoloLens 2 のチュートリアルから

MixedRealityToolkit オブジェクトを選択した状態で、
・構成プロファイルを [DefaultHoloLens2ConfigurationProfile] に変更
・Copy & Customize(コピーしてカスタマイズ) ボタンをクリック
・Clone Profile(プロファイルの複製) ウィンドウでClone。
image.png

・Spatial Awareness(空間認識) タブ内の、Enable Spatial Awareness System(空間認識システムを有効にする) チェックボックスをオン
image.png

・Clone(複製) ボタンをクリックしてClone Profile(プロファイルの複製) ウィンドウを開き、DefaultMixedRealitySpatialAwarenessSystemProfile の編集可能なコピーを作成します。
image.png

image.png

・次はWindows Mixed Reality Spatial Mesh Observer(Windows Mixed Reality 空間メッシュ オブザーバー) セクション内のClone(複製) ボタンをクリック
image.png

image.png

空間認識メッシュの可視性を非表示に変更するために、Spatial Mesh Observer Settings(空間メッシュ オブザーバーの設定) で、Display Option(表示オプション) をOcclusion(オクルージョン) に変更。

image.png
ハンド トラッキングのジェスチャと対話可能なボタン

Projectウィンドウで PressableButtonHoloLens2 を検索して、プレハブを追加します。
image.png

今回は左上のものを追加します。
image.png
プレハブをヒエラルキーにドラッグすると、TextMeshProのインポーターが立ち上がるので、Import TMP Essentialsボタンを押して追加します。
image.png

ボタンの位置は、カメラ前に配置させるために
x = 0、y = 0、z = 0.5
として設定します。
するとボタンが追加されていることを確認することができます。
image.png

さっき追加したboxの位置をボタン近くに移動させます。Transformを
Position x = 0、y = 0.04、z = 0.5
Scale x = 0.02、y = 0.02、z = 0.02)。
とします。
image.png

再度、PressableButtonHoloLens2 オブジェクトを選択して、インスペクタ内のInteractable (Script) コンポーネント内 Events > Receiversセクションを展開します。
image.png

一番下にあるAddEventを押して、イベント レシーバーの種類 InteractableOnPressReceiver の新しいイベント レシーバーを作成します。※InteractableOnPressReceiver というイベント レシーバーの種類を使用すると、追跡対象のハンドがボタンを押したときに、押されたイベントにボタンが応答できるようになります。
image.png

イベント レシーバーに対して、 Interaction Filter(対話式操作フィルター) をNear and Far(近くと遠く) に変更します。
image.png

次に、On Press イベントを受け取るようにキューブを構成していきます。
Hierarchyウィンドウから、キューブを On Press () イベントの Event Properties オブジェクト フィールドにドラッグして、レシーバーとして割り当てます。
以下の場所にCubeを持ってきて
image.png

置き換えます。

image.png

アクション ドロップダウン (現在は No Function(関数なし) が割り当てられている) をクリックし、 MeshRenderer > Material materialの順に選択して、On Press () イベントがトリガーされたときにキューブのマテリアル プロパティが変更されるように設定します。
image.png

選択したら、None (Material)の横の小さな円のアイコンをクリックして、MRTK_Standard_Cyanを検索、選択します。
image.png

image.png
同じようにリリースした場合の設定を追加します。先ほどはOnClick()に設定したように、On Release()にCubeを、そしてMaterialにMRTK_Standard_LightGray を設定します。
image.png

すると、ボタンを押している間だけシアンの色になるようになりました!か…簡単すぎる…あっけなさすぎる!
image.png

MRTK の Grid Object Collection を使用したボタンのパネルの作成
・HierarchyでCreate Emptyを作成 名前はButtonCollectionとします。
・ButtonCollectionを親として、先ほど作成したPressableButtonHoloLens2 をドラッグさせて従属させます。
image.png

・PressableButtonHoloLens2 を4回Duplicate(Ctrl+C Ctrl+V)させます。
image.png

・ButtonCollection オブジェクトを選択した状態で、InspectorでAdd Componentし、次に Grid Object Collection を検索して選択し、Grid Object Collection (Script) コンポーネントを ButtonCollection オブジェクトに追加します。
image.png

Num Rows(行数) を 1 に変更して、すべてのボタンを 1 行に整列させる
Cell Width(セル幅) を 0.05 に変更して、行内でボタンを一定間隔で並べる
次に、 Update Collection ボタンをクリックして、新しい構成を適用します。
image.png

image.png

シーンへのテキストの追加
・ButtonCollection オブジェクトを右クリックし、3D Object > Text - TextMeshPro
・Inspectorでサイズ変更Rect TransformのPos Y:-0.0425、Width:0.24、Height:0.024 に変更
・Text Mesh Pro (Script) のTextを Button Collection、Font Style:Bold、Font Size:0.2、Alignment:center middleに変更する
image.png

次のチュートリアル:動的なコンテンツの配置とソルバーの使用

Projectウィンドウで、Assets > MixedRealityToolkit.SDK > Features > Utilities > Solvers(ソルバー) に移動します。
image.png

前のチュートリアルで作成したボタンコレクションを拡張して、ユーザーの視線の方向に従うようにします。 さらに、ボタンコレクションが以下のようになるソルバーを構成します。

・ユーザーの読み取り方向に対して平行に回転する
・ユーザーの水平の視線の向きより下に配置する※他のオブジェクトを妨げないために
・ボタンを押しやすくするために、ユーザーからおよそ腕半分の距離に配置する

1.Orbital ソルバーを追加する
ButtonCollectionオブジェクトを選択し、Inspectorで、Add Componentから、Orbital (Script) コンポーネントを追加します。

それぞれのコンポーネントを以下の構成します。

Solver Handler (Script)
・Tracked Target Type が Head

Orbital (Script)
・Orientation Type が Follow Tracked Object
・Local Offset  X = 0、Y = 0、Z = 0
・World Offset X = 0、Y = -0.4、Z = 0.3
image.png

Playで確認すると、先ほどまでcubeの下にあったボタンコレクションが視界の真下に移動しています。

オブジェクトに追跡対象の手を追跡させる

Cube オブジェクトを、ユーザーの追跡対象の手を追跡するようにします。
ソルバーの構築は以下のように構成します。
・ユーザーの手の回転に合わせて向きを変える
・ユーザーの手首の位置に移動する
・Radial View ソルバーを使用する

1.Radial View ソルバーを追加する
Cubeオブジェクトを選択し、Inspectorで、Add Componentから、Radial View (Script) を追加します。

2.Radial View ソルバーを構成する
コンポーネントを以下のように構成します。

Solver Handler (Script)
・TrackedTracked Target Type : Hand Joint
・Tracked Handness : Right
・Tracked Hand Joint : Wrist (手首)

Radial View (Script)
・Reference Direction:Object Oriented
・Orient To Reference Direction(参照方向に向ける) チェックボックスをオン
・Min Distance : 0
・Max Distance : 0
image.png

Playで確認すると、右手にcubeが追従していることを確認できます。

ギズモのサイズ

いまさらですが、シーン上のギズモが無駄に大きかったので変更します。
image.png
SceneのGizmosを開き、3D Gizmosを好みのサイズまで変更します。
image.png
一番左端から1段階右にしたあたりで見えやすくなりました。
image.png
                             

3D オブジェクトの操作

コレクションの一部としての 3D オブジェクトの整理、基本操作のための境界ボックス、近距離操作と遠距離操作、手の追跡によるタッチやグラブ ジェスチャなど、基本的な 3D コンテンツとユーザー エクスペリエンスについて説明します。
MRTK.HoloLens2.Unity.Tutorials.Assets.GettingStarted.2.3.0.3.unitypackage
Unity カスタム パッケージをダウンロードしてインポートします。
image.png

コレクション内の 3D オブジェクトを整理する

3D オブジェクトのパネルを作成します。 具体的には、3D オブジェクトが 3 x 3 グリッドに配置されるように構成します。

・3D オブジェクトを親オブジェクトにペアレント化する
・Grid Object Collection (Script) コンポーネントを追加して構成する

1.3D オブジェクトを親オブジェクトにペアレント化する
Hierarchyで 空のオブジェクトを作成し、(適切な名前たとえば、3DObjectCollectionを付けて) 適切な場所 (たとえば、X = 0、Y = -0.2、Z = 2) に配置します。
Projectウィンドウで、 Assets > MRTK.Tutorials.GettingStarted > Prefabs に移動
image.png

次のプレハブを 3DObjectCollection にペアレント化します。
・Cheese
・CoffeeCup
・EarthCore
・Octa
・Platonic
・TheModule
image.png

3DObjectCollection の子オブジェクトとして 3 つのCubeを作成します。
Transformの Scale : X = 0.15、Y = 0.15、Z = 0.15
に設定します。Position Y:-0.3として、Cubeを複製し、それぞれのX座標とマテリアルを割り当てます、マテリアルは Assets > MixedRealityToolkit.SDK > StandardAssets > Materials にあります。

Cube
 Position X:-0.3
 Materials:MRTK_Standard_GlowingCyan

Cube(1)
 Position X:0
 Materials:MRTK_Standard_GlowingOrange

Cube(2)
 Position X:0.3
 Materials:MRTK_Standard_Green
などとします。※位置は適当です。

image.png
image.png

2.Grid Object Collection (Script) コンポーネントを追加して構成する

Grid Object Collection (Script) コンポーネントを 3DObjectCollection オブジェクトに追加し、次のように構成します。
Sort Type : Child Order
次に、Update Collection ボタンをクリックして、新しい構成を適用します。
image.png

3D オブジェクトの操作

3D オブジェクトを操作する機能を追加します。 またプレハブオブジェクトの場合は、ユーザーが追跡対象の手を使用して、これらのオブジェクトに手を伸ばしてつかむことができるようにします。
主な手順は次のとおりです。
・すべてのオブジェクトに Manipulation Handler (Script) コンポーネントを追加する
・プレハブ オブジェクトに Near Interaction Grabbable (Script) コンポーネントを追加する
・Manipulation Handler (Script) コンポーネントを構成する

1.すべてのオブジェクトに Manipulation Handler (Script) コンポーネントを追加する

Hierarchyで、すべてのオブジェクトを選択し、Manipulation Handler (Script) コンポーネントを追加します。

※注意:このチュートリアルでは、コライダーが既にプレハブに追加されています。 Cube オブジェクトなどの Unity プリミティブの場合、オブジェクトが作成されるときに Collider コンポーネントが自動的に追加されます。

2.プレハブ オブジェクトに Near Interaction Grabbable (Script) コンポーネントを追加する

Hierarchyで、Cube以外のオブジェクトCheese ~ TheModule オブジェクトを選択し、すべてのオブジェクトに Near Interaction Grabbable (Script) コンポーネントを追加します。

3.Manipulation Handler (Script) コンポーネントを構成する

■既定の操作
Cube オブジェクトについて、そのままの動きが見たいので何も設定しません。

■操作をスケールのみに制限する
Cube (1) オブジェクトについて、Two Handed Manipulation Type(両手を使った操作の種類) を Scaleに変更し、ユーザーがオブジェクトのサイズのみを変更できるようにします。
image.png

■移動をユーザーから一定の距離に制限する
Cube (2) オブジェクトについて、Constraint On Movement(動きの制限) を Fix Distance From Head(頭部から一定の距離) に変更して、オブジェクトを移動したときに、それがユーザーから同じ距離を保つようにします。
image.png

■既定のグラブ可能な操作
Cheese、CoffeCup、および EarthCore オブジェクトについて、そのままの動きが見たいので何も設定しません。

■遠距離操作機能を除去する
Octa オブジェクトについて、Allow Far Manipulation(遠距離操作を許可) チェック ボックスをオフにして、ユーザーが追跡対象の手を使用した場合のみオブジェクトを直接操作できるようにします。
image.png

■オブジェクトを中心を軸に回転させる
Platonic オブジェクトについて、One Hand Rotation Mode Near(片手回転モード - 近距離) および One Hand Rotation Mode Far(片手回転モード - 遠距離) を Rotate About Object Center(オブジェクトの中心を軸に回転) に変更し、ユーザーがオブジェクトを 1 つの手で回転させたとき、オブジェクトが中心を軸に回転するようにします。
image.png

■オブジェクトを放した後も動作を続ける
TheModule オブジェクトについて、Rigidbody コンポーネントを追加して物理的処理を有効にし、Use Gravity(重力を使用) チェックボックスをオフにして、オブジェクトが重力の影響を受けないようにします。
image.png
Manipulation Handler (Script) コンポーネントに戻り、 Release Behavior(解放動作) が Keep Velocity(速度を維持) およびKeep Angular Velocity(角速度を維持) の両方に設定されていることを確認し、オブジェクトがユーザーの手から離れた後も動き続けるようにします。
image.png

バウンディング(境界)ボックスボックスの追加

バウンディングボックスには、拡大縮小および回転に使用できるハンドルが用意されているため、1 つの手で、近距離と遠距離の両方のオブジェクトを操作するのがより簡単かつ直感的になります。
この例では、EarthCore オブジェクトに境界ボックスを追加して、ハンドルを使用した拡大縮小と回転を使用して、このオブジェクトを操作できるようにします。
■重要
境界ボックスを使用できるようにするには、オブジェクトに次のコンポーネントが必要です。
・Collider コンポーネント、たとえばボックス コライダー
・Bounding Box (Script) コンポーネント

Bounding Box (Script) コンポーネントを EarthCore オブジェクトに追加する

Inspectorで EarthCoreオブジェクトを選択し、Bounding Box (Script) コンポーネントを追加します。
image.png

Playボタンを押して確認します。

タッチ エフェクトの追加

手でオブジェクトに触れたときにイベントがトリガーされるようにします。 具体的には、ユーザーが触れたときにサウンド エフェクトが再生されるように Octa オブジェクトを構成します。

これを実現するための主な手順は次のとおりです。
・オブジェクトに Audio Source コンポーネントを追加する
・オブジェクトに Near Interaction Touchable (Script) コンポーネントを追加する
・オブジェクトに Hand Interaction Touch (Script) コンポーネントを追加する
・On Touch Started イベントを実装する
・エディター内のシミュレーションを使用してタッチ操作をテストする

■重要
タッチ イベントをトリガーできるようにするには、オブジェクトに次のコンポーネントが必要です。
Collider コンポーネント、可能であればボックス コライダー
Near Interaction Touchable (Script) コンポーネント
Hand Interaction Touch (Script) コンポーネント

1.オブジェクトに Audio Source コンポーネントを追加する

Octaオブジェクトを選択し、Audio Source コンポーネントを追加します。次に、Spatial Blendを 1 に変更して、空間オーディオを有効にします。
image.png

2.オブジェクトに Near Interaction Touchable (Script) コンポーネントを追加する

Octaオブジェクトが選択された状態で、
・Near Interaction Touchable (Script) コンポーネントを追加
・Fix Bounds(境界の修正) およびFix Center(センターの修正) ボタンをクリック
・Near Interaction Touchable (Script) のLocal Centerおよび Boundsのプロパティを BoxCollider に一致するように更新
image.png

3.オブジェクトに Hand Interaction Touch (Script) コンポーネントを追加する

Octaオブジェクトを選択した状態で、Hand Interaction Touch (Script) コンポーネントを Octa オブジェクトに追加します。

4.On Touch Started イベントを実装する

Hand Interaction Touch (Script) コンポーネントで、小さい + アイコンをクリックして、新しい On Touch Started () イベントを作成します。 次に、イベントを受信するように Octa オブジェクトを構成し、トリガーされるアクションとして AudioSource.PlayOneShot を定義します。
image.png

Assets > MixedRealityToolkit.SDK > StandardAssets > Audio に移動して、MRTK で提供されているオーディオ クリップを表示します。次に、適切なオーディオ クリップ (MRTK_Gem オーディオ クリップなど) を Audio Clipフィールドに割り当てます。
image.png

音声コマンドの有効化

音声コマンドを実装して、ユーザーが Octa オブジェクトでサウンドを再生できるようにします。主な手順は次のとおりです。
・既定の入力システム プロファイルを複製する
・既定の音声コマンド プロファイルを複製する
・新しい音声コマンドを作成する
・Speech Input Handler (Script) コンポーネントを追加して構成する
・音声コマンドの Response イベントを実装する

1.既定の入力システム プロファイルを複製する

HierarchyでMixedRealityToolkitオブジェクトを選択し、InspectorウィンドウでInputタブを選択し、DefaultHoloLens2InputSystemProfileを複製して、カスタマイズ可能な独自の入力システム プロファイルに置き換えます。
image.png

2.既定の音声コマンド プロファイルを複製する

Speechセクションを展開し、DefaultMixedRealitySpeechCommandsProfileを複製して、カスタマイズ可能な独自の音声コマンド プロファイルに置き換えます。
image.png

3.新しい音声コマンドを作成する

Speech Commandsセクションで、+Add a New Speech Command(新しい音声コマンドの追加) ボタンをクリックして、既存の音声コマンドの一覧の一番下に新しい音声コマンドを追加します。
image.png

次に、Keywordフィールドに適切な単語または語句 (たとえば、Play Music) を入力します。
image.png

4.Speech Input Handler (Script) コンポーネントを追加して構成する

Octaオブジェクトを選択し、Speech Input Handler (Script) コンポーネントを追加します。 次に、Is Focus Required(フォーカスが必要) チェックボックスをオフにして、ユーザーが Octa オブジェクトを確認しなくても音声コマンドをトリガーできるようにします。
image.png

5.音声コマンドの Response イベントを実装する

Speech Input Handler (Script) コンポーネントで、小さい + ボタンをクリックして、キーワードの一覧にキーワード要素を追加します。
image.png
Element 0をクリックして展開し、 Keywordドロップダウンから、前に作成した Play Music キーワードを選択します。
image.png

新しい Response () イベントを作成し、イベントを受信するように Octa オブジェクトを構成し、トリガーするアクションとして AudioSource.PlayOneShot を定義します。次に、適切なオーディオ クリップ (MRTK_Gem オーディオ クリップなど) を Audio Clip フィールドに割り当てます。
image.png

パン ジェスチャ

2D UI をスクロールし、次にそれを展開して 3D オブジェクトのコレクションをスクロールします。これを実現するための主な手順は次のとおりです。
・パンに使用できる Quad オブジェクトを作成する
・Near Interaction Touchable (Script) コンポーネントを追加する
・Hand Interaction Pan Zoom (Script) コンポーネントを追加する
・スクロールする 2D コンテンツを追加する
・スクロールする 3D コンテンツを追加する
・Move With Pan (Script) コンポーネントを追加する

1.パンに使用できる Quad オブジェクトを作成する

Hierarchyで、3D Object > Quad から、Quad をシーンに追加。
PanGesture のような適切な名前を付け、適切な場所に配置します (たとえば、X =1.5、Y = - 0.2、Z = 2 など)。
パン用のメッシュ コライダーは薄いので、ユーザーがコライダーを簡単に操作できるようにするために、ボックス コライダーに置き換えます。Mesh Collider コンポーネントをremoveし、Add ComponentからBox Collider コンポーネントを追加します。
厚みをつけるために、Sizeの Z を 0.15 に変更します。
image.png

2.Near Interaction Touchable (Script) コンポーネントを追加する

PanGesture オブジェクトが選択された状態で、Near Interaction Touchable (Script) コンポーネントを PanGesture オブジェクトに追加します。次に、Fix Bounds および Fix Center(センターの修正) ボタンをクリックして、Near Interaction Touchable (Script) のLocal Center(ローカルのセンター) および Bounds(境界) のプロパティを BoxCollider に一致するように更新します。

3.Hand Interaction Pan Zoom (Script) コンポーネントを追加する

PanGesture オブジェクトが選択された状態で、Hand Interaction Pan Zoom (Script) コンポーネントを PanGesture オブジェクトに追加し、次に Lock Horizontal(水平方向のロック) チェックボックスをオンにして、垂直スクロールのみを許可します。

4.スクロールする 2D コンテンツを追加する

Projectパネルで PanContent 素材を検索し、それをクリックして PanGesture オブジェクトのメッシュ レンダラー Materialsの Element 0プロパティにドラッグします。

Inspectorウィンドウで、新しく追加した PanContent 素材コンポーネントを展開します。次に、Tilingの Y 値を 0.5 に変更して X 値と一致させ、タイルを正方形で表示します。

5.スクロールする 3D コンテンツを追加する

Hierarchyウィンドウで、PanGesture オブジェクトの子オブジェクトとして 4 つのキューブを作成し、Transformの Scaleを X = 0.15、Y = 0.15、Z = 0.15 に設定します。

キューブを均等に配置して時間を節約するには、Grid Object Collection (Script) コンポーネントをキューブの親オブジェクト (PanGesture オブジェクト) に追加し、次のようにグリッド オブジェクト コレクション (スクリプト) を構成します。
Num Rows を 1 に変更して、すべてのキューブを 1 行に整列させる
Cell Width を 0.25 に変更して、行内でキューブを一定間隔で並べる
次に、Update Collection(コレクションの更新) ボタンをクリックして、新しい構成を適用します。

6.Move With Pan (Script) コンポーネントを追加する

Hierarchyウィンドウで、すべてのキューブ子オブジェクトを選択してから、Add Componentから、Move With Pan (Script) コンポーネントをすべてのキューブに追加します。

すべてのキューブが選択された状態で、PanGesture オブジェクトをクリックし、 Pan Input Sourceフィールドにドラッグします。

Hierarchyウィンドウで PanGestureオブジェクトを選択し、次にインスペクターで Mesh Rendererチェックボックスをオフにして、Mesh Renderer コンポーネントを無効にします。

ここでゲームモードに入ると、エディター内のシミュレーションでパンジェスチャを使用して、3Dコンテンツのスクロールをテストできます。

視線追跡

ユーザーが視線を向けている間、3DObjectCollection の各オブジェクトをゆっくり回転させるとともに、視線を向けているオブジェクトがエアタップまたは音声コマンドによって選択されたときにブリップ効果をトリガーする機能を実装します。

1.Eye Tracking Target (Script) コンポーネントをすべてのターゲット オブジェクトに追加する

Hierarchyウィンドウで、3DObjectCollectionオブジェクトを展開し、すべての子オブジェクトを選択してから、Inspectorウィンドウで、 Add ComponentでEye Tracking Target (Script) コンポーネントをすべての子オブジェクトに追加します。

すべての子オブジェクトが選択された状態で、Eye Tracking Target (Script) コンポーネントを次のように構成します。
・Select Actionを Selectに変更
・Voice Selectを展開し、音声コマンドの一覧の Sizeを 1 、Element 0を Selectに変更

2.Eye Tracking Tutorial Demo (Script) コンポーネントをすべてのターゲット オブジェクトに追加する

すべての子オブジェクトが選択された状態で、Add Componentで、Eye Tracking Tutorial Demo (Script) コンポーネントをすべての子オブジェクトに追加します。

3.While Looking At Target イベントを実装する

Hierarchyウィンドウで Cheeseオブジェクトを選択してから、新しい While Looking At Target () イベントを作成し、イベントを受信するようにCheeseオブジェクトを構成し、トリガーされるアクションとしてEyeTrackingTutorialDemo.RotateTarget を定義します。
そして3DObjectCollection 内のそれぞれの子オブジェクトに対して繰り返します。

4.On Selected イベントを実装する

HierarchyウィンドウでCheeseオブジェクトを選択し、新しい On Selected () イベントを作成します。次に、イベントを受信するようにCheeseオブジェクトを構成し、トリガーするアクションとして EyeTrackingTutorialDemo.BlipTarget を定義します。

3DObjectCollection 内のそれぞれの子オブジェクトに対して繰り返します。

5.エディター内のシミュレーションでシミュレートされた視線追跡を有効にする

Hierarchyウィンドウで MixedRealityToolkitオブジェクトを選択し、次に InspectorでInputタブを選択し、Input Data Providersセクションを展開して、 Input Simulation Serviceセクションを展開し、 DefaultMixedRealityInputSimulationProfile を複製して、カスタマイズ可能な独自の Input Simulation Profileに置き換えます。

Eye Simulationセクションで、Simulate Eye Position(目の位置のシミュレート) チェックボックスをオンにして、視線追跡シミュレーションを有効にします。

ここでゲーム モードに入ると、カーソルがオブジェクトの 1 つに接触するようにビューを調整し、手の操作または音声コマンドを使用してオブジェクトを選択することによって、実装したスピンとブリップの効果をテストできます。

6.Visual Studio プロジェクトのアプリ機能で視線入力を有効にする

アプリをビルドして、Visual Studio からお使いのデバイスにデプロイする前に、プロジェクトのアプリの機能で視線入力が有効になっている必要があります。 そのためには、 HoloLens 2 の Unity アプリのテストに関するページの手順を使用できます。

まとめ

・とりあえず整列させたいときは親オブジェクトにGrid Object Collection
・手とかに物を追従させたいときはRadial View
・ユーザーに追従する位置に置きたいときはOrbital
・3Dオブジェクトには、Manipulation Handler、プレハブにはNear Interaction Grabbable
・音を出したいときは、 Audio Source ・Near Interaction Touchable・ Hand Interaction Touch

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MRTK2.3.0の入門チュートリアルで始めるHoloLens2

HoloLens2開発手始め 準備

公式サイトのことについて記述していきます。
ホロラボの作成した日本語化サイトもあります。
https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/GettingStartedWithTheMRTK.html

このサイトも素晴らしいリンク集です。

なので、この記事自体いるの?という所ではありますが、MSの記事は何か見づらいところがあるので、Qiitaの形式にしてメモを残したいと思います。
※この記事を書いたのが、MRTK v2.4.0が出る前だったので内容に差異があります。
※MSの入門チュートリアルがアップデートされたので内容に差異があります。
https://docs.microsoft.com/ja-jp/windows/mixed-reality/mr-learning-base-01

環境を整える

推奨バージョンは
- Unity 2018.4.x, Unity 2019
- IL2CPP と .NET両方対応しているのは2018
- Visual Studio 2019
- Windows SDK 18362以降.
- Windows 10 の2019年5月以降にWindowsUpdateしていれば SDKが入っているはずです。

MRTKのページより、Microsoft.MixedReality.Toolkit.Unity.Foundation.2.3.0.unitypackage
のパッケージをダウンロード!※現時点ではMRTK2.3.0

そのほかオプション

  • 【サンプルパッケージ】Microsoft.MixedRealityToolkit.Unity.Examples.unitypackage
    • 便利なデモシーン
  • 【ツールパッケージ】Microsoft.MixedRealityToolkit.Unity.Tools.unitypackage
    • MRTK開発者のエクスペリエンスを向上させるExtensionServiceCreatorなどの便利なツールが含まれている
  • 【拡張パッケージ】Microsoft.MixedRealityToolkit.Unity.Extensions.unitypackage
    • 便利なオプションコンポーネントのセット

UnityプロジェクトにMRTKパッケージをインポートする

  • 新しいUnityプロジェクトを作成、テンプレートタイプは「3D」
  • ダウンロードしたMicrosoft.MixedRealityToolkit.Unity.Foundation.unitypackageをProjectビューのAssetへunitypackageを放り込んでインポートします。オプションとして他のunitypackageをインポートするのもアリです。

image.png

プロジェクトのセットアップ

これらのオプションが、推奨されています。
- 現在のプラットフォームでXR設定を有効にします
- テキストのシリアル化を強制する/表示可能なメタファイル
ただし、何もしなくともデフォルトでこの設定になっているので、Applyを押してデフォルトの設定とします。

image.png

TextMesh Proのセットアップ

一部のプレハブおよびアセットにはTextMesh Proが必要です。
インストールは2018.1 以降の Unity で、Window > Package Manager > TextMesh Pro > Install からインストールできます。
インストール後はWindow > TextMeshPro > Import TMP Essential Resources でTMP Essential Resourcesをインポートします。ただしインポートした後に、変更を確認するにはUnityを再起動する必要があります。

ターゲットをUWPに設定

HoloLensアプリケーションを作成するには、ユニバーサルWindowsプラットフォームに切り替えます。
- メニューを開く:ファイル>ビルド設定
- プラットフォームリストでユニバーサルWindowsプラットフォームを選択
- Switch ボタンをクリック

image.png

Unityインストール直後だと
UnitySetup-UWP-IL2CPP-Support-for-Editor-2018.4.18f1.exe
をダウンロードしてUWP設定にスイッチ可能な状態にする必要があります。

再度デフォルトの設定を聞かれるのでApplyで確定します。
image.png

MRTKを新しいシーンまたは新しいプロジェクトに追加する

  • MRTKパッケージをインポートします(FoundationとExamplesの両方がお勧め)。
    image.png

    メニューバーからMixed Reality Toolkit-> Add to Scene and Configureを選択します
    image.png

インスペクターを見ると、現在アクティブなMRTK構成プロファイル等が表示されています。
image.png

MRTKシーンの設定

これには以下が含まれます。

  • Mixed Reality Toolkit
    • ツールキット自体。フレームワーク全体の中心的な構成エントリポイントを提供します。
  • MixedRealityPlayspace
    • ヘッドセットの親オブジェクト。これにより、ヘッドセット/コントローラーおよびその他の必要なシステムがシーンで正しく管理されます。
    • メインカメラは子としてPlayspaceに移動されます-これにより、SDKと連携してPlayspaceでカメラを管理できます
    • 注意: シーンでの作業中は、メインカメラ(またはMixedRealityPlayspace)をシーンの原点(0,0,0)から移動しないでください。これはMRTKとアクティブなSDKによって制御されます。プレーヤーの開始点を移動する必要がある場合は、カメラではなくシーンコンテンツを移動してください。

Playを押し、スペースバーを押して手のシミュレーションをテストします。
image.png

これで、ビルドしてデバイスにデプロイする準備が整いました。MRTKのビルドとデプロイの手順に従ってください。

MRTKの構築と展開

デバイスでスタンドアロンアプリとしてアプリを実行するには(HoloLens、Android、iOSなどの場合)、Unityプロジェクトでビルドとデプロイのステップを実行する必要があります。MRTKを使用するアプリのビルドとデプロイは、他のUnityアプリのビルドとデプロイと同じです。MRTK固有の指示はありません。HoloLens用のUnityアプリをビルドしてデプロイする方法の詳細な手順については、以下をお読みください。Publishing Buildsで、他のプラットフォーム向けのビルドの詳細をご覧ください。
MRTKの構築とHoloLens 1およびHoloLens 2(UWP)への展開

HoloLens 1およびHoloLens 2(UWP)のビルドとデプロイの方法については、アプリケーションをデバイスにビルドするときに説明されています。

ヒント: WMR、HoloLens 1、またはHoloLens 2用にビルドする場合は、ビルド設定の「ターゲットSDKバージョン」と「最小プラットフォームバージョン」を次の図のようにすることをお勧めします。

ビルドウィンドウ

他の設定は異なる場合があります(たとえば、ビルド構成/アーキテクチャ/ビルドタイプ、その他は常にVisual Studioソリューション内で変更できます)。

「ターゲットSDKバージョン」ドロップダウンにオプション「10.0.18362.0」が含まれていることを確認してください。これがない場合は 、最新のWindows SDKをインストールする必要があります。

なにはともあれ、Build and Run で実行します。

image.png

失敗しました。
ビルドセッティングが誤っていたので修正します。
image.png

それに加えて、そもそもHoloLens2がPCに接続されていませんでした。これはRunするわけないですね。
HoloLens2をUSB-TypeCで接続して、http://127.0.0.1:10080/ にアクセスします。
image.png

Request pin ボタンを押して、HoloLens2上に表示されているDevice Portal PIN番号7桁を入力します。
image.png

新しいユーザー名とパスワードを設定し、再度ログインします。
image.png

デバイスポータルに入れました。
image.png

では、ビルドしたものをVisualStudioで開きます
image.png

image.png

HoloLens2はx86からARMに変更になったので、切り替えます。
Deviceに設定して、、、ビルド!

image.png

ビルド時間めちゃくちゃ時間かかります。
.NETの時はこんなにかからなかったような・・・。
で、待った末にビルド失敗です。なんでやねん!!!

先ほどは開始だけでやりましたが、
デバッグなしで開始 を再度行います。
image.png

が、、、駄目!! 'v142' のビルド ツールが見つかりません。と言われてしまう。
image.png

https://qiita.com/souuuuta/items/685e8bf25edac39b67ae

確かに、確認するとツールが入っていない状態になっています。
image.png

修正しました。再度ビルド!
image.png

きたよ!再度HoloLensの設定内の開発者向け内ペアリングを確認します。
image.png

ビルド成功!!
image.png

しかし、毎回ビルドしていると、ものすごく時間がかかるので、Holographic Remoting Playerで確認します。

image.png

WindowsStoreでインストール後に起動させて、IPアドレスを確認。
image.png

EmulationModeをRemote to Device、Device VersionはHoloLens2、RemoteMachineにIPアドレスを入力します。
image.png

Connectを押して、成功すると緑になります。
image.png

この状態でPlayをすると、実際に確認しながら作業ができるようになります。
image.png

いろいろ確認できる準備ができたので、まずは、いつもの豆腐を出してみましょう。
GameObjectからCubeを呼び出します。
image.png

サイズと位置を調整して、、(Unityでの1は1mなので大きさを0.1=10cmに)
image.png

目の前に立方体を確認できました。

ユーザーインターフェースの作成
MSの HoloLens 2 のチュートリアルから

MixedRealityToolkit オブジェクトを選択した状態で、
・構成プロファイルを [DefaultHoloLens2ConfigurationProfile] に変更
・Copy & Customize(コピーしてカスタマイズ) ボタンをクリック
・Clone Profile(プロファイルの複製) ウィンドウでClone。
image.png

・Spatial Awareness(空間認識) タブ内の、Enable Spatial Awareness System(空間認識システムを有効にする) チェックボックスをオン
image.png

・Clone(複製) ボタンをクリックしてClone Profile(プロファイルの複製) ウィンドウを開き、DefaultMixedRealitySpatialAwarenessSystemProfile の編集可能なコピーを作成します。
image.png

image.png

・次はWindows Mixed Reality Spatial Mesh Observer(Windows Mixed Reality 空間メッシュ オブザーバー) セクション内のClone(複製) ボタンをクリック
image.png

image.png

空間認識メッシュの可視性を非表示に変更するために、Spatial Mesh Observer Settings(空間メッシュ オブザーバーの設定) で、Display Option(表示オプション) をOcclusion(オクルージョン) に変更。

image.png
ハンド トラッキングのジェスチャと対話可能なボタン

Projectウィンドウで PressableButtonHoloLens2 を検索して、プレハブを追加します。
image.png

今回は左上のものを追加します。
image.png
プレハブをヒエラルキーにドラッグすると、TextMeshProのインポーターが立ち上がるので、Import TMP Essentialsボタンを押して追加します。
image.png

ボタンの位置は、カメラ前に配置させるために
x = 0、y = 0、z = 0.5
として設定します。
するとボタンが追加されていることを確認することができます。
image.png

さっき追加したboxの位置をボタン近くに移動させます。Transformを
Position x = 0、y = 0.04、z = 0.5
Scale x = 0.02、y = 0.02、z = 0.02)。
とします。
image.png

再度、PressableButtonHoloLens2 オブジェクトを選択して、インスペクタ内のInteractable (Script) コンポーネント内 Events > Receiversセクションを展開します。
image.png

一番下にあるAddEventを押して、イベント レシーバーの種類 InteractableOnPressReceiver の新しいイベント レシーバーを作成します。※InteractableOnPressReceiver というイベント レシーバーの種類を使用すると、追跡対象のハンドがボタンを押したときに、押されたイベントにボタンが応答できるようになります。
image.png

イベント レシーバーに対して、 Interaction Filter(対話式操作フィルター) をNear and Far(近くと遠く) に変更します。
image.png

次に、On Press イベントを受け取るようにキューブを構成していきます。
Hierarchyウィンドウから、キューブを On Press () イベントの Event Properties オブジェクト フィールドにドラッグして、レシーバーとして割り当てます。
以下の場所にCubeを持ってきて
image.png

置き換えます。

image.png

アクション ドロップダウン (現在は No Function(関数なし) が割り当てられている) をクリックし、 MeshRenderer > Material materialの順に選択して、On Press () イベントがトリガーされたときにキューブのマテリアル プロパティが変更されるように設定します。
image.png

選択したら、None (Material)の横の小さな円のアイコンをクリックして、MRTK_Standard_Cyanを検索、選択します。
image.png

image.png
同じようにリリースした場合の設定を追加します。先ほどはOnClick()に設定したように、On Release()にCubeを、そしてMaterialにMRTK_Standard_LightGray を設定します。
image.png

すると、ボタンを押している間だけシアンの色になるようになりました!か…簡単すぎる…あっけなさすぎる!
image.png

MRTK の Grid Object Collection を使用したボタンのパネルの作成
・HierarchyでCreate Emptyを作成 名前はButtonCollectionとします。
・ButtonCollectionを親として、先ほど作成したPressableButtonHoloLens2 をドラッグさせて従属させます。
image.png

・PressableButtonHoloLens2 を4回Duplicate(Ctrl+C Ctrl+V)させます。
image.png

・ButtonCollection オブジェクトを選択した状態で、InspectorでAdd Componentし、次に Grid Object Collection を検索して選択し、Grid Object Collection (Script) コンポーネントを ButtonCollection オブジェクトに追加します。
image.png

Num Rows(行数) を 1 に変更して、すべてのボタンを 1 行に整列させる
Cell Width(セル幅) を 0.05 に変更して、行内でボタンを一定間隔で並べる
次に、 Update Collection ボタンをクリックして、新しい構成を適用します。
image.png

image.png

シーンへのテキストの追加
・ButtonCollection オブジェクトを右クリックし、3D Object > Text - TextMeshPro
・Inspectorでサイズ変更Rect TransformのPos Y:-0.0425、Width:0.24、Height:0.024 に変更
・Text Mesh Pro (Script) のTextを Button Collection、Font Style:Bold、Font Size:0.2、Alignment:center middleに変更する
image.png

次のチュートリアル:動的なコンテンツの配置とソルバーの使用

Projectウィンドウで、Assets > MixedRealityToolkit.SDK > Features > Utilities > Solvers(ソルバー) に移動します。
image.png

前のチュートリアルで作成したボタンコレクションを拡張して、ユーザーの視線の方向に従うようにします。 さらに、ボタンコレクションが以下のようになるソルバーを構成します。

・ユーザーの読み取り方向に対して平行に回転する
・ユーザーの水平の視線の向きより下に配置する※他のオブジェクトを妨げないために
・ボタンを押しやすくするために、ユーザーからおよそ腕半分の距離に配置する

1.Orbital ソルバーを追加する
ButtonCollectionオブジェクトを選択し、Inspectorで、Add Componentから、Orbital (Script) コンポーネントを追加します。

それぞれのコンポーネントを以下の構成します。

Solver Handler (Script)
・Tracked Target Type が Head

Orbital (Script)
・Orientation Type が Follow Tracked Object
・Local Offset  X = 0、Y = 0、Z = 0
・World Offset X = 0、Y = -0.4、Z = 0.3
image.png

Playで確認すると、先ほどまでcubeの下にあったボタンコレクションが視界の真下に移動しています。

オブジェクトに追跡対象の手を追跡させる

Cube オブジェクトを、ユーザーの追跡対象の手を追跡するようにします。
ソルバーの構築は以下のように構成します。
・ユーザーの手の回転に合わせて向きを変える
・ユーザーの手首の位置に移動する
・Radial View ソルバーを使用する

1.Radial View ソルバーを追加する
Cubeオブジェクトを選択し、Inspectorで、Add Componentから、Radial View (Script) を追加します。

2.Radial View ソルバーを構成する
コンポーネントを以下のように構成します。

Solver Handler (Script)
・TrackedTracked Target Type : Hand Joint
・Tracked Handness : Right
・Tracked Hand Joint : Wrist (手首)

Radial View (Script)
・Reference Direction:Object Oriented
・Orient To Reference Direction(参照方向に向ける) チェックボックスをオン
・Min Distance : 0
・Max Distance : 0
image.png

Playで確認すると、右手にcubeが追従していることを確認できます。

ギズモのサイズ

いまさらですが、シーン上のギズモが無駄に大きかったので変更します。
image.png
SceneのGizmosを開き、3D Gizmosを好みのサイズまで変更します。
image.png
一番左端から1段階右にしたあたりで見えやすくなりました。
image.png
                             

3D オブジェクトの操作

コレクションの一部としての 3D オブジェクトの整理、基本操作のための境界ボックス、近距離操作と遠距離操作、手の追跡によるタッチやグラブ ジェスチャなど、基本的な 3D コンテンツとユーザー エクスペリエンスについて説明します。
MRTK.HoloLens2.Unity.Tutorials.Assets.GettingStarted.2.3.0.3.unitypackage
Unity カスタム パッケージをダウンロードしてインポートします。
image.png

コレクション内の 3D オブジェクトを整理する

3D オブジェクトのパネルを作成します。 具体的には、3D オブジェクトが 3 x 3 グリッドに配置されるように構成します。

・3D オブジェクトを親オブジェクトにペアレント化する
・Grid Object Collection (Script) コンポーネントを追加して構成する

1.3D オブジェクトを親オブジェクトにペアレント化する
Hierarchyで 空のオブジェクトを作成し、(適切な名前たとえば、3DObjectCollectionを付けて) 適切な場所 (たとえば、X = 0、Y = -0.2、Z = 2) に配置します。
Projectウィンドウで、 Assets > MRTK.Tutorials.GettingStarted > Prefabs に移動
image.png

次のプレハブを 3DObjectCollection にペアレント化します。
・Cheese
・CoffeeCup
・EarthCore
・Octa
・Platonic
・TheModule
image.png

3DObjectCollection の子オブジェクトとして 3 つのCubeを作成します。
Transformの Scale : X = 0.15、Y = 0.15、Z = 0.15
に設定します。Position Y:-0.3として、Cubeを複製し、それぞれのX座標とマテリアルを割り当てます、マテリアルは Assets > MixedRealityToolkit.SDK > StandardAssets > Materials にあります。

Cube
 Position X:-0.3
 Materials:MRTK_Standard_GlowingCyan

Cube(1)
 Position X:0
 Materials:MRTK_Standard_GlowingOrange

Cube(2)
 Position X:0.3
 Materials:MRTK_Standard_Green
などとします。※位置は適当です。

image.png
image.png

2.Grid Object Collection (Script) コンポーネントを追加して構成する

Grid Object Collection (Script) コンポーネントを 3DObjectCollection オブジェクトに追加し、次のように構成します。
Sort Type : Child Order
次に、Update Collection ボタンをクリックして、新しい構成を適用します。
image.png

3D オブジェクトの操作

3D オブジェクトを操作する機能を追加します。 またプレハブオブジェクトの場合は、ユーザーが追跡対象の手を使用して、これらのオブジェクトに手を伸ばしてつかむことができるようにします。
主な手順は次のとおりです。
・すべてのオブジェクトに Manipulation Handler (Script) コンポーネントを追加する
・プレハブ オブジェクトに Near Interaction Grabbable (Script) コンポーネントを追加する
・Manipulation Handler (Script) コンポーネントを構成する

1.すべてのオブジェクトに Manipulation Handler (Script) コンポーネントを追加する

Hierarchyで、すべてのオブジェクトを選択し、Manipulation Handler (Script) コンポーネントを追加します。

※注意:このチュートリアルでは、コライダーが既にプレハブに追加されています。 Cube オブジェクトなどの Unity プリミティブの場合、オブジェクトが作成されるときに Collider コンポーネントが自動的に追加されます。

2.プレハブ オブジェクトに Near Interaction Grabbable (Script) コンポーネントを追加する

Hierarchyで、Cube以外のオブジェクトCheese ~ TheModule オブジェクトを選択し、すべてのオブジェクトに Near Interaction Grabbable (Script) コンポーネントを追加します。

3.Manipulation Handler (Script) コンポーネントを構成する

■既定の操作
Cube オブジェクトについて、そのままの動きが見たいので何も設定しません。

■操作をスケールのみに制限する
Cube (1) オブジェクトについて、Two Handed Manipulation Type(両手を使った操作の種類) を Scaleに変更し、ユーザーがオブジェクトのサイズのみを変更できるようにします。
image.png

■移動をユーザーから一定の距離に制限する
Cube (2) オブジェクトについて、Constraint On Movement(動きの制限) を Fix Distance From Head(頭部から一定の距離) に変更して、オブジェクトを移動したときに、それがユーザーから同じ距離を保つようにします。
image.png

■既定のグラブ可能な操作
Cheese、CoffeCup、および EarthCore オブジェクトについて、そのままの動きが見たいので何も設定しません。

■遠距離操作機能を除去する
Octa オブジェクトについて、Allow Far Manipulation(遠距離操作を許可) チェック ボックスをオフにして、ユーザーが追跡対象の手を使用した場合のみオブジェクトを直接操作できるようにします。
image.png

■オブジェクトを中心を軸に回転させる
Platonic オブジェクトについて、One Hand Rotation Mode Near(片手回転モード - 近距離) および One Hand Rotation Mode Far(片手回転モード - 遠距離) を Rotate About Object Center(オブジェクトの中心を軸に回転) に変更し、ユーザーがオブジェクトを 1 つの手で回転させたとき、オブジェクトが中心を軸に回転するようにします。
image.png

■オブジェクトを放した後も動作を続ける
TheModule オブジェクトについて、Rigidbody コンポーネントを追加して物理的処理を有効にし、Use Gravity(重力を使用) チェックボックスをオフにして、オブジェクトが重力の影響を受けないようにします。
image.png
Manipulation Handler (Script) コンポーネントに戻り、 Release Behavior(解放動作) が Keep Velocity(速度を維持) およびKeep Angular Velocity(角速度を維持) の両方に設定されていることを確認し、オブジェクトがユーザーの手から離れた後も動き続けるようにします。
image.png

バウンディング(境界)ボックスボックスの追加

バウンディングボックスには、拡大縮小および回転に使用できるハンドルが用意されているため、1 つの手で、近距離と遠距離の両方のオブジェクトを操作するのがより簡単かつ直感的になります。
この例では、EarthCore オブジェクトに境界ボックスを追加して、ハンドルを使用した拡大縮小と回転を使用して、このオブジェクトを操作できるようにします。
■重要
境界ボックスを使用できるようにするには、オブジェクトに次のコンポーネントが必要です。
・Collider コンポーネント、たとえばボックス コライダー
・Bounding Box (Script) コンポーネント

Bounding Box (Script) コンポーネントを EarthCore オブジェクトに追加する

Inspectorで EarthCoreオブジェクトを選択し、Bounding Box (Script) コンポーネントを追加します。
image.png

Playボタンを押して確認します。

タッチ エフェクトの追加

手でオブジェクトに触れたときにイベントがトリガーされるようにします。 具体的には、ユーザーが触れたときにサウンド エフェクトが再生されるように Octa オブジェクトを構成します。

これを実現するための主な手順は次のとおりです。
・オブジェクトに Audio Source コンポーネントを追加する
・オブジェクトに Near Interaction Touchable (Script) コンポーネントを追加する
・オブジェクトに Hand Interaction Touch (Script) コンポーネントを追加する
・On Touch Started イベントを実装する
・エディター内のシミュレーションを使用してタッチ操作をテストする

■重要
タッチ イベントをトリガーできるようにするには、オブジェクトに次のコンポーネントが必要です。
Collider コンポーネント、可能であればボックス コライダー
Near Interaction Touchable (Script) コンポーネント
Hand Interaction Touch (Script) コンポーネント

1.オブジェクトに Audio Source コンポーネントを追加する

Octaオブジェクトを選択し、Audio Source コンポーネントを追加します。次に、Spatial Blendを 1 に変更して、空間オーディオを有効にします。
image.png

2.オブジェクトに Near Interaction Touchable (Script) コンポーネントを追加する

Octaオブジェクトが選択された状態で、
・Near Interaction Touchable (Script) コンポーネントを追加
・Fix Bounds(境界の修正) およびFix Center(センターの修正) ボタンをクリック
・Near Interaction Touchable (Script) のLocal Centerおよび Boundsのプロパティを BoxCollider に一致するように更新
image.png

3.オブジェクトに Hand Interaction Touch (Script) コンポーネントを追加する

Octaオブジェクトを選択した状態で、Hand Interaction Touch (Script) コンポーネントを Octa オブジェクトに追加します。

4.On Touch Started イベントを実装する

Hand Interaction Touch (Script) コンポーネントで、小さい + アイコンをクリックして、新しい On Touch Started () イベントを作成します。 次に、イベントを受信するように Octa オブジェクトを構成し、トリガーされるアクションとして AudioSource.PlayOneShot を定義します。
image.png

Assets > MixedRealityToolkit.SDK > StandardAssets > Audio に移動して、MRTK で提供されているオーディオ クリップを表示します。次に、適切なオーディオ クリップ (MRTK_Gem オーディオ クリップなど) を Audio Clipフィールドに割り当てます。
image.png

音声コマンドの有効化

音声コマンドを実装して、ユーザーが Octa オブジェクトでサウンドを再生できるようにします。主な手順は次のとおりです。
・既定の入力システム プロファイルを複製する
・既定の音声コマンド プロファイルを複製する
・新しい音声コマンドを作成する
・Speech Input Handler (Script) コンポーネントを追加して構成する
・音声コマンドの Response イベントを実装する

1.既定の入力システム プロファイルを複製する

HierarchyでMixedRealityToolkitオブジェクトを選択し、InspectorウィンドウでInputタブを選択し、DefaultHoloLens2InputSystemProfileを複製して、カスタマイズ可能な独自の入力システム プロファイルに置き換えます。
image.png

2.既定の音声コマンド プロファイルを複製する

Speechセクションを展開し、DefaultMixedRealitySpeechCommandsProfileを複製して、カスタマイズ可能な独自の音声コマンド プロファイルに置き換えます。
image.png

3.新しい音声コマンドを作成する

Speech Commandsセクションで、+Add a New Speech Command(新しい音声コマンドの追加) ボタンをクリックして、既存の音声コマンドの一覧の一番下に新しい音声コマンドを追加します。
image.png

次に、Keywordフィールドに適切な単語または語句 (たとえば、Play Music) を入力します。
image.png

4.Speech Input Handler (Script) コンポーネントを追加して構成する

Octaオブジェクトを選択し、Speech Input Handler (Script) コンポーネントを追加します。 次に、Is Focus Required(フォーカスが必要) チェックボックスをオフにして、ユーザーが Octa オブジェクトを確認しなくても音声コマンドをトリガーできるようにします。
image.png

5.音声コマンドの Response イベントを実装する

Speech Input Handler (Script) コンポーネントで、小さい + ボタンをクリックして、キーワードの一覧にキーワード要素を追加します。
image.png
Element 0をクリックして展開し、 Keywordドロップダウンから、前に作成した Play Music キーワードを選択します。
image.png

新しい Response () イベントを作成し、イベントを受信するように Octa オブジェクトを構成し、トリガーするアクションとして AudioSource.PlayOneShot を定義します。次に、適切なオーディオ クリップ (MRTK_Gem オーディオ クリップなど) を Audio Clip フィールドに割り当てます。
image.png

パン ジェスチャ

2D UI をスクロールし、次にそれを展開して 3D オブジェクトのコレクションをスクロールします。これを実現するための主な手順は次のとおりです。
・パンに使用できる Quad オブジェクトを作成する
・Near Interaction Touchable (Script) コンポーネントを追加する
・Hand Interaction Pan Zoom (Script) コンポーネントを追加する
・スクロールする 2D コンテンツを追加する
・スクロールする 3D コンテンツを追加する
・Move With Pan (Script) コンポーネントを追加する

1.パンに使用できる Quad オブジェクトを作成する

Hierarchyで、3D Object > Quad から、Quad をシーンに追加。
PanGesture のような適切な名前を付け、適切な場所に配置します (たとえば、X =1.5、Y = - 0.2、Z = 2 など)。
パン用のメッシュ コライダーは薄いので、ユーザーがコライダーを簡単に操作できるようにするために、ボックス コライダーに置き換えます。Mesh Collider コンポーネントをremoveし、Add ComponentからBox Collider コンポーネントを追加します。
厚みをつけるために、Sizeの Z を 0.15 に変更します。
image.png

2.Near Interaction Touchable (Script) コンポーネントを追加する

PanGesture オブジェクトが選択された状態で、Near Interaction Touchable (Script) コンポーネントを PanGesture オブジェクトに追加します。次に、Fix Bounds および Fix Center(センターの修正) ボタンをクリックして、Near Interaction Touchable (Script) のLocal Center(ローカルのセンター) および Bounds(境界) のプロパティを BoxCollider に一致するように更新します。

3.Hand Interaction Pan Zoom (Script) コンポーネントを追加する

PanGesture オブジェクトが選択された状態で、Hand Interaction Pan Zoom (Script) コンポーネントを PanGesture オブジェクトに追加し、次に Lock Horizontal(水平方向のロック) チェックボックスをオンにして、垂直スクロールのみを許可します。

4.スクロールする 2D コンテンツを追加する

Projectパネルで PanContent 素材を検索し、それをクリックして PanGesture オブジェクトのメッシュ レンダラー Materialsの Element 0プロパティにドラッグします。

Inspectorウィンドウで、新しく追加した PanContent 素材コンポーネントを展開します。次に、Tilingの Y 値を 0.5 に変更して X 値と一致させ、タイルを正方形で表示します。

5.スクロールする 3D コンテンツを追加する

Hierarchyウィンドウで、PanGesture オブジェクトの子オブジェクトとして 4 つのキューブを作成し、Transformの Scaleを X = 0.15、Y = 0.15、Z = 0.15 に設定します。

キューブを均等に配置して時間を節約するには、Grid Object Collection (Script) コンポーネントをキューブの親オブジェクト (PanGesture オブジェクト) に追加し、次のようにグリッド オブジェクト コレクション (スクリプト) を構成します。
Num Rows を 1 に変更して、すべてのキューブを 1 行に整列させる
Cell Width を 0.25 に変更して、行内でキューブを一定間隔で並べる
次に、Update Collection(コレクションの更新) ボタンをクリックして、新しい構成を適用します。

6.Move With Pan (Script) コンポーネントを追加する

Hierarchyウィンドウで、すべてのキューブ子オブジェクトを選択してから、Add Componentから、Move With Pan (Script) コンポーネントをすべてのキューブに追加します。

すべてのキューブが選択された状態で、PanGesture オブジェクトをクリックし、 Pan Input Sourceフィールドにドラッグします。

Hierarchyウィンドウで PanGestureオブジェクトを選択し、次にインスペクターで Mesh Rendererチェックボックスをオフにして、Mesh Renderer コンポーネントを無効にします。

ここでゲームモードに入ると、エディター内のシミュレーションでパンジェスチャを使用して、3Dコンテンツのスクロールをテストできます。

視線追跡

ユーザーが視線を向けている間、3DObjectCollection の各オブジェクトをゆっくり回転させるとともに、視線を向けているオブジェクトがエアタップまたは音声コマンドによって選択されたときにブリップ効果をトリガーする機能を実装します。

1.Eye Tracking Target (Script) コンポーネントをすべてのターゲット オブジェクトに追加する

Hierarchyウィンドウで、3DObjectCollectionオブジェクトを展開し、すべての子オブジェクトを選択してから、Inspectorウィンドウで、 Add ComponentでEye Tracking Target (Script) コンポーネントをすべての子オブジェクトに追加します。

すべての子オブジェクトが選択された状態で、Eye Tracking Target (Script) コンポーネントを次のように構成します。
・Select Actionを Selectに変更
・Voice Selectを展開し、音声コマンドの一覧の Sizeを 1 、Element 0を Selectに変更

2.Eye Tracking Tutorial Demo (Script) コンポーネントをすべてのターゲット オブジェクトに追加する

すべての子オブジェクトが選択された状態で、Add Componentで、Eye Tracking Tutorial Demo (Script) コンポーネントをすべての子オブジェクトに追加します。

3.While Looking At Target イベントを実装する

Hierarchyウィンドウで Cheeseオブジェクトを選択してから、新しい While Looking At Target () イベントを作成し、イベントを受信するようにCheeseオブジェクトを構成し、トリガーされるアクションとしてEyeTrackingTutorialDemo.RotateTarget を定義します。
そして3DObjectCollection 内のそれぞれの子オブジェクトに対して繰り返します。

4.On Selected イベントを実装する

HierarchyウィンドウでCheeseオブジェクトを選択し、新しい On Selected () イベントを作成します。次に、イベントを受信するようにCheeseオブジェクトを構成し、トリガーするアクションとして EyeTrackingTutorialDemo.BlipTarget を定義します。

3DObjectCollection 内のそれぞれの子オブジェクトに対して繰り返します。

5.エディター内のシミュレーションでシミュレートされた視線追跡を有効にする

Hierarchyウィンドウで MixedRealityToolkitオブジェクトを選択し、次に InspectorでInputタブを選択し、Input Data Providersセクションを展開して、 Input Simulation Serviceセクションを展開し、 DefaultMixedRealityInputSimulationProfile を複製して、カスタマイズ可能な独自の Input Simulation Profileに置き換えます。

Eye Simulationセクションで、Simulate Eye Position(目の位置のシミュレート) チェックボックスをオンにして、視線追跡シミュレーションを有効にします。

ここでゲーム モードに入ると、カーソルがオブジェクトの 1 つに接触するようにビューを調整し、手の操作または音声コマンドを使用してオブジェクトを選択することによって、実装したスピンとブリップの効果をテストできます。

6.Visual Studio プロジェクトのアプリ機能で視線入力を有効にする

アプリをビルドして、Visual Studio からお使いのデバイスにデプロイする前に、プロジェクトのアプリの機能で視線入力が有効になっている必要があります。 そのためには、 HoloLens 2 の Unity アプリのテストに関するページの手順を使用できます。

まとめ

・とりあえず整列させたいときは親オブジェクトにGrid Object Collection
・手とかに物を追従させたいときはRadial View
・ユーザーに追従する位置に置きたいときはOrbital
・3Dオブジェクトには、Manipulation Handler、プレハブにはNear Interaction Grabbable
・音を出したいときは、 Audio Source ・Near Interaction Touchable・ Hand Interaction Touch

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity] missing prefabを再度紐づける方法

UnityプロジェクトをGit管理しているときに
うっかりmetaファイルがgitignoreされていて、PULLしてきた時にmetaファイルが更新され、missing prefabになってしまう。
あるあるですよね

Screen Shot 2020-07-07 at 15.24.36.png

ど゛う゛し゛て゛な゛ん゛だ゛よ゛お゛お゛ぉ゛お゛!゛!゛!゛ん゛あ゛あ゛あ゛あ゛あ゛ぁ゛ぁ゛あ゛あ゛!゛!゛!゛!゛

metaファイルはignoreされており、metaファイルは一度もコミットされていないので、バックアップなど存在しません。
絶望しかありません。

シーン上のGameObjectをUnpackすれば治る的な記事を見つけましたが、治りませんでした。(赤い文字が白くなっただけ)

再度Prefabを配置し直すという選択肢も、どの値をPrefabにApplyしてあったか、記憶を頼りに復元するしかありません。
(適度にOverrideしましょうね...)

どうするか

ymlのguidを直接書き換えましょう

※自己責任でお願いします。(バックアップをとっておいてください)

Unityのバージョンは
- 2019.3です

新しく生成されたPrefabのmetaファイルをテキストエディタで開きましょう
(一応モザイクで隠しておきましたが、必要なかったかもしれません)

(Item.meta)
Screen_Shot_2020-07-07_at_15_40_08.png
こちらのguidの値を控えておきましょう。

続いて、missing prefabが置いてあるシーンファイルをテキストエディタで開きます。
目の前に広がるymlファイル。幻想的ですね

その中からmissing PrefabになっているGameObjectの名前で検索をかけましょう (ItemというGameObject)
以下の画像の緑枠の部分です。

赤枠のguidの項目(581xxxxx)の部分が複数ありますが、それらを全て先ほど控えたmetaファイルのguidの値(cf1xxxxx)で書き換えましょう
(一つのGameObject名に複数あるようです (- targetの項目分だけ必要?))

その状態でUnityEditorに戻ります。
すると!なんとmissing Prefabが復活しているではありませんか!

私の可愛いPrafabちゃん❤️


ということで少し面倒ですが、metaファイルのguidを紐付け直してあげれば復活させることが可能でした。
記憶を便りに復活させていくよりは全然マシでしょう。

これでもうmissing prefabになったからといって、泣き寝入りしなくて済みますね!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Bitrize + mac + unity でモバイルアプリを作成する時に調べたこと

とりあえずCIツール知識が0な自分でcliを使って色々しようとして
調べる必要があった部分のメモ書き

BitrizeとGithubActionを使ってみようとしたけど
基本1こ使い方覚えれば、少しは学習コストが下がりそうだなぁ
と思った。

yaml に泣かされる

半角スペースの個数に泣かされる
https://qiita.com/jerrywdlee/items/d5d31c10617ec7342d56

Xcodebuild コマンドを使うにはインストールが必要だと知る

※これ結果的に不要ポイ?
https://qiita.com/mym/items/8bc079b7d0f5f55c49dc

error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

と思ったらXcodeのインストール済みなら設定画面で設定すれば良さそうだったと言う罠
https://qiita.com/eytyet/items/59c5bad1c167d5addc68

project_pathはファイル名を指定する

Bitrizeの ymlファイル内にて
contents.xcworkspacedataが無いみたいなエラーでなんぞや?と思ったらそう言うことだった。

    - xcode-archive@2.8.5: 
        inputs:
        - project_path: ./output/Unity-iPhone.xcodeproj
        - scheme: Unity-iPhone

んで出来上がったipaファイル何処いったんだ?

output delectoryにできた。

/var/folders/_v/r_bddp7d4z3c650zzb4xhw940000gp/T/deploy706604927

何処だよこれ!
ちなみに
- app_path: $BITRISE_IPA_PATH
みたいな環境変数を使えば動いてくれるっぽいのであんまりいらない

Deploygateに upできない

これなんで解決したんだっけかな・・・
TOPぺージのコマンド入れたおかげ?

INFO[11:06:05]  * [OK] Step dependency (curl) installed, available. 
curl: (26) Failed to open/read local data from file/application
{"message":"You do not have a permission to upload applications.","because":"You do not have a permission to upload applications.","error":true}|

terminal

途中でやめたくなった時のコマンド
Control + C

yamlの文字列の扱い

シングルクォーテーション、ダブルクォーテーション等
あろうがなかろうが関係ないなかろうが関係ない
https://neos21.hatenablog.com/entry/2020/01/11/080000

バッチ(command)ファイル

windowsだと batだけど
macの場合 commandファイルね

chmod u+x login.command
こんな感じで権限付与しないと動かない
https://qiita.com/TatsuyaOGth/items/f15bfa9aeb68d8ecfc67

これバッチを作った時のカレントディレクトリーを変更するコマンド、超大事

cd `dirname $0`

terminal が閉じない

https://ocs.hatenadiary.org/entry/20111010/1318209350

隠しファイルの表示方法

Mac の Finder で 隠しファイル を表示するためのショートカットは command + shift + .

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

あの日見たScriptableObjectの型を僕達はまだ知らない

ScriptableObjectの読み込みを一元管理する

ScriptableObjectは便利ですよね。データをひとまとまりで取得できる優れものです。
今回はそれを読み込む流れを一元管理したいと思います。

読み込みが管理されていないと、どうなる?

Image2.png
クラスとScriptableObjectが「多対多」の関係になってしまい、人間の脳に優しくありません。

間に管理クラスを挟んで、「1対多」の関係を作る

Image1.png

管理クラス作成のために、ジェネリクスを使う

LoadData.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public sealed class LoadData
{
    private static LoadData instance = new LoadData();

    public static LoadData Instance
    {
        get
        {
            return instance;
        }
    }
    // ScriptableObjectのみ受け付けるジェネリクスメソッド
    public T ScriptableLoader<T>(string path) where T : ScriptableObject
    {
        return Resources.Load<T>(path);
    }
}

こうすることで、ScriptableObjectが返されることを保証しつつ、様々な型のScriptableObjectを指定できます。

コード

今回使用したScrptableObjectです。

GameData.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "MyScript/Create GameData")]
public class GameData : ScriptableObject
{
    public int Data1;
    public string Data2;
    public float Data3;
}

これをもとに、ScriptableObjectを作成し、値を入れます。
Image4.png

それをStart()で表示してみます。

Game.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Game : MonoBehaviour
{

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(LoadData.Instance.ScriptableLoader<GameData>("Data/MyGameData").Data1);
    }
}

実行結果

Image3.png

おわりに

以上、「ScriptableObjectの型は使いたいクラスだけが知っていればいいよね。読み込むクラスはそんなの知らなくていいよ」という話でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む