用GameObject作为函数参数传参

本文探讨了Unity中GameObject作为参数传递时的行为特征,通过实验验证了传递的是对象引用的拷贝而非值传递,同时指出若要修改外部对象则需使用ref关键字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,字符串。


原文链接:http://blog.youkuaiyun.com/fansongy/article/details/48712553

文章作者:松阳



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值