无法将公共变量的值放入Unity3D c#

时间:2019-04-09 14:17:41

标签: c# unity3d

我的public Color winColor脚本中有一个gameController.cs变量。我正在Start()中设置其值。现在,我想在另一个脚本check.cs中获取其值。

现在我已经公开使用了GameObject.Find("gameController").GetComponent<gamePlay>().winColor; 这里的问题是它显示了不同的值。 这是我在tile.cs

中的代码
private Color winingColor;

    void Start () 
    {
        winingColor = GameObject.Find("gameController").GetComponent<gamePlay>().winColor;
        Debug.Log(winingColor);
    }

    void Update () 
    {
        Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        bool overSprite = this.GetComponent<SpriteRenderer>().bounds.Contains(mousePosition);

        if (overSprite)
        {
            if (Input.GetButton("Fire1"))
            {

                if (this.GetComponent<SpriteRenderer>().color == winingColor)
                {
                    float x = this.gameObject.transform.position.x;
                    this.gameObject.transform.position = new Vector3(x, 3.5f, 0.0f);
                }
            }
        }
    }

gameController.cs代码

public GameObject ball;
    public List<GameObject> tiles;

    private Color [] colors = { new Color(0,1,0,1), new Color(1,0,0,1), new Color(1,1,1,1), new Color(0,0,1,1),  new Color(1,1,0,1), new Color(0, 0, 0, 1)};

    public Color winColor;

    // Use this for initialization
    void Start () 
    {
        winColor = colors[1];
        Debug.Log("con wincolor:" + winColor);
        ball.GetComponent<SpriteRenderer>().color = colors[1];
        tiles[0].GetComponent<SpriteRenderer>().color = colors[0];
        tiles[1].GetComponent<SpriteRenderer>().color = colors[1];
        tiles[2].GetComponent<SpriteRenderer>().color = colors[3];
        tiles[3].GetComponent<SpriteRenderer>().color = colors[4];

    }

winColorgameController.cs的值为RGBA(1.000, 0.000, 0.000, 1.000) 但是在tile.cs中,我得到了RGBA(0.000, 0.000, 0.000, 0.000)

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

不同游戏对象的Start()发生的顺序出乎您的意料。
如果Tile.cs Start()首先发生,则不会设置winColor。

将此行移动到Awake()

winColor = colors[1];

如果不应该更改winColor,则可以解决此问题的另一种方法是,可以将winColor更改为Property getter,并删除winColor = colors[1];行。

public Color winColor { get { return colors[1];}}

答案 1 :(得分:0)

在我的实验中,它正在工作,您确定没有在代码的某处更改颜色吗?

Test2:

public class test2 : MonoBehaviour
{
    public Color winColor;
    private Color[] colors = { new Color(0, 1, 0, 1), new Color(1, 0, 0, 1), new Color(1, 1, 1, 1), new Color(0, 0, 1, 1), new Color(1, 1, 0, 1), new Color(0, 0, 0, 1) };

    // Start is called before the first frame update
    void Start()
    {
        winColor = colors[1];
        Debug.Log("con wincolor:" + winColor);
    }

}

测试1:

public class test1 : MonoBehaviour
{
    private Color winingColor;

    // Start is called before the first frame update
    void Start()
    {
        winingColor = GameObject.Find("test").GetComponent<test2>().winColor;
        Debug.Log("test1:" + winingColor);
    }    
}

在我看来,最好使用Getters/Setters访问公共属性,它们可以为您提供更好的灵活性:

public class test2 : MonoBehaviour
{
    private Color[] colors = { new Color(0, 1, 0, 1), new Color(1, 0, 0, 1), new Color(1, 1, 1, 1), new Color(0, 0, 1, 1), new Color(1, 1, 0, 1), new Color(0, 0, 0, 1) };

    public Color winColor
    {
        get; set;
    }

    // Start is called before the first frame update
    void Start()
    {
        winColor = colors[1];
        Debug.Log("con wincolor:" + winColor);
    }

}