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只适合纯数值开关、语言词条、少量外部可调参数这类场景。