UnLua使用UnLua.Ref来引用UObject

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、付费专栏及课程。

余额充值