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。