【unity数据持久化】游戏排行榜信息简单的存储,你还知道吗?数据管理类_PlayerPrfs

news2024/12/28 2:48:06

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unity数据存储

请添加图片描述


制作一个数据管理类(存储排行榜信息)的实践

Unity公共类PlayerPrefs知识点入口

文章目录

    • 制作一个数据管理类(存储排行榜信息)的实践
    • Unity公共类PlayerPrefs知识点入口
    • 🎶需求分析
    • 🎶关键知识补充
    • 🎶数据管理类的创建
    • 🎶PlayerPrefs—各种类型的反射存储框架
      • 🎶PlayerPrefs—存储主方法
      • 🎶PlayerPrefs—普通数据类型的反射存储
      • 🎶PlayerPrefs—泛型List的反射存储
      • 🎶PlayerPrefs—泛型Dictionary的反射存储
      • 🎶PlayerPrefs—自定义类类型的反射存储
    • 🎶PlayerPrefs—各种类型的反射获取框架
      • 🎶PlayerPrefs—获取主方法
      • 🎶PlayerPrefs—普通数据类型的反射获取
      • 🎶PlayerPrefs—泛型List的反射获取
      • 🎶PlayerPrefs—泛型Dictionary的反射获取
      • 🎶PlayerPrefs—自定义类类型的反射存储
    • 🎶PlayerPrefs—排行榜管理最终代码
    • ⭐相关文章⭐


🎶需求分析


在这里插入图片描述


🎶关键知识补充


在这里插入图片描述


🎶数据管理类的创建


在这里插入图片描述


🎶PlayerPrefs—各种类型的反射存储框架


在这里插入图片描述

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using Unity.VisualScripting;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 数据管理存储  
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------


public class PlayerfabsClass
{
    //单例模式的构建
    static private PlayerfabsClass chats = new PlayerfabsClass();
    static public  PlayerfabsClass Chats { get => chats; }
    //private List<object> listMess;
    //private Dictionary<object, object> dictionaryMess;

    /// <summary>
    /// 实现对象的数据的存储
    /// </summary>
    /// <param  name="player">玩家对象</param>
    /// <param  name="palyName">玩家对象信息Key字符</param>
    public void SaveDataMess(object  player ,string playName)
    {
        //-关键作用-:通过排行中的值来获取其信息

        //自定义key的规则通过反射来获取对象里面的-类型名-和-类型值-
       
        Type type = player.GetType();
        Debug.Log(type);     
        FieldInfo[] FieldsMess = type.GetFields();
        for (int i = 0; i < FieldsMess.Length; i++)
        {
            Debug.Log(FieldsMess[i]);
        }
        
        string temp = null;      
        for (int i = 0; i < FieldsMess.Length; i++)  //通过字符串的拼接来,使得存储的字段具有唯一性
        {
            temp = $"{playName}_{type}_{FieldsMess[i].FieldType.Name}_{FieldsMess[i].Name }";
            Debug.Log(playName);
            HelpSave( FieldsMess[i].GetValue(player) ,temp );
        }
        PlayerPrefs.Save();      
    }

    /// <summary>
    /// 辅助存储
    /// </summary>
    /// <param name="value">由于只能设置三种类型的值就不得不用方法来进行</param>
    /// <param name="playName">已经拼接好的key字符串</param>
    private void HelpSave(object value , string playName )
    {
       Type valueTpye = value.GetType();
        //----------1.常用数据类型的反射存储
        if (valueTpye == typeof(int))
        {
            Debug.Log((int)value);
            PlayerPrefs.SetInt(playName, (int)value);
        } 
       else  if (valueTpye == typeof(float ))
        {
            Debug.Log((float )value);
            PlayerPrefs.SetFloat(playName, (float)value);
        }
       else  if (valueTpye == typeof(string))
        {
            Debug.Log(value.ToString());
            PlayerPrefs.SetString(playName, value.ToString());
        }
        //----------2.泛型List数据类型的反射存储 ——递归
       else if(valueTpye.IsAssignableFrom(typeof(IList)) == true)  //因为泛型不确定无法判断所以通过(判断是否为子类的API)确定类型
        {
            IList list = valueTpye as IList;
            int index = 0;
            PlayerPrefs.SetInt(playName,list.Count);  //存储List数据先存储数量
            foreach (object  item in list  )
            {
                HelpSave(item, item + "_" + index);
            }
        }
        //--------3.泛型字典数据类型的反射存储 —— 递归
        else if(valueTpye.IsAssignableFrom(typeof(IDictionary) )==true)
        {
            IDictionary dictionary = valueTpye as IDictionary;
            int index = 0;
            PlayerPrefs.SetInt(playName,dictionary.Count );
            foreach (object item in dictionary .Keys)
            {
                HelpSave(item,item+"_Key_"+ index );
                HelpSave(dictionary[item], dictionary[item] + "_Vaule_" + index);
            }

        }
        //--------4.自定义类型的数据的反射存储 —— 大递归
        else 
        {
            SaveDataMess(value ,playName);
        }
    }



     
}


