如何使用 Unity 在 ARCore 中放置两个或多个 3D 资产
How place two or more 3D assets in ARCore using Unity
我只想在 canvas 上有两个按钮 #1、#2 并且在平面检测之后当我 select 按钮 #1 并点击屏幕时应该放置一个 3D 资产并且当我单击按钮 #2 并点击屏幕应该放置第二个 3D 资产,并且需要删除之前的资产。
一次需要放置一项资产,而当 select 放置另一项资产时,需要移除先前放置的资产。
你看过HelloAR Example了吗?你有: public GameObject AndyAndroidPrefab;
这将被放置在触摸上。因此,您可以修改示例项目中的代码以满足您的需要。
您可以在放置 3D 资产的位置添加两个 public 游戏对象,并移除 AndyAndroidPrefab 资产。
public GameObject obj1_prefab;
public GameObject obj2_prefab;
然后你可以添加一个 bool 变量来显示你点击了哪个按钮。
private bool firstBtnClicked = true;
然后你可以创建两个 public void 函数来处理按钮点击:
public void firstButtonClick()
{
firstBtnClicked = true;
}
public void secondButtonClick()
{
firstBtnClicked = false;
}
然后您可以将功能添加到 canvas 按钮:
然后你必须在 instantiate the object:
的地方进行更改
//Test if already an object exists and delete it:
if (GameObject.Find("Anchor/myobject") != null)
{
GameObject parentanchor = GameObject.Find("Anchor/myobject").transform.parent.gameObject;
Destroy(parentanchor);
}
GameObject obj = null;
if (firstBtnClicked == true)
{
// Instantiate first Asset model at the hit pose.
obj = Instantiate(obj1_prefab, hit.Pose.position, hit.Pose.rotation);
}
else
{
// Second button clicked: Instantiate second Asset model at the hit pose.
obj = Instantiate(obj2_prefab, hit.Pose.position, hit.Pose.rotation);
}
// Compensate for the hitPose rotation facing away from the raycast (i.e. camera).
obj.transform.Rotate(0, k_ModelRotation, 0, Space.Self);
obj.name = "myobject";
// Create an anchor to allow ARCore to track the hitpoint as understanding of the physical
// world evolves.
var anchor = hit.Trackable.CreateAnchor(hit.Pose);
// Make the object model a child of the anchor.
obj.transform.parent = anchor.transform;
所以现在,如果您单击按钮 one,您将 select 您的第一个对象,并且在触摸屏幕后放置第一个资产。当您单击第二个按钮时,您会将第二个对象放置在屏幕触摸上。
我只想在 canvas 上有两个按钮 #1、#2 并且在平面检测之后当我 select 按钮 #1 并点击屏幕时应该放置一个 3D 资产并且当我单击按钮 #2 并点击屏幕应该放置第二个 3D 资产,并且需要删除之前的资产。 一次需要放置一项资产,而当 select 放置另一项资产时,需要移除先前放置的资产。
你看过HelloAR Example了吗?你有: public GameObject AndyAndroidPrefab;
这将被放置在触摸上。因此,您可以修改示例项目中的代码以满足您的需要。
您可以在放置 3D 资产的位置添加两个 public 游戏对象,并移除 AndyAndroidPrefab 资产。
public GameObject obj1_prefab;
public GameObject obj2_prefab;
然后你可以添加一个 bool 变量来显示你点击了哪个按钮。
private bool firstBtnClicked = true;
然后你可以创建两个 public void 函数来处理按钮点击:
public void firstButtonClick()
{
firstBtnClicked = true;
}
public void secondButtonClick()
{
firstBtnClicked = false;
}
然后您可以将功能添加到 canvas 按钮:
然后你必须在 instantiate the object:
的地方进行更改 //Test if already an object exists and delete it:
if (GameObject.Find("Anchor/myobject") != null)
{
GameObject parentanchor = GameObject.Find("Anchor/myobject").transform.parent.gameObject;
Destroy(parentanchor);
}
GameObject obj = null;
if (firstBtnClicked == true)
{
// Instantiate first Asset model at the hit pose.
obj = Instantiate(obj1_prefab, hit.Pose.position, hit.Pose.rotation);
}
else
{
// Second button clicked: Instantiate second Asset model at the hit pose.
obj = Instantiate(obj2_prefab, hit.Pose.position, hit.Pose.rotation);
}
// Compensate for the hitPose rotation facing away from the raycast (i.e. camera).
obj.transform.Rotate(0, k_ModelRotation, 0, Space.Self);
obj.name = "myobject";
// Create an anchor to allow ARCore to track the hitpoint as understanding of the physical
// world evolves.
var anchor = hit.Trackable.CreateAnchor(hit.Pose);
// Make the object model a child of the anchor.
obj.transform.parent = anchor.transform;
所以现在,如果您单击按钮 one,您将 select 您的第一个对象,并且在触摸屏幕后放置第一个资产。当您单击第二个按钮时,您会将第二个对象放置在屏幕触摸上。