跳转到主内容
极星编程网:以代码为星,赴技术山海!

Unity游戏怎么用XML来做配置 C#读取游戏设置

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; } } }
常见坑: React Native For Android 源码编译 中文WORD版 本文档主要讲述的是React Native For Android 源码编译;希望对大家会有帮助;感兴趣的朋友可以过来看看 下载 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只适合纯数值开关、语言词条、少量外部可调参数这类场景。

相关文章