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の初心者です。
ありがとうございます!これはうまくいった! –
私は以前に 'GameObject'(つまり' PlaneWrapper')を実装して、 'Instantiate(plane、Vector3.zero、Quaternion.identity、PlaneWrapper.transform)'を実行しました。そうすれば、 'PlaneWrapper.SetActicve([true | false])'を設定することができます。興味深いことに、オーバーヘッドの違いは何ですか? – Daevin
大きな違いは、SetActiveはオブジェクト上のすべてのスクリプトを制御しますが、レンダリングを有効/無効にするだけであれば、他のスクリプトは引き続き実行されます。私の個人的な意見では、これはTrackedPlaneVisualizerのバグだと思うが、メッシュが変化してレンダラーの状態がチェックされたときにレンダラーを再び有効にする。 –