width="150" height="210" frameborder="0" scrolling="no" src="http://widget.weibo.com/relationship/bulkfollow.php?language=zh_cn&uids=2080045857&wide=1&color=FFFFFF,FFFFFF,0082CB,666666&showtitle=0&showinfo=1&sense=0&verified=1&count=1&refer=http%3A%2F%2Fwww.himigame.com%2Fandroid-game%2F1521.html&dpc=1" style="font-size: 14px; font-weight: bold; border-width: 0px; margin: 0px; padding: 0px; font-family: arial, helvetica, clean, sans-serif; line-height: 16px;">
GameObject是引用类型么
今天忽然想到这样的问题,我将一个GameObject作为参数传入,在函数内直接更改它。那么它应该是值传递还是引用传递呢?
结论
先说推出的结论:当GameObject作为参数传递时,传递的是对象的引用的拷贝。它很类似C#中的 Func(ref int value),但与其不同的是对它赋值并不会改变原值,因此它是一个拷贝变量,反过来,如果希望影响这个引用,则可以使用ref
验证
所以我做了这样的一个实验:
public class testRef : MonoBehaviour {
GameObject m_obj;
void Start () {
m_obj = gameObject;
Debug.Log("GameObject Instance ID:"+gameObject.GetInstanceID());
}
void makeChild(GameObject obj) {
if(obj == null) {
Debug.LogError("obj is null");
} else {
obj.name=obj.name+"a";
Debug.Log(obj.GetInstanceID());
obj = null;
}
}
void makeRefChild(ref GameObject obj) {
if(obj == null) {
Debug.LogError("obj is null");
} else {
obj.name=obj.name+"b";
Debug.Log(obj.GetInstanceID());
obj = null;
}
}
void OnGUI() {
if(GUILayout.Button("A")) {
makeChild(m_obj);
}
if(GUILayout.Button("B")) {
makeRefChild(ref m_obj);
}
}
}
我在界面中加入两个按钮,每点击一下为当前的GameObject
名字加入一个a
,然后输出InstanceID。运行程序分别点击按钮A、B、A输出如下:
可以发现,作为参数传入的对象与脚本中的GameObject是一致的,因此可以认为操作的是一个对象的引用,但它并不是函数外的引用,因为当对它赋值为空时,并不能改变原值。
另外经测试,GameObject的基类Object也有一样的特性。因此,所有Object的子类例如MonoBehaviour ,Component等都有这样的特性。
PS:
经提醒,我查了一下,所有的C#类都是引用类型
值类型:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。
引用类:数组,用户定义的类、接口、委托,object,字符串。
还是基础不牢固,需要多加强
如果你觉得这篇文章对你有帮助,可以顺手点个顶,不但不会喜当爹,还能让更多人能看到它...