🎶PlayerPrefs—存储主方法


在这里插入图片描述

 public void SaveDataMess(object player, string playName)
    {
        //-关键作用-:通过排行中的值来获取其信息

        //自定义key的规则通过反射来获取对象里面的-类型名-和-类型值-

        Type type = player.GetType();
        Debug.Log(type);
        FieldInfo[] FieldsMess = type.GetFields();
        for (int i = 0; i < FieldsMess.Length; i++)
        {
            Debug.Log(FieldsMess[i]);
        }

        string temp = null;
        for (int i = 0; i < FieldsMess.Length; i++)  //通过字符串的拼接来,使得存储的字段具有唯一性
        {
            temp = $"{playName}_{type}_{FieldsMess[i].FieldType.Name}_{FieldsMess[i].Name }";
            Debug.Log(playName);
            HelpSave(FieldsMess[i].GetValue(player), temp);
        }
        PlayerPrefs.Save();
    }

🎶PlayerPrefs—普通数据类型的反射存储


在这里插入图片描述

//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 数据管理存储     
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------

public class PlayerfabsClass
{
    //单例模式的构建
    static private PlayerfabsClass chats = new PlayerfabsClass();
    static public  PlayerfabsClass Chats { get => chats; }
    //private List<object> listMess;
    //private Dictionary<object, object> dictionaryMess;

    /// <summary>
    /// 实现对象的数据的存储
    /// </summary>
    /// <param  name="player">玩家对象</param>
    /// <param  name="palyName">玩家对象信息Key字符</param>
    public void SaveDataMess(object  player ,string playName)
    {
        //-关键作用-:通过排行中的值来获取其信息

        //自定义key的规则通过反射来获取对象里面的-类型名-和-类型值-
       
        Type type = player.GetType();
        Debug.Log(type);     
        FieldInfo[] FieldsMess = type.GetFields();
        for (int i = 0; i < FieldsMess.Length; i++)
        {
            Debug.Log(FieldsMess[i]);
        }
        
        string temp = null;      
        for (int i = 0; i < FieldsMess.Length; i++)  //通过字符串的拼接来,使得存储的字段具有唯一性
        {
            temp = $"{playName}_{type}_{FieldsMess[i].FieldType.Name}_{FieldsMess[i].Name }";
            Debug.Log(playName);
            HelpSave( FieldsMess[i].GetValue(player) ,temp );
        }
        PlayerPrefs.Save();      
    }

    /// <summary>
    /// 辅助存储
    /// </summary>
    /// <param name="value">由于只能设置三种类型的值就不得不用方法来进行</param>
    /// <param name="playName">已经拼接好的key字符串</param>
    private void HelpSave(object value , string playName )
    {
       Type valueTpye = value.GetType();
        if (valueTpye == typeof(int))
        {
            Debug.Log((int)value);
            PlayerPrefs.SetInt(playName, (int)value);
        } 
       else  if (valueTpye == typeof(float ))
        {
            Debug.Log((float )value);
            PlayerPrefs.SetFloat(playName, (float)value);
        }
       else  if (valueTpye == typeof(string))
        {
            Debug.Log(value.ToString());
            PlayerPrefs.SetString(playName, value.ToString());
        }
    }

