我有一个名为 的脚本DialogueController
,它附加到画布上。我想从DialogueController
脚本中实例化该画布。每当我尝试这样做时,通过 Unity 编辑器分配给画布的所有公共对象都设置为 null(包括画布本身,这是我试图实例化的对象)。
有没有一种简单的方法可以做到这一点?我有一个替代解决方案,但能够做到这一点会使我的代码更加分隔。
我有一个名为 的脚本DialogueController
,它附加到画布上。我想从DialogueController
脚本中实例化该画布。每当我尝试这样做时,通过 Unity 编辑器分配给画布的所有公共对象都设置为 null(包括画布本身,这是我试图实例化的对象)。
有没有一种简单的方法可以做到这一点?我有一个替代解决方案,但能够做到这一点会使我的代码更加分隔。
您可以使用资源文件夹(和 Resources.Load() 方法)从脚本本身初始化这些变量。像这样的东西:
//The canvas is at the path "Assets/Resources/canvas".
function Start () {
your_canvas = Instantiate(Resources.Load("canvas"));
}
从评论来看,您似乎需要该 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 脚本,它有一个函数在需要登录时监听,并且在那个时候 - 它实例化你的登录对话框。