C# ARCore Unity-触摸/更新帧问题
我目前正在使用C#中的ARCore和Unity3D创建AR应用程序 我的目标是通过触摸屏幕将两个物体放置在表面上。在获得两个对象之间的距离后,我以编程方式将几个对象放置在两个主要对象之间 代码放在Update()函数中,因为它需要触摸,并且一些按钮需要闪烁 我在技术上成功地实现了它,但问题是update()函数中的Touch在每一帧都被调用,并且会干扰应该更新的块线,即使周围有条件块也会干扰 代码块DrawPoints()创建并显示两个对象“target1”和“target2”之间的对象,它可以很好地更新并保持不变。但如果我触摸屏幕,它就会消失C# ARCore Unity-触摸/更新帧问题,c#,unity3d,augmented-reality,arcore,C#,Unity3d,Augmented Reality,Arcore,我目前正在使用C#中的ARCore和Unity3D创建AR应用程序 我的目标是通过触摸屏幕将两个物体放置在表面上。在获得两个对象之间的距离后,我以编程方式将几个对象放置在两个主要对象之间 代码放在Update()函数中,因为它需要触摸,并且一些按钮需要闪烁 我在技术上成功地实现了它,但问题是update()函数中的Touch在每一帧都被调用,并且会干扰应该更新的块线,即使周围有条件块也会干扰 代码块DrawPoints()创建并显示两个对象“target1”和“target2”之间的对象,它可以
if (mIsSecondTargetVisible)
{
DrawPoints(target1, target2, Color.red, 0.2f);
}
我尝试在Update()函数中更改此块的位置,但结果仍然相同
void Update()
{
_UpdateApplicationLifecycle();
// Hide snackbar when currently tracking at least one plane.
Session.GetTrackables<DetectedPlane>(m_AllPlanes);
bool showSearchingUI = true;
for (int i = 0; i < m_AllPlanes.Count; i++)
{
if (m_AllPlanes[i].TrackingState == TrackingState.Tracking)
{
showSearchingUI = false;
break;
}
}
SearchingForPlaneUI.SetActive(showSearchingUI);
Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)
{
return;
}
TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
TrackableHitFlags.FeaturePointWithSurfaceNormal;
if(!EventSystem.current.IsPointerOverGameObject(touch.fingerId))
{
if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
{
if ((hit.Trackable is DetectedPlane) &&
Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
hit.Pose.rotation * Vector3.up) < 0)
{
Debug.Log("Hit at back of the current DetectedPlane");
}
else
{
anchor = hit.Trackable.CreateAnchor(hit.Pose);
if (mIsFirsttargetVisible == false){
target1 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target1.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target1.transform.parent = anchor.transform;
mIsFirsttargetVisible = true;
}
else if (mIsSecondTargetVisible == false){
target2 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target2.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target2.transform.parent = anchor.transform;
mIsSecondTargetVisible = true;
}
}
}
}
if (mIsSecondTargetVisible)
{
DrawPoints(target1, target2, Color.red, 0.2f);
}
}
我解决了我的问题,这里是最后的代码,加上解释。请注意,行块的顺序很重要
void Update()
{
_UpdateApplicationLifecycle();
// Hide snackbar when currently tracking at least one plane.
Session.GetTrackables<DetectedPlane>(m_AllPlanes);
bool showSearchingUI = true;
for (int i = 0; i < m_AllPlanes.Count; i++)
{
if (m_AllPlanes[i].TrackingState == TrackingState.Tracking)
{
showSearchingUI = false;
break;
}
}
SearchingForPlaneUI.SetActive(showSearchingUI);
Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)
{
return;
}
// Should not handle input if the player is pointing on UI.
if (EventSystem.current.IsPointerOverGameObject(touch.fingerId))
{
return;
}
if (mIsSecondTargetVisible)
{
return;
}
TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
TrackableHitFlags.FeaturePointWithSurfaceNormal;
if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
{
if ((hit.Trackable is DetectedPlane) && Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
hit.Pose.rotation * Vector3.up) < 0)
{
Debug.Log("Hit at back of the current DetectedPlane");
}
else
{
anchor = hit.Trackable.CreateAnchor(hit.Pose);
if (mIsFirsttargetVisible == false){
target1 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target1.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target1.transform.parent = anchor.transform;
mIsFirsttargetVisible = true;
}
else if (mIsSecondTargetVisible == false){
target2 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target2.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target2.transform.parent = anchor.transform;
mIsSecondTargetVisible = true;
}
}
}
if (mIsSecondTargetVisible)
{
DrawPoints(target1, target2, Color.red, 0.2f);
}
}
关于下面的线框,需要连续显示对象但受到触摸屏Arcore raycast干扰的用户:
if (mIsSecondTargetVisible)
{
DrawPoints(target1, target2, Color.red, 0.2f);
}
为了避免触摸,我在触摸框光线投射上方添加了此条件:
if (mIsSecondTargetVisible)
{
return;
}
我解决了我的问题,这里是最后的代码,加上解释。请注意,行块的顺序很重要
void Update()
{
_UpdateApplicationLifecycle();
// Hide snackbar when currently tracking at least one plane.
Session.GetTrackables<DetectedPlane>(m_AllPlanes);
bool showSearchingUI = true;
for (int i = 0; i < m_AllPlanes.Count; i++)
{
if (m_AllPlanes[i].TrackingState == TrackingState.Tracking)
{
showSearchingUI = false;
break;
}
}
SearchingForPlaneUI.SetActive(showSearchingUI);
Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)
{
return;
}
// Should not handle input if the player is pointing on UI.
if (EventSystem.current.IsPointerOverGameObject(touch.fingerId))
{
return;
}
if (mIsSecondTargetVisible)
{
return;
}
TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
TrackableHitFlags.FeaturePointWithSurfaceNormal;
if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
{
if ((hit.Trackable is DetectedPlane) && Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
hit.Pose.rotation * Vector3.up) < 0)
{
Debug.Log("Hit at back of the current DetectedPlane");
}
else
{
anchor = hit.Trackable.CreateAnchor(hit.Pose);
if (mIsFirsttargetVisible == false){
target1 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target1.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target1.transform.parent = anchor.transform;
mIsFirsttargetVisible = true;
}
else if (mIsSecondTargetVisible == false){
target2 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target2.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target2.transform.parent = anchor.transform;
mIsSecondTargetVisible = true;
}
}
}
if (mIsSecondTargetVisible)
{
DrawPoints(target1, target2, Color.red, 0.2f);
}
}
关于下面的线框,需要连续显示对象但受到触摸屏Arcore raycast干扰的用户:
if (mIsSecondTargetVisible)
{
DrawPoints(target1, target2, Color.red, 0.2f);
}
为了避免触摸,我在触摸框光线投射上方添加了此条件:
if (mIsSecondTargetVisible)
{
return;
}