Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/55: Рейтинг темы: голосов - 55, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 14

Как выключить триггер по истечению времени?

14.04.2016, 13:01. Показов 10670. Ответов 15

Студворк — интернет-сервис помощи студентам
Есть триггер, который активирует "GameObject monster" когда в него заходит игрок. Хочу, что бы объект монстр появлялся на какое-то конкретное время, а потом опять исчезал, вот код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public GameObject monster;
public bool triggerEnter = false;
 
void Awake()
{
monster.SetActive (false);
}
 
void OnTriggerEnter(Collider all)
{
if (triggerEnter == false && all.CompareTag ("Player")) 
{
triggerEnter = true;
monster.SetActive (true);
}
}
Пробовал сделать через Time.deltaTime вот так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public GameObject monster;
public bool triggerEnter = false;
public float Life = 0.6f;
private float Die;
 
void Awake()
{
monster.SetActive (false);
}
 
void OnTriggerEnter(Collider all)
{
if (triggerEnter == false && all.CompareTag ("Player")) 
{
Die += Time.deltaTime;
triggerEnter = true;
monster.SetActive (true);
 
if (Die >= Life) {
monster.SetActive (false);
}
}
Но тогда триггер даже не равен "true", когда я в него захожу и соответственно ничего не происходит
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2016, 13:01
Ответы с готовыми решениями:

Как выключить комп по истечению времени?
Как выключить комп по истечению времени?

Как нажать кнопку по истечению времени?
как можно осуществить что бы после нажатия нажатия Button1 пошло время указаное в Label1 и по истечению это времени снова нажималась...

Как выполнять действие по истечению некоторого времени
У меня в цикле while(1) выполняется программа, мне нужно чтобы к примеру каждые пять минут вызывалась функция. Основная программа должна...

15
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
14.04.2016, 13:32
GooDDarK, то ест то, что код
C#
1
2
if (Die >= Life) {
monster.SetActive (false);
выполняется только при мертвом монстре Вас не смутило?
1
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
14.04.2016, 13:33
GooDDarK, в префабе монстра повесьте на него подобный скрипт и монстр будет исчезать по прошествии заданного времени:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using UnityEngine;
 
public class DieBehaviour : MonoBehaviour
{
    public float Lifetime = 5.0f;
 
    float elapsedTime;
 
    void Start()
    {
        elapsedTime = 0.0f;
    }
 
    void Update()
    {
        elapsedTime += Time.deltaTime;
        if (elapsedTime >= Lifetime)
            Die();
    }
 
    void Die()
    {
        Destroy(this.gameObject);
    }
}
1
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 14
14.04.2016, 15:22  [ТС]
Забыл закрыть первый иф...

Добавлено через 49 секунд
Триггер всё равно не видит, что игрок входит в него

Добавлено через 1 час 16 минут
Помогите пожалуйста хотя бы через "юз" объекта это сделать.

Есть код, который позволяет "взять предмет", если игрок стоит рядом и при "взятии предмета" у меня вызывается картинка, перед этим созданная через UI и выключенная, на определенное время. Картинка вызывается, но висит на экране постоянно, как бы игнорируя мою проверку:

C#
1
2
3
4
 if (OffVisible == VisibleImage) 
        {
            Image.SetActive (false);
        }
Сам код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class GiveGrib : MonoBehaviour {
 
    public GameObject Image;
    public float VisibleImage = 0.6f;
    private float OffVisible;
 
    void Awake () {
        Image.SetActive (false);
        OffVisible = 0.0f;
    }
 
    void Update () {
    
    GameObject player = GameObject.FindGameObjectWithTag("Player");
    if (Input.GetButtonDown ("Use")&Vector3.Distance(transform.position, player.transform.position)<2)
        {
            OffVisible += Time.deltaTime;
            Image.SetActive (true);
        }
        if (OffVisible == VisibleImage) 
        {
            Image.SetActive (false);
        }
    }
}
0
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
14.04.2016, 16:23
Я ж вам писал скрипт. Он не подходит под задачу?

Цитата Сообщение от GooDDarK Посмотреть сообщение
GameObject player = GameObject.FindGameObjectWithTag("Player ");
Уберите это скорее из функции Update и перенесите куда-нибудь в Start.

Цитата Сообщение от GooDDarK Посмотреть сообщение
if (Input.GetButtonDown ("Use")&Vector3.Distance(transform.posit ion, player.transform.position)<2)
Вы используете битовое И. Не надо так, пишите && вместо.

И, наконец,
Цитата Сообщение от GooDDarK Посмотреть сообщение
if (OffVisible == VisibleImage)
Это условие вряд ли выполнится. Вы же каждый Update увеличиваете OffVisible на величину Time.deltaTime. Никто не гарантирует, что когда-нибудь в сумме наберется ровно 0.6f
Напишите тогда уж if (OffVisible >= VisibleImage)
1
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 14
14.04.2016, 16:37  [ТС]
Если убрать это из апдейта в старт
C#
1
GameObject player = GameObject.FindGameObjectWithTag("Player");
то эта проверка
C#
1
Vector3.Distance(transform.position, player.transform.position)<2
не увидит объект "player"

Ваш скрипт я тоже попробовал, не вышло, этот чертов код не хочет работать
0
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
14.04.2016, 17:13
GooDDarK, судя по названию скрипта GiveGrib, у вас в игре должен подбираться предмет, и в это время должно появляться какое-то сообщение?
Могу попробовать набросать пример реализации.
1
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 14
14.04.2016, 17:19  [ТС]
Именно так, только подбираться условно, на самом деле просто уничтожаться, просто я этого пока не написал, всё равно не работает

Попробуйте, если вас это не затруднит, буду очень признателен!

Добавлено через 4 минуты
Единственный способ, как у меня получилось это реализовать - через триггер, функцией OnTriggerExit, но это не то, что мне нужно...
0
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
14.04.2016, 17:28
GooDDarK, проект я сюда прикреплять не буду, т.к. размер слишком большой для форума. Постараюсь описать всё по-порядку.

Сначала - код:
Peek.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using UnityEngine;
 
public class Peek : MonoBehaviour
{
    public string ItemName;
    public float PeekRadius = 1;
    public KeyCode PeekKey = KeyCode.E;
 
    void Start()
    {
        var sColl = this.gameObject.AddComponent<SphereCollider>();
        sColl.radius = PeekRadius;
        sColl.isTrigger = true;
    }
 
    void OnTriggerStay(Collider other)
    {
        if (other.CompareTag("Player") && Input.GetKeyDown(PeekKey))
            PeekItem(other.gameObject.GetComponent<Pocket>());
    }
 
    void PeekItem(Pocket owner)
    {
        owner.AddItem(ItemName);
        Destroy(this.gameObject);
    }
}

Pocket.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class Pocket : MonoBehaviour
{
    public Text TextPicked;
    public float TextVisibleTime = 1f;
    public List<string> Items;
 
    void Start()
    {
        Items = new List<string>();
    }
 
    public void AddItem(string item)
    {
        Items.Add(item);
 
        StartCoroutine("BlinkText");
    }
 
    private IEnumerator BlinkText()
    {
        float elapsedTime = 0.0f;
 
        TextPicked.gameObject.SetActive(true);
 
        while (elapsedTime < TextVisibleTime)
        {
            elapsedTime += Time.deltaTime;
            yield return new WaitForEndOfFrame();
        }
 
        TextPicked.gameObject.SetActive(false);
    }
}


Порядок действий:
1) На игрока (с тегом Player) вешаем скрипт Pocket.
TextVisibleTime - время, в течении которого активна надпись,
TextPicked - в данном случае это ссылка на UI-текст (при старте игры он неактивен).

2) На объект, который нужно подбирать, вешаем скрипт Peek
ItemName - произвольное имя объекта,
PeekRadius - радиус коллайдера-триггера, который при старте будет повешен на подбираемый объект,
PeekKey - кнопка взаимодействия с объектом.

