Невозможно получить значение публичной переменной в другой скрипт в Unity3D c # - PullRequest
1 голос
/ 09 апреля 2019

У меня есть public Color winColor var в моем 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];

    }

Значение winColor в gameController.cs равно RGBA(1.000, 0.000, 0.000, 1.000) Но в tile.cs Iя получаю RGBA(0.000, 0.000, 0.000, 0.000)

Есть мысли?

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Запуск () различных игровых объектов происходит в том порядке, в котором вы не ожидаете.
Если Tile.cs Start () произойдет первым, winColor еще не будет установлен.

Переместить эту строку в Awake ()

winColor = colors[1];

Еще один способ решить эту проблему, если winColor не должен изменяться, - это изменить winColor на получатель свойств и удалить строку winColor = colors[1];.

public Color winColor { get { return colors[1];}}
0 голосов
/ 09 апреля 2019

В моем эксперименте это работает, вы уверены, что не меняете цвет где-нибудь в коде?

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);
    }

}

Test1:

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);
    }    
}

Также, на мой взгляд, было бы лучше использовать добытчики / сеттеры для доступа к публичным свойствам, они дают вам большую гибкость:

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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...