本日もチュートリアルお試し枠の続きです。
HOLOGRAMS 211 4章を実施します。
いつも通り、以下ブログの記事を参考に実施します。
azure-recipe.kc-cloud.jp
参考記事にある通りにチュートリアルを実施します。
アプリを起動し、宇宙飛行士が現れたところで「Move Astronaut」と発声します。
カーソルの矢印が四方向に表示が変わります。
その状態で宇宙飛行士をタップして、手を動かすと……。
手の動きに合わせて宇宙飛行士が移動します。
今回、技術としては目新しいものはありませんが、いつも通りコード確認していきます。
・AstronautManager.cs
void Start() { keywordCollection = new Dictionary<string, KeywordAction>(); // Add keyword to start manipulation. keywordCollection.Add("Move Astronaut", MoveAstronautCommand); (略) // Initialize KeywordRecognizer with the previously added keywords. keywordRecognizer = new KeywordRecognizer(keywordCollection.Keys.ToArray()); keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized; keywordRecognizer.Start(); }
音声認識の登録箇所です。以下で実施した技術と同様です。
bluebirdofoz.hatenablog.com
タップ操作時の今回の追加コードは以下です。
・GestureAction.cs
void PerformManipulationStart(Vector3 position) { manipulationPreviousPosition = position; } void PerformManipulationUpdate(Vector3 position) { if (GestureManager.Instance.IsManipulating) { /* TODO: DEVELOPER CODING EXERCISE 4.a */ Vector3 moveVector = Vector3.zero; // 4.a: Calculate the moveVector as position - manipulationPreviousPosition. moveVector = position - manipulationPreviousPosition; // 4.a: Update the manipulationPreviousPosition with the current position. manipulationPreviousPosition = position; // 4.a: Increment this transform's position by the moveVector. transform.position += moveVector; } }
手の位置情報に合わせて、宇宙飛行士の位置を移動しています。
因みに、追加コードの関数呼び出しはGestureManager.csに記載済みです。
・GestureManager.cs
private void ManipulationRecognizer_ManipulationStartedEvent(InteractionSourceKind source, Vector3 position, Ray ray) { if (HandsManager.Instance.FocusedGameObject != null) { IsManipulating = true; ManipulationPosition = position; HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationStart", position); } } private void ManipulationRecognizer_ManipulationUpdatedEvent(InteractionSourceKind source, Vector3 position, Ray ray) { if (HandsManager.Instance.FocusedGameObject != null) { IsManipulating = true; ManipulationPosition = position; HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationUpdate", position); } }
関数をSendMessageを使って関数名で呼び出すこのやり方、処理の繋がりを追跡するのに手間取るので、どうも慣れません。
オブジェクト間の結びつきが弱くなる点は良いんですが、それ以上に可読性が下がり過ぎな気がします。