[Unity]获得目标文件夹下面所有的.asset物体的变量数值

本文介绍了在Unity中如何获取目标文件夹下所有.Item.asset文件的变量数值。首先,通过查找文件夹路径下不同类型的文件,然后利用脚本Test_FindFiles.cs搜索文件夹中的变量。在实现过程中,遇到了Unity中`AssetDatabase`命名空间缺失的问题,参考相关资料解决了该问题。

 

分为几种步骤获得

1.查找文件夹路径下不同类型的文件

2.通过脚本查找文件夹中创建的Item.asset文件的变量

 


 


1.查找文件夹路径下不同类型的文件

参考了参考资料1、2的内容。

 

Test_FindFiles实体的Test_FindFiles.cs脚本的Objects数组,可以用于观察场景运行后 实际获得的 物体。

Test_FindFiles.cs文件挂载在一个空的实体。

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class Test_FindFiles : MonoBehaviour {

    public List<Object> objects = new List<Object>();//用于存放场景运行后的 文件夹下的文件物体

    // Use this for initialization
    void Start() {
        findFiles001();
    }

    /// <summary>
    /// 获得 目标文件夹下面 后缀为.asset的物体
    /// </summary>
    public void findFiles()
    {
        string fullPath = "Assets/123/asset" + "/";  //路径

        //获取指定路径下面的所有资源文件  
        if (Directory.Exists(fullPath))//using System.IO;
        {
            DirectoryInfo direction = new DirectoryInfo(fullPath);
            FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);

            Debug.Log(files.Length);

            for (int i = 0; i < files.Length; i++)
            {
                if (files[
<think>好的,用户之前问过如何在Unity播放模式结束后保存修改,现在又问类似的问题:“在unity播放项目时改东西怎么保存”。看起来用户可能在尝试实时修改并保存,但不太清楚具体步骤或者之前的解释不够明白。 首先,我需要确认用户的需求。他们可能在开发过程中调整参数,比如物体的位置、UI设置或者变量数值,希望在退出播放模式后这些改动能保留下来。之前我介绍了三种方法:脚本持久化、强制标记场景和PlayerPrefs,但用户可能还需要更简洁的步骤或更明确的指导。 接下来,用户可能的疑问点是什么?他们可能对如何选择合适的方法有困惑,或者对具体操作步骤不太清楚。比如,方法二虽然能强制保存场景,但风险较高,用户可能担心数据丢失,或者不知道如何正确使用Editor脚本。而方法一需要编写脚本,对于不熟悉序列化的新手来说可能有点难度。 需要检查之前的回答是否足够详细,是否需要补充示例或注意事项。比如,在方法一中,用户可能需要更多的代码示例或者解释如何应用到不同的组件上。另外,用户可能想知道是否有更快捷的方式,比如使用Asset Store的工具,或者Unity内置的功能。 还要考虑用户的使用场景。他们是个人开发者还是团队协作?如果是团队,方法二的风险更高,因为可能意外覆盖他人的修改。这时候可能需要强调备份的重要性,或者推荐更安全的持久化方法。 另外,用户可能对方法三的PlayerPrefs有误解,以为可以保存任何类型的数据,但实际上它适合简单的键值对,不适合复杂对象。需要明确说明适用场景,避免用户错误使用。 最后,总结时需要再次强调不同方法的优缺点,帮助用户根据具体情况选择最合适的方案。可能还需要提醒用户,频繁修改并保存可能影响开发流程,建议合理规划游戏数据的加载和保存机制。</think>在 Unity 中,**播放模式(Play Mode)** 下直接修改的场景或对象属性默认会在退出播放后重置。若需永久保存这些修改,可通过以下方法实现: --- ### 方法一:运行时数据持久化(推荐) 通过脚本将修改的数据保存到文件,退出播放后重新加载。 #### 步骤: 1. **创建数据存储脚本** 例如保存物体的位置、旋转和缩放: ```csharp using UnityEngine; using System.IO; public class SaveRuntimeChanges : MonoBehaviour { private string savePath => Application.persistentDataPath + "/saved_data.json"; // 退出播放时保存数据 void OnApplicationQuit() { SaveData(); } void SaveData() { // 记录数据(示例:保存当前物体的状态) var data = new TransformData { position = transform.position, rotation = transform.eulerAngles, scale = transform.localScale }; // 序列化为 JSON 并保存 string json = JsonUtility.ToJson(data); File.WriteAllText(savePath, json); } // 游戏启动时加载数据 void Start() { if (File.Exists(savePath)) { string json = File.ReadAllText(savePath); TransformData data = JsonUtility.FromJson<TransformData>(json); transform.position = data.position; transform.eulerAngles = data.rotation; transform.localScale = data.scale; } } } [System.Serializable] public class TransformData { public Vector3 position; public Vector3 rotation; public Vector3 scale; } ``` #### 适用场景: - 需要保存特定物体的状态(如位置、血量、开关状态)。 - 支持复杂数据结构(如列表、类嵌套)。 --- ### 方法二:强制保留场景修改(高风险!慎用) 通过 Editor 脚本在退出播放模式时标记场景为“已修改”,需手动保存场景。 #### 步骤: 1. 在项目中创建 `Editor` 文件夹(若不存在)。 2. 新建脚本 `ForceSaveChanges.cs`: ```csharp using UnityEditor; using UnityEngine; [InitializeOnLoad] public static class ForceSaveChanges { static ForceSaveChanges() { EditorApplication.playModeStateChanged += OnPlayModeStateChanged; } private static void OnPlayModeStateChanged(PlayModeStateChange state) { // 当退出播放模式时 if (state == PlayModeStateChange.ExitingPlayMode) { // 强制标记场景为已修改 UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ); Debug.Log("场景修改已标记,请手动保存!"); } } } ``` 3. 退出播放模式后,按 `Ctrl/Cmd + S` 手动保存场景。 #### 注意事项: - **可能丢失数据**:若未及时保存,场景会恢复原状。 - **破坏协作**:团队开发时可能覆盖他人修改,务必提前沟通。 --- ### 方法三:使用 PlayerPrefs 保存简单数据 适合保存全局设置(如音量、分辨率)。 #### 示例: ```csharp // 保存数据 PlayerPrefs.SetFloat("Volume", 0.8f); PlayerPrefs.SetInt("Resolution", 1920); PlayerPrefs.Save(); // 必须调用 Save() // 读取数据 float volume = PlayerPrefs.GetFloat("Volume", 1.0f); // 默认值 1.0 int resolution = PlayerPrefs.GetInt("Resolution", 1080); ``` #### 局限性: - 仅支持 `int`、`float`、`string` 类型。 - 数据存储在系统注册表或文件中,不适合复杂结构。 --- ### 方法四:使用 ScriptableObject 存储数据 创建持久化数据资源文件,适合存储游戏配置(如角色属性、物品库)。 #### 步骤: 1. 创建 ScriptableObject 类: ```csharp using UnityEngine; [CreateAssetMenu(fileName = "GameData", menuName = "Data/GameData")] public class GameData : ScriptableObject { public int playerLevel = 1; public float playerHealth = 100.0f; } ``` 2. 右键菜单 **Create > Data > GameData** 生成资源文件。 3.脚本中修改并保存: ```csharp public GameData gameData; // 拖拽赋值 void Update() { if (Input.GetKeyDown(KeyCode.S)) { gameData.playerLevel++; EditorUtility.SetDirty(gameData); // 标记为已修改 AssetDatabase.SaveAssets(); // 保存到磁盘(仅Editor模式) } } ``` --- ### 总结 | 方法 | 适用场景 | 风险 | 复杂度 | |--------------------|--------------------------|--------|--------| | 运行时数据持久化 | 物体状态、复杂数据 | 低 | 中 | | 强制保留场景修改 | 快速测试 | 高 | 低 | | PlayerPrefs | 简单配置(音量、按键) | 低 | 低 | | ScriptableObject | 游戏配置、共享数据 | 中 | 高 | **推荐流程**: 1. **测试阶段**:用方法二快速验证效果(记得备份场景)。 2. **正式开发**:使用方法一或四持久化关键数据。 3. **全局设置**:用方法三存储玩家偏好。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值