1

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

有没有一种简单的方法可以做到这一点?我有一个替代解决方案,但能够做到这一点会使我的代码更加分隔。

4

2 回答 2

1

您可以使用资源文件夹(和 Resources.Load() 方法)从脚本本身初始化这些变量。像这样的东西:

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

function Start () { 
    your_canvas = Instantiate(Resources.Load("canvas")); 
} 
于 2014-12-10T15:17:56.843 回答
0

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

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

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

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

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour
{

    public GameObject myObject;

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

}

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

于 2014-12-10T15:35:30.833 回答