Unity 运行状态下动态保存 预制体/预制体上脚本参数

Posted 一梭键盘任平生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 运行状态下动态保存 预制体/预制体上脚本参数相关的知识,希望对你有一定的参考价值。

前言:在Unity游戏制作过程中为了方便策划调试保存 通常会让策划可以在游戏运行时直接保存调整好的预制体

在此背景下,出现了以下代码:

一.运行状态下动态保存预制体

代码:

public class ChangePrefabs : MonoBehaviour 
    public bool Save = false;
    public string Name;
    private string path;
    void Start() 
        Name = this.gameObject.name;
        path = string.Format("Assets/Model/0", Name.Replace("(Clone)", "")) ;
    

    void Update() 
        if(Save) 
            Save = false;
            PrefabUtility.SaveAsPrefabAsset(this.gameObject, path);
        
    

程序运行中修改预制体的上部球体的材质,然后点击Save,停止运行后 可以看到工程里的预制体也同样被改变了

1.把脚本挂在预制体上

2.修改预制体上部球体的材质

修改前:

修改后:

点击Save

 

3.停止运行后,工程中的预制体 上部球体变成了工程中修改的材质

二.运行状态下动态保存预制体上的脚本参数

代码:

public class ChangePrefabScript : MonoBehaviour 
    public bool Save = false;
    public string path;
    public string canChange;
    GameObject player;
    void Start() 
        player = Addressables.LoadAssetAsync<GameObject>(path).Result;
    

    // Update is called once per frame
    void Update() 
        if(Save) 
            Save = false;
            SerializedObject thisScript = new SerializedObject(this);
            if(player != null) 
                var oldChangePrefabScript = player.GetComponent<ChangePrefabScript>();
                SerializedObject oldScript = new SerializedObject(oldChangePrefabScript);
                SerializedProperty serializedProperty = thisScript.FindProperty("canChange");
                oldScript.CopyFromSerializedProperty(serializedProperty);
                oldScript.ApplyModifiedProperties();
            
        
    

程序运行中修改预制体上的脚本中的CanChange中的内容,然后点击Save,停止运行后 可以看到工程里的预制体上的脚本中的Can Change内容随之改变了

1.把脚本挂在预制体上

2.程序运行时改变Can Change的值 然后点击Save

3.程序停止运行后,找到预制体上的相应脚本查看 Can Change值已经变成修改值 

 

获取某个Unity工程中的所有预制体

参考技术A 在不同的平台上该路径是不同的:在编辑器模式下是Assets目录,即:<path to projectfolder>/Assets

string path:即游戏数据所在目录

string searchPattern:因要找的是prefab,因此是*.prefab

System.IO.SearchOption searchOption:因要找目录下所有的prefab,包括子孙目录,因此使用AllDirectories(若不在子孙目录中搜索则使用TopDirectoryOnly)

路径从Assets开始,因此移除前面获取到的路径中包含的游戏数据所在目录的部分,但这样就移除了“Assets”,因此再在开头将其加回

将路径中的“\”替换为“/”

因获取所有预制体可能需要较长的时间,因此用进度条显示当前执行进度

移除进度条显示:EditorUtility.ClearProgressBar()

以上是关于Unity 运行状态下动态保存 预制体/预制体上脚本参数的主要内容,如果未能解决你的问题,请参考以下文章

Unity在编辑器模式下修改预制体

Unity 3D 从入门到实践Unity 3D 预制体

获取某个Unity工程中的所有预制体

Unity 一键制作预制体,一键修改预制体

Unity3D日常开发生成预制体,并且预制体自动销毁

Unity3D日常开发生成预制体,并且预制体自动销毁