Unity3d开发(三)GameObject 作函数参数

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等都有这样的特性。

版权声明:本文为博主原创文章,未经博主允许不得转载。

诚实是人生绝妙的法宝。虽然对人诚实,

Unity3d开发(三)GameObject 作函数参数

相关文章:

你感兴趣的文章:

标签云: