質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Leap Motion

Leap Motionは、Leap Motionによって開発、販売している、手のジェスチャーでパソコンを操作できるデバイスです。

Q&A

解決済

1回答

442閲覧

最も近いオブジェクトにのみ処理を行う

tyint121

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Leap Motion

Leap Motionは、Leap Motionによって開発、販売している、手のジェスチャーでパソコンを操作できるデバイスです。

0グッド

0クリップ

投稿2017/11/22 16:30

unityでleap motionを用いたアプリを作っています。
Instantiateで生成した複数のクローンのうち、ハンドモデルに最も近いクローンにのみピンチによる移動や拡大処理を行おうと思っています。
以下が実際のシーンになります。

生成されたクローンには検出されたピンチ動作を受け、移動や拡大縮小を行うスクリプト(LeapRTS)が追加されているのですが、ハンドモデルから最も近いオブジェクト以外はそのスクリプトを非アクティブにするといった考え方でよろしいでしょうか?

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

やり方は様々あるので、なにが正解かはそのときどきで変わると思います。
が、まずは動くようにするのが一番大事なので、思ったもので実装してみてはいかがでしょうか。

その上で、例えば、処理負荷が高いから軽くしたい、などの質問をしたほうがいいかなと思いました。

考え方自体に不安があるのであれば、不安に思っている点などを書かれたほうがいいように思います。

以上を踏まえた上であくまで一例ですが、自分なら、という前提でお答えすると、「一番近いオブジェクト」を検知して、その検知したオブジェクトに対して処理を実行させるようにします。

文面から、ピンチ動作の処理を生成したオブジェクト側に持たせているのかな、と感じましたがあっていますか?
もしそうであれば、ピンチ動作自体は生成オブジェクト側に実装しておくのでもいいと思いますが、それを起動させるのはハンドモデル側で行う、ということです。

(ものすごくざっくりイメージを書くと、ハンドモデル側で、生成したオブジェクトの機能実行のスイッチを押すようなイメージです)

投稿2017/11/22 17:33

edo_m18

総合スコア2283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tyint121

2017/11/23 11:28

ご回答ありがとうございます。 ピンチ動作の処理を生成したオブジェクト側に持たせている ← そうなります。 他サイト等参考に組んでみましたがエラーが出てしまいました。 以下のスクリプトをハンドモデルにアタッチし、シーン中にinstantiateで生成したクローンのうち一番近いもののピンチ処理(leapRTS)をアクティブにしようと思っています。(生成時leapRTSは非アクティブにしています) クローンにはwindowタグがついており、そのなかで最も距離が近いものに対して処理が行われるといった流れです。 using UnityEngine; using System.Collections; namespace Leap.Unity.PinchUtility { public class Distance_detection : MonoBehaviour { private GameObject nearObj; private float searchTime = 0; // Use this for initialization void Start() { nearObj = serchTag(gameObject, "Player"); } // Update is called once per frame void Update() { searchTime += Time.deltaTime; if (searchTime >= 1.0f) { nearObj = serchTag(gameObject, "Player"); searchTime = 0; } GetComponent<LeapRTS>().enabled = true;  ←この部分 } GameObject serchTag(GameObject nowObj, string window) { float tmpDis = 0; float nearDis = 0; GameObject targetObj = null; foreach (GameObject obs in GameObject.FindGameObjectsWithTag(window)) { tmpDis = Vector3.Distance(obs.transform.position, nowObj.transform.position); if (nearDis == 0 || nearDis > tmpDis) { nearDis = tmpDis; targetObj = obs; } } return targetObj; } } } 以下エラーですが、他クラスのleapRTSの参照がうまくいっていないようです・・・ NullReferenceException: Object reference not set to an instance of an object 教えていただけましたら幸いです。
edo_m18

2017/11/23 11:40

GetComponentを実行しているのは"Distance_detection"側ですよね? ここは"nearObj.GetComponent"を実行しないとダメですね。 あと、見つからなかった場合、などのエラー処理も追加しないとなりません。
tyint121

2017/11/27 07:09

ありがとうございます! 実行できました。 もし、最も近いオブジェクトとそれ以外の処理を分けるといった場合はどういった方法がありますでしょうか?
edo_m18

2017/11/27 07:42

操作対象オブジェクトは開発者が認識しているはずなので、ひとまず操作対象になりえるオブジェクトをすべて取得して、その上で一番近いものを検索。 その該当オブジェクトに対して「最も近いオブジェクトの処理」を実行し、それ以外のオブジェクトに対して「それ以外の処理」を実行すればいいと思います。
tyint121

2017/11/28 15:44

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問