    /// <summary>
    /// 实现对象的读取
    /// </summary>
    public void ReadMess()
    {

    }


🎶PlayerPrefs—泛型List的反射存储


在这里插入图片描述

在这里插入图片描述

   //----------2.泛型List数据类型的反射存储
       else if(valueTpye.IsAssignableFrom(typeof(IList)) == true)  //因为泛型不确定无法判断所以通过(判断是否为子类的API)确定类型
        {
            IList list = valueTpye as IList;
            int index = 0;
            PlayerPrefs.SetInt(playName,list.Count);  //存储List数据先存储数量
            foreach (object  item in list  )
            {
                HelpSave(item, item + "_" + index);
            }
        }

🎶PlayerPrefs—泛型Dictionary的反射存储


在这里插入图片描述

 //--------3.泛型字典数据类型的反射存储 —— 递归
        else if(valueTpye.IsAssignableFrom(typeof(IDictionary) )==true)
        {
            IDictionary dictionary = valueTpye as IDictionary;
            int index = 0;
            PlayerPrefs.SetInt(playName,dictionary.Count );
            foreach (object item in dictionary .Keys)
            {
                HelpSave(item,item+"_Key_"+ index );
                HelpSave(dictionary[item], dictionary[item] + "_Vaule_" + index);
            }

        }

🎶PlayerPrefs—自定义类类型的反射存储


在这里插入图片描述

        //--------4.自定义类型的数据的反射存储 —— 大递归
        else 
        {
            SaveDataMess(value ,playName);
        }

🎶PlayerPrefs—各种类型的反射获取框架


在这里插入图片描述

 #region 获取和赋值
    /// <summary>
    /// 获取存的数据,返回一个对象
    /// </summary>
    /// <param name="data"></param>
    /// <param name="playName"></param>
    /// <returns></returns>
    public object GetDataMess(Type data ,string playName)
    {
        object player = Activator.CreateInstance(data) ;
        
        FieldInfo[] info = data.GetFields();

        string temp = "" ; 

        for (int i = 0; i < info.Length; i++)
        {
            
            temp = $"{playName}_{data}_{info[i].FieldType.Name}_{info [i].Name }";
            //遍历每一个成员传进去设值
            info[i].SetValue(data ,HelpSet(info[i].FieldType ,temp));
        }
        //给所有成员都设置值
        

        return player;
    }


    public object HelpSet(Type type ,string playName)
    {

        //----------1.常用数据类型的反射获取
        if (type == typeof(int) )
        {
          return PlayerPrefs.GetInt(playName,0); //第二个重载为设置默认值
        }
        else if(type == typeof(float))
        {
            return PlayerPrefs.GetFloat(playName, 0);
        }
        else if (type == typeof(string ))
        {
            return PlayerPrefs.GetString(playName, "");
        }
        else if(type ==typeof(bool))
        {
            return PlayerPrefs.GetInt(playName, 0) == 1 ? true : false;
        }

        //----------2.泛型List数据类型的反射获取
        else if (type.IsAssignableFrom(typeof(IList)) == true)
        {
            //此时list也是对象了要实例化
            IList list = Activator.CreateInstance(type) as IList;

            Type Ftype = type.GetGenericArguments()[0];  //一个泛型返回下标0即可
          
            int Count = PlayerPrefs.GetInt(playName + "_" + "Number");
        
            for (int i = 0; i < Count; i++)
            {               
                list.Add(HelpSet(Ftype , playName + "_" + i));
            }
            
            return list;
        }
        //--------3.泛型字典数据类型的反射获取 

        else if (type.IsAssignableFrom(typeof(IDictionary)) == true)
        {
            //此时list也是对象了要实例化
            IDictionary dictionary = Activator.CreateInstance(type) as IDictionary;

            Type Ftype1 = type.GetGenericArguments()[0];  //一个泛型返回下标0即可
            Type Ftype2 = type.GetGenericArguments()[1];

            int Count = PlayerPrefs.GetInt(playName + "_" + "Number");

            for (int i = 0; i < Count; i++)
            {
                dictionary.Add(HelpSet(Ftype1, playName + "_" + i),
                               HelpSet(Ftype1, playName + "_" + i ) );
            }

            return dictionary;
        }

