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

Программирование на Юнити.

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

Сообщение Dragon-FAST 17 фев 2017, 12:39

Подскажите пожалуйста как осуществить проверку: есть ли объект на сцене по tag или layer?
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29

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

Сообщение samana 17 фев 2017, 13:05

Перебрать все объекты сцены и проверить их тег или слой.

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

    if(go.layer == LayerMask.NameToLayer("myLayer"))//....
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение Dragon-FAST 17 фев 2017, 13:27

samana писал(а):Перебрать все объекты сцены и проверить их тег или слой.

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

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

Спасибо всё отлично работает!
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29

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

Сообщение seaman 17 фев 2017, 18:19

GameObject.FindGameObjectsWithTag
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение samana 17 фев 2017, 18:21

seaman писал(а):GameObject.FindGameObjectsWithTag

О, а я почему-то так и не нашел этот метод.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение Dragon-FAST 18 фев 2017, 08:08

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 сразу загружается гл. меню, хотя персонаж остаётся на месте и никуда не девается!!!
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29

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

Сообщение samana 18 фев 2017, 18:33

У вас получился очень сложным подход к ситуации. Не надо ничего проверять каждый кадр и тем более искать в 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);
        }
    }
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение Dragon-FAST 21 фев 2017, 08:49

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);
        }
    }
}

Спасибо, Я тебе очень благодарен!!
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


cron