Как бы я проверил отдельные огни, если мой булево значение истинно постоянно - PullRequest
0 голосов
/ 27 октября 2018

Мне нужен способ проверить все сценарии, если логическое значение истинно, а затем способ в этом сценарии, чтобы увидеть в операторе if текущего источника света, рядом с которым стоит персонаж, имеет логическое значение true, чтобы активировать, и только после этого должен быть создан экземпляр.функция должна быть запущена.

private bool Once = true;
public Transform Spawnpoint1;
public Transform Spawnpoint2;

public GameObject Prefab1;
public GameObject Prefab2;

//Something like this, but I don't know where to go after that
GameObject[] Lights = GameObject.FindGameObjectsWithTag("lightSwitch");
//foreach(GameObject Light in Lights)

void OnTriggerEnter2D(Collider2D collision)
{
    if (Once == true)
    {
        Debug.Log("It's true");
        if (LightOnOff.isON == true) // It needs to check this constantly
        {
            Debug.Log(" It's Lit");
            Instantiate(Prefab1, Spawnpoint1.position, Spawnpoint1.rotation);

            Instantiate(Prefab2, Spawnpoint2.position, Spawnpoint2.rotation);

            Once = false;
        }
    }
}

здесь также есть сценарий Light

public static bool isON;

public void lightOn()
{
    this.GetComponent<Light>().enabled = true;
    isON = true;
}

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Прежде всего, вы не должны использовать static

public static bool isON;

для индивидуального значения! static делает значение «неэкземплярным» значением, то есть оно принадлежит всему классу, а не экземплярам => Проще говоря, эта переменная является общей для всех ваших компонентов (см. этот пост * Дополнительная информация). Вместо этого используйте

public bool isON;

Чем получить доступ к переменной insteance компонента, например
Обновление: из комментариев я теперь знаю, что на самом деле компоненты находятся не на объекте коллайдера, а на дочернем объекте, к которому этот скрипт прикреплен

void OnTriggerEnter2D(Collider2D collision)
{
    // Update. TODO check if the correct Object collided
    //if(!collision.gameObject == <your player>)

    if (!Once) return;

    // Update this now searches in its own children instead of children of collision
    var lightOnOff = GetComponentInChildren<LightOnOff>(true);
    if(!lightOnOff)
    {
        Debug.Log("No LightOnOff found on collision" + collision.name, this);
        return;
    }

    Debug.Log("It's true");
    if (!LightOnOff.isON) return;

    Debug.Log(" It's Lit");
    Instantiate(Prefab1, Spawnpoint1.position, Spawnpoint1.rotation);
    Instantiate(Prefab2, Spawnpoint2.position, Spawnpoint2.rotation);

    Once = false;
}

Но вместо использования компонента LightOnOff вы также можете просто получить доступ к компоненту Light и сделать что-то вроде
Обновление: Из комментариев я теперь знаю, что на самом деле компоненты находятся не на объекте коллайдера, а на дочернем объекте, к которому этот скрипт прикреплен

void OnTriggerEnter2D(Collider2D collision)
{
    if (!Once) return;

    // directly access the Light
    // Update this now searches in its own children instead of children of collision
    var light = GetComponentInChildren<Light>(true);
    if(!light)
    {
        Debug.Log("No Light found on collision" + collision.name, this);
        return;
    }

    Debug.Log("It's true");

    // Directly check if the Light component is enabled
    if (!light.enabled) return;

    Debug.Log(" It's Lit");
    Instantiate(Prefab1, Spawnpoint1.position, Spawnpoint1.rotation);
    Instantiate(Prefab2, Spawnpoint2.position, Spawnpoint2.rotation);

    Once = false;
}
0 голосов
/ 27 октября 2018

Вам не нужно отслеживать все огни только для этого.

Что вам нужно изменить, так это то, что вы должны сделать isON не статичным. Это потому, что фактический свет может быть включен или нет, а не потому, что концепция света включена или нет.

public bool isON;

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

void OnCollisionEnter2D(Collider2D col) {
    // only activate once
    if (once) {
        // Get light if exists
        GameObject collidedObject = col.gameObject;
        Light light = collidedObject.GetComponentInChildren<Light>();

        if (light != null) {
            // We have a light, check if it's on. We only care about the collided light
            if (light.isON) {
                Debug.Log("It's Lit fam");

                Instantiate(Prefab1, Spawnpoint1.position, Spawnpoint1.rotation);
                Instantiate(Prefab2, Spawnpoint2.position, Spawnpoint2.rotation);

                // Note that if we run into another lit light nothing will happen, 
                // even if its the first time running into that particular light
                Once = false;
            }
        }
    }
}

Кроме того, вы можете просто использовать if(something) вместо if(something == true)

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