#pragma once #include "BsScriptEnginePrerequisites.h" #include "BsRTTIType.h" #include "BsGameObjectRTTI.h" #include "BsManagedComponent.h" #include "BsMonoManager.h" #include "BsManagedSerializableObject.h" #include "BsGameObjectManager.h" #include "BsScriptComponent.h" namespace BansheeEngine { class BS_SCR_BE_EXPORT ManagedComponentRTTI : public RTTIType { private: String& getNamespace(ManagedComponent* obj) { return obj->mNamespace; } void setNamespace(ManagedComponent* obj, String& val) { obj->mNamespace = val; } String& getTypename(ManagedComponent* obj) { return obj->mTypeName; } void setTypename(ManagedComponent* obj, String& val) { obj->mTypeName = val; } ManagedSerializableObjectPtr getObjectData(ManagedComponent* obj) { return any_cast(obj->mRTTIData); } void setObjectData(ManagedComponent* obj, ManagedSerializableObjectPtr val) { obj->mSerializedObjectData = val; } bool& getMissingType(ManagedComponent* obj) { return obj->mMissingType; } void setMissingType(ManagedComponent* obj, bool& val) { obj->mMissingType = val; } public: ManagedComponentRTTI() { addPlainField("mNamespace", 0, &ManagedComponentRTTI::getNamespace, &ManagedComponentRTTI::setNamespace); addPlainField("mTypename", 1, &ManagedComponentRTTI::getTypename, &ManagedComponentRTTI::setTypename); addReflectablePtrField("mObjectData", 2, &ManagedComponentRTTI::getObjectData, &ManagedComponentRTTI::setObjectData); addPlainField("mMissingType", 3, &ManagedComponentRTTI::getMissingType, &ManagedComponentRTTI::setMissingType); } void onSerializationStarted(IReflectable* obj) override { ManagedComponent* mc = static_cast(obj); MonoObject* managedInstance = mc->getManagedInstance(); if (managedInstance != nullptr) mc->mRTTIData = ManagedSerializableObject::createFromExisting(managedInstance); else mc->mRTTIData = mc->mSerializedObjectData; } void onSerializationEnded(IReflectable* obj) override { ManagedComponent* mc = static_cast(obj); mc->mRTTIData = nullptr; } virtual const String& getRTTIName() override { static String name = "ManagedComponent"; return name; } virtual UINT32 getRTTIId() override { return TID_ManagedComponent; } virtual std::shared_ptr newRTTIObject() override { return GameObjectRTTI::createGameObject(); } }; }