我的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];
}
winColor
中gameController.cs
的值为RGBA(1.000, 0.000, 0.000, 1.000)
但是在tile.cs
中,我得到了RGBA(0.000, 0.000, 0.000, 0.000)
有什么想法吗?
答案 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);
}
}