在Start()函数中Unity查找子组件失败

时间:2015-08-06 09:54:49

标签: c# unity3d

我找不到当前游戏对象的子对象(预制 我有父游戏对象(它是从另一个脚本的预制件创建的),并且有2个孩子。层次结构如下:

RewardItemPrefab

---- RewardName(有文本组件)。

---- Image(拥有SpriteRenderer组件)。

void Start ()
    {
        if (RewardText == null)
        {
            RewardText = this.GetComponentInChildren<Text>();
            if (RewardText == null)
            {
                Debug.Log("RewardText == null");
                return;
            }
        }

        RewardText.text = _text;

        if (RewardImage == null)
        {
            RewardImage = this.GetComponentInChildren<Image>();
            if (RewardImage == null)
            {
                Debug.Log("RewardImage == null");
                return;
            }
        }

        RewardImage.sprite = Reward.LoadRewardSprite(RewardImageProp);
    }

但在此之前,正如我所说,这个游戏对象是从另一个脚本创建的:

var go = new GameObject(reward.Name, typeof(RewardProfileView));

go.GetComponent<RewardProfileView>().RewardItem = reward;

'RewardItem'属性是奖励类属性:

    public Reward RewardItem
    {
        get { return _reward; }
        set
        {
            if (value != null)
            {
                _reward = value;

                RewardTextProp = _reward.Name;

                RewardImageProp = _reward.Name;
            }
            else
            {
                _reward = null;
            }
        }
    }

RewardTextProp和RewardImageProp只是字符串字段。

注意:需要能够设置动态创建的预制件的子属性。

1 个答案:

答案 0 :(得分:0)

如果您在一个Start()方法中创建 GameObject ,然后尝试使用其他Start()方法访问它,则会遇到麻烦。这是竞争条件的典型示例,其中您不知道将首先执行哪个Start()方法。

最简单,最直接的解决方案是将 GameObject 创建部分放在Awake()方法中。

Awake()方法保证在Start()方法开始运行之前为所有GameObject运行。