Мой GameObject всегда остается неактивным, SetActive (true) не работает и сопрограмма не запускается - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть несколько префабов, хранящихся в массиве, и создаю их по одному, нажимая кнопку.Объект появляется, но всегда неактивен.

Я часами искал ответ и много раз пытался, но проблема осталась прежней.Я надеюсь, что это нормально, хотя есть несколько похожих вопросов, но ни один из ответов не решает мою проблему.Как я уже описывал, я хочу создать экземпляр GameObject из массива за нажатие кнопки, и объект действительно появляется, но когда я пытаюсь запустить для него сопрограмму (если это полезно, это IEnumerator, который должен позволить объекту исчезнуть с помощьюобрабатывая его цвета альфа-канала), я всегда получаю ошибку, которая говорит, что GameObject неактивен.Я не могу установить его активным, написав myPrefab.gameObject.SetActive (true), и я попытался вызвать его в нескольких местах в моем коде.Он всегда остается неактивным.Кто-нибудь знает, в чем может быть проблема?

public class Class1 : MonoBehaviour
{
    [SerializeField]
    private MyClass[] myPrefabs;

    private MyClass myCurrentPrefab;

    private int myIndex;

    public void ButtonEffect()
    {
        InstantiatePrefab();
        myCurrentPrefab.OnButtonEffect();
    }

    private void InstantiatePrefab()
    {
        myIndex = Random.Range(0, myPrefabs.Length);
        myCurrentPrefab = myPrefabs[myIndex];
        Instantiate(myCurrentPrefab);
    }
}

public class MyClass : MonoBehaviour
{
    private SpriteRenderer mySprite;

    private void Start()
    {
        mySprite = GetComponent<SpriteRenderer>();
    }

    private void Awake()
    {
        this.gameObject.SetActive(true)
    } 

    private void OnButtonEffect()
    {
        StartCoroutine(FadeOut(mySprite, 3));
    }

    public IEnumerator FadeOut(SpriteRenderer spriteToFade, float duration)
    {
        //DoFadeOutStuff
    }
}

Здесь я попытался установить активный объект в функции Awake своего собственного кода, но я также попробовал это в обеих функциях Class1и его функция запуска.Я также попытался обработать это для всего массива в цикле foreach.Всегда один и тот же результат.Все, что я хочу сделать, это установить его активным, сейчас мне даже не важно, правильно ли работает мой гаситель.Сначала я подумал, что это потому, что мой экземпляр объекта является клоном, но я ничего не могу найти в нем, поэтому, даже если решение довольно очевидно, пожалуйста, помогите!

1 Ответ

0 голосов
/ 30 декабря 2018

Проблема в том, что вы ссылаетесь на сам префаб, который на самом деле не активен в сцене.Вам необходимо создать игровой объект и установить его значение для экземпляра префаба.Следующее должно работать

using UnityEngine;

public class Class1 : MonoBehaviour
{
[SerializeField]
private GameObject[] myPrefabs;

public void ButtonEffect()
{
    var go = InstantiatedPrefab();
    go.GetComponent<MyClass>().OnButtonEffect();
}

private GameObject InstantiatedPrefab()
{
    var index = Random.Range(0, myPrefabs.Length);
    return Instantiate(myPrefabs[index]);
}
}

using System.Collections;
using UnityEngine;

public class MyClass : MonoBehaviour
{
private SpriteRenderer mySprite;

private void Start()
{
    mySprite = GetComponent<SpriteRenderer>();
}

public void OnButtonEffect()
{
    StartCoroutine(FadeOut(mySprite, 3));
}

private IEnumerator FadeOut(SpriteRenderer spriteToFade, float duration)
{
    print("FadeOut");
    yield return 0;

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...