从该游戏对象上的脚本实例化游戏对象

时间:2014-12-10 13:49:52

标签: c# unity3d instantiation gameobject

我有一个名为DialogueController的脚本,它附加到画布上。我想从DialogueController脚本中实例化该画布。每当我尝试这样做时,通过Unity编辑器分配给画布的所有公共对象都被设置为null(包括画布本身,这是我试图实例化的)。

有一种简单的方法吗?我有一个替代解决方案,但能够做到这一点将使我的代码稍微划分。

2 个答案:

答案 0 :(得分:1)

您可以使用resources folders(以及Resources.Load()方法)从脚本本身初始化这些变量。这样的事情:

//The canvas is at the path "Assets/Resources/canvas".

function Start () { 
    your_canvas = Instantiate(Resources.Load("canvas")); 
} 

答案 1 :(得分:0)

从评论中,您似乎需要该Canvas的初始“种子”实例,其中包含您的脚本,以便在需要时实例化更多副本。第2部分最适合您的需求

最简单的方法是在场景中放置一个所述画布的实例。您可以通过取消检查器中的小复选框来“禁用”可绘制/可见画布部分,然后让它自己在GameObject上的脚本函数中启用...

void Start ()
{
    thisCanvas = GetComponent<Canvas>();
    thisCanvas.enabled = true;
}

当然,另一种方法就是从场景中已有的另一个脚本中实例化一个副本 - 经典案例:  在场景中创建一个BLANK GameObject(CTRL + Shift + N),[F2]将其重命名为“GameManager”(当游戏对象名称为BTW时有空格时,某些统一函数仍会出错)然后附加一个名为GameManager的新脚本。  这个脚本基本上只是为了确保加载正确的场景,并实例化某些预制件,建立网络连接,设置你没有从编辑器中完成的播放器变量等等  这样:

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour
{

    public GameObject myObject;

    void Start ()
    {
        Instantiate(myObject, transform.position, transform.rotation);
    }

}

现在将您要实例化的“预制件”拖放到检查器中“GameManager”的插槽中。  请注意,它不一定是游戏开始的时候,另一个例子是GameManager脚本有一个函数在需要登录时监听,并且在那时 - 它实例化你的登录对话框。