韩唐伯石 2022-03-10 12:51 采纳率: 55%
浏览 699
已结题

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

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

  • 写回答

6条回答 默认 最新

  • 陈言必行 Unity领域优质创作者 2022-03-10 15:30
    关注

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

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

    /// <summary>
    /// 加载时不销毁的对象
    /// </summary>
    public class DontDestroy : MonoBehaviour
    {
        private void Awake()
        {
            DontDestroyOnLoad(gameObject);
        }    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 封尘绝念丶 2022-03-10 13:22
    关注

    跨场景保存数据:
    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

    评论
  • dark9spring 2022-03-10 17:03
    关注

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

    img


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

    评论
  • wresource Android领域优质创作者 2022-03-10 23:23
    关注

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

    评论
  • 仰望星空的代码 博客专家认证 2022-03-11 09:13
    关注
    评论
  • 国服第二切图仔 2022-03-11 09:25
    关注

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

    
    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");
        }
    }
    
    
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 已采纳回答 3月11日
  • 创建了问题 3月10日

悬赏问题

  • ¥15 用keil调试程序保证结果进行led相关闪烁
  • ¥15 paddle训练自己的数据loss降不下去
  • ¥20 用matlab的pdetool解决以下三个问题
  • ¥15 一道python的homework题,老是非零返回求解
  • ¥15 单个福来轮的平衡与侧向滑动是如何做到的?
  • ¥20 #数电实验的一些问题
  • ¥15 嵌入式Linux固件,能直接告诉我crc32校验的区域在哪不,内核的校验我已经找到了,uboot没有
  • ¥20 h3c静态路要求有详细过程
  • ¥15 调制识别中输入为时频图,星座图,眼图等
  • ¥15 数据结构C++的循环、随机数问题