如何使用Unity将两个或多个3D资产放置在ARCore中

时间:2018-06-29 07:03:42

标签: unity3d arcore

我只想在画布上有两个按钮#1,#2,并且在检测到平面后,当我选择按钮#1并点击屏幕时,应该放置一个3D资源,而当我单击按钮#2并点击屏幕秒时应该放置3D资产,并且需要删除之前的资产。 一次需要放置一项资产,而在选择另一项资产时,则需要移除先前放置的资产。

1 个答案:

答案 0 :(得分:0)

您看过HelloAR Example吗?您将在其中找到:public GameObject AndyAndroidPrefab;将与您保持联系。因此,您可以从示例项目中修改该代码以适合您的需求。

您可以在放置3D资产的地方添加两个公共GameObject,并删除AndyAndroidPrefab资产。

public GameObject obj1_prefab;
public GameObject obj2_prefab;

然后,您不能添加一个bool变量来显示单击哪个按钮。

private bool firstBtnClicked = true;

然后,您可以创建两个公共无效函数,以处理按钮单击:

public void firstButtonClick()
{
    firstBtnClicked = true;
}

public void secondButtonClick()
{
    firstBtnClicked = false;
}

然后,您可以将功能添加到画布按钮: enter image description here

然后,您必须在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;

因此,现在,如果您单击一个按钮,则将选择第一个对象,然后在屏幕上触摸后将放置第一个资产。当您单击第二个按钮时,会将第二个对象放在屏幕上。