Getcomponet.var возвращает ноль, но публичная переменная не ноль - PullRequest
0 голосов
/ 03 апреля 2019

У меня проблема, у меня есть список игровых объектов, переданных в функцию.Я получаю игровой объект в списке на I-й позиции и получаю доступ к общедоступной версии сценария, размещенного на игровом объекте.var должен возвращать игровой объект, но возвращает ноль.Вот как работает мой код:

  1. сценарий levelMechanics создает сетку игровых объектов с помощью сценария nodeMechanics
  2. levelMechanics вызывает сценарий roomSpawner, который сообщает каждому узлу запускать там код nodeMechanics, который получаетузлы, окружающие узлы и сохраняющие их в общедоступных переменных

оба эти шага работают отлично, и я могу щелкнуть по каждому узлу, и в иерархии скрипт nodeMechanics, прикрепленный к каждому узлу, сообщит мне узлывыше, ниже, слева и справа от текущего узла.проблема в том, что если я пытаюсь получить доступ к узлам, окружающим узлы, я получаю нулевое значение.что я пытался,

  1. получение списка в roomSpawner путем доступа через levelMechanics вместо levelMechanics, помещая его в roomSpawner.

  2. , передавая в списке икопирование и доступ к скопированному списку.

  3. оба списка [i] .getcomponet (nodemechanics) .nodeDown и список [i] .gameobject.getcomponet (nodemechanics) .nodeDown

  4. получение nodeMechanics узла, его сохранение, а затем попытка получить данные сохраненной nodeMechanics вместо того, чтобы просто прыгнуть прямо в получение данных.

я просто потерян, так какИерархия говорит, что эти переменные не являются нулевыми, но когда я пытаюсь получить к ним доступ в коде, они есть.В следующем коде я пытаюсь получить доступ к vars

  public GameObject test;
  public nodeMechanics temp;

public void IntializeNodes(List<GameObject> nodes)
    {
        for (int i = 0; i < nodes.Count; i++)
        {
            nodes[i].gameObject.GetComponent<nodeMechanics>().test = true;
//im not sure why i am able to write but not read

        }

    }
    public void SpawnObjects(List<GameObject> nodes)
    {
        //this function is being called in level mechanics and the list is being passed in
        print("nodes created");
        for (int i = 0; i < nodes.Count; i++)
        {
            noders.Add(nodes[i]);//the current method is copy over the list and try to access the copy but that doesnt work. i tried not copying
            test = noders[i].gameObject;//ive tried not splint this up and jumping straight into nodes[i]..GetComponent<nodeMechanics>().nodeDown;
            temp = test.GetComponent<nodeMechanics>();
            print(temp.nodeDown);//no matter what i do this always returns null. but in the hierarchy it is not

// это скрипт levelMechanics

   public List<GameObject> objects;
    public List<GameObject> nodes;
    public GameObject floor;
    public float offX, offZ;
    void Awake()
    {
        RoomCheck();
        RoomSetup();
        //GetComponent<roomSpawner>().SpawnEnemys(nodes);
        this.GetComponent<roomSpawner>().IntializeNodes(nodes);
        this.GetComponent<roomSpawner>().SpawnObjects(nodes);


    }
void RoomSetup()
    {
        bool first = true;
        int collCount = -1;
        GameObject placeHolder = new GameObject("temp");
        float colls;

        colls = floor.transform.localScale.x - 1;

        offX = floor.transform.localScale.x;
        offZ = floor.transform.localScale.z;
        offX = (offX / 2) - offX + 1;
        offZ = (offZ / 2) - 1;
        offX = offX + floor.transform.position.x;
        offZ = (offZ + floor.transform.position.z);
        //print(colls);
        for (int i = 0; i < ((floor.transform.localScale.x-1) * (floor.transform.localScale.z-1)); i++)
        {
            collCount++;
            //print(collCount);
            GameObject temp = new GameObject(i + " Node");
            temp.transform.SetParent(floor.transform);
            temp.AddComponent<BoxCollider>();
            temp.GetComponent<BoxCollider>().isTrigger = true;
            temp.AddComponent<nodeMechanics>();
            temp.layer = 9;

            if(!first)
            {
                temp.transform.position = new Vector3((placeHolder.transform.position.x + 1), 6, placeHolder.transform.position.z);
                placeHolder = temp;
                if (collCount >= colls)
                {
                    //print("new line on " + temp.name + " coll " + collCount);
                    collCount = 0;
                    temp.transform.position = new Vector3(floor.transform.localPosition.x + offX, 6, placeHolder.transform.position.z - 1);
                    placeHolder = temp;
                }
            }
            if (first)
            {
                // print(colls);
                temp.transform.position = new Vector3(floor.transform.localPosition.x+offX, 6, floor.transform.localPosition.z+offZ);
                placeHolder = temp;
                first = false;
            }

            nodes.Add(temp);
        }

    }

это скрипт nodeMechanics

public class nodeMechanics : MonoBehaviour
{
    public GameObject nodeUp, nodeDown, nodeLeft, nodeRight, forced;
    public bool test = false;
    void FixedUpdate()
    {
        if (test)
        {
            FindAround();
        }
        if(forced != null)
        {
            Instantiate(forced, this.transform.position, forced.transform.rotation);
        }
    }

    public void FindAround()
    {
        int mask = LayerMask.GetMask("Node");
        RaycastHit up, down, left, right;
        if (Physics.Raycast(this.transform.position, Vector3.forward, out up, 1, mask))
        {
            nodeUp = up.collider.transform.gameObject;
        }
        if (Physics.Raycast(this.transform.position, Vector3.back, out down, 1, mask))
        {
            nodeDown = down.collider.transform.gameObject;
        }
        if (Physics.Raycast(this.transform.position, Vector3.left, out left, 1, mask))
        {
            nodeLeft = left.collider.transform.gameObject;
        }
        if (Physics.Raycast(this.transform.position, Vector3.right, out right, 1, mask))
        {
            nodeRight = right.collider.transform.gameObject;
        }
    }
}

, чтобы уточнитьследующий код не работает должным образом

 for (int i = 0; i < nodes.Count; i++)
        {
            noders.Add(nodes[i]);//the current method is copy over the list and try to access the copy but that doesnt work. i tried not copying
            test = noders[i].gameObject;//ive tried not splint this up and jumping straight into nodes[i]..GetComponent<nodeMechanics>().nodeDown;
            temp = test.GetComponent<nodeMechanics>();
            print(temp.nodeDown);

temp.nodeDown должен возвращать правильный узел, но возвращает ноль, в иерархии он показывает правильный объект, а не нуль

1 Ответ

0 голосов
/ 03 апреля 2019

решено, так как я вызывал spawnRoom сразу после узлов intializeNodes, я полагаю, что единица побежала их друг над другом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...