Посоветуйте как исправить баг...

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

Посоветуйте как исправить баг...

Сообщение Dragon-FAST 28 янв 2018, 06:59

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

public class PlayerMessange : MonoBehaviour {

    public GameObject gameOver;

    public GameObject GO = null;

    public float time = 0;
    public bool dt = true;

    void Start()
    {
        GO = Instantiate(gameOver, transform);
        GO.SetActive(false);
    }

    void Update()
    {
        if (dt) time += Time.deltaTime;
        if (GlabalVar.HP <= 0)
        {
            GameOver();
        }
    }
    void GetDamage(int damage)
    {
        dt = true;
        GlabalVar.HP -= damage;
        GO.SetActive(true);
        if (time >= 0.01f)
        {
            GO.SetActive(false);
            time = 0;
            dt = false;
        }
    }

    void GameOver()
    {
        if (GlabalVar.Life > 1)
        {
            GlabalVar.Life--;
            GlabalVar.HP = 100;
            GO.SetActive(true);
            SceneManager.LoadScene(GlabalVar.Level--);
        }
        else
        {
            GO.SetActive(true);
            SceneManager.LoadScene("go");
        }
    }
}
 

---
Одна из частей скрипта отвечает за эффект попадания по персонажу (включает полупрозрачный спрайт).
БАГ:
если уйти из-под огня спрайт не успевает выключиться, перенести таймер в Update() не помогает (эффект вообще не включается),
уменьшить:
Синтаксис:
Используется csharp
if (time >= 0.01f)
        {
            GO.SetActive(false);
            time = 0;
            dt = false;
        }

до очень маленького значения - баг не исправляет.

Подскажите решение проблемы - буду благодарен!
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29

Re: Посоветуйте как исправить баг...

Сообщение samana 28 янв 2018, 07:55

Почему бы не выключать спрайт, просто через определённый интервал времени, например с помощью Invoke?

Синтаксис:
Используется csharp
void GetDamage(int damage)
{
    dt = true;
    GlabalVar.HP -= damage;
    GO.SetActive(true);
    Invoke("hideSprite", 0.1f);// через 100 миллисекунд выполнит метод hideSprite
}

private void hideSprite()
{
    GO.SetActive(false);
    dt = false;
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Посоветуйте как исправить баг...

Сообщение Dragon-FAST 28 янв 2018, 08:09

samana писал(а):Почему бы не выключать спрайт, просто через определённый интервал времени, например с помощью Invoke?

Синтаксис:
Используется csharp
void GetDamage(int damage)
{
    dt = true;
    GlabalVar.HP -= damage;
    GO.SetActive(true);
    Invoke("hideSprite", 0.1f);// через 100 миллисекунд выполнит метод hideSprite
}

private void hideSprite()
{
    GO.SetActive(false);
    dt = false;
}

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

Re: Посоветуйте как исправить баг...

Сообщение Cr0c 28 янв 2018, 10:07

Мне Invoke не нравится из-за задания метода стрингом. Я делаю корутину и оборачиваю в метод. Тогда можно анонимный делегат передавать - это позволит передавать любые действия и параметры без создания кучи методов.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Посоветуйте как исправить баг...

Сообщение samana 28 янв 2018, 10:22

Cr0c писал(а):Мне Invoke не нравится из-за задания метода стрингом. Я делаю корутину и оборачиваю в метод. Тогда можно анонимный делегат передавать - это позволит передавать любые действия и параметры без создания кучи методов.

Да, это решение хорошее!

Dragon-FAST, если вы хотите попробовать вариант Cr0c-а, то это выглядит примерно так (если я правильно понял идею):

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

void GetDamage(int damage)
{
    dt = true;
    GlabalVar.HP -= damage;
    GO.SetActive(true);

    InvokeAfter(() => { GO.SetActive(false); dt = false; }, 0.1f); // создаёте метод налету
    InvokeAfter(() => { Debug.Log("sprite is hidden"); }, 0.1f); // то же самое

}

void InvokeAfter(Action action, float sec)
{
    StartCoroutine(invokeAfterCoroutine(action, sec));
}

private IEnumerator invokeAfterCoroutine(Action action, float sec)
{
    yield return new WaitForSeconds(sec);
    action();
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Посоветуйте как исправить баг...

Сообщение Cr0c 28 янв 2018, 10:28

Вынести дебаг в отдельную корутину - не лучшая идея, лишнее переключение потока. А идея правильно понята, только лучше System.Action
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Посоветуйте как исправить баг...

Сообщение samana 28 янв 2018, 10:42

Cr0c писал(а):Вынести дебаг в отдельную корутину - не лучшая идея, лишнее переключение потока.

Это был просто пример, что InvokeAfter можно вызывать теперь много раз с разным содержимым, а то вдруг автор темы подумает, что этот InvokeAfter служит только для одной команды.

Cr0c писал(а):лучше System.Action

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

Re: Посоветуйте как исправить баг...

Сообщение Cr0c 28 янв 2018, 11:52

samana писал(а):Обычно так прописываю, когда происходит конфликт имён, но зачастую очень лень без необходимости печатать лишний System

Лучше сразу писать максимально явные определения, потом проще будет ))
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Посоветуйте как исправить баг...

Сообщение seaman 28 янв 2018, 17:40

лишнее переключение потока

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

Re: Посоветуйте как исправить баг...

Сообщение Cr0c 28 янв 2018, 17:48

Ну да, юнити однопоточна. Как правильнее назвать переключение по разным экземплярам корутин с их итераторами и всякими внутренними штуками?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Посоветуйте как исправить баг...

Сообщение artk 05 фев 2018, 02:19

Можно использовать Invoke(action.Method.Name);
Стринги в коде - это плохо, да
Аватара пользователя
artk
Старожил
 
Сообщения: 749
Зарегистрирован: 22 май 2011, 12:22


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

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

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