        else
        {
            GetDataMess(type, playName);
        }
        return null;
    }
    #endregion

🎶PlayerPrefs—获取主方法


    public object GetDataMess(Type data ,string playName)
    {
        object player = Activator.CreateInstance(data) ;
        
        FieldInfo[] info = data.GetFields();

        string temp = "" ; 

        for (int i = 0; i < info.Length; i++)
        {
            
            temp = $"{playName}_{data}_{info[i].FieldType.Name}_{info [i].Name }";
            //遍历每一个成员传进去设值
            info[i].SetValue(data ,HelpSet(info[i].FieldType ,temp));
        }
        //给所有成员都设置值
        

        return player;
    }

🎶PlayerPrefs—普通数据类型的反射获取


在这里插入图片描述

 //----------1.常用数据类型的反射获取
        if (type == typeof(int) )
        {
          return PlayerPrefs.GetInt(playName,0); //第二个重载为设置默认值
        }
        else if(type == typeof(float))
        {
            return PlayerPrefs.GetFloat(playName, 0);
        }
        else if (type == typeof(string ))
        {
            return PlayerPrefs.GetString(playName, "");
        }
        else if(type ==typeof(bool))
        {
            return PlayerPrefs.GetInt(playName, 0) == 1 ? true : false;
        }

🎶PlayerPrefs—泛型List的反射获取


在这里插入图片描述

   //----------2.泛型List数据类型的反射获取
        else if (type.IsAssignableFrom(typeof(IList)) == true)
        {
            //此时list也是对象了要实例化
            IList list = Activator.CreateInstance(type) as IList;

            Type Ftype = type.GetGenericArguments()[0];  //一个泛型返回下标0即可
          
            int Count = PlayerPrefs.GetInt(playName + "_" + "Number");
        
            for (int i = 0; i < Count; i++)
            {               
                list.Add(HelpSet(Ftype , playName + "_" + i));
            }
            
            return list;
        }

🎶PlayerPrefs—泛型Dictionary的反射获取


在这里插入图片描述

 //--------3.泛型字典数据类型的反射获取 

        else if (type.IsAssignableFrom(typeof(IDictionary)) == true)
        {
            //此时list也是对象了要实例化
            IDictionary dictionary = Activator.CreateInstance(type) as IDictionary;

            Type Ftype1 = type.GetGenericArguments()[0];  //一个泛型返回下标0即可
            Type Ftype2 = type.GetGenericArguments()[1];

            int Count = PlayerPrefs.GetInt(playName + "_" + "Number");

            for (int i = 0; i < Count; i++)
            {
                dictionary.Add(HelpSet(Ftype1, playName + "_" + i),
                               HelpSet(Ftype1, playName + "_" + i ) );
            }

            return dictionary;
        }

🎶PlayerPrefs—自定义类类型的反射存储


在这里插入图片描述

else
        {
            GetDataMess(type, playName);
        }

🎶PlayerPrefs—排行榜管理最终代码


在这里插入图片描述

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using Unity.VisualScripting;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 数据管理类     
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------


public class PlayerfabsClass
{
    //单例模式的构建
    static private PlayerfabsClass chats = new PlayerfabsClass();
    static public PlayerfabsClass Chats { get => chats; }
    //private List<object> listMess;
    //private Dictionary<object, object> dictionaryMess;

    /// <summary>
    /// 实现对象里的数据的存储
    /// </summary>
    /// <param  name="player">玩家对象</param>
    /// <param  name="palyName">玩家对象信息Key字符</param>
    /// 


