【问题标题】:My GameObject always stays inactive, SetActive(true) doesn't work and the coroutine won't start我的 GameObject 始终处于非活动状态,SetActive(true) 不起作用,协程无法启动
【发布时间】:2019-05-27 00:45:10
【问题描述】:

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

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

【问题讨论】:

  • 如果一个游戏对象处于非活动状态,它的组件也是如此(也就是脚本)你需要另一个对象来激活它。
  • 我也尝试在 Class1 中设置它,它位于另一个对象的按钮上,如果这就是你的意思
  • 除了第一类,不能附加到游戏对象,因为它不是 MonoBehaviour。
  • 好吧,对不起,我只是错过了,我只是重新输入而不是复制它,会改变它
  • @Eddge 我希望代码现在是正确的,对不起,我重新创建了代码以省略所有不相关的内容

标签: c# unity3d


【解决方案1】:

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

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;

}
}

【讨论】:

  • 非常感谢,这完全解决了问题!我已经在想这一定是问题,但不知道如何解决,所以是的,非常感谢!
猜你喜欢
  • 2017-11-14
  • 2022-01-22
  • 2019-12-27
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多