Add concrete component script field support

This commit is contained in:
2026-04-03 16:51:42 +08:00
parent 73415915e6
commit e0e5c1fcaa
11 changed files with 507 additions and 4 deletions

View File

@@ -75,6 +75,7 @@ std::string ScriptFieldTypeToString(ScriptFieldType type) {
case ScriptFieldType::Vector3: return "Vector3";
case ScriptFieldType::Vector4: return "Vector4";
case ScriptFieldType::GameObject: return "GameObject";
case ScriptFieldType::Component: return "Component";
}
return "None";
@@ -103,6 +104,8 @@ bool TryParseScriptFieldType(const std::string& value, ScriptFieldType& outType)
outType = ScriptFieldType::Vector4;
} else if (value == "GameObject") {
outType = ScriptFieldType::GameObject;
} else if (value == "Component") {
outType = ScriptFieldType::Component;
} else {
return false;
}
@@ -123,6 +126,7 @@ bool IsScriptFieldValueCompatible(ScriptFieldType type, const ScriptFieldValue&
case ScriptFieldType::Vector3: return std::holds_alternative<Math::Vector3>(value);
case ScriptFieldType::Vector4: return std::holds_alternative<Math::Vector4>(value);
case ScriptFieldType::GameObject: return std::holds_alternative<GameObjectReference>(value);
case ScriptFieldType::Component: return std::holds_alternative<ComponentReference>(value);
}
return false;
@@ -141,6 +145,7 @@ ScriptFieldValue CreateDefaultScriptFieldValue(ScriptFieldType type) {
case ScriptFieldType::Vector3: return Math::Vector3::Zero();
case ScriptFieldType::Vector4: return Math::Vector4::Zero();
case ScriptFieldType::GameObject: return GameObjectReference{};
case ScriptFieldType::Component: return ComponentReference{};
}
return std::monostate{};
@@ -180,6 +185,10 @@ std::string SerializeScriptFieldValue(ScriptFieldType type, const ScriptFieldVal
}
case ScriptFieldType::GameObject:
return std::to_string(std::get<GameObjectReference>(value).gameObjectUUID);
case ScriptFieldType::Component: {
const ComponentReference reference = std::get<ComponentReference>(value);
return std::to_string(reference.gameObjectUUID) + "," + std::to_string(reference.scriptComponentUUID);
}
}
return std::string();
@@ -236,6 +245,18 @@ bool TryDeserializeScriptFieldValue(ScriptFieldType type, const std::string& val
case ScriptFieldType::GameObject:
outValue = GameObjectReference{static_cast<uint64_t>(std::stoull(value))};
return true;
case ScriptFieldType::Component: {
const size_t separator = value.find(',');
if (separator == std::string::npos) {
return false;
}
outValue = ComponentReference{
static_cast<uint64_t>(std::stoull(value.substr(0, separator))),
static_cast<uint64_t>(std::stoull(value.substr(separator + 1)))
};
return true;
}
}
} catch (...) {
return false;