Скрипт Unity перестает работать после повторной активации игрового объекта, к которому он прикреплен

#c# #unity3d

#c# #unity3d

Вопрос:

Я просто хочу создать анимацию для пинг-понга, но когда он переключает элемент пользовательского интерфейса, скрипт перестает работать. Есть идеи? Вы можете задаться вопросом, почему я не использую анимацию вместо этого, во-первых, это была бы та же проблема, во-вторых, мне нужен другой скрипт, который также прикреплен к деактивированному объекту: S

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UiFadingPingPong : MonoBehaviour{

    bool fadeTrigger = false;
    float currentVal = 0;
    public float duration = 10f;
    public bool enable = false;
    
    void Start(){
        currentVal = 0;
    }
    void OnEnable(){  
        enable = true;
    }
    void OnDisable(){  
        enable = false;
    }
        // Update is called once per frame
    void Update(){
        if(enable){ 
            if(currentVal <= 0){
                fadeTrigger = false;
            }
            if(currentVal >= 1){
                fadeTrigger = true;
            }
            if(fadeTrigger == false){
                currentVal  = Time.deltaTime / duration;    
            }else{
                currentVal -= Time.deltaTime / duration;    
            }
            Image image = GetComponent<Image>();
            var tempColor = image.color;
            tempColor.a = currentVal;
            image.color = tempColor;
        }
    }
}  
  

Спасибо за любую помощь 🙂

Ответ №1:

Отключая игровой объект, к которому подключен этот скрипт, вы также отключаете скрипт.

Это означает, что Update() метод не будет выполняться и не будет интерпретировать, что enable переменная теперь установлена в false , (поскольку OnDisable() она все еще выполняется, но после этого дальнейшая обработка не будет выполняться).

Решением этого было бы прикрепить этот скрипт к отдельному игровому объекту, который не включается / отключается, и может управлять этим эффектом включения / выключения

Комментарии:

1. хорошо, спасибо за ваш ответ 🙂 Я думаю, это объясняет, почему подход couroutine также не работает. Я подумал, что, возможно, будет обходной путь.

2. Другим решением было бы, как вы упомянули, использование анимации. Хотя я не совсем понимаю, почему это будет та же проблема. Анимация будет включать ключевые кадры, которые устанавливают альфа элемента пользовательского интерфейса на значение от 255 до 0. Чем дальше друг от друга находятся кадры, тем медленнее будет переход (или затухание) между двумя (или более) состояниями, непрозрачными или прозрачными

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

4. Если вы не отключите игровой объект, к которому прикреплен аниматор, он будет работать так, как ожидалось. Если вы устанавливаете Time.timeScale и хотите, чтобы анимация продолжалась, когда Time.timeScale = 0 не забудьте установить Update Mode для аниматора значение Unscaled Time

5. Привет, спасибо за твой ответ. На самом деле я вчера тоже понял, что это связано с временными рамками. Извините за недостающую информацию 🙂 И да, время.unscaledDeltaTime — это то, что мне было нужно. работал нормально.