【问题标题】:Why is this transform set in this Unity script?为什么在这个 Unity 脚本中设置了这个变换?
【发布时间】:2018-12-30 12:32:55
【问题描述】:

我一直在关注这个很棒的教程:

https://www.youtube.com/watch?v=uxrKE2VKvmc

有时它会为每个目标执行此操作,它会创建一个游戏对象?

如果你看这里的代码:

private void SetupTargets(List<TrackableBehaviour> allTargets)
    {
        Debug.Log("Listing all Targets names:");

        foreach (TrackableBehaviour target in allTargets)
        {
            Debug.Log("Target's name:" + target.TrackableName);

            target.gameObject.transform.parent = transform;
            target.gameObject.name = target.TrackableName;

            target.gameObject.AddComponent<PlaneManager>();

            Debug.Log(target.TrackableName + " created!");
        }
    }

为什么是这行代码?

target.gameObject.transform.parent = transform;

如果我将其注释掉,它仍然可以正常工作..

完整的类代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
using System.Linq;

public class TargetManager : MonoBehaviour
{

    public String mStartingMarkerDatabaseName = "";

    private List<TrackableBehaviour> mAllTargets = new List<TrackableBehaviour>();

    private void Awake()
    {
        VuforiaARController.Instance.RegisterVuforiaStartedCallback(onVuforiaStarted);
    }

    private void onDestroy()
    {
        VuforiaARController.Instance.UnregisterVuforiaStartedCallback(onVuforiaStarted);
    }

    private void onVuforiaStarted()
    {
        LoadDatabase(mStartingMarkerDatabaseName);
        mAllTargets = GetTargets();
        SetupTargets(mAllTargets);
    }

    private void LoadDatabase(string name)
    {
        ObjectTracker objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
        objectTracker.Stop();

        if (DataSet.Exists(name))
        {
            DataSet dataSet = objectTracker.CreateDataSet();
            dataSet.Load(name);
            objectTracker.ActivateDataSet(dataSet);
        }

        objectTracker.Start();
    }

    private List<TrackableBehaviour> GetTargets()
    {
        List<TrackableBehaviour> allTrackables = new List<TrackableBehaviour>();

        allTrackables = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours().ToList();

        return allTrackables;
    }

    private void SetupTargets(List<TrackableBehaviour> allTargets)
    {
        Debug.Log("Listing all Targets names:");

        foreach (TrackableBehaviour target in allTargets)
        {
            Debug.Log("Target's name:" + target.TrackableName);

            target.gameObject.transform.parent = transform; 
            target.gameObject.name = target.TrackableName;

            target.gameObject.AddComponent<PlaneManager>();

            Debug.Log(target.TrackableName + " created!");
        }
    }
}

【问题讨论】:

    标签: unity3d augmented-reality vuforia


    【解决方案1】:
    target.gameObject.transform.parent = transform;
    

    该代码意味着目标游戏对象将是 TargetManager 脚本附加到的任何游戏对象的子对象。

    正如 derHugo 在 cmets 中指出的那样,它是多余的,可以写成

    target.transform.parent = transform;
    

    【讨论】:

    • 目标管理器就在“SampleScene”下面...所以它没有父级?
    • 不,目标管理器没有父级。但我们不是在谈论目标经理。我们谈论的是个人目标本身。这些将是目标经理的孩子。
    • 哦,是的,好吧!所以任何应用于目标管理器的转换都会影响孩子们?
    • 正确。您可以在编辑器中对此进行测试。您可以使一个对象成为另一个对象的子对象。然后,当您移动、旋转或缩放父级时,子级会相应地进行调整。
    • 简单来说,它只是意味着target 将是TargetManager 的子代。不过这有点多余:target.transform.parent =... 就足够了;)
    猜你喜欢
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多