之前总结过一个动态加载识别数据的方法,这次用在ModelTarget案例中,发现问题,无法同时存在两个DataSet,就是说要在加载第二个数据时候,把之前的数据清掉。因此找到如下方法清除历史数据:
public static void DeactivateDateset(string datasetName)
{
ObjectTracker objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
IEnumerable<DataSet> activeDataSets = objectTracker.GetActiveDataSets();
List<DataSet> activeDataSetsToBeRemoved = activeDataSets.ToList();
List<DataSet> dataSetsToBeActive = new List<DataSet>();
foreach (DataSet ads in activeDataSetsToBeRemoved)
{
objectTracker.DeactivateDataSet(ads);
if (!ads.Path.Contains(datasetName))
{
dataSetsToBeActive.Add(ads);
}
else
{
objectTracker.DestroyDataSet(ads, false);
var trackables = ads.GetTrackables();
foreach (var item in trackables)
{
TrackerManager.Instance.GetStateManager().DestroyTrackableBehavioursForTrackable(item, true);
}
}
}
objectTracker.Stop();
foreach (DataSet ds in dataSetsToBeActive)
{
objectTracker.ActivateDataSet(ds);
}
objectTracker.Start();
}
这个方法要在加载数据之前调用,可以看到方法中需要传入一个string类型的参数来清除指定的数据,那么我们就需要一个变量来存储当前已加载上的DataSet的名称,在需要加载下一个的时候把之前的清掉。
if (curDataName != dataName)
{
DeactivateDateset(curDataName);
Destroy(GameObject.Find(curDataName));
curDataName = dataName;
}
else
{
DeactivateDateset(dataName);
Destroy(GameObject.Find(dataName));
}
如此一来,动态加载识别数据的方法,可以用到ModelTarget这种同时只能存在一个数据集的情况。也可以在允许存在多个数据集的时候,根据需要将不再使用的数据集清掉。
动态加载数据的方法可以到以前的文章中看:https://blog.csdn.net/Delesgues/article/details/87979766