Unity 数据读取|(一)宏的定义和资源路径

本文详细介绍了Unity编程中如何使用平台宏定义来根据不同环境执行代码,以及各种常见资源路径的访问权限和适用场景。涵盖了Unity编辑器脚本符号、iOS、Android、Windows、Mac和WebGL平台的示例及路径属性说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.平台宏定义

1.1 使用场合

  • 在程序中我们想要根据不同的运行环境去执行不同的代码时使用。比如我们在PC上和安卓上需要执行不同的代码,我们就可以使用Unity自带的宏定义来区分。

1.2 常用定义

定义功能
UNITY_EDITOR用于从游戏代码调用 Unity 编辑器脚本的脚本符号。
UNITY_EDITOR_WINWindows 上编辑器代码的脚本符号。
UNITY_EDITOR_OSXMac OS X 上编辑器代码的脚本符号。
UNITY_EDITOR_LINUXLinux 上编辑器代码的脚本符号。
UNITY_STANDALONE_OSX专门用于 Mac OS X(包括 Universal、PPC 和 Intel 架构)编译或执行代码的脚本符
UNITY_STANDALONE_WIN用于专门为 Windows 独立应用程序编译/执行代码的脚本符号。
UNITY_STANDALONE_LINUX用于专门为 Linux 独立应用程序编译/执行代码的脚本符号。
UNITY_STANDALONE用于为任何独立平台(Mac OS X、Windows 或 Linux)编译/执行代码的脚本符号。
UNITY_WII用于为 Wii 控制台编译/执行代码的脚本符号。
UNITY_IOS用于为 iOS 平台编译/执行代码的脚本符号。
UNITY_IPHONE已弃用。请改用UNITY_IOS。
UNITY_ANDROIDAndroid 平台的脚本符号。
UNITY_LUMINMagic Leap OS 平台的脚本符号。您还可以使用PLATFORM_LUMIN。请注意,Lumin 平台不再受支持。
UNITY_TIZENTizen 平台的脚本符号。
UNITY_TVOSApple TV 平台的脚本符号。
UNITY_WSA脚本符号为通用Windows平台。此外,NETFX_CORE是在针对 .NET Core 编译 C# 文件并使用 .NET 时定义的脚本后端。
UNITY_WSA_10_0通用 Windows 平台的脚本符号。此外,WINDOWS_UWP是在针对 .NET Core 编译 C# 文件时定义的。
UNITY_WEBGL脚本符号为网页GL
UNITY_FACEBOOKFacebook 平台的脚本符号(WebGL 或 Windows 独立)。
UNITY_ANALYTICS用于调用 Unity 的脚本符号分析。
UNITY_ASSERTIONS用于断言控制过程的脚本符号。
UNITY_6464 位平台的脚本符号。

1.3 代码样例

using UnityEngine;
using System.Collections;

public class PlatformDefines : MonoBehaviour {
  void Start () {

    #if UNITY_EDITOR
      Debug.Log("Unity Editor");
    #endif

    #if UNITY_IOS
      Debug.Log("iOS");
    #endif

    #if UNITY_STANDALONE_OSX
        Debug.Log("Standalone OSX");
    #endif

    #if UNITY_STANDALONE_WIN
      Debug.Log("Standalone Windows");
    #endif

  }          
}

2.资源路径