    public void SaveDataMess(object player, string playName)
    {
        //-关键作用-:通过排行中的值来获取其信息

        //自定义key的规则通过反射来获取对象里面的-类型名-和-类型值-

        Type type = player.GetType();
        Debug.Log(type);
        FieldInfo[] FieldsMess = type.GetFields();
        for (int i = 0; i < FieldsMess.Length; i++)
        {
            Debug.Log(FieldsMess[i]);
        }

        string temp = null;
        for (int i = 0; i < FieldsMess.Length; i++)  //通过字符串的拼接来,使得存储的字段具有唯一性
        {
            temp = $"{playName}_{type}_{FieldsMess[i].FieldType.Name}_{FieldsMess[i].Name }";
            Debug.Log(playName);
            HelpSave(FieldsMess[i].GetValue(player), temp);
        }
        PlayerPrefs.Save();
    }

    /// <summary>
    /// 辅助存储
    /// </summary>
    /// <param name="value">由于只能设置三种类型的值就不得不用方法来进行</param>
    /// <param name="playName">已经拼接好的key字符串</param>
    private void HelpSave(object value, string playName)
    {
        Type valueTpye = value.GetType();
        //----------1.常用数据类型的反射存储
        if (valueTpye == typeof(int))
        {
            Debug.Log((int)value);
            PlayerPrefs.SetInt(playName, (int)value);
        }
        else if (valueTpye == typeof(float))
        {
            Debug.Log((float)value);
            PlayerPrefs.SetFloat(playName, (float)value);
        }
        else if (valueTpye == typeof(string))
        {
            Debug.Log(value.ToString());
            PlayerPrefs.SetString(playName, value.ToString());
        }
        else if(valueTpye == typeof(bool))
        {
            Debug.Log(value.ToString());
            PlayerPrefs.SetInt(playName,(bool)value?1:0);
        }
        //----------2.泛型List数据类型的反射存储 ——递归

        else if (valueTpye.IsAssignableFrom(typeof(IList)) == true)  //因为泛型不确定无法判断所以通过(判断是否为子类的API)确定类型
        {
            IList list = valueTpye as IList;
            int index = 0;
            PlayerPrefs.SetInt(playName+"_"+"Number", list.Count);  //存储List数据先存储数量
            foreach (object item in list)
            {
                HelpSave(item, playName + "_" + index);
                index++;
            }
        }
        //--------3.泛型字典数据类型的反射存储 —— 递归

        else if (valueTpye.IsAssignableFrom(typeof(IDictionary)) == true)
        {
            IDictionary dictionary = valueTpye as IDictionary;
            int index = 0;
            PlayerPrefs.SetInt(playName+ "_" + "Number", dictionary.Count); //先存储数量
            foreach (object item in dictionary.Keys)
            {
                HelpSave(item, playName + "_Key_" + index);
                HelpSave(dictionary[item], playName + "_Vaule_" + index);
                index++;
            }

        }
        //--------4.自定义类型的数据的反射存储 —— 大递归
        else
        {
            SaveDataMess(value, playName);
        }
    }

    #region 获取和赋值
    /// <summary>
    /// 获取存的数据,返回一个对象
    /// </summary>
    /// <param name="data"></param>
    /// <param name="playName"></param>
    /// <returns></returns>
    public object GetDataMess(Type data ,string playName)
    {
        object player = Activator.CreateInstance(data) ;
        
        FieldInfo[] info = data.GetFields();

        string temp = "" ; 

        for (int i = 0; i < info.Length; i++)
        {
            
            temp = $"{playName}_{data}_{info[i].FieldType.Name}_{info [i].Name }";
            //遍历每一个成员传进去设值
            info[i].SetValue(data ,HelpSet(info[i].FieldType ,temp));
        }
        //给所有成员都设置值
        

        return player;
    }


    public object HelpSet(Type type ,string playName)
    {

        //----------1.常用数据类型的反射获取
        if (type == typeof(int) )
        {
          return PlayerPrefs.GetInt(playName,0); //第二个重载为设置默认值
        }
        else if(type == typeof(float))
        {
            return PlayerPrefs.GetFloat(playName, 0);
        }
        else if (type == typeof(string ))
        {
            return PlayerPrefs.GetString(playName, "");
        }
        else if(type ==typeof(bool))
        {
            return PlayerPrefs.GetInt(playName, 0) == 1 ? true : false;
        }

