Add support for editing JsonAsset data at runtime (eg. modify game settings on the fly)
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
|
// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
#include "JsonAsset.h"
|
#include "JsonAsset.h"
|
||||||
#include "Engine/Threading/Threading.h"
|
|
||||||
#if USE_EDITOR
|
#if USE_EDITOR
|
||||||
#include "Engine/Platform/File.h"
|
#include "Engine/Platform/File.h"
|
||||||
#include "Engine/Core/Types/DataContainer.h"
|
#include "Engine/Core/Types/DataContainer.h"
|
||||||
@@ -14,6 +13,7 @@
|
|||||||
#include "Cache/AssetsCache.h"
|
#include "Cache/AssetsCache.h"
|
||||||
#include "Engine/Core/Log.h"
|
#include "Engine/Core/Log.h"
|
||||||
#include "Engine/Serialization/JsonTools.h"
|
#include "Engine/Serialization/JsonTools.h"
|
||||||
|
#include "Engine/Serialization/JsonWriters.h"
|
||||||
#include "Engine/Content/Factories/JsonAssetFactory.h"
|
#include "Engine/Content/Factories/JsonAssetFactory.h"
|
||||||
#include "Engine/Core/Cache.h"
|
#include "Engine/Core/Cache.h"
|
||||||
#include "Engine/Debug/Exceptions/JsonParseException.h"
|
#include "Engine/Debug/Exceptions/JsonParseException.h"
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "Engine/Scripting/ManagedCLR/MClass.h"
|
#include "Engine/Scripting/ManagedCLR/MClass.h"
|
||||||
#include "Engine/Scripting/ManagedCLR/MField.h"
|
#include "Engine/Scripting/ManagedCLR/MField.h"
|
||||||
#include "Engine/Utilities/StringConverter.h"
|
#include "Engine/Utilities/StringConverter.h"
|
||||||
|
#include "Engine/Threading/Threading.h"
|
||||||
|
|
||||||
JsonAssetBase::JsonAssetBase(const SpawnParams& params, const AssetInfo* info)
|
JsonAssetBase::JsonAssetBase(const SpawnParams& params, const AssetInfo* info)
|
||||||
: Asset(params, info)
|
: Asset(params, info)
|
||||||
@@ -45,9 +46,22 @@ String JsonAssetBase::GetData() const
|
|||||||
return String((const char*)buffer.GetString(), (int32)buffer.GetSize());
|
return String((const char*)buffer.GetString(), (int32)buffer.GetSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JsonAssetBase::SetData(const StringView& value)
|
||||||
|
{
|
||||||
|
if (!IsLoaded())
|
||||||
|
return;
|
||||||
|
PROFILE_CPU_NAMED("JsonAsset.SetData");
|
||||||
|
const StringAnsi dataJson(value);
|
||||||
|
ScopeLock lock(Locker);
|
||||||
|
const StringView dataTypeName = DataTypeName;
|
||||||
|
if (Init(dataTypeName, dataJson))
|
||||||
|
{
|
||||||
|
LOG(Error, "Failed to set Json asset data.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool JsonAssetBase::Init(const StringView& dataTypeName, const StringAnsiView& dataJson)
|
bool JsonAssetBase::Init(const StringView& dataTypeName, const StringAnsiView& dataJson)
|
||||||
{
|
{
|
||||||
CHECK_RETURN(IsVirtual(), true);
|
|
||||||
unload(true);
|
unload(true);
|
||||||
DataTypeName = dataTypeName;
|
DataTypeName = dataTypeName;
|
||||||
DataEngineBuild = FLAXENGINE_VERSION_BUILD;
|
DataEngineBuild = FLAXENGINE_VERSION_BUILD;
|
||||||
@@ -63,6 +77,7 @@ bool JsonAssetBase::Init(const StringView& dataTypeName, const StringAnsiView& d
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Data = &Document;
|
Data = &Document;
|
||||||
|
_isVirtualDocument = true;
|
||||||
|
|
||||||
// Load asset-specific data
|
// Load asset-specific data
|
||||||
return loadAsset() != LoadResult::Ok;
|
return loadAsset() != LoadResult::Ok;
|
||||||
@@ -137,7 +152,7 @@ void JsonAssetBase::GetReferences(Array<Guid>& output) const
|
|||||||
|
|
||||||
Asset::LoadResult JsonAssetBase::loadAsset()
|
Asset::LoadResult JsonAssetBase::loadAsset()
|
||||||
{
|
{
|
||||||
if (IsVirtual())
|
if (IsVirtual() || _isVirtualDocument)
|
||||||
return LoadResult::Ok;
|
return LoadResult::Ok;
|
||||||
|
|
||||||
// Load data (raw json file in editor, cooked asset in build game)
|
// Load data (raw json file in editor, cooked asset in build game)
|
||||||
@@ -210,6 +225,7 @@ void JsonAssetBase::unload(bool isReloading)
|
|||||||
Data = nullptr;
|
Data = nullptr;
|
||||||
DataTypeName.Clear();
|
DataTypeName.Clear();
|
||||||
DataEngineBuild = 0;
|
DataEngineBuild = 0;
|
||||||
|
_isVirtualDocument = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_EDITOR
|
#if USE_EDITOR
|
||||||
|
|||||||
@@ -66,5 +66,16 @@ namespace FlaxEngine
|
|||||||
Debug.LogError(string.Format("Missing type '{0}' to create Json Asset instance.", dataTypeName), this);
|
Debug.LogError(string.Format("Missing type '{0}' to create Json Asset instance.", dataTypeName), this);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the instance of the asset (for both C# and C++). Doesn't save asset to the file (runtime only).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="instance">The new instance.</param>
|
||||||
|
public void SetInstance(object instance)
|
||||||
|
{
|
||||||
|
_instance = instance;
|
||||||
|
string str = instance != null ? JsonSerializer.Serialize(instance) : null;
|
||||||
|
Data = str;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ API_CLASS(Abstract, NoSpawn) class FLAXENGINE_API JsonAssetBase : public Asset
|
|||||||
DECLARE_SCRIPTING_TYPE_NO_SPAWN(JsonAssetBase);
|
DECLARE_SCRIPTING_TYPE_NO_SPAWN(JsonAssetBase);
|
||||||
protected:
|
protected:
|
||||||
String _path;
|
String _path;
|
||||||
|
bool _isVirtualDocument = false;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -50,6 +51,11 @@ public:
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
API_PROPERTY() String GetData() const;
|
API_PROPERTY() String GetData() const;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The Json data (as string).
|
||||||
|
/// </summary>
|
||||||
|
API_PROPERTY() void SetData(const StringView& value);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes the virtual Json asset with custom data.
|
/// Initializes the virtual Json asset with custom data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user