3) Запускаем игру, подходим достаточно близко к объекту и нажимаем кнопку 'E'. Объект должен исчезнуть, появиться в списке Items в скрипте Pocket, а также активироваться указанная надпись.

Cr0c, гляньте тоже при случае, нет ли вопиющих ошибок в моём посте
1
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 14
14.04.2016, 17:53  [ТС]
При нажатии на Е ничего не происходит.
0
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
14.04.2016, 18:01
GooDDarK, покажите скриншоты вашей игры. Меня интересуют окна Hierarchy и Inspector. Покажите как настроены ваши игровые объекты на сцене?
1
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
14.04.2016, 18:03
Tsin,
C#
1
yield return null;
всякие wait'ы поджирают память. Не страшно, но если часто, то потом GC может давать лаги.
На предмет надо вешать ДВА коллайдера: BoxCollider чтобы предмет не провалился никуда и SphereCollider для триггера.
C#
1
2
3
4
5
6
   public void AddItem(string item)
    {
        Items.Add(item);
        TextPicked.text = item; // забыли нарисовать текст
        StartCoroutine("BlinkText");
    }
1
 Аватар для Tsin
1180 / 488 / 188
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
14.04.2016, 18:09
Cr0c, спасибо за комментарий!

Цитата Сообщение от Cr0c Посмотреть сообщение
TextPicked.text = item; // забыли нарисовать текст
А у меня в проекте текст был нарисован уже... да, это могло запутать ТС-а, если в его случае текст пустой. Тогда и отображаться ничего не будет.
1
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 14
14.04.2016, 18:30  [ТС]
Что-то я совсем запутался