        //----------2.泛型List数据类型的反射获取
        else if (type.IsAssignableFrom(typeof(IList)) == true)
        {
            //此时list也是对象了要实例化
            IList list = Activator.CreateInstance(type) as IList;

            Type Ftype = type.GetGenericArguments()[0];  //一个泛型返回下标0即可
          
            int Count = PlayerPrefs.GetInt(playName + "_" + "Number");
        
            for (int i = 0; i < Count; i++)
            {               
                list.Add(HelpSet(Ftype , playName + "_" + i));
            }
            
            return list;
        }
        //--------3.泛型字典数据类型的反射获取 

        else if (type.IsAssignableFrom(typeof(IDictionary)) == true)
        {
            //此时list也是对象了要实例化
            IDictionary dictionary = Activator.CreateInstance(type) as IDictionary;

            Type Ftype1 = type.GetGenericArguments()[0];  //一个泛型返回下标0即可
            Type Ftype2 = type.GetGenericArguments()[1];

            int Count = PlayerPrefs.GetInt(playName + "_" + "Number");

            for (int i = 0; i < Count; i++)
            {
                dictionary.Add(HelpSet(Ftype1, playName + "_" + i),
                               HelpSet(Ftype1, playName + "_" + i ) );
            }

            return dictionary;
        }

