UnLua使用UnLua.Ref来引用UObject

在C++中,使用UPROPERTY可以引用UObject。UnLua提供UnLua.Ref和UnLua.Release来管理在lua中创建的UObject引用。这背后的原理涉及到FGCObject类,它维护了一个引用对象集合,并在垃圾回收时确保对象不被删除。FObjectReferencer在UnLua的FLuaEnv中使用,通过Add和Remove方法添加或移除引用。

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

C++里面,我们如果要引用住UObject,只要给变量加上UPROPERTY修饰即可,而蓝图里面的变量默认都有UPROPERTY。

问题是,我们在lua里面创建的UObject,该怎么保持住它的引用呢?

UnLua提供了两个函数来做到这一点

--引用Obj
self.RefHandle = UnLua.Ref(Obj)

--释放Obj引用
self.RefHandle = nil

那么这两个函数能够做到这点的原理是什么呢?

关键在于FGCObject这个类。

class FObjectReferencer: public FGCObject
{
    void Add(UObject* Object)
    {
        if(Object == nullptr)
            return;
        ReferencedObjects.Add(Object);
    }

    void Remove(UObject* Object)
    {
        if(Object == nullptr)
            return;
        ReferencedObjects.Remove(Object);
    }
    virtual void AddReferencedObjects(FReferenceCollector& Collector) override
    {
        Collector.AddReferencedObjects(ReferencedObjects);
    }
    TSet<UObject*> ReferencedObjects;

};

FGCObject内部会将本FGCObject实例加入到全局的引用检测队列中去,AddReferencedObjects用于处理额外的引用对象。凡是被Collector添加了的UObject,都会保持引用,从而不会被GC。

UnLua添加了FObjectReferencer之后,在FLuaEnv里面添加了       

FObjectReferencer ManualObjectReference;

调用UnLua.Ref的时,会调用ManualObjectReference的Add Remove,从而引用住lua里面创建的UObject。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值