当前位置: 首页 > news >正文

Unity 数据持久化【PlayerPrefs】

1、数据持久化

在这里插入图片描述

文章目录

  • 1、数据持久化
    • PlayerPrefs基本方法
      • 1、PlayerPrefs概念
      • 2、存储相关
      • 3、读取相关
      • 4、删除数据
      • 思考 信息的存储和读取
    • PlayerPrefs存储位置
      • 1、PlayerPrefs存储的数据在哪个位置
      • 2、PlayerPrefs 数据唯一性
      • 思考 排行榜功能
  • 2、Playerprefs实践
    • 1、必备知识点-反射知识小补充
    • 2、需求分析 Playerprefs数据管理类创建
    • 3、反射存储数据-常用成员、List成员、Dic成员、自定义类成员
    • 4、反射读取数据-常用成员、List成员、Dic成员、自定义类成员
    • 4、加密思路
    • 5、生成资源包

概念

将【变量数据】在内存和硬盘之间的存储或读取

内容

PlayerPrefs的基本方法
PlayerPrefs在不同平台的存储位置
利用反射结合PlayerPrets制作通用存诸工具

PlayerPrefs基本方法

1、PlayerPrefs概念

是unity提供的可以用于存储读取玩家数据的公共类

2、存储相关

PlaverPrefs的数据存储类似于键值对存储一个键对应一个值
提供了存储3种数据的方法int float string
键:string类型
值:int float string对应3API PlayerPrefs.SetInt("myAge", 18);PlayerPrefs.SetFloat("myHeight", 183.5f);PlayerPrefs.SetString("myName", "姓名");PlayerPrefs.Save();bool sex = true; //sex若为true存1,sex若为flase则存1PlayerPrefs.SetInt("sex", sex ? 1 : 0);如果用同一个键名,会进行覆盖PlayerPrefs.SetFloat("myAge", 18.3f);//键名是唯一的

3、读取相关

Set之后也能读取信息,读取顺序为:内存 > 硬盘1intint age = PlayerPrefs.GetInt("myAge");print(age); //0 被覆盖age = PlayerPrefs.GetInt("myAge", 18); //18 设置的初始默认值print(age);2floatfloat height = PlayerPrefs.GetFloat("myHeight", 100f);print(height);3stringstring name = PlayerPrefs.GetString("myName");print(name);是否存在的键名if (PlayerPrefs.HasKey("myName")){print("存在myName对应的键值对数据");}

4、删除数据

删除指定键值对PlayerPrefs.DeleteKey("myAge");删除所有PlayerPrefs.DeleteAll();

思考 信息的存储和读取

