2017-11-12 1 views
0

ARCore Unityのコードをしばらく見てきましたが、私はトグルボタンを持っているので、ユーザーがオブジェクトを追跡された平面が表示されている間にどこに配置するかを知りながら、オブジェクトを配置すると、追跡された平面を視覚的に無効にするオプションが与えられ、より現実的に見えます。私はAndroid Studioで、HelloArActivity.javaのメインで次のようなことをすることができました:ARCoreユニティの追跡されたプレーンの表示/非表示を切り替えます

if (planeToggle) { 
       mPlaneRenderer.drawPlanes(mSession.getAllPlanes(), frame.getPose(), projmtx); 
      } 

これは本当に簡単でした。私はplaneToggleという名前のブールを作成し、if条件にmPlaneRenderer.drawPlanes関数を配置しました。ブールが真実であれば、それは飛行機を表示し、その偽のときには表示されません...

しかし、ユニティで私は混乱しています。私はHelloARController.csで次のようなことをしました:

私はtogglePlanesのボタンを作った。 はブール変数を切り替えるには、それにイベントリスナーを設定し、このようなものでした:私は、トグルボタンを押したときに

for (int i = 0; i < m_newPlanes.Count; i++) 
       { 
       // Instantiate a plane visualization prefab and set it to track the new plane. The transform is set to 
       // the origin with an identity rotation since the mesh for our prefab is updated in Unity World 
       // coordinates. 

       GameObject planeObject = Instantiate(m_trackedPlanePrefab, Vector3.zero, Quaternion.identity, 
         transform); 
        planeObject.GetComponent<TrackedPlaneVisualizer>().SetTrackedPlane(m_newPlanes[i]); 

        m_planeColors[0].a = 0; 

        // Apply a random color and grid rotation. 
        planeObject.GetComponent<Renderer>().material.SetColor("_GridColor", m_planeColors[0]); 
        planeObject.GetComponent<Renderer>().material.SetFloat("_UvRotation", Random.Range(0.0f, 360.0f)); 


     if (togglePlanes == false){ // my code 

      planeObject.SetActive(false); // my code 

      } // 
    } 

何も起こりませんが。

私が持っていた他のオプションは、私はこのような何かをしたTrackedPlaneVisualizer.csに変更を加えることだった。

for (int i = 0; i < planePolygonCount; ++i) 
      { 
       Vector3 v = m_meshVertices[i]; 

       // Vector from plane center to current point 
       Vector3 d = v - planeCenter; 

       float scale = 1.0f - Mathf.Min((FEATHER_LENGTH/d.magnitude), FEATHER_SCALE); 
       m_meshVertices.Add(scale * d + planeCenter); 

       if (togglePlanesbool == true) // my code 
       { 
        m_meshColors.Add(new Color(0.0f, 0.0f, 0.0f, 1.0f)); // my code 
       } 

       else 
       { 
        m_meshColors.Add(new Color(0.0f, 0.0f, 0.0f, 0.0f)); // my code 
       } 
    } 

これは仕事をしました。しかし、トグルで遅延が発生しています.2つの異なる飛行機がレンダリングされた場合、それらの間でトグルを開始することがあります(有効になっている場合は無効になり、無効になる場合もあります)。だから私はこれも行くためのオプションではないと思います....誰でも助けることができますか?

私はUnityの初心者です。

答えて

1

サンプルは実際にプレーンを隠して表示するように設計されていないため、いくつか追加する必要があります。

まず、ARCoreプレーンを表すGameObjectsのコレクションはありません。これを行う最も簡単な方法は、ゲームオブジェクトにタグを追加することです。

UnityエディタでTrackedPlaneVisualizerプレファブを見つけて選択します。プロパティインスペクタで、タグドロップダウンをドロップダウンし、というプレーンという名前のタグを追加します。

次に、Toggleハンドラメソッドでは、 "plane"タグを持つすべてのゲームオブジェクトを見つける必要があります。その後、RendererコンポーネントとTrackedPlaneVisualizerコンポーネントの両方を取得し、トグルに基づいてそれらのコンポーネントを有効または無効にします。両方のコンポーネントを実行する必要があります。 Rendererはプレーンを描画し、TrackedPlaneVisualizerはRendererを再度有効にします(理想的にはRendererの状態を優先します)。

public void OnTogglePlanes(bool flag) { 
     showPlanes = flag; 
     foreach (GameObject plane in GameObject.FindGameObjectsWithTag ("plane")) { 
      Renderer r = plane.GetComponent<Renderer>(); 
      TrackedPlaneVisualizer t = plane.GetComponent<TrackedPlaneVisualizer>(); 
      r.enabled = flag; 
      t.enabled = flag; 
     } 
    } 

GameObjectがインスタンス化されている場所でも同様のことができるため、新しいプレーンがトグルを尊重します。

+0

ありがとうございます!これはうまくいった! –

+0

私は以前に 'GameObject'(つまり' PlaneWrapper')を実装して、 'Instantiate(plane、Vector3.zero、Quaternion.identity、PlaneWrapper.transform)'を実行しました。そうすれば、 'PlaneWrapper.SetActicve([true | false])'を設定することができます。興味深いことに、オーバーヘッドの違いは何ですか? – Daevin

+0

大きな違いは、SetActiveはオブジェクト上のすべてのスクリプトを制御しますが、レンダリングを有効/無効にするだけであれば、他のスクリプトは引き続き実行されます。私の個人的な意見では、これはTrackedPlaneVisualizerのバグだと思うが、メッシュが変化してレンダラーの状態がチェックされたときにレンダラーを再び有効にする。 –

関連する問題