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 は、あなたのニーズに最も一般的です

最も簡単な方法は、前述のキャンバスの 1 つのインスタンスを既にシーンに配置することです。インスペクターの小さなチェックボックスのチェックを外すことで、描画可能/表示可能なキャンバス部分を「無効」にしてから、ゲームオブジェクトのスクリプトの関数でそれ自体を有効にすることができます...

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

もちろん、もう 1 つの方法は、シーンに既にある別のスクリプトから 1 つのコピーをインスタンス化することです - 古典的なケース: シーンに空のゲームオブジェクトを作成し (CTRL+Shift+N)、[F2] 名前を「GameManager」に変更します ( GameObject 名にスペースが含まれている場合、一部のユニティ関数は依然としてバグアウトし、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 に答える