我的GameObject始终保持不活动状态,SetActive(true)不起作用,协程也不会启动

时间:2018-12-29 16:26:23

标签: c# unity3d

我将许多预制件存储在一个阵列中,并通过单击一个按钮一次实例化一个。该对象出现,但始终处于非活动状态。

我花了几个小时寻找答案,并尝试了很多,但问题仍然存在。我希望可以问问,即使有几个类似的问题,但没有一个答案可以解决我的问题。 就像我已经描述过的那样,我想在每次单击按钮时从数组中实例化一个GameObject,并且确实出现了该对象,但是当我尝试在其上启动协程时(如果有帮助,它是一个IEnumerator,它将使Object淡出。处理它的颜色Alpha通道),我总是收到一条错误消息,说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和Start函数这两个函数中也都对其进行了尝试。我也尝试过在foreach循环中为整个数组处理它。总是相同的结果。我要做的就是将其设置为活动状态,现在我什至不在乎淡出的东西是否正常工作。首先我以为是因为我的实例化对象是一个克隆对象,但是我找不到任何有关它的东西,所以即使解决方案很明显,也请帮忙!

1 个答案:

答案 0 :(得分:0)

问题是您要引用实际的预制件本身,而该预制件在场景中实际上并不活跃。您需要创建一个游戏对象并将其值设置为实例化的预制件。以下应该可以工作

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;

}
}