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

9次阅读

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

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

Unity里用XML存配置,C#怎么读取才不崩

Unity本身不内置xml解析器,但.net Framework和.NET Runtime自带 System.Xml 和更现代的 System.Xml.linq,只要项目目标框架支持(Unity 2019.4+ 默认用 .NET Standard 2.1 或 .NET 6+),就能直接用。关键不是“能不能”,而是“放哪、怎么读、怎么防错”。

XML文件必须放ResourcesStreamingAssets目录

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

XDocumentXmlDocument更稳

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 路径要用 WWWUnityWebRequest 异步加载(因是只读压缩包),不能直接 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/catchnull 判断清爽,也避免因某字段缺失导致整个配置加载失败。

真正复杂配置(比如技能表、物品列表)建议用 ScriptableObject 替代XML——Unity编辑器里可直接可视化编辑、版本控制友好、无解析开销。XML只适合纯数值开关、语言词条、少量外部可调参数这类场景。

text=ZqhQzanResources