Edit Unreal Engine DataTable configuration through JSON files — auto-discover projects, search, modify, validate, and import back to the engine.
UE projects commonly store DataTable data in .uasset files, with corresponding JSON source files that serve as the editable representation. This skill provides a complete workflow for discovering, modifying, and re-importing these data tables.
This skill works with any UE project — it automatically detects the project structure and locates DataTable JSON files. No hardcoded paths required.
The JSON file should be an array of objects, each with a Name field as the row key:
json
[
{ "Name": "230000", "DevName": "技能名", "LOC_Name": "NSLOCTEXT(...)", ... },
{ "Name": "230001", ... }
]
.uasset files are binary and cannot be edited directly — always modify through JSON then import.ALWAYS run this step first when the user has not provided a specific JSON path. Use scripts/dt_discover.py to auto-detect UE projects and DataTable JSON files:
bash
# Auto-discover all UE projects and DataTable JSON files in common locations
python {SKILL_DIR}/scripts/dt_discover.py
# Search in a specific directory
python {SKILL_DIR}/scripts/dt_discover.py --root "<directory>"
# Find a specific table by name (matches JSON filename)
python {SKILL_DIR}/scripts/dt_discover.py --table "AI_Skills"
# Filter by UE project name
python {SKILL_DIR}/scripts/dt_discover.py --project "SMG"
# Output as JSON for parsing
python {SKILL_DIR}/scripts/dt_discover.py --json-output
When the user provides a table name (e.g. "修改 AI_Skills 表"), use --table to locate the matching JSON file:
bash
python {SKILL_DIR}/scripts/dt_discover.py --table "<user_provided_table_name>"
Once the JSON file is identified, store its absolute path for use in subsequent steps.
Use scripts/dt_search.py to locate the row(s) to modify. The --json parameter takes the path discovered in Step 0.
bash
# Search by row ID
python {SKILL_DIR}/scripts/dt_search.py --json <json_path> --id 230000
# Search by name keyword
python {SKILL_DIR}/scripts/dt_search.py --json <json_path> --name "蓄力"
# Search by any field
python {SKILL_DIR}/scripts/dt_search.py --json <json_path> --field DevName --value "瞬移"
# List all rows in a Part (for AI Skills tables)
python {SKILL_DIR}/scripts/dt_search.py --json <json_path> --part 1
# Show full JSON for results
python {SKILL_DIR}/scripts/dt_search.py --json <json_path> --id 230000 --full
# List all available fields
python {SKILL_DIR}/scripts/dt_search.py --json <json_path> --list-fields
Present search results to the user before proceeding with modifications.
Use scripts/dt_modify.py to modify fields. The script automatically:
NSLOCTEXT() format for localization fieldsbash
# Modify LOC_Desc (auto-wraps in NSLOCTEXT)
python {SKILL_DIR}/scripts/dt_modify.py --json <json_path> --id 230000 --set-loc-desc "对随机角色造成伤害"
# Modify LOC_Name
python {SKILL_DIR}/scripts/dt_modify.py --json <json_path> --id 230000 --set-loc-name "新技能名"
# Modify any field
python {SKILL_DIR}/scripts/dt_modify.py --json <json_path> --id 230000 --set "bUseAlert=true" --set "DevName=新名称"
# Preview without saving (dry-run)
python {SKILL_DIR}/scripts/dt_modify.py --json <json_path> --id 230000 --set-loc-desc "测试" --dry-run
# Validate entire JSON
python {SKILL_DIR}/scripts/dt_modify.py --json <json_path> --validate
For localization fields ( LOC_Name, LOC_Desc, LOC_AlertText, LOC_InterruptMessage, LOC_NoticeText):
NSLOCTEXT("<PartName>", "<SkillID>_<FieldName>", "<text>")NSLOCTEXT(...) or INVTEXT(...) string, it is used as-is--no-wrap flag to disable auto-wrappingFor complex modifications (nested objects, arrays, or bulk changes), directly edit the JSON file using replace_in_file or read_file + write_to_file tools. Always validate after editing:
bash
python {SKILL_DIR}/scripts/dt_modify.py --json <json_path> --validate
After modifying and validating the JSON, generate the UE import command. The user must execute this command in the UE Editor Output Log:
text
py "{SKILL_DIR}/scripts/dt_import_ue.py" --json "<json_path>" --part <part_number>
Parameters:
--part 0 — Import Part0 (ID 200000–229999)--part 1 — Import Part1 (ID 230000–239999)--part 2 — Import Part2 (ID 240000–249999)--part all — Import all Parts--asset-base "<path>" — Override the UE asset base path (default: /Game/SMG/Configs/DataTables/AISkills)Determine the correct --part number from the row ID being modified. Always provide the full command with absolute paths for the user to copy-paste.
After the user reports the UE import result, check the log output for:
Imported DataTable '...' - 0 Problems = SuccessError lines = Investigation neededRefer to references/field_schema.md for the complete field documentation when needed.
User says: "修改 AI_Skills 表中技能 230005 的描述"
Discover: python {SKILL_DIR}/scripts/dt_discover.py --table "AI_Skills"
→ Found: D:\Projects\MyGame\Content\Configs\Json\Json_AI_Skills.json
Search: python {SKILL_DIR}/scripts/dt_search.py --json "<found_path>" --id 230005
→ Shows current skill data
Modify: python {SKILL_DIR}/scripts/dt_modify.py --json "<found_path>" --id 230005 --set-loc-desc "新的描述文本"
→ Modifies and validates
Import: Provide UE command for the user to run in editor
ErrorCauseSolutionNo UE project foundProject not in search pathsUse --root to specify project directoryNo DataTable JSON foundJSON file not in Content directoryCheck project structure, provide path manuallyUnicodeDecodeErrorWrong encoding detectionScripts auto-detect; if issues persist, check file BOM bytesfill_data_table_from_json_string failsJSON fields don't match RowStructValidate JSON, check for missing/extra fieldsDataTable not foundWrong asset pathUse --asset-base to specify correct UE asset pathP4 checkout failureFile locked by another userCoordinate with team or force checkout