        else
        {
            GetDataMess(type, playName);
        }
        return null;
    }
    #endregion
    #region 打印对象里面的信息
    /// <summary>
    /// 读取信息函数
    /// </summary>
    /// <param name="type">为什么这里不用Object用type,因为读取没有值,只需要类型就行简化了代码 </param>
    /// <param name="playName">还是原来的Key关键标识字符</param>
    public void ReadData(Type type ,string playName)
    {
        string temp = "";
        //----------1.常用数据类型的反射打印
        if (type == typeof(int))
        {
            Debug.Log(PlayerPrefs.GetInt(playName));
        }
        else if(type == typeof(float) )
        {
            Debug.Log(PlayerPrefs.GetFloat(playName));
        }
        else if (type == typeof(string) )
        {
            Debug.Log(PlayerPrefs.GetString(playName));
        }
        //----------2.泛型List数据类型的反射打印 ——递归

        else if (type.IsAssignableFrom(typeof(IList)) )
        {
            IList list = type as IList;
            Debug.Log( PlayerPrefs.GetInt(playName +"_" + "Number") ); //先读取数量
            int index = 0;
            foreach (Type item in list )
            {
                ReadData(item, playName + "_" + index);
                index++;
            }
        }


        //--------3.泛型字典数据类型的反射打印 —— 递归

        else if (type.IsAssignableFrom(typeof(IDictionary)))
        {
            IDictionary dictionary = type as IDictionary;
            int index = 0;
            PlayerPrefs.GetInt(playName + "_" + "Number"); //先读取数量
            foreach (Type item in dictionary.Keys)
            {
                ReadData(item, playName + "_Key_" + index);
                ReadData(item, playName + "_Vaule_" + index);
                index++;
            }
        }
        //--------4.自定义类型的数据的反射打印 —— 大递归
        else
        {
            FieldInfo[] FieldsMess = type.GetFields();
           
          for (int i = 0; i < FieldsMess.Length; i++) //成员递归下去
            {
                temp = $"{playName}_{type}_{FieldsMess[i].FieldType.Name}_{FieldsMess[i].Name }";
              
                ReadData(FieldsMess[i].FieldType , playName);
            }
        }
        

    }
    #endregion 


}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 排行榜数据控制器     
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class Contorl : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Player player1 = new Player("孙悟空","BBBBB",66,10);
        //存
        PlayerfabsClass.Chats.SaveDataMess(player1,player1.playName);
        //取
        PlayerfabsClass.Chats.GetDataMess(player1.GetType(),player1.playName);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


⭐相关文章⭐

⭐【2023unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随

⭐【2023unity游戏制作-mango的冒险】-3.基础动作和动画API实现

⭐【2023unity游戏制作-mango的冒险】-2.始画面API制作

⭐【2023unity游戏制作-mango的冒险】-1.场景搭建

⭐“狂飙”游戏制作—游戏分类图鉴(网易游学)

⭐本站最全-unity常用API大全(万字详解),不信你不收藏



你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谈一谈冷门的C语言爬虫

C语言可以用来编写爬虫程序&#xff0c;但是相对于其他编程语言&#xff0c;C语言的爬虫开发可能会更加复杂和繁琐。因为C语言本身并没有提供现成的爬虫框架和库&#xff0c;需要自己编写网络请求、HTML解析等功能。 不过&#xff0c;如果你对C语言比较熟悉&#xff0c;也可以…

FPGA认识-LCMXO3LF-9400C-5BG400C 什么是低功耗FPGA

莱迪思深力科超低密度FPGA 是最新的立即启用、非挥发性、小型覆盖区 FPGA&#xff0c;采用先进的封装技术&#xff0c;能让每个元件达到最低成本。此系列采用最新的小型封装&#xff0c;不仅具有低功率、成本优势并结合快速效能。FPGA 现场可编程逻辑器件,小尺寸&#xff0c;高…

SSRS rdlc报表 八 报表项目部署

开发环境 vs2022 sqlserver 2019 windows 11 参考文档&#xff1a;安装 SQL Server Reporting Services - SQL Server Reporting Services (SSRS) | Microsoft Learn 配置 URL (Configuration Manager) - SQL Server Reporting Services (SSRS) | Microsoft Learn 项目右键…

问道价值互联网,区块链的下一个十年 | 2023 开放原子全球开源峰会区块链分论坛即将启幕

随着全球 Web3 浪潮经由数字藏品、元宇宙的日渐普及而实现落地&#xff0c;区块链在“信息互联网”转向“价值互联网”中的重要作用正得到进一步认可。在数字经济蓬勃发展、数据成为重要生产要素的时代&#xff0c;区块链已不仅仅是一项技术、一种工具&#xff0c;更是一种思维…

大型城市综合体建筑智能消防应急照明和疏散系统的具体应用 安科瑞 许敏

摘要&#xff1a;随着我国社会经济的迅猛发展与城市化建设进程的加快&#xff0c;大型城市综合体建筑越来越多&#xff0c;随之而来的消防安全管理问题不容忽视。智能消防应急照明和疏散系统作为保证人员安全疏散不可或缺的消防设施&#xff0c;是保障消防安全的重要组成部分。…

重磅!MyBatis-Plus 可视化代码生成器来啦,开发效率提升2倍 !!

前言 一、mybatis-plus-generator-ui是什么&#xff1f; 二、 mybatis-plus-generator-ui怎么用&#xff1f; 1、maven pom引入2、新建程序入口&#xff0c;以main函数的方式运行3、实例运行 三、mybatis-plus-generator-ui代码生成 1、Table的查询和浏览2、输出配置3、策…

Vue+springboot茶馆管理系统的设计与实现

在网络购物的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;茶馆只能以客户为导向&#xff0c;按茶叶分类&#xff0c;以商品的持续创新作为商家最重要的竞争手段。 系…

JDK8-1-Lambda表达式(2)-方法传递(行为参数化)

JDK8-1-Lambda表达式&#xff08;2&#xff09;-方法传递&#xff08;行为参数化&#xff09; Java 8 允许程序将方法作为参数传递&#xff0c;先看一个例子&#xff1a; 苹果实体类&#xff1a; public class Apple {//颜色private String color;//重量&#xff0c;单位克&…

【Golang Leetcode】总目录(Day1~100)

Leetcode Golang Day1~10 Golang每日一练(leetDay0001) 1. 两数之和 Two Sum 2. 两数相加 Add Two Numbers 3. 无重复字符的最长子串 Longest-substring-without-repeating-characters Golang每日一练(leetDay0002) 4. 寻找两个正序数组的中位数 Median of two sorted arra…

【算法系列之链表I】leetcode206.反转链表

203.移除链表元素 力扣题目链接 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]解题思路 核心思路就是…

Hive数据类型和文件格式

