如何更新MonoBehaviour's脚本属性?

本文关键字:脚本 属性 MonoBehaviour 何更新 更新 | 更新日期: 2023-09-27 18:15:10

我有一个MarkBehaviour类,它包含一个称为markCount的属性。根据markCount,我将选择Update()功能上的精灵。

但是当我从其他行为类调用setMark()函数时,我已经在下面的2个函数中记录了markCount属性,但是Update()函数上的markCount属性没有改变。仅在setMark()函数中更改。

public class MarkBehaviour : MonoBehaviour {
    public int markCount;
    void Start(){
           markCount = 0;
    }
    void Update () {    
        Debug.Log ("mark setted from other class" + markCount);
        int cal = calculate (markCount);
        gameObject.GetComponent<SpriteRenderer>().sprite = numberSpriteArray[cal];
    }
    public void setMark(int mark){
        Debug.Log ("manual set mark from other class, set " + markCount);
        markCount = mark;
    }
}

我怎样才能改变它?

调用setMark()函数的另一个类的代码:

public class GameoverBehaviour : MonoBehaviour {
    public GameObject mark;
    void Start () {
        int markCount = getMark ();
        Instantiate (mark, new Vector3(2.3f,-0.5f,0), gameObject.transform.localRotation);
        MarkBehaviour mBS = (MarkBehaviour) mark.GetComponent<MarkBehaviour>();
        mBS.setMark (markCount);
    }
    // Update is called once per frame
    void Update () {
    }
   // for example set it to 30
    int getMark(){
       return 30;
    }
}

如何更新MonoBehaviour's脚本属性?

问题

当你运行这行代码时:

MarkBehaviour mBS = (MarkBehaviour) mark.GetComponent<MarkBehaviour>();

你实际上是在说,在预制mark中找到MarkBehaviour。这不起作用,因为prefab还没有被实例化,只有一个prefab的克隆被实例化了。


你有两种很好的方法来做这件事。

方案1

你可以实例化对象然后SendMessage:

GameObject g = Instantiate(mark, new Vector3(2.3f,-0.5f,0), gameObject.transform.localRotation) as GameObject;
g.SendMessage("setMark", markCount);

注意我保持一个引用g到实例化的对象,以便我可以在它上面使用SendMessage。


方案2

你可以存储对附加到GameObject上的Component MarkBehaviour的引用。

private MarkBehaviour markObj;
GameObject g = Instantiate(mark, new Vector3(2.3f,-0.5f,0), gameObject.transform.localRotation) as GameObject;

一旦你有了GameObject g的引用,你就可以使用GetComponent()函数了。

markObj = g.GetComponent<MarkBehaviour>();
markObj.setMark(markCount);

我认为问题在于您没有创建对标记实例化的适当引用。

替换:

Instantiate (mark, new Vector3(2.3f,-0.5f,0), gameObject.transform.localRotation);

with this:

mark = Instantiate (mark, new Vector3(2.3f,-0.5f,0), gameObject.transform.localRotation) as GameObject;