c# - Unity - Vuforia - Raycast Hits 在 Unity 编辑器上运行良好,但在 Android 设备构建上存在错误
问题描述
对于我的学士论文,我正在增加物理纸质地图。因此,如标题中所写,我使用 unity 与 vuforia 结合来进行图像目标检测和其他功能。
到目前为止,一切都很好。
现在的问题:
我使用在地图旁边增加的立方体元素作为交互元素来过滤投影内容。那些立方体上有盒子对撞机。我将以下“buttonController”脚本附加到我的 AR 相机上,它应该处理这些立方体上的 Raycast 命中并触发更多功能。
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class ButtonController : MonoBehaviour
{
public AudioClip[] audioClips;
public AudioSource myAudioSource;
private string btnName;
private GameObject[] stations;
private void Start()
{
myAudioSource = GetComponent<AudioSource>();
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
//Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 tapPositionFar = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.farClipPlane);
Vector3 tapPositionNear = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane);
Vector3 tapPosF = Camera.main.ScreenToWorldPoint(tapPositionFar);
Vector3 tapPosN = Camera.main.ScreenToWorldPoint(tapPositionNear);
int layerMask = LayerMask.GetMask("Button", "Pin");
RaycastHit hit;
if (Physics.Raycast(tapPosN, tapPosF - tapPosN, out hit, Mathf.Infinity, layerMask))
{
btnName = hit.transform.name;
Debug.Log("NAME OF HIT TARGET: " + hit.transform.name);
myAudioSource.clip = audioClips[0];
myAudioSource.Play();
switch (btnName)
{
case "buttonRoute1":
Debug.Log("In: CASE 1");
playAnimation(btnName);
stations = GameObject.FindGameObjectsWithTag("Route1");
Debug.Log(stations);
LineRenderer lineRenderer = GetComponent<LineRenderer>();
foreach (GameObject station in stations)
{
MeshRenderer mRenderer = station.GetComponent<MeshRenderer>();
if (mRenderer.enabled == true)
{
mRenderer.enabled = false;
}
else
{
mRenderer.enabled = true;
}
}
return;
case "buttonRoute2":
Debug.Log("In: CASE 2");
playAnimation(btnName);
return;
case "buttonRoute3":
Debug.Log("In: CASE 3");
playAnimation(btnName);
return;
case "buttonRoute4":
Debug.Log("In: CASE 4");
playAnimation(btnName);
return;
case "buttonRoute5":
Debug.Log("In: CASE 5");
playAnimation(btnName);
return;
case "buttonRoute6":
Debug.Log("In: CASE 6");
playAnimation(btnName);
return;
}
}
else
{
//Debug.DrawRay(ray.origin, ray.direction * 1000, Color.white);
Debug.Log("NOTHING HAPPENED WITH MOUSE");
}
}
}
void playAnimation(string btnName)
{
GameObject currentGameObject = GameObject.Find(btnName);
Animation anim = currentGameObject.GetComponent<Animation>();
anim.Play();
}
}
这个立方体在统一场景中设置为特殊的 XZ 坐标,并且在运行时不会在另一个脚本中以编程方式移动。
我还增加了放置在图像目标的 0/0/0 上的引脚,并在运行时重新定位到由其 LatLong 坐标计算的新 XZ 坐标。上面的脚本也检测到他们的 Raycast 命中。
当我在编辑器中运行我的应用程序时,一切正常。每个元素,立方体和大头针,都会像它们应该的那样被光线投射击中。
到目前为止,一切都很好。
当我构建 android 版本并将其安装到我的 xiaomi android 手机时,raycast 不会像他们应该的那样命中。当我在地图旁边的原始位置触摸立方体时,我根本没有受到任何打击。但是我在下图中看到的蓝色标记区域被击中。
看起来侧面立方体的 boxcolliders 在运行时都移动到我的 imagetarget 的 0/0/0 位置,尽管模型保持其原始位置。
尽管引脚上有活动的网格碰撞器并且在编辑器中也被击中,但它们根本没有受到任何命中。
我现在非常绝望,因为我已经尝试过我在数千个威胁中找到的每一个建议。
我尝试设置一个新的 AR 相机元素,将脚本移动到另一个对象,更改层次结构,更改碰撞器,重置碰撞器,从鼠标点击到触摸的不同光线投射脚本,使用不同的设备,......等等。
如果你们中的任何人可能暗示问题可能是什么,我将非常感激。
如果需要更多信息,请告诉我!
感谢到目前为止。问候
编辑:
@Philipp Lenssen 和其他人
就像我已经说过的那样,我认为对撞机在运行时会移动。我调试了 buttonRoute 1 和 buttonRoute 2 的碰撞器,同时击中了屏幕截图 1 中的蓝色标记区域。
我被击中并且对撞机的位置完全不同。
标记为绿色和黄色的立方体是用于可视化 Route 1 和 Route 2 的 boxcolliders 的立方体 Button cube 在地图旁边
他们甚至不在同一个错误的位置。一个在 Y 轴的 0 上方,一个在下方。它们的 X 和 Z 坐标非常奇怪。他们应该保持地图旁边显示的绿色路线 2 和黄色路线 1 按钮 3d 元素的位置!
我不知道为什么会发生这种情况......
编辑:
我已经将整个项目重建为一个新的干净的项目。我还将我的 Android SDK 更新到了最新版本。现在该应用程序可以正常工作了!
解决方案
推荐阅读
- java - 尝试获取方法时Java返回Null
- postgresql - 如何将简单网站连接到 RDS PostgreSQL DB
- c++ - 模板
无效 h(T const(&)[N]); 作为朋友功能 - javascript - 为什么从屏幕底部对新页面渲染做出反应?
- c++ - 在 C++ 中的 BFS 遍历期间,Node 中的子节点列表丢失
- hibernate - JPA 条件查询 order by - 获取重复记录
- one-simulator - 快速创建许多不同的 StationaryMovement 节点
- mysql - 在几个连接之后放置 ON 子句(内部和左侧)
- keycloak - Keycloak Admin CLI:设置客户端属性
- assembly - Mips-Assembly beq 和