文章目录 Hive数据类型和文件格式1 基本数据类型2. 集合数据类型2.1 Struct举例2.2 Array举例2.3 Map举例 3 数据类型转换3.1 隐式转换3.2 显示转换 4 文本文件数据编码 Hive数据类型和文件格式 Hive支持关系数据库中的大多数基本数据类型&#xff0c;同时也支持3种新的集合数…

KDZD绝缘油介质损耗电阻率测试仪参数

一、概述 测试仪依据GB/T5654-2007《液体绝缘材料相对电容率、介质损耗因数和直流电阻率的测量》设计制造。用于绝缘油等液体绝缘介质的介质损耗因数和直流电阻率的测量。 一体化结构。内部集成了介损油杯、温控仪、温度传感器、介损测试电桥、交流试验电源、标准电容器、高阻计…

无线无源中继采发仪在工程监测中的应用

无线无源中继采发仪在工程监测中的应用 随着科技的不断发展&#xff0c;无线传感技术在工程监测中的应用越来越广泛。其中&#xff0c;无线无源中继采发仪是一种新型的数据采集设备&#xff0c;能够将传感器数据通过无线信号传输到数据中心。本文旨在探讨无线无源中继采发仪在…

Scrum敏捷项目管理

在了解敏捷项目管理之前&#xff0c;我们先看下敏捷和传统项目管理有什么区别。 传统项目管理&#xff1a;阶段式项目管理模式。 制定详细的计划和步骤&#xff0c;按计划执行&#xff0c;直到所有的计划执行全部结束。咖 敏捷项目管理模式&#xff0c;从愿景和高价值的目标出…

基于摄影测量的三维重建【终极指南】

我们生活的时代非常令人兴奋&#xff0c;如果你对 3D 东西感兴趣&#xff0c;更是如此。 我们有能力使用任何相机&#xff0c;从感兴趣的物体中捕捉一些图像数据&#xff0c;并在眨眼间将它们变成 3D 资产&#xff01; 这种通过简单的数据采集阶段进行的 3D 重建过程是许多行业…

k8s service与ingress

1.前言 service只能作用与网络模型中的四层&#xff0c;ingress可以作用于网络模型中的七层&#xff0c;Service是一种抽象&#xff0c;定义了一个逻辑上的一组Pod以及访问它们的策略。Service为Pod提供了一个稳定的IP地址和DNS名称&#xff0c;并通过标签选择器来定义需要暴露…

SpringBoot_Vue3 《Hello World》项目入门教程

1. 前言 前后端分离模式&#xff0c;可以让后端和前端开发人员致力于自己擅长的领域&#xff0c;且可以让前端和后端业务逻辑高度解耦合。本文从一个简单的案例入手&#xff0c;讲解使用 spring boot和vue3如何实现前后端的分离。 前后端分离有2 种模式&#xff1a; 逻辑分离…

华为OD机试真题 JavaScript 实现【在字符串中找出连续最长的数字串】【2023 B卷 100分】,附详细解题思路

一、题目描述 输入一个字符串&#xff0c;返回其最长的数字子串&#xff0c;以及其长度。 若有多个最长的数字子串&#xff0c;则将它们全部输出&#xff08;按原字符串的相对位置&#xff09;。 本题含有多组样例输入。 数据范围&#xff1a; 字符串长度 1≤n≤200 &…

【LeetCode】240. 搜索二维矩阵 II

240. 搜索二维矩阵 II&#xff08;中等&#xff09; 这道题和 74. 搜索二维矩阵 基本一致&#xff0c;可以放在一起做。 方法一&#xff1a;变形的二叉搜索树 思路 这种做法和 74. 搜索二维矩阵完全一致。 我们可以将二维矩阵抽象成「以右上角为根的 BST」&#xff1a; 那…

基于python五子棋的设计与实现(论文+源码)_kaic

目 录 摘 要 绪 论 一、游戏的需求分析 &#xff08;一&#xff09;游戏设计目标 &#xff08;二&#xff09;游戏的功能需求 1.可视化模块 2.玩家操作模块 3.胜负判定模块 &#xff08;三&#xff09;游戏的性能需求 &#xff08;四&#xff09;游戏其它需求 二、五子棋游戏…