如何更新MonoBehaviour脚本的属性?

时间:2014-07-28 16:06:07

标签: c# unity3d

我有一个MarkBehaviour类,其中包含一个名为markCount的属性。根据{{​​1}},我将在markCount函数中选择精灵。

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

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()

2 个答案:

答案 0 :(得分:2)

问题

当你运行这行代码时:

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

您实际上是这样说,请在预制件mark中找到MarkBehaviour。这不起作用,因为预制件尚未实例化,只有预制件的克隆。


你有两种很好的方法可以做到这一点。

解决方案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);

答案 1 :(得分:1)

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

替换这个:

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

用这个:

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