В иерархии у меня слишком много объектов, не знаю что кидать
Миниатюры
Как выключить триггер по истечению времени?   Как выключить триггер по истечению времени?  
0
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 14
14.04.2016, 18:53  [ТС]
Всё получилось, спасибо за помощь, вам обоим +1!

Код в студию, если интересно

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class GiveGrib : MonoBehaviour
{
    public GameObject Image_; // Есть класс с названием Image
    public float VisibleTime = 0.6f;
    
    private GameObject player;
    
    void Awake()
    {
        Image_.SetActive(false);
        player = GameObject.FindGameObjectWithTag("Player");
    }
    
    void Update()
    {
        if (Input.GetButtonDown("Use") && Vector3.Distance(transform.position, player.transform.position) < 2)
        {
            StartCoroutine(ShowImage());
        }
    }
    
    IEnumerator ShowImage()
    {
        if (Image_.activeInHierarchy)
            yield break; // Если уже показывается - выходим
        Image_.SetActive(true);
        yield return new WaitForSeconds(VisibleTime);
        Image_.SetActive(false);
    }
}
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
15.04.2016, 21:17
GooDDarK, на будущее, отложенный вызов можно делать через Invoke и не городить корутины.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2016, 21:17
Помогаю со студенческими работами здесь

Как сделать самоудаляемые сообщения по истечению времени
Здравствуйте, не подскажите как делаются самоудаляемые сообщения, различные инструменты требующие подождать некоторое время на php?...

Как поменять текст в Label по истечению времени?
Например: Первый текст: Загрузка данных... Потом текст меняется на: Подключение к базе данных...

Как закрыть программно MessageBox по истечению определенного времени?
Доброго времени суток! Интересует вопрос: Как послать/передать определенный ID (IDOK, IDCANCEL, IDRETRY) кнопки MessageBox по истечению...

Как с помощью макроса сделать, чтобы главная форма, закрывалась по истечению времени автоматически?
Как с помощью макроса сделать так, чтобы главная форма, закрывалась по истечению времени автоматически?

Действия по истечению времени
Делаю лабу, во скрин с РадиоБатан все понятно, то не могу понять как сделать так что бы после того как пользователь выбрал дату и ввел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru