[英]vuforia doesn't accept old script for AR unity app
我的朋友为我创建了一个代码,让我在统一中使用 vuforia 创建一个 AR 应用程序,它完全可以正常工作。 现在我使用新版本的 vuforia 安装新的统一它显示一些错误我发现应用了一些更改,例如“MonoBehaviour,ITrackableEventHandler”更改为“DefaultTrackableEventHandler”,但我有一些无法理解的错误:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
public class Shutter0 : DefaultTrackableEventHandler
{
TrackableBehaviour mTrackableBehaviour;
GameObject derakht;
string IP;
public int port;
GameObject TextMesh;
public string myText;
// "connection" things
IPEndPoint remoteEndPoint;
UdpClient client;
// Start is called before the first frame update
void Start()
{
derakht = GameObject.Find("derakht");
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
//OnTrackingLost();
IP = "127.0.0.1";
port = 8050;
string myText = "25j";
remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP), port);
client = new UdpClient();
// status
print("Sending to " + IP + " : " + port);
}
// Implementation of the ITrackableEventHandler function called when the
// tracking state changes.
public void OnTrackableStateChanged(
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED)
{
OnTrackingFound();
}
}
private void OnTrackingFound()
{
try
{
// encode string to UTF8-coded bytes
myText = "0";
byte[] data = Encoding.UTF8.GetBytes(myText);
// send the data
client.Send(data, data.Length, remoteEndPoint);
}
catch (Exception err)
{
print(err.ToString());
}
}
}
错误应该是不言自明的
TrackableBehaviour
不包含RegisterTrackableEventHandler
的定义
这种方法根本不存在(不再存在)。
你可能更喜欢RegisterOnTrackableStatusChanged
mTrackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStateChanged);
顺便说一句,我不会继承DefaultTrackableEventHandler
tbh .. 这有点糟糕^^
我宁愿实现我自己的喜欢
[RequireComponent(typeof(TrackableBehaviour))]
public class TrackableEventHandlerEvents : MonoBehaviour
{
[SerializeField] private TrackableBehaviour _trackableBehaviour;
public UnityEvent onTrackingFound;
public UnityEvent onTrackingLost;
private void Awake()
{
if(!_trackableBehaviour) _trackableBehaviour = GetComponent<TrackableBehaviour>();
if(!_trackableBehaviour)
{
Debug.LogError($"This component requires a {nameof(TrackableBehaviour)} !", this);
return;
}
_trackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStateChanged);
}
/// <summary>
/// called when the tracking state changes.
/// </summary>
private void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
{
switch(newStatus)
{
case TrackableBehaviour.Status.DETECTED:
case TrackableBehaviour.Status.TRACKED:
case TrackableBehaviour.Status.EXTENDED_TRACKED:
OnTrackingFound();
break;
default:
OnTrackingLost();
break;
}
}
protected virtual void OnTrackingFound()
{
Debug.Log("Trackable " + _trackableBehaviour.TrackableName + " found");
onTrackingFound.Invoke();
}
protected virtual void OnTrackingLost()
{
Debug.Log("Trackable " + _trackableBehaviour.TrackableName + " lost");
onTrackingLost.Invoke();
}
}
为什么? → 因为这样你
可以让任何其他方法通过 Inspector 添加回调(如在按钮UnityEvent
onClick
)或通过代码使用例如
_trackableEventHandlerEvents.onTrackingLost.AddCallback(() => Debug.Log("Hello World;"));
您可以通过从该组件继承并扩展例如直接扩展方法
protected override void OnTrackingFound() { // You can keep the default behavior // or if you remove this line you can completely overwrite the behavior base.OnTrackingFound(); // Additional behavior }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.