【问题标题】:Instantiate gameobject from a script that is on that gameobject从该游戏对象上的脚本实例化游戏对象
【发布时间】:2014-12-10 13:49:52
【问题描述】:

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

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

【问题讨论】:

  • 您是指函数Instantiate() 还是口语中的“设置值并做好准备”?我问是因为从这里写的内容来看有点令人困惑......您正在尝试创建已经存在的东西? =s ps [unity3d] 标签在这里不是 [unity] :)
  • 嗨,是的,我的意思是实例化。预制件已经存在,但它不存在于场景本身中。我正在尝试使用 DialogueController 脚本将画布放入场景中,该脚本位于画布本身上。

标签: c# unity3d instantiation gameobject


【解决方案1】:

您可以使用resources folders(和 Resources.Load() 方法)从脚本本身初始化这些变量。类似的东西:

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

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

【讨论】:

  • 非常好,是的,我认为这将是最好的解决方案。非常感谢!
【解决方案2】:

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

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

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

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

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour
{

    public GameObject myObject;

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

}

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

【讨论】:

  • 太好了,谢谢您的回复。我最终实施的解决方案(在看到您上面的回复之前)是第二种解决方案。我将 GameObject 附加到该脚本并从那里实例化它。两个很棒的解决方案!
猜你喜欢
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
相关资源
最近更新 更多