unity如何实现跨场景时人物数据的保存?

比如我控制的角色身上有一个playercontroller类组件和一个debuffmanager类组件等等,如何在切换进入下一个场景之前把角色当前的状态保存下来,在进入下一个场景时把再把playercontroller类和debuffmanager类组件的内容赋值给当前的角色的playercontroller和debuffmanager。
问每个人讲的都不一样,玩家控制类单例、dontdestroyload、做一个普通的c#脚本单例储存等等。
我只想实现在切换场景时把玩家当前的状态带入到下一个场景的效果!
希望能写一下具体思路。

最简单的方式就是将playercontroller类组件和一个debuffmanager类这种控制类挂载到切换脚本不销毁的物体上,这样不管如何切换场景都是这个两个脚本保持当前状态在执行。

切换场景不销毁的物体,制作起来也简单,只需要将下面这个脚本挂载到不想销毁的物体上即可。

/// <summary>
/// 加载时不销毁的对象
/// </summary>
public class DontDestroy : MonoBehaviour
{
    private void Awake()
    {
        DontDestroyOnLoad(gameObject);
    }    
}

跨场景保存数据:
1.生成要全局的数据

public class GameSetting : MonoBehaviour {undefined

[Tooltip("选择你要初始化的全局数据,比如保存在scriptobject 的序列化对象")]
public string _data;

void Start ()
{
var _global = GameObject.Find("GlobalInstance");
if(_global == null)
{
Glolbal.Instance.Initial(_data);
}
}
}

2.

public class Glolbal : MonoBehaviour {undefined

public static CusClassA      cusClassA;
private static Glolbal       _instance;


public static Glolbal Instance
{undefined
    get;
    set;
}

//保持全局单例只被调用一次
static Glolbal()
{undefined
    GameObject go = new GameObject("GlobalInstance");
    DontDestroyOnLoad(go);
    _instance = go.AddComponent<Glolbal>();
    
}


/// <summary>
/// 初始化数据
/// </summary>
/// <param name="s"></param>
public void Initial(string s)
{undefined
    cusClassA = new CusClassA(s);
}

}

  1. 数据操作可以在里面操作一些内容。

public class CusClassA {undefined

public CusClassA(string a)
{undefined
Debug.Log("a has been constructed");
}

~CusClassA()
{undefined
    Debug.Log("a has been disconstructed");
}

}

————————————————
版权声明:本文为CSDN博主「Yan_Sl」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014761712/article/details/53446183

如果只是一些数值,例如血量、蓝量、buff等,可以用static关键字保存玩家数据,用另外一个新建的数据类分离玩家数据,像这样

img


如果是组件的话,也使用static关键字保存,但是必须复制一份到内存里再保存,保存原来的相当于保存了一份引用,切换场景还是会销毁,切换以后将组件重新挂载在玩家身上即可

做一个缓存,然后携带到下一个场景,如果这个状态通用的话,可以考虑全局的对象

https://blog.csdn.net/y1196645376/article/details/52549082?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-11.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-11.pc_feed_download_top3ask

解决方案大概是,生成要全局的数据,在第一个场景里面存,然后在另外一个场景里面去取,看看对你又帮助麽


1.生成要全局的数据

public class GameSetting : MonoBehaviour {undefined



    [Tooltip("选择你要初始化的全局数据,比如保存在scriptobject 的序列化对象")]
    public string _data;

void Start ()
    {
        var _global = GameObject.Find("GlobalInstance");
   if(_global == null)
        {
            Glolbal.Instance.Initial(_data);
        }
}
}


2.

public class Glolbal : MonoBehaviour {undefined


    public static CusClassA      cusClassA;
    private static Glolbal       _instance;


    public static Glolbal Instance
    {undefined
        get;
        set;
    }

    //保持全局单例只被调用一次
    static Glolbal()
    {undefined
        GameObject go = new GameObject("GlobalInstance");
        DontDestroyOnLoad(go);
        _instance = go.AddComponent<Glolbal>();
        
    }


    /// <summary>
    /// 初始化数据
    /// </summary>
    /// <param name="s"></param>
    public void Initial(string s)
    {undefined
        cusClassA = new CusClassA(s);
    }

}

3. 数据操作可以在里面操作一些内容。

public class CusClassA  {undefined


public CusClassA(string a)
    {undefined
        Debug.Log("a has been constructed");
    }

    ~CusClassA()
    {undefined
        Debug.Log("a has been disconstructed");
    }
}