在InitializeOnLoad上更改GameObject组件

时间:2016-11-21 14:13:21

标签: c# unity3d

我在游戏启动时创建了我想用作主脚本的脚本。现在我想通过该脚本访问特定的按钮文本并更改它的文本。我有问题,因为我的文字没有改变。以下是我的尝试:

static main()
{
    Debug.Log("Up and running");
    GameObject devButtonText = GameObject.Find("devButtonText");
    Text text = devButtonText.GetComponent<Text>();
    text.text = "Test";
}

按钮为devButton,文字为devButtonText

完整脚本

using UnityEngine;
using UnityEditor;
using System.Collections;
using UnityEngine.UI;


[InitializeOnLoad]
public class main : MonoBehaviour {


    static main()
    {
        Debug.Log("Up and running");
        GameObject devButton = GameObject.Find("devButton");
        Text text = devButton.GetComponentInChildren<Text>();
        text.text = "Test";
    }

    // Use this for initialization
    void Start () { 

    }

    // Update is called once per frame
    void Update () {

    }
}

2 个答案:

答案 0 :(得分:2)

  

我在游戏发布时创建了我想用作主脚本的脚本。

Unity Editor启动时,必须使用InitializeOnLoad属性来运行功能,而不是游戏。编译游戏时,每个编辑器脚本都不会运行。 Unity documentation

  

有时,只要Unity启动而无需用户操作,就可以在项目中运行一些编辑器脚本代码。

相反,创建一个Empty GameObject并附加以下脚本:

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


public class ChangeText : MonoBehaviour
{
    private void Awake()
    {
        GameObject devButton = GameObject.Find("devButton");
        Text text = devButton.GetComponentInChildren<Text>();
        text.text = "Test";
    }
}

更好:

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


public class ChangeText : MonoBehaviour
{
    // Drag & Drop the desired Text component here
    public Text TextToChange ;

    // Write the new content of the Text component
    public string NewText ;

    private void Awake()
    {
        TextToChange.text = NewText;
    }
}

场景开始时会自动调用脚本。

答案 1 :(得分:1)

初始化MonoBehaviour时

  1. 您应该使用Start,Awake或OnEnable。

  2. 您不应该使用构造函数,静态构造函数或字段初始化(如public GameObject go = GameObject.Find("devButton");

  3. 这应该有效:

    using UnityEngine;
    using UnityEditor;
    using System.Collections;
    using UnityEngine.UI;
    
    
    public class main : MonoBehaviour {
    
    
        void Awake () { 
            Debug.Log("Up and running");
            GameObject devButton = GameObject.Find("devButton");
            Text text = devButton.GetComponentInChildren<Text>();
            text.text = "Test";
        }
    }
    

    修改

    鉴于名称 main ,我想这是您项目的起点,因此如果您的脚本未附加到任何游戏对象,则不会调用Start,Awake或OnEnable。在这种情况下,您应将其附加到游戏对象并更改统一脚本执行顺序并将脚本置于最早的位置。