2.1 常用路径说明

  • 程序读取文件首先需要获取路径,在不同平台路径的存取权限不同,用途也不一样,有些时候相同的资源存储路径,在不同平台下访问方式也不一样。相信大家一定踩坑不少,故总结常用的资源存储路径,便于以后方便查阅。

    路径属性访问权限路径说明特点
    Resources只读Unity内部路径,Resources文件夹,可以是Assets目录下的子目录或者是孙目录会将文件夹内的资源打包集成到.asset文件里面。因此建议可以放一些Prefab,因为Prefab在打包时会自动过滤掉不需要的资源,有利于减小资源包的大小。资源读取使用Resources.Load()。
    Application.dataPath只读此属性用于返回程序的数据文件所在文件夹的路径。例如在Editor中就是Assets了。只能用于Windows模式或者Editor模式。
    Application.streamingAssetsPath只读此属性用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径。放在Unity工程StreamingAssets文件夹中的资源发布后都可以通过这个路径读取出来。(1)在打包时资源会原封不动地打包进去,不会压缩,一般放置资源数据(2)在PC/Mac中可实现对文件的“增删改查”等操作,但在移动端是一个只读路径。(3)在打包时不会被压缩,读取速度很快,但是需要加密预防别人解压破解。(4)一般在这个文件夹里面存放一些二进制文件(比如AssetBundle,mp4等一些文件)。(5)在Android端读取这个文件夹时,只能使用WWW进行异步读取,而在ios和pc上则可以使用File类及其他同步读取方式。
    Application.persistendDataPath读写此属性用于返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件。(1)这个路径可读可写,但只能在程序运行的时候才能读写操作,不能提前将数据放入这个路径;(2)在IOS上是应用沙盒,可以被iCloud自动备份,可以通过同步推送一类的助手直接取出文件;(3)在Android上的位置是根据Project Setting里设置的Write Access路径,可以设置是程序沙盒还是sdcard(如果在Android设置保存在沙盒中,那么就必须root以后才能用电脑取出文件,因此建议写在sdcard里);(4)在Android端读取这个文件夹时,只能使用WWW进行异步读取,而在ios和pc上则可以使用File类及其他同步读取方式。(5)可以将需要热更的文件放在里面(将一些文件放在Application.streamingAssetsPath,在运行后再将Application.streamingAssetsPath里面的文件移动到Application.persistentDataPath下,再进行热更。也可以完全从服务器上下载后存放在Application.persistentDataPath。
    Application.temporaryCachePath只读此属性用于返回一个临时数据的缓存目录。IOS上不能被自动备份

2.2 常用路径说明

2.2.1 IOS

路径属性路径
Application.dataPathApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
Application.streamingAssetsPathApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
Application.persistentDataPathApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
Application.temporaryCachePathApplication/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches

2.2.2 Android

路径属性路径
Application.dataPath/data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPathjar:file:///data/app/xxx.xxx.xxx.apk/!/assets
Application.persistentDataPath/data/data/xxx.xxx.xxx/files
Application.temporaryCachePath/data/data/xxx.xxx.xxx/cache

2.2.3 Windows

路径属性路径
Application.dataPath/Assets
Application.streamingAssetsPath/Assets/StreamingAssets
Application.persistentDataPathC:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName
Application.temporaryCachePathC:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName

2.2.4 Mac

路径属性路径
Application.dataPath/Assets
Application.streamingAssetsPath/Assets/StreamingAssets
Application.persistentDataPath/Users/xxxx/Library/Caches/CompanyName/Product Name
Application.temporaryCachePath/var/folders/57/6b4_9w8113x2fsmzx_yhrhvh0000gn/T/CompanyName/Product Name

2.2.5 Windows Web Player

路径属性路径
Application.dataPath/ file:///D:/MyGame/WebPlayer (即导包后保存的文件夹,html文件所在文件夹)
Application.streamingAssetsPath
Application.persistentDataPath
Application.temporaryCachePath
<think>好的,我需要回答用户关于Unity如何存储读取JSON数据的问题。首先,我要确保自己了解Unity中处理JSON的基本方法。记得Unity通常使用C#,所以可能需要用到System.IONewtonsoft的JSON库,或者Unity自带的JsonUtility。 用户可能想知道如何将对象序列化为JSON并保存到文件,以及如何从文件中读取JSON并反序列化为对象。我应该分步骤解释,先介绍序列化反序列化的基本概念,再说明具体代码实现。 首先,存储数据到JSON。需要创建数据类,比如PlayerData,包含需要保存的字段。然后使用JsonUtility.ToJson将对象转换为JSON字符串,再用File.WriteAllText保存到文件。需要确保路径正确,Application.persistentDataPath是常用的安全路径。 接下来是读取部分,使用File.ReadAllText读取文件内容,再用JsonUtility.FromJson将字符串转回对象。要提醒用户处理文件不存在的情况,可能加入异常处理或者检查文件是否存在。 另外,用户可能不熟悉JsonUtility的限制,比如不支持复杂结构如字典,可能需要提到使用第三方库如Newtonsoft的Json.NET来处理更复杂的情况。但为了简单起见,先专注于Unity内置的方法。 还要注意示例代码的正确性,比如确保类有[Serializable]属性,字段是public的,否则JsonUtility可能无法正确序列化。可能需要给出完整的代码示例,从定义类到保存加载的过程。 用户可能遇到的常见问题,比如路径问题、权限问题,或者数据结构变化导致的反序列化失败,可以简要提及注意事项,比如版本控制或数据迁移。 总结步骤:创建数据模型→序列化→保存到文件→读取文件→反序列化。确保每个步骤都有代码示例解释,结构清晰,方便用户跟随操作。 最后检查是否符合系统级指令,数学公式不需要,但确保JSON格式正确,代码块使用正确的标记,使用中文回答,分点说明,结构清晰。可能需要验证代码是否实际可行,比如JsonUtility的使用是否正确,文件操作的路径是否正确。</think>在Unity中存储读取JSON数据可分为以下步骤: --- ### 、存储JSON数据 #### 1. 定义数据模型类 ```csharp [System.Serializable] public class PlayerData { public string playerName; public int level; public float health; public List<string> inventory; } ``` #### 2. 序列化并保存 ```csharp using UnityEngine; using System.IO; public class SaveManager : MonoBehaviour { void SaveData() { // 创建数据对象 PlayerData data = new PlayerData(); data.playerName = "Player1"; data.level = 5; data.health = 80.5f; data.inventory = new List<string> { "Sword", "Potion" }; // 序列化为JSON字符串 string jsonData = JsonUtility.ToJson(data, true); // true表示格式化输出 // 保存到文件 string path = Path.Combine(Application.persistentDataPath, "save.json"); File.WriteAllText(path, jsonData); Debug.Log("保存路径: " + path); } } ``` --- ### 二、读取JSON数据 #### 1. 从文件读取并反序列化 ```csharp PlayerData LoadData() { string path = Path.Combine(Application.persistentDataPath, "save.json"); if (File.Exists(path)) { string jsonData = File.ReadAllText(path); PlayerData data = JsonUtility.FromJson<PlayerData>(jsonData); return data; } else { Debug.LogError("文件不存在!"); return null; } } ``` #### 2. 使用数据 ```csharp void LoadAndUseData() { PlayerData loadedData = LoadData(); if (loadedData != null) { Debug.Log($"玩家名: {loadedData.playerName}"); Debug.Log($"等级: {loadedData.level}"); } } ``` --- ### 三、关键注意事项 1. **路径选择** - `Application.persistentDataPath` 是跨平台安全路径(推荐使用) - 不要直接使用 `Application.dataPath`(编辑器模式可用,但打包后不可写) 2. **序列化限制** - Unity自带的 `JsonUtility` 不支持字典等复杂结构 - 需要复杂序列化时,可安装 `Newtonsoft Json.NET`(需通过Package Manager导入) 3. **数据安全** - 敏感数据建议加密后存储 - 文件操作建议用 `try-catch` 包裹处理异常 --- ### 四、扩展:Newtonsoft JSON使用(选学) 1. 安装:通过 Package Manager 添加 `JSON .NET` 2. 序列化/反序列化: ```csharp using Newtonsoft.Json; // 序列化 string json = JsonConvert.SerializeObject(data, Formatting.Indented); // 反序列化 PlayerData data = JsonConvert.DeserializeObject<PlayerData>(json); ``` --- 通过以上步骤,你可以在Unity中实现游戏存档、配置加载等常见数据操作。建议先通过简单数据类型练习,再逐步处理复杂结构。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游戏开发小Y

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值