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

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

ただいまの
回答率

91.36%

  • C#

    4780questions

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

  • Unity3D

    787questions

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

  • Leap Motion

    22questions

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

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

解決済

回答 1

投稿 2017/11/23 01:30

  • 評価
  • クリップ 0
  • VIEW 84

tyint121

score 3

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

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

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

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

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

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

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

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

投稿 2017/11/23 02:33

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/23 20: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

    教えていただけましたら幸いです。

    キャンセル

  • 2017/11/23 20:40

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

    キャンセル

  • 2017/11/27 16:09

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

    キャンセル

  • 2017/11/27 16:42

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

    キャンセル

  • 2017/11/29 00:44

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

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • C#

    4780questions

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

  • Unity3D

    787questions

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

  • Leap Motion

    22questions

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