将加载的预制件附加到对象的Unity 3D奇怪行为

时间:2018-07-05 10:21:12

标签: c# unity3d

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

该字符称为“ MrPresident”,它具有一个附加点“ 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);
}

值在各处飞来飞去。在第一个Update上,输出的第一行是(0,0,0),但之后的位置在更新过程中每个周期都会改变。它附加到的角色是动画的,但只是就位,我认为相对于附加点的位置应保持在我设置的位置不变。如果我删除了行

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

然后位置保持在(0,0,0),但是因为我没有附加到Approprite父对象(附加点),所以该位置显然是错误的。我在这里想念什么吗?感谢您的帮助。

编辑

我发现我应该使用

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之类的格式,则可以正常工作。如果我将其设置为我要附加到预制件中的最高父级,则它可以工作。但是,如果我尝试将其附加到附加点,它将消失。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

请不要使用transform.parent来设置GameObject的父代。使用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);