【问题标题】:Unity 3D Strange Behaviour Attaching Loaded Prefab to ObjectUnity 3D奇怪行为将加载的预制件附加到对象
【发布时间】:2018-12-13 19:01:46
【问题描述】:

嘿,每个人都可以使用一些建议。在运行我的程序时,我正在加载一个预制件并将其附加到角色对象的骨骼上。

这个角色被称为“总统先生”,它有一个名为“genSuit_AttachHandRight”的附着点。通过另一个脚本,我调用此函数来加载一个名为“basicBriefcase”的预制件,将其附加到此附加点,并尝试将其相对于附加点的位置设置为 (0, 0, 0)。:

public void Equip(string mode)
{
    // on startup load basic equipment
    if ( mode == "Initialize" )
    {
        // right hand equipment
        string modelRightAttachPoint = championProperties.modelRightAttachPoint;
        string defaultRightHandType = championProperties.defaultRightHandType;
        string defaultRightHandObject = championProperties.defaultRightHandObject;
        if ( defaultRightHandType == "custom")
        {
            string championName = this.name;
            GameObject equipment = Instantiate(Resources.Load("Equipment/" + championName + "/" + defaultRightHandObject, typeof(GameObject))) as GameObject;
            equipment.name = defaultRightHandObject; // gets rid of the (Clone)

            equipment.transform.parent = GameObject.Find(modelRightAttachPoint).transform;
            equipment.transform.position = Vector3.zero;
        }
    }
}

预制件正在层次结构中加载,并且在我按下播放时似乎已附加到附加点,但在游戏视图中无处可见。当我尝试通过运行它进行调试时:

public void Update()
{
    print(GameObject.Find("basicBriefcase").transform.position);
}

价值飞扬四方。第一次更新时输出的第一行是 (0, 0, 0),但之后的位置通过更新每个周期都在变化。它附加的角色是动画的,但它只是坐在原位,我认为相对于附加点的位置应该在我设置的位置保持不变。如果我删除该行

equipment.transform.parent = GameObject.Find(modelRightAttachPoint).transform;

然后位置停留在 (0, 0, 0),但是因为我没有附加到适当的父级(附加点),所以位置显然是错误的。我在这里错过了什么吗?感谢您的帮助。

编辑

我发现我应该使用

equipment.transform.localPosition = Vector3.zero;

而不是 .position 但现在我遇到了一个全新的问题。之前设备可以正常连接到父级,现在当我尝试设置父级时它就消失了。

如果我执行这个语句

GameObject equipment = Instantiate(Resources.Load(startPath + defaultRightHandObject, typeof(GameObject))) as GameObject;

对象出现在没有父级的层次结构中。但如果我尝试这样做:

Transform trans = GameObject.Find("MrPresidentAttachRightHand").transform;     
equipment.transform.SetParent(trans, true);

对象就消失了。它无处可寻,它没有附加到它应该附加到的父级。我试过使用 .parent 和 .SetParent。我已经尝试重新加载它应该附加到的预制件。如果我尝试将父级设置为 Camera.main.transform 之类的东西,它可以工作。如果我将它设置为我试图将其附加到的预制件中的最高父级,它就可以工作。但是,如果我尝试将其附加到附加点,它就会消失。我做错了什么?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    只是不要使用transform.parent 来设置游戏对象的父级。使用transform.SetParent 函数让您指定对象是否应相对于父对象放置。

    应该是:

    Transform trans = GameObject.Find(modelRightAttachPoint).transform;
    equipment.transform.SetParent(trans, true);
    

    如果仍有问题,请将 false 传递给它:

    Transform trans = GameObject.Find(modelRightAttachPoint).transform;
    equipment.transform.SetParent(trans, false);
    

    【讨论】:

    • 感谢您的评论。它不工作。我发现我应该使用 localPosition 而不是 position 来设置位置,但现在我遇到了一个全新的问题。在创建的设备附加到父设备之前,但现在由于某种原因我根本无法将其附加。我已经编辑了问题以详细说明。
    • 看来,如果不是使用 GameObject.Find 来定位 modelRightAttachPoint 对象的变换,而是搜索脚本附加到的当前对象(包含附加点)的子对象附加点,我可以成功附加对象。怎么会起作用,但是在层次结构中搜索附加点不起作用?
    • 可能有多个具有相同名称的对象,或者您将其拼错为另一个游戏对象名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2015-01-30
    相关资源
    最近更新 更多