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

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

СообщениеДобавлено: 28 янв 2018, 06:59
Dragon-FAST
Синтаксис:
Используется 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;
        }

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

Подскажите решение проблемы - буду благодарен!

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

СообщениеДобавлено: 28 янв 2018, 07:55
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;
}

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

СообщениеДобавлено: 28 янв 2018, 08:09
Dragon-FAST
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;
}

Спасибо, помогло.

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

СообщениеДобавлено: 28 янв 2018, 10:07
Cr0c
Мне Invoke не нравится из-за задания метода стрингом. Я делаю корутину и оборачиваю в метод. Тогда можно анонимный делегат передавать - это позволит передавать любые действия и параметры без создания кучи методов.

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

СообщениеДобавлено: 28 янв 2018, 10:22
samana
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();
}

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

СообщениеДобавлено: 28 янв 2018, 10:28
Cr0c
Вынести дебаг в отдельную корутину - не лучшая идея, лишнее переключение потока. А идея правильно понята, только лучше System.Action

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

СообщениеДобавлено: 28 янв 2018, 10:42
samana
Cr0c писал(а):Вынести дебаг в отдельную корутину - не лучшая идея, лишнее переключение потока.

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

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

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

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

СообщениеДобавлено: 28 янв 2018, 11:52
Cr0c
samana писал(а):Обычно так прописываю, когда происходит конфликт имён, но зачастую очень лень без необходимости печатать лишний System

Лучше сразу писать максимально явные определения, потом проще будет ))

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

СообщениеДобавлено: 28 янв 2018, 17:40
seaman
лишнее переключение потока

Корутины не переключают потоки.

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

СообщениеДобавлено: 28 янв 2018, 17:48
Cr0c
Ну да, юнити однопоточна. Как правильнее назвать переключение по разным экземплярам корутин с их итераторами и всякими внутренними штуками?

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

СообщениеДобавлено: 05 фев 2018, 02:19
artk
Можно использовать Invoke(action.Method.Name);
Стринги в коде - это плохо, да