Unity中读取XML配置需将文件置于Resources或StreamingAssets目录,用XDocument.Parse解析TextAsset或异步加载StreamingAssets路径文件,并通过扩展方法安全提取字段值。
Unity里用XML存配置,C#怎么读取才不崩
Unity本身不内置XML解析器,但.NET Framework和.NET Runtime自带
和更现代的
,只要项目目标框架支持(Unity 2019.4+ 默认用 .NET Standard 2.1 或 .NET 6+),就能直接用。关键不是“能不能”,而是“放哪、怎么读、怎么防错”。
XML文件必须放
或
目录
Unity编辑器里拖进项目的XML文件,默认不会被打包进构建后资源。想运行时读取,得明确告诉Unity“这是数据,别删”。两种主流方式:
目录:把XML放进
,用
加载——但注意返回的是
,需用
取字符串再解析
目录:放
,构建后原样复制到输出目录(如
),适合需要外部修改的配置(比如玩家自定义键位)
别放
根目录或普通文件夹下——构建时会被忽略,
在真机上一定返回
用
比
更稳
是老式DOM API,容易在Unity协程或多线程中出问题;
(来自
)更轻量、函数式风格强、异常更明确,推荐作为首选。示例读取逻辑:
常见坑:
React Native For Android 源码编译 中文WORD版
本文档主要讲述的是React Native For Android 源码编译;希望对大家会有帮助;感兴趣的朋友可以过来看看
下载
XML声明行
如果
编码
声明和实际不符(比如文件是UTF-8 BOM但写成
),
会抛
Unity Android/iOS 构建后,
路径要用
或
异步加载
(因是只读压缩包),不能直接
节点名大小写敏感,
找不到
配置类建议用
延时解析,别急着转实体
别一上来就写
。XML结构常变,硬绑定容易崩。更安全的做法是封装一层“可空提取”:
这样调用:
。比反复写
或
判断清爽,也避免因某字段缺失导致整个配置加载失败。
真正复杂配置(比如技能表、物品列表)建议用
替代XML——Unity编辑器里可直接可视化编辑、版本控制友好、无解析开销。XML只适合纯数值开关、语言词条、少量外部可调参数这类场景。
System.XmlSystem.Xml.LinqResourcesStreamingAssetsResourcesAssets/Resources/config.xmlResources.Load("config") TextAsset.textStreamingAssetsAssets/StreamingAssets/config.xmlApplication.streamingAssetsPathAssetsFile.ExistsfalseXDocumentXmlDocumentXmlDocumentXDocumentSystem.Xml.Linqusing 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;
}
}
} encoding="utf-8"XDocument.ParseXmlExceptionStreamingAssetsWWWUnityWebRequestFile.ReadAllTextroot.Element("Setting")XElementnew GameConfig { Volume = (float)root.Element("volume") }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/catchnullScriptableObject