
[code]

    GameObject[] go1;
    GameObject[] go2;
    GameObject[] go3;
    string[] tag = { "A", "B", "C"};
    
    Dictionary<int, GameObject[]> Dict = new Dictionary<int, GameObject[]>();
    Dict.Add(0, go1);
    Dict.Add(1, go2);
    Dict.Add(2, go3);
    
    for (int i = 0; i < tag.Length; i++)
    {
        Dict[i] = GameObject.FindGameObjectsWithTag(tag[i]);
    }
    
[/code]

以上のコードを書き、タグで一括取得したGameObject群をハッシュテーブルと繰り返しを使って一括で走査しようと試みたところ、以下のように「インスタンス化されていない」というエラーが表示されました。

[code]

    NullReferenceException: Object reference not set to an instance of an object
    
[/code]

GameObject群を一括で取得する際にインスタンス化されていないと表示されるエラーを解決するにはどうしたらよいでしょうか？


CC BY-SA 3.0
2014-12-19T10:01:43.147
2129
2015-02-08T12:36:50.873
2015-02-08T12:36:50.873
935
2487
question
unity3d c#
UnityでC#のハッシュテーブルを使った時に、GameObject[]がインスタンス化されない


`go1`から`go3`までインスタンス化されていないように見受けられますが、

[code]

    Dict.Add(0, go1);
    Dict.Add(1, go2);
    Dict.Add(2, go3);
    
[/code]

の部分は`GameObject.FindGameObjectsWithTag()`が正しく`GameObject`の配列を返すのであれば不要ではないかと考えます。

[code]

    string[] tag = { "A", "B", "C"};
    Dictionary<int, GameObject[]> dict = new Dictionary<int, GameObject[]>();
    for (int i = 0; i < tag.Length; i++)
    {
        dict[i] = GameObject.FindGameObjectsWithTag(tag[i]);
    }
    
[/code]

では動きませんか？


CC BY-SA 3.0
2014-12-19T10:36:21.853
2132
2014-12-19T10:36:21.853
3313
2129
answer


配列で設定されているGameObjectがどのように設定されているかによるかとは思いますが、 もし、Inspectorなどで手動で設定されているのであれば、
Dictionaryで追加されている各GameObjectのAwakeが実行される前ならば、
インスタンス化されていないとエラーが出るのは仕方がないことだと思います。

もしMonoBehaviourのAwakeで上記の処理が実行されているようであれば、Startに移動することによって
問題なく動作したりするのではないでしょうか。


CC BY-SA 3.0
2014-12-19T13:45:21.760
2151
2014-12-19T13:45:21.760
5280
2129
answer


Cube等のGameObjectをいくつか作成してそれぞれTagにA、B、Cを設定し、下記のScriptをScene内の任意のGameObjectへAddComponentすると、動作すると思われますがいかがでしょう？

[code]

    using System.Collections.Generic;
    using UnityEngine;
    using System.Collections;
    
    public class GameManager : MonoBehaviour
    {
        private static readonly string[] Tags = { "A", "B", "C" };
    
        private readonly Dictionary<int, GameObject[]> _dict = new Dictionary<int, GameObject[]>();
        private int _counter;
    
        void Start()
        {
            for (var i = 0; i < Tags.Length; i++)
            {
                _dict[i] = GameObject.FindGameObjectsWithTag(Tags[i]);
            }
            StartCoroutine(SampleCoroutine());
        }
    
        IEnumerator SampleCoroutine()
        {
            while (true)
            {
                yield return new WaitForSeconds(2f);
    
                foreach (var targetObject in _dict[_counter % _dict.Count])
                {
                    //対象のGameObjectが縦に伸びる
                    targetObject.transform.localScale += new Vector3(0, 0.5f);
                }
    
                _counter++;
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2014-12-22T08:26:04.823
2375
2014-12-22T08:26:04.823
4077
2129
answer