Unity中读取XML配置需将文件置于Resources或StreamingAssets目录,用XDocument.Parse解析TextAsset或异步加载StreamingAssets路径文件,并通过扩展方法安全提取字段值。

Unity里用XML存配置,C#怎么读取才不崩
Unity本身不内置XML解析器,但.NET Framework和.NET Runtime自带 System.Xml 和更现代的 System.Xml.Linq,只要项目目标框架支持(Unity 2019.4+ 默认用 .NET Standard 2.1 或 .NET 6+),就能直接用。关键不是“能不能”,而是“放哪、怎么读、怎么防错”。
XML文件必须放Resources或StreamingAssets目录
Unity编辑器里拖进项目的XML文件,默认不会被打包进构建后资源。想运行时读取,得明确告诉Unity“这是数据,别删”。两种主流方式:
-
Resources目录:把XML放进Assets/Resources/config.xml,用Resources.Load加载——但注意返回的是("config") TextAsset,需用.text取字符串再解析 -
StreamingAssets目录:放Assets/StreamingAssets/config.xml,构建后原样复制到输出目录(如Application.streamingAssetsPath),适合需要外部修改的配置(比如玩家自定义键位) - 别放
Assets根目录或普通文件夹下——构建时会被忽略,File.Exists在真机上一定返回false
用XDocument比XmlDocument更稳
XmlDocument 是老式DOM API,容易在Unity协程或多线程中出问题;XDocument(来自 System.Xml.Linq)更轻量、函数式风格强、异常更明确,推荐作为首选。示例读取逻辑:
using System.Xml.Linq;
using UnityEngine;
public static class ConfigLoader
{
public static bool TryLoadConfig(out XElement root)
{
root = null;
try
{
// 从 Resources 加载
TextAsset asset = Resources.Load("config");
if (asset == null) return false;
XDocument doc = XDocument.Parse(asset.text);
root = doc.Root;
return root != null;
}
catch (System.Xml.XmlException ex)
{
Debug.LogError($"XML解析失败: {ex.Message}");
return false;
}
}
}
常见坑:
- XML声明行
如果编码声明和实际不符(比如文件是UTF-8 BOM但写成encoding="utf-8"),XDocument.Parse会抛XmlException - Unity Android/iOS 构建后,
StreamingAssets路径要用WWW或UnityWebRequest异步加载(因是只读压缩包),不能直接File.ReadAllText - 节点名大小写敏感,
root.Element("Setting")找不到
配置类建议用XElement延时解析,别急着转实体
别一上来就写 new GameConfig { Volume = (float)root.Element("volume") }。XML结构常变,硬绑定容易崩。更安全的做法是封装一层“可空提取”:
public static class XmlExtensions
{
public static float GetFloat(this XElement el, string name, float defaultValue = 0f)
{
var val = el?.Element(name)?.Value;
return float.TryParse(val, out float f) ? f : defaultValue;
}
public static bool GetBool(this XElement el, string name, bool defaultValue = false)
{
var val = el?.Element(name)?.Value;
return bool.TryParse(val, out bool b) ? b : defaultValue;
}
}
这样调用:configRoot.GetFloat("masterVolume", 0.8f)。比反复写 try/catch 或 null 判断清爽,也避免因某字段缺失导致整个配置加载失败。
真正复杂配置(比如技能表、物品列表)建议用 ScriptableObject 替代XML——Unity编辑器里可直接可视化编辑、版本控制友好、无解析开销。XML只适合纯数值开关、语言词条、少量外部可调参数这类场景。