玩家信息类,装备信息类
用List存储装备信息
添加标识,存储多个玩家信息
将信息存储读取using System.Collections.Generic;
using UnityEngine;public class Item
{public int id;public int num;
}
public class Player
{public string name;public int age;public int atk;public int def;public List<Item> itemList;//用于存储或读取的标识private string keyName;/// <summary>/// 存储数据/// </summary>public void Save(){PlayerPrefs.SetString(keyName + "_name", name);PlayerPrefs.SetInt(keyName + "_age", age);PlayerPrefs.SetInt(keyName + "_atk", atk);PlayerPrefs.SetInt(keyName + "_def", def);PlayerPrefs.SetInt(keyName + "_ItemNum", itemList.Count);for (int i = 0; i < itemList.Count; i++){PlayerPrefs.SetInt(keyName + "_itemID" + i, itemList[i].id);PlayerPrefs.SetInt(keyName + "_itemNum" + i, itemList[i].num);}PlayerPrefs.Save();}/// <summary>/// 读取数据/// </summary>public void Load(string keyName){//记录传入的标识this.keyName = keyName;name = PlayerPrefs.GetString(keyName + "_name", "未命名");age = PlayerPrefs.GetInt(keyName + "_age", 18);atk = PlayerPrefs.GetInt(keyName + "_atk", 20);def = PlayerPrefs.GetInt(keyName + "_def", 2);//获取数量int num = PlayerPrefs.GetInt(keyName + "_ItemNum", 0);//初始化容器itemList = new List<Item>();Item item;for (int i = 0; i < num; i++){item = new Item();item.id = PlayerPrefs.GetInt(keyName + "_itemID" + i);item.num = PlayerPrefs.GetInt(keyName + "_itemNum" + i);itemList.Add(item);}}
}
public class Test1_Exercises : MonoBehaviour
{void Start(){Player p = new Player();p.Load();//print(p.name);//print(p.age);//print(p.atk);//print(p.def);print("不同类型道具数量:"+p.itemList.Count);for (int i = 0; i < p.itemList.Count; i++){print("道具id:" + p.itemList[i].id);print("道具数量:" + p.itemList[i].num);}Item item = new Item();item.id = 1;item.num = 99;p.itemList.Add(item);item = new Item();item.id = 2;item.num = 99;p.itemList.Add(item);p.Save();//其他玩家Player p2 = new Player();p2.Load("Player2");p2.Save();}
}

PlayerPrefs存储位置

1、PlayerPrefs存储的数据在哪个位置

不同平台存储位置不同

WindowsPlayerPrefs 存储在HKCU\Software\[公司名称]\[产品名称]项下的注册表中其中公司和产品名称是在"Project Settings"中设置的名称运行 regeditHKEY_CURRENT_USERSOFTWAREUnityUnityEditor公司名称产品名称
Android/data/data/应用程序包名/shared_prefs/pkg-name.xml
IOS/Library/Preferences/[应用ID].plist

2、PlayerPrefs 数据唯一性

PlayerPrefs 中不同数据的唯一性
由key决定,不同key决定了不同的数据
同一项目中,如果不同数据key相同,会造成数据丢失

思考 排行榜功能

排行榜主要记录玩家名,玩家得分,玩家通关时间
using System.Collections.Generic;
using UnityEngine;public class RankListInfo
{public List<RankInfo> rankList;public RankListInfo() { Load(); }public void Add(string name, int score, int time){rankList.Add(new RankInfo(name, score, time));}public void Save(){PlayerPrefs.SetInt("rankListNum", rankList.Count);for (int i = 0; i < rankList.Count; i++){RankInfo info = rankList[i];PlayerPrefs.SetString("rankInfo" + i, info.playerName);PlayerPrefs.SetInt("rankInfo" + i, info.playerScore);PlayerPrefs.SetInt("rankInfo" + i, info.playerTime);}}private void Load(){int num = PlayerPrefs.GetInt("rankListNum", 0);rankList = new List<RankInfo>();for (int i = 0;i < num;i++){RankInfo info = new RankInfo(PlayerPrefs.GetString("rankInfo" + i), PlayerPrefs.GetInt("rankScore" + i), PlayerPrefs.GetInt("rankTIme" + i));rankList.Add(info);}}
}public class RankInfo
{public string playerName;public int playerScore;public int playerTime;public RankInfo(string name, int score, int time){playerName = name;playerScore = score;playerTime = time;}
}
public class Test2_Exercises : MonoBehaviour
{void Start(){RankListInfo rankList = new RankListInfo();print(rankList.rankList.Count);for (int i = 0; i < rankList.rankList.Count; i++){print("姓名" + rankList.rankList[i].playerName);print("分数" + rankList.rankList[i].playerScore);print("时间" + rankList.rankList[i].playerTime);}rankList.Add("玩家", 100, 88);rankList.Save();}
}

2、Playerprefs实践

1、必备知识点-反射知识小补充

Type	用于获取类的所有信息:字段、属性、方法 等
Assembly	用于获取程序集,通过程序集获取Type
Activator	用于快速实例化对象using System;
using System.Collections.Generic;
using UnityEngine;
public class Father { }
public class Son : Father { }
public class Reflection : MonoBehaviour
{void Start(){1、判断A对象是否让B对象分配空间//父类装子类//是否可以从某一个类型的对象为自己分配空间Type fatherType = typeof(Father);Type sonType = typeof(Son);//调用者通过IsAssignableFrom方法进行判断,是否可以通过传入的类型为自己分配空间if (fatherType.IsAssignableFrom(sonType)){print("可以分配");Father f = Activator.CreateInstance(sonType) as Father;print(f);}else{print("不能分配");}2、通过反射获取泛型类型List<string> list = new List<string>();Type listType = list.GetType();//通过得到泛型类的类型,得到泛型具体的类型Type[] types = listType.GetGenericArguments();print(types[0]);Dictionary<string,float> dict = new Dictionary<string,float>();Type dicType = dict.GetType();types = dicType.GetGenericArguments();print(types[0]);print(types[1]);}
}

2、需求分析 Playerprefs数据管理类创建

Test

using System.Collections.Generic;
using UnityEngine;public class PlayerInfo
{public int age = 10;public string name = "姓名";public float height = 188.5f;public bool sex = true;public List<int> list = new List<int>() { 1, 2, 3, 4, };public Dictionary<int, string> dic = new Dictionary<int, string>(){{1,"123" },{1,"123" }};public ItemInfo itemInfo = new ItemInfo(3, 33);public List<ItemInfo> items = new List<ItemInfo>() { new ItemInfo(1, 99), new ItemInfo(2, 22) };public Dictionary<int, ItemInfo> itemDic = new Dictionary<int, ItemInfo>() { { 4, new ItemInfo(4, 44) }, { 5, new ItemInfo(5, 55) } };
}
public class ItemInfo
{public int num;public int id;public ItemInfo() { }public ItemInfo(int id, int num){this.id = id;this.num = num;}
}
public class Test : MonoBehaviour
{void Start(){PlayerInfo p = new PlayerInfo();PlayerPrefsDataMgr.Instance.SaveData(p, "Player1");}
}

3、反射存储数据-常用成员、List成员、Dic成员、自定义类成员

using System;
using System.Collections;
using System.Reflection;
using UnityEngine;
/// <summary>
/// PlayerPrefs数据管理类,同一管理数据的存储和读取
/// </summary>
public class PlayerPrefsDataMgr
{private static PlayerPrefsDataMgr instance = new PlayerPrefsDataMgr();public static PlayerPrefsDataMgr Instance{get { return instance; }}private PlayerPrefsDataMgr() { }/// <summary>/// 存储数据/// </summary>/// <param name="data">数据对象</param>/// <param name="keyName">数据对象的唯一key,自己控制</param>public void SaveData(object data, string keyName){//通过Type得到传入数据对象的所有字段,结合PlayerPrefs来存储//1、获取传入数据对象的所有字段Type dataType = data.GetType();//得到所有字段FieldInfo[] infos = dataType.GetFields();//2、自己定义一个key的规则,进行数据存储//keyName_数据类型_字段类型_字段名//3、遍历字段,进行数据存储string saveKeyNmae = "";FieldInfo info;for (int i = 0; i < infos.Length; i++){//对每一个字段,进行数据存储//得到具体的字段信息info = infos[i];//通过FieldInfo可以直接获取到字段的类型和字段的名字//    字段的类型 info.FieldType.Name//    字段的名字 info.Name//根据key生成key//    Player1_PlayerInfo_Int32_agesaveKeyNmae = keyName + "_" + dataType.Name + "_" + info.FieldType.Name + "_" + info.Name;//获取值//info.GetValue(data)SaveData(info.GetValue(data), saveKeyNmae);}}/// <summary>/// /// </summary>/// <param name="value">类型</param>/// <param name="keyName">存储的key名称</param>private void SaveValue(object value, string keyName){Type fieldType = value.GetType();if (fieldType == typeof(int)){Debug.Log("存储int" + keyName);PlayerPrefs.SetInt(keyName, (int)value);}else if (fieldType == typeof(float)){Debug.Log("存储float" + keyName);PlayerPrefs.SetFloat(keyName, (float)value);}else if (fieldType == typeof(string)){Debug.Log("存储string" + keyName);PlayerPrefs.SetString(keyName, value.ToString());}else if (fieldType == typeof(bool)){Debug.Log("存储bool" + keyName);PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0);}//通过IList判断这个类是否为Listelse if (typeof(IList).IsAssignableFrom(fieldType)){Debug.Log("存储List" + keyName);IList list = value as IList;//存储List数量PlayerPrefs.SetInt(keyName, list.Count);int index = 0;foreach (object obj in list){SaveValue(obj, keyName + index);index++;}}else if (typeof(IDictionary).IsAssignableFrom(fieldType)){Debug.Log("存储Dictionary" + keyName);IDictionary dic = value as IDictionary;//存储字典长度PlayerPrefs.SetInt(keyName,dic.Count);//遍历存储Dic里面的具体值int index = 0;foreach (object key in dic.Keys){SaveValue(key, keyName + "_key_" + index);SaveValue(dic[key], keyName + "_value_" + index);index++;}}else{SaveData(value, keyName);}}/// <summary>/// 读取数据/// </summary>/// <param name="type">想要读取数据的数据类型</param>/// <param name="keyName">数据对象的唯一key</param>/// <returns></returns>public object LoadData(Type type, string keyName){//只需要传入一个Type,typeof(Player),就可以在内部动态创建一个对象返回出来//根据传入的类型和keyName,依据存储数据时key的拼接规则来进行数据的获取赋值,然后返回出去return null;}
}

4、反射读取数据-常用成员、List成员、Dic成员、自定义类成员

test

using System.Collections.Generic;
using UnityEngine;public class PlayerInfo
{public int age;public string name = "姓名";public float height;public bool sex;public List<int> list;public Dictionary<int, string> dic;public ItemInfo itemInfo;public List<ItemInfo> itemList;public Dictionary<int, ItemInfo> itemDic;
}
public class ItemInfo
{public int num;public int id;public ItemInfo() { }public ItemInfo(int id, int num){this.id = id;this.num = num;}
}
public class Test : MonoBehaviour
{void Start(){//PlayerInfo p = new PlayerInfo();将数据对象的信息存储到硬盘//PlayerPrefsDataMgr.Instance.SaveData(p, "Player1");//PlayerPrefs.DeleteAll();//读取数据PlayerInfo p = PlayerPrefsDataMgr.Instance.LoadData(typeof(PlayerInfo), "Player1") as PlayerInfo;//游戏逻辑p.age = 18;p.name = "姓名";p.height = 183;p.sex = true;p.itemList.Add(new ItemInfo(1,99));p.itemList.Add(new ItemInfo(2,22));p.itemDic.Add(3, new ItemInfo(3, 33));p.itemDic.Add(4, new ItemInfo(4, 44));//游戏数据存储PlayerPrefsDataMgr.Instance.SaveData(p, "player1");}
}

PlayerPrefsDataMgr

using System;
using System.Collections;
using System.Reflection;
using UnityEngine;
/// <summary>
/// PlayerPrefs数据管理类,同一管理数据的存储和读取
/// </summary>
public class PlayerPrefsDataMgr
{private static PlayerPrefsDataMgr instance = new PlayerPrefsDataMgr();public static PlayerPrefsDataMgr Instance{get { return instance; }}private PlayerPrefsDataMgr() { }/// <summary>/// 存储数据/// </summary>/// <param name="data">数据对象</param>/// <param name="keyName">数据对象的唯一key,自己控制</param>public void SaveData(object data, string keyName){//通过Type得到传入数据对象的所有字段,结合PlayerPrefs来存储//1、获取传入数据对象的所有字段Type dataType = data.GetType();//得到所有字段FieldInfo[] infos = dataType.GetFields();//2、自己定义一个key的规则,进行数据存储//keyName_数据类型_字段类型_字段名//3、遍历字段,进行数据存储string saveKeyNmae = "";FieldInfo info;for (int i = 0; i < infos.Length; i++){//对每一个字段,进行数据存储//得到具体的字段信息info = infos[i];//通过FieldInfo可以直接获取到字段的类型和字段的名字//    字段的类型 info.FieldType.Name//    字段的名字 info.Name//根据key生成key//    Player1_PlayerInfo_Int32_agesaveKeyNmae = keyName + "_" + dataType.Name + "_" + info.FieldType.Name + "_" + info.Name;//获取值//info.GetValue(data)SaveData(info.GetValue(data), saveKeyNmae);}PlayerPrefs.Save();}/// <summary>/// /// </summary>/// <param name="value">类型</param>/// <param name="keyName">存储的key名称</param>private void SaveValue(object value, string keyName){Type fieldType = value.GetType();if (fieldType == typeof(int)){Debug.Log("存储int" + keyName);PlayerPrefs.SetInt(keyName, (int)value);}else if (fieldType == typeof(float)){Debug.Log("存储float" + keyName);PlayerPrefs.SetFloat(keyName, (float)value);}else if (fieldType == typeof(string)){Debug.Log("存储string" + keyName);PlayerPrefs.SetString(keyName, value.ToString());}else if (fieldType == typeof(bool)){Debug.Log("存储bool" + keyName);PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0);}//通过IList判断这个类是否为Listelse if (typeof(IList).IsAssignableFrom(fieldType)){Debug.Log("存储List" + keyName);IList list = value as IList;//存储List数量PlayerPrefs.SetInt(keyName, list.Count);int index = 0;foreach (object obj in list){SaveValue(obj, keyName + index);index++;}}else if (typeof(IDictionary).IsAssignableFrom(fieldType)){Debug.Log("存储Dictionary" + keyName);IDictionary dic = value as IDictionary;//存储字典长度PlayerPrefs.SetInt(keyName,dic.Count);//遍历存储Dic里面的具体值int index = 0;foreach (object key in dic.Keys){SaveValue(key, keyName + "_key_" + index);SaveValue(dic[key], keyName + "_value_" + index);index++;}}else{SaveData(value, keyName);}}/// <summary>/// 读取数据/// </summary>/// <param name="type">想要读取数据的数据类型</param>/// <param name="keyName">数据对象的唯一key</param>/// <returns></returns>public object LoadData(Type type, string keyName){//只需要传入一个Type,typeof(Player),就可以在内部动态创建一个对象返回出来//根据传入的类型和keyName,依据存储数据时key的拼接规则来进行数据的获取赋值,然后返回出去//根据传入的Type创建一个对象,用于存储数据object data = Activator.CreateInstance(type);//要在这个new出来的对象中存储数据FieldInfo[] infos = type.GetFields();//用于拼接key的字符串string loadKeyName = "";//用于存储单个字段信息的对象FieldInfo info;for (int i = 0; i < infos.Length; i++){info = infos[i];loadKeyName = keyName + "_" + type.Name + "_" + info.FieldType.Name + "_" + info.Name;//填充数据到data中info.SetValue(data, LoadValue(info.FieldType, loadKeyName));}return data;}/// <summary>/// 得到单个数据的方法/// </summary>/// <param name="fieldType">字段类型,用于判断API的读取</param>/// <param name="keyName">唯一key,获取Value</param>/// <returns></returns>private object LoadValue(Type fieldType,string keyName){//根据字段类型if (fieldType == typeof(int)){return PlayerPrefs.GetInt(keyName, 0);}else if (fieldType == typeof(float)){return PlayerPrefs.GetFloat(keyName, 0);}else if (fieldType == typeof(string)){return PlayerPrefs.GetString(keyName, "");}else if(fieldType == typeof(bool)){return PlayerPrefs.GetInt(keyName, 0) == 1 ? true : false;}else if (typeof(IList).IsAssignableFrom(fieldType)){//得到List长度int count = PlayerPrefs.GetInt(keyName, 0);//实例化一个List对象类进行赋值IList list = Activator.CreateInstance(fieldType) as IList;for (int i = 0; i < count; i++){//得到List中泛型的类型list.Add(LoadValue(fieldType.GetGenericArguments()[0], keyName + i));}return list;}else if (typeof(IDictionary).IsAssignableFrom(fieldType)){//得到字典dictionary的长度int count = PlayerPrefs.GetInt(keyName, 0);//实例化字典对象IDictionary dic = Activator.CreateInstance(fieldType) as IDictionary;Type[] kvType = fieldType.GetGenericArguments();for (int i = 0; i < count; i++){dic.Add(LoadValue(kvType[0], keyName + "_key_" + i), LoadValue(kvType[1], keyName + "_value_" + i));}return dic;}else{return LoadData(fieldType, keyName);}}
}

4、加密思路

//为int数据加密
int rValue = (int)value;
rValue += 10;
PlayerPrefs.SetInt(keyName, rValue);
//解密
return PlayerPrefs.GetInt(keyName, 0) - 10;

5、生成资源包

Export Package

相关文章:

Unity 数据持久化【PlayerPrefs】

1、数据持久化 文章目录 1、数据持久化PlayerPrefs基本方法1、PlayerPrefs概念2、存储相关3、读取相关4、删除数据思考 信息的存储和读取 PlayerPrefs存储位置1、PlayerPrefs存储的数据在哪个位置2、PlayerPrefs 数据唯一性思考 排行榜功能 2、Playerprefs实践1、必备知识点-反…...

linux-虚拟内存-虚拟cpu

1、进程&#xff1a; 计算机中的程序关于某数据集合上的一次运行活动。 狭义定义&#xff1a;进程是正在运行的程序的实例&#xff08;an instance of a computer program that is being executed&#xff09;。广义定义&#xff1a;进程是一个具有一定独立功能的程序关于某个…...

某某市信息科技学业水平测试软件打开加载失败逆向分析(笔记)

引言&#xff1a;笔者在工作过程中&#xff0c;用户上报某某市信息科技学业水平测试软件在云电脑上打开初始化的情况下出现了加载和绑定机器失败的问题。一般情况下&#xff0c;在实体机上用户进行登录后&#xff0c;用户的账号信息跟主机的机器码进行绑定然后保存到配置文件&a…...

vue3+antd 实现点击按钮弹出对话框

格式1&#xff1a;确认对话框 按钮&#xff1a; 点击按钮之后&#xff1a; 完整代码&#xff1a; <template><div><a-button click"showConfirm">Confirm</a-button></div> </template> <script setup> import {Mod…...

Python一些可能用的到的函数系列130 UCS-Time Brick

说明 UCS对象是基于GFGoLite进行封装&#xff0c;且侧重于实现UCS规范。 内容 1 函数 我发现pydantic真是一个特别好用的东西&#xff0c;可以确保在数据传递时的可靠&#xff0c;以及对某个数据模型的描述。 以下&#xff0c;UCS给出了id、time相关的brick映射&#xff0…...

Java实现布隆过滤器的几种方式

布隆过滤器应用场景: 为预防大量黑客故意发起非法的时间查询请求,造成缓存击穿,建议采用布隆过滤器的方法解决。布隆过滤器通过一个很长的二进制向量和一系列随机映射函数(哈希函数)来记录与识别某个数据是否在一个集合中。如果数据不在集合中,能被识别出来,不需要到数…...

最新整理的机器人相关数据合集(1993-2022年不等 具体看数据类型)

机器人安装数据是指记录全球或特定区域内工业机器人新安装数量的信息&#xff0c;这一数据由国际机器人联合会(IFR)等权威机构定期发布。这些数据不仅揭示了机器人技术的市场需求趋势&#xff0c;还反映了各国和地区自动化水平及产业升级的步伐。例如&#xff0c;数据显示中国在…...

Python打开Excel文档并读取数据

Python 版本 目前 Python 3 版本为主流版本&#xff0c;这里测试的版本是&#xff1a;Python 3.10.5。 常用库说明 Python 操作 Excel 的常用库有&#xff1a;xlrd、xlwt、xlutils、openpyxl、pandas。这里主要说明下 Excel 文档 .xls 格式和 .xlsx 格式的文档打开和读取。 …...

算法day03 桶排序 数据结构分类 时间复杂度 异或运算

学数据结构之前 必看_哔哩哔哩_bilibili 1.认识复杂度和简单排序算法_哔哩哔哩_bilibili 桶排序&#xff08;Bucket sort&#xff09;------时间复杂度为O(n)的排序方法&#xff08;一&#xff09;_多桶排序时间复杂度-CSDN博客 桶排序 测试场景&#xff1a;数组中有10000个随…...

k8s学习之cobra命令库学习

1.前言 打开k8s代码的时候&#xff0c;我发现基本上那几个核心服务都是使用cobra库作为命令行处理的能力。因此&#xff0c;为了对代码之后的代码学习的有比较深入的理解&#xff0c;因此先基于这个库写个demo&#xff0c;加深对这个库的一些理解吧 2.cobra库的基本简介 Git…...

Spring框架的学习SpringMVC(1)

1.什么是MVC (1)MVC其实就是软件架构的一种设计模式&#xff0c;它将软件的系统分为&#xff0c;&#xff08;视图&#xff0c;模型&#xff0c;控制器&#xff09;三个部分 1.1View(视图) 视图也就是&#xff0c;在浏览器显示的那一个部分&#xff0c;是后端数据的呈现 1.…...

赋值运算符重载和const成员函数和 const函数

文章目录 1.运算符重载(1)(2)运算符重载的语法&#xff1a;(3)运算符重载的注意事项&#xff1a;(4)前置和后置重载区别 2.const成员函数3.取地址及const取地址操作符重载4.总结 1.运算符重载 (1) 我们知道内置类型(整形&#xff0c;字符型&#xff0c;浮点型…)可以进行一系…...

VSCode设置字体大小

方法1&#xff1a;Ctrl 和 Ctrl -&#xff0c;可以控制整个VSCode界面的整体缩放&#xff0c;但是不会调整字体大小 方法2&#xff1a;该方法只能设置编辑器界面的字号&#xff0c;无法改变窗口界面的字号。 &#xff08;1&#xff09;点开左下角如下图标&#xff0c;进入…...

Excel中按列的首行字母顺序,重新排列(VBA脚本)

排序前 要求对4列数据按照第一行abcd的顺序排列 VB脚本如下&#xff1a; 要使用这个脚本&#xff0c;请按照以下步骤操作&#xff1a; 打开Excel&#xff0c;然后按下 Alt F11 打开VBA编辑器。在VBA编辑器中&#xff0c;选择“插入” > “模块”&#xff0c;在打开的模块…...

多线程爬虫技术详解

&#x1f380;引言❤❤ 在当今信息爆炸的时代&#xff0c;网络爬虫&#xff08;Web Crawler&#xff09;作为一种自动获取网页内容的程序&#xff0c;已经成为数据挖掘和信息检索不可或缺的工具。多线程爬虫作为提高爬虫效率的重要手段&#xff0c;通过并行处理技术大幅度提升…...

项目一单机安装基于LNMP结构的WordPress网站 web与数据库服务分离

网站的类型&#xff1a; Jave:LNMT PHP:LNMP Python: LNMU 项目部署&#xff1a; 1.项目的类型&#xff08;项目的开发语言&#xff09; 2.项目运营平台的技术选择 3.尽快让项目运行起来 all in one部署 4. 架构的优化 配置ansible管理环境 配置nginx 配置数据库服务…...

vue事件处理v-on或@

事件处理v-on或 我们可以使用v-on指令&#xff08;简写&#xff09;来监听DOM事件&#xff0c;并在事件触发时执行对应的Javascript。用法&#xff1a;v-on:click"methodName"或click"hander" 事件处理器的值可以是&#xff1a; 内敛事件处理器&#xff1…...

使用OpenCV与PySide(PyQt)的视觉检测小项目练习

OpenCV 提供了丰富的图像处理和计算机视觉功能&#xff0c;可以实现各种复杂的图像处理任务&#xff0c;如目标检测、人脸识别、图像分割等。 PyQt(或PySide)是一个创建GUI应用程序的工具包&#xff0c;它是Python编程语言和Qt库的成功融合。Qt库是最强大的GUI库之一。Qt的快速…...

通信协议_C#实现自定义ModbusRTU主站

背景知识&#xff1a;modbus协议介绍 相关工具 mbslave:充当从站。虚拟串口工具:虚拟出一对串口。VS2022。 实现过程以及Demo 打开虚拟串口工具: 打开mbslave: 此处从站连接COM1口。 Demo实现 创建DLL库&#xff0c;创建ModbusRTU类,进行实现&#xff1a; using Syste…...

【C语言】 —— 编译和链接

【C语言】 —— 编译和链接 一、编译环境和运行环境二、翻译环境2.1、 预处理2.2、 编译&#xff08;1&#xff09;词法分析&#xff08;2&#xff09;语法分析&#xff08;3&#xff09;语义分析 2.3、 汇编2.4、链接 三、运行环境 一、编译环境和运行环境 平时我们说写 C语言…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...