实例化方法确实在画布内绘制预制按钮,而不是用正确的预制尺寸绘制它

时间:2014-12-16 11:10:03

标签: c# canvas unity3d

我的场景有基本的游戏对象(相机,带有两个孩子imagebutton的画布)。 enter image description here

我制作一个按钮的预制件,现在预制件在项目视图中,我想在脚本中实例化这个预制按钮,我希望它在画布内绘制。

为此,我制作一个脚本文件,将其作为脚本组件附加到画布上。这是我的脚本实现:

using UnityEngine;

public class QuizManager : MonoBehaviour {

    public Transform suggestionBtn;

    // Use this for initialization
    void Start () {
        Instantiate (suggestionBtn, new Vector3 (100, 400, 0), Quaternion.identity);
}


// Update is called once per frame
    void Update () {

    }
}

当然,suggestionBtn是预制件,这就是我将它引用到脚本变量的原因(将预制件从项目视图拖到脚本组件中)。

enter image description here

现在,当我运行游戏时,我注意到预制件的克隆被添加到层次结构视图中的所有游戏对象之上(我希望将它添加到画布中):

enter image description here

它也有错误的尺寸(非常小,几乎看不到),这里是我放大后的样子

enter image description here

所以我的问题是如何正确地使用正常尺寸实例化预制件并相对于画布(画布的子画面)正确定位?

由于

2 个答案:

答案 0 :(得分:4)

您可以通过将实例分配给变量然后更改其父级来正确初始化转换(在正确的游戏对象层次结构下)。

public class QuizManager : MonoBehaviour {

    public Transform suggestionBtn;

    // Use this for initialization
    void Start () {
        Transform clone =  (Transform)Instantiate (suggestionBtn, 
                           new Vector3 (100, 400, 0), Quaternion.identity);

        // make instance the child of current object
        clone.parent = gameObject.transform; 

        // adjust the scale
        clone.transform.localScale = new Vector3(Xval, Yval, Zval);
    }

}

您可以在实例化后更改指定的localScale变量中的clone

答案 1 :(得分:0)

在运行时从层次结构视图的屏幕截图中,您实例化的按钮不会嵌套在Canvas下,因此它不会由Canvas Renderer呈现。

实例化它时,需要将transform.parent设置为画布游戏对象的变换。

var newButton = Instantiate (suggestionBtn, new Vector3 (100, 400, 0), Quaternion.identity) as GameObject;
newButton.transform.parent = GameObject.Find("Canvas").transform;