如何更新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;
}
}
问题
当你运行这行代码时:
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;