Страница 1 из 1

Проверка, есть ли объект на сцене

СообщениеДобавлено: 17 фев 2017, 12:39
Dragon-FAST
Подскажите пожалуйста как осуществить проверку: есть ли объект на сцене по tag или layer?

Re: Проверка, есть ли объект на сцене

СообщениеДобавлено: 17 фев 2017, 13:05
samana
Перебрать все объекты сцены и проверить их тег или слой.

Синтаксис:
Используется csharp
GameObject[] allGo = FindObjectsOfType<GameObject>();
foreach (GameObject go in allGo)
{
    if(go.CompareTag("tagMane")) //...

    if(go.layer == LayerMask.NameToLayer("myLayer"))//....
}

Re: Проверка, есть ли объект на сцене

СообщениеДобавлено: 17 фев 2017, 13:27
Dragon-FAST
samana писал(а):Перебрать все объекты сцены и проверить их тег или слой.

Синтаксис:
Используется csharp
GameObject[] allGo = FindObjectsOfType<GameObject>();
foreach (GameObject go in allGo)
{
    if(go.CompareTag("tagMane")) //...

    if(go.layer == LayerMask.NameToLayer("myLayer"))//....
}

Спасибо всё отлично работает!

Re: Проверка, есть ли объект на сцене

СообщениеДобавлено: 17 фев 2017, 18:19
seaman
GameObject.FindGameObjectsWithTag

Re: Проверка, есть ли объект на сцене

СообщениеДобавлено: 17 фев 2017, 18:21
samana
seaman писал(а):GameObject.FindGameObjectsWithTag

О, а я почему-то так и не нашел этот метод.

Re: Проверка, есть ли объект на сцене

СообщениеДобавлено: 18 фев 2017, 08:08
Dragon-FAST
Dragon-FAST писал(а):
samana писал(а):Перебрать все объекты сцены и проверить их тег или слой.

Синтаксис:
Используется csharp
GameObject[] allGo = FindObjectsOfType<GameObject>();
foreach (GameObject go in allGo)
{
    if(go.CompareTag("tagMane")) //...

    if(go.layer == LayerMask.NameToLayer("myLayer"))//....
}

Спасибо всё отлично работает!


Решил доработать скрипт:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class Scanner : MonoBehaviour {
        public static bool scan = true; // есть или нет пепрсонаж с тегом на сцене
        public int reset = 0; // обнуление таймера
        public static float time; //таймер
        void Update () {
                time += Time.deltaTime; //таймер
                if(time >= 5){ //если таймер досчитал до 5 или больше
                        GameObject[] allGo = FindObjectsOfType<GameObject>();
                        foreach (GameObject go in allGo)
                        {
                                if(go.CompareTag("Player"))
                                {
                                        scan = true;; //если есть объект с тегом
                                } else {
                                        scan = false; //если нет объекта с тегом
                                }
                        }if (scan == false) //если объекта с тегом нет на сцене то перезапустить сцену
                        {
                                SceneManager.LoadScene(SceneManager.GetActiveScene().name);
                        }
                        time =  reset; //обнулить таймер
                }
        }
}

Он работает с другим скриптом (пока ещё не доработанным):
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class GamePlay : MonoBehaviour {
        public static int Life = 5;
        public static int Hp = 10;
        public bool scano = true;
        public void Update() {

                if (Life <= 0) {
                        SceneManager.LoadScene(0);
                        Life = 5;
                }
                if (Scanner.scan == false) {
                        Life -= 1;
                }
        }
}

По сути должно быть так: сканер сканирует на наличие персонажа. Если персонажа нет то перезагружается сцена, и от Life отнимается 1... Когда Life <= 0 загружается гл. меню, но сканер чёто глючит после того как таймер досчитает до 5 сразу загружается гл. меню, хотя персонаж остаётся на месте и никуда не девается!!!

Re: Проверка, есть ли объект на сцене

СообщениеДобавлено: 18 фев 2017, 18:33
samana
У вас получился очень сложным подход к ситуации. Не надо ничего проверять каждый кадр и тем более искать в Update объекты, это затратно.
Недавно была похожая тема - viewtopic.php?f=105&t=42093 , вы можете сделать примерно похожее решение. Нужно просто чтобы менеджер уровня фиксировал факт смерти игрока и выполнял нужную логику.

Player

Синтаксис:
Используется csharp
using System;
using UnityEngine;

public class Player : MonoBehaviour {

    // событие игрока, которое сработает при его смерти
    public static event Action DEATH;

    // Перед смертью кричим "Кажется я уми..ра......."
    private void OnDestroy()
    {
        if (DEATH != null) DEATH();
    }
}



GameManager

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    private static int playerLifes = 5;

    // менеджер проснулся и начал прислушиваться и игроку
    private void OnEnable()
    {
        Player.DEATH += onPlayerDeath;
    }

    // менежден уснул и ничего не хочет слышать
    private void OnDisable()
    {
        Player.DEATH -= onPlayerDeath;
    }

    // Кажется я что-то слышу!! О нет, игрок умер!!! Что же делать, что же делать?!?!
    private void onPlayerDeath()
    {
        playerLifes--;
        if (playerLifes == 0)
        {
            SceneManager.LoadScene(0);
            playerLifes = 5;
        }
        else
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }
    }
}

Re: Проверка, есть ли объект на сцене

СообщениеДобавлено: 21 фев 2017, 08:49
Dragon-FAST
samana писал(а):У вас получился очень сложным подход к ситуации. Не надо ничего проверять каждый кадр и тем более искать в Update объекты, это затратно.
Недавно была похожая тема - viewtopic.php?f=105&t=42093 , вы можете сделать примерно похожее решение. Нужно просто чтобы менеджер уровня фиксировал факт смерти игрока и выполнял нужную логику.

Player

Синтаксис:
Используется csharp
using System;
using UnityEngine;

public class Player : MonoBehaviour {

    // событие игрока, которое сработает при его смерти
    public static event Action DEATH;

    // Перед смертью кричим "Кажется я уми..ра......."
    private void OnDestroy()
    {
        if (DEATH != null) DEATH();
    }
}



GameManager

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    private static int playerLifes = 5;

    // менеджер проснулся и начал прислушиваться и игроку
    private void OnEnable()
    {
        Player.DEATH += onPlayerDeath;
    }

    // менежден уснул и ничего не хочет слышать
    private void OnDisable()
    {
        Player.DEATH -= onPlayerDeath;
    }

    // Кажется я что-то слышу!! О нет, игрок умер!!! Что же делать, что же делать?!?!
    private void onPlayerDeath()
    {
        playerLifes--;
        if (playerLifes == 0)
        {
            SceneManager.LoadScene(0);
            playerLifes = 5;
        }
        else
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }
    }
}

Спасибо, Я тебе очень благодарен!!