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

Unity实现按键设置功能代码

一、前言

最近在学习unity2D,想做一个横版过关游戏,需要按键设置功能,让用户可以自定义方向键与攻击键等。

自己写了一个,总结如下。

二、界面效果图

在这里插入图片描述
这个是一个csv文件,准备第一列是中文按键说明,第二列是英文,第三列是日文(还没有翻译);第四列是默认按键名称,第五列是默认按键ascII码(如果用户选了恢复默认设置,就会用到);第六列是用户自己设置的按键名称,第七列是用户自己设置的按键ascII码;第八列保留,暂未使用。

在这里插入图片描述
这个是首页,如果选到了这个按钮,就是按键设置页面。

在这里插入图片描述

这个是按键设置页面,实现了按 上下/用户设置的上下移动光标,按回车/ 开始键确定,然后按另一个键进行按键修改。
(图中灰色块就是光标,还没有找图片;最后3行按钮进行了特殊处理)

三、主要部分代码

unity代码比较多,总结下主要用到的3个类。

1.FileManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.SceneManagement;
using System.Text;public class FileManager : MonoSingleTon<FileManager>
{private bool isInit =false;public TextAsset keyConfigCsv;//012列是语言,3是默认名称,4是默认ascii,56是用户设置的//这个要装第二行的数据/*wsadjkliqeuocvjk*///语言,这个不能修改,只能读取public static string[] LanguageWasd = new string[16];private static string[] LanguageWasd0 = new string[16];private static string[] LanguageWasd1 = new string[16];private static string[] LanguageWasd2 = new string[16];//默认的key的str与int,这个不能修改,只能读取public static int[] DefaultWasdNumKeys = new int[16];public static string[] DefaultWasdNumKeysStr = new string[16];//实际用的key的str与intpublic static int[] WasdNumKeys = new int[16];public static string[] WasdNumKeysStr = new string[16];//临时用的key的str与int,因为可能只修改不保存,所以用public static int[] WasdNumKeysTemp = new int[16];public static string[] WasdNumKeysStrTemp = new string[16];// Start is called before the first frame update// 这个方法会在脚本被启用时注册监听事件void OnEnable(){//Debug.Log("进入这个场景playerData");//Debug.Log("执行完毕这个场景playerData");}private void Awake(){if (!isInit){InitKeyConfig();}}void Start(){}// Update is called once per framevoid Update(){}private bool InitKeyConfig(){string path = GetKeyConfigPath();Debug.Log(path);if (File.Exists(path)){//用用户的初始化LoadKeyConfig(File.ReadAllText(path).Split("\n"));Debug.Log("使用用户的初始化");isInit = true;return false;}else{string text = keyConfigCsv.text;//把默认的文件写进本地File.WriteAllText(path, text, Encoding.UTF8);//用默认的初始化LoadKeyConfig(text.Split("\n"));//string[] dataRow = text.Split("\n");//File.WriteAllLines(path, dataRow);Debug.Log("使用默认的初始化");isInit = true;return true;}}//读取到临时变量里public void LoadKeyConfig(string[] dataRow){int language = LanguageManager.GetLanguage();//File.WriteAllLines(path, dataRow);for(int i = 0; i < dataRow.Length; i++){string[] dataCell = dataRow[i].Split(",");if (i >= 16){break;}else{LanguageWasd[i] = dataCell[language];LanguageWasd0[i] = dataCell[0];LanguageWasd1[i] = dataCell[1];LanguageWasd2[i] = dataCell[2];DefaultWasdNumKeysStr[i] = dataCell[3];DefaultWasdNumKeys[i] = int.Parse(dataCell[4]);WasdNumKeysStr[i] = dataCell[5];WasdNumKeysStrTemp[i] = dataCell[5];WasdNumKeys[i] = int.Parse(dataCell[6]);WasdNumKeysTemp[i] = int.Parse(dataCell[6]);}}}private static void SaveKeyConfig(string[] dataRow){//Application.dataPath//这个打包后就不能用了,可能没权限string path = GetKeyConfigPath();if (File.Exists(path)){//删了重新创建File.Delete(path);File.CreateText(path).Close();}else{File.CreateText(path).Close();}//List<string> datas2 = new List<string>();//datas.Add("coins,1");Debug.Log("写入数据");File.WriteAllLines(path, dataRow, Encoding.UTF8);Debug.Log("写入数据完毕");}public void ResetKeyConfig(){string text = keyConfigCsv.text;//用默认的初始化LoadKeyConfig(text.Split("\n"));//并且保存SaveKeyConfig(text.Split("\n"));//SceneManager.LoadScene(0);}public static string GetKeyConfigPath(){return Application.persistentDataPath + "/KeyConfig.csv";}public static void SaveKeyConfig(){string[] newData = new string[16];//保存文件for(int i=0; i<16; i++){newData[i] = LanguageWasd0[i] + "," + LanguageWasd1[i] + "," + LanguageWasd2[i] + ","+ DefaultWasdNumKeysStr[i] + "," + DefaultWasdNumKeys[i] + "," + WasdNumKeysStr[i] + "," + WasdNumKeys[i] + "," + ";";}SaveKeyConfig(newData);Debug.Log("保存键盘信息完毕");}}

这个类负责操作配置文件,要把内置的配置文件保存到本地配置文件中,以及读取配置文件。(要区分读取内置的还是本地的)

2.TitleScreen.cs

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;public class TitleScreen : MonoBehaviour
{TextMeshProUGUI tmpTitleText;bool calledNextScene;bool inputDetected = false;bool isTitle = true;bool isKeySetting = false;bool isLanguageSetting = false;int alphaKeyPressText = 255;bool alphaKeyPressTextShow = true;public AudioClip keyPressClip;public AudioClip keyChangeClip;[SerializeField] Image[] buttons = new Image[5];[SerializeField] Text[] buttonsText = new Text[5];private int buttonsChoosedNum = 0;private enum TitleScreenStates { WaitForInput, NextScene };TitleScreenStates titleScreenState = TitleScreenStates.WaitForInput;#if UNITY_STANDALONEstring insertKeyPressText = "PRESS ANY KEY";
#endif#if UNITY_ANDROID || UNITY_IOSstring insertKeyPressText = "TAP TO START";
#endifstring titleText =
@"<size=18><color=#ffffff{0:X2}>{1}</color></size>";private void Awake(){//tmpTitleText = GameObject.Find("TitleText").GetComponent<TextMeshProUGUI>();}// Start is called before the first frame updatevoid Start(){//tmpTitleText.alignment = TextAlignmentOptions.Center;//tmpTitleText.alignment = TextAlignmentOptions.Midline;//tmpTitleText.fontStyle = FontStyles.UpperCase;titleScreenState = TitleScreenStates.WaitForInput;if (isHaveSavePoint()){initButton(1);}else {initButton(0);}}// Update is called once per framevoid Update(){switch(titleScreenState){case TitleScreenStates.WaitForInput://buttonsText[buttonsChoosedNum].text = String.Format(titleText, alphaKeyPressText, buttonsText[buttonsChoosedNum].text);buttonsText[buttonsChoosedNum].enabled = alphaKeyPressTextShow;if (!inputDetected){ChooseButton();SelectButton();}break;case TitleScreenStates.NextScene:if (!calledNextScene){GameManager.Instance.StartNextScene();calledNextScene = true;}break;}}private IEnumerator FlashTitleText() { for(int i = 0; i < 5; i++){alphaKeyPressTextShow = true;alphaKeyPressText = 0;yield return new WaitForSeconds(0.1f);alphaKeyPressTextShow = false;alphaKeyPressText = 255;yield return new WaitForSeconds(0.1f);}alphaKeyPressTextShow = true;alphaKeyPressText = 0;yield return new WaitForSeconds(0.1f);titleScreenState = TitleScreenStates.NextScene;}private IEnumerator FlashTitleTextAndOpenKeyConfig(){for (int i = 0; i < 5; i++){alphaKeyPressTextShow = true;alphaKeyPressText = 0;yield return new WaitForSeconds(0.1f);alphaKeyPressTextShow = false;alphaKeyPressText = 255;yield return new WaitForSeconds(0.1f);}alphaKeyPressTextShow = true;alphaKeyPressText = 0;yield return new WaitForSeconds(0.1f);//退出的时候,需要改为接受输入KeyConfigScript.Instance.Show(() => { inputDetected = false;Debug.Log("回调方法"); });}private bool isHaveSavePoint() {return false;}private void ChooseButton() {if (  Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown((KeyCode)FileManager.WasdNumKeys[0])  ){if (buttonsChoosedNum > 0){buttons[buttonsChoosedNum].enabled = false;buttonsChoosedNum--;buttons[buttonsChoosedNum].enabled = true;PlayChangeButton();}else{PlayChangeButton();}}if (Input.GetKeyDown(KeyCode.DownArrow) || Input.GetKeyDown((KeyCode)FileManager.WasdNumKeys[1]) ){if (buttonsChoosedNum < buttons.Length - 1){buttons[buttonsChoosedNum].enabled = false;buttonsChoosedNum++;buttons[buttonsChoosedNum].enabled = true;PlayChangeButton();}else{PlayChangeButton();}}}private void SelectButton() { if( Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown((KeyCode)FileManager.WasdNumKeys[13])  ){if (buttonsChoosedNum == 0){inputDetected = true;StartCoroutine(FlashTitleText());SoundManager.Instance.Play(keyPressClip);} else if (buttonsChoosedNum == 1) {inputDetected = true;SoundManager.Instance.Play(keyPressClip);}else if (buttonsChoosedNum == 2){inputDetected = true;SoundManager.Instance.Play(keyPressClip);}else if (buttonsChoosedNum == 3){inputDetected = true;SoundManager.Instance.Play(keyPressClip);StartCoroutine(FlashTitleTextAndOpenKeyConfig());}else if (buttonsChoosedNum == 4){Application.Quit();}}}private void PlayChangeButton() { if(keyChangeClip != null){SoundManager.Instance.Play(keyChangeClip);}}private void initButton(int n) {buttonsChoosedNum = n;for(int i = 0; i < buttons.Length; i++){if (i == n){buttons[i].enabled = true;}else {buttons[i].enabled = false;}}}}

这个是游戏首页用的类,主要管是否显示按键设置页面;
按键设置页面也在首页,是个Canvas对象,刚开始会隐藏,选择按键设置按钮并确定后,才会展示。

3.KeyConfigScript.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;public class KeyConfigScript : MonoBehaviour
{bool flashText = false;public static KeyConfigScript Instance = null;[SerializeField] Canvas canvas;public AudioClip keyChangeClip;public AudioClip keySelectClip;/*wsadjkliqeuocvjk*/public UnityEngine.UI.Image[] buttons = new UnityEngine.UI.Image[19];[SerializeField] Text[] buttonsText = new Text[19];[SerializeField] ScrollRect scrollRect;private Action nowScreenAction;private int buttonsChoosedNum = 0;bool alphaKeyPressTextShow = true;//检测按键bool canInput = false;bool canMove = true;private void Awake(){// If there is not already an instance of SoundManager, set it to this.if (Instance == null){Instance = this;}//If an instance already exists, destroy whatever this object is to enforce the singleton.else if (Instance != this){Destroy(gameObject);}//Set SoundManager to DontDestroyOnLoad so that it won't be destroyed when reloading our scene.DontDestroyOnLoad(gameObject);//默认隐藏Close();}private void OnEnable(){}private void initKeysObjects() {//读取下当前配置文件,获得每个按键配置的名称和值for (int i = 0; i < buttons.Length; i++){if (i >= 16){buttons[i].enabled = false;}else{buttonsText[i].text = FileManager.LanguageWasd[i] + ":" + FileManager.WasdNumKeysStr[i];//初始化方法,只有0才是if (i == 0){buttons[i].enabled = true;}else{buttons[i].enabled = false;}}}}private void ChooseButton(){if ( Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown((KeyCode)FileManager.WasdNumKeys[0]) ){if (buttonsChoosedNum > 0){buttons[buttonsChoosedNum].enabled = false;buttonsChoosedNum--;buttons[buttonsChoosedNum].enabled = true;PlayChangeButton();ScrollUpOrDown(buttonsChoosedNum, false);}else{//移动到最后一个buttons[buttonsChoosedNum].enabled = false;buttonsChoosedNum = buttons.Length - 1;buttons[buttonsChoosedNum].enabled = true;PlayChangeButton();}}if (Input.GetKeyDown(KeyCode.DownArrow) || Input.GetKeyDown((KeyCode)FileManager.WasdNumKeys[1]) ){if (buttonsChoosedNum < buttons.Length - 1){buttons[buttonsChoosedNum].enabled = false;buttonsChoosedNum++;buttons[buttonsChoosedNum].enabled = true;PlayChangeButton();ScrollUpOrDown(buttonsChoosedNum, true);}else{//移动到第一个buttons[buttonsChoosedNum].enabled = false;buttonsChoosedNum = 0;buttons[buttonsChoosedNum].enabled = true;PlayChangeButton();}}}private void SelectButton(){//如果是可以移动状态if (canMove){//如果按下选择键if (  Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown((KeyCode)FileManager.WasdNumKeys[13])  ) {//播放声音PlaySelectButton();//关闭移动canMove = false;//如果是这些键,特殊处理然后返回switch (buttonsChoosedNum){case 16:StartCoroutine(FlashTitleTextSecond(Reset));return;case 17:StartCoroutine(FlashTitleTextSecond(SaveAndClose));return;case 18:StartCoroutine(FlashTitleTextSecond(Close));return;}//如果是普通键//闪烁标志位打开flashText = true;//字幕闪烁StartCoroutine(FlashTitleText());}}else{BeforeSettingKey();}}private void BeforeSettingKey(){if (Input.anyKeyDown){//需要看这个键能不能设置bool canSetting = false;foreach (KeyCode key in System.Enum.GetValues(typeof(KeyCode))){if (Input.GetKeyDown(key)){// 检查按键是否为可打印字符if ((key >= KeyCode.A && key <= KeyCode.Z) || (key >= KeyCode.Alpha0 && key <= KeyCode.Alpha9)){// 将字符转换为 ASCII 码string keyStr = key.ToString();//char keyChar = keyStr[0];int asciiValue = (int)key;Debug.Log($"按下的键 {key} 对应的 ASCII 码值是:{asciiValue}");SettingKey(keyStr, asciiValue);canSetting = true;break;}else{// 非字母数字键(你可以根据需求处理这些按键)Debug.Log($"按下了非字符键:{key}");if (key == KeyCode.Space){SettingKey("Space", 32);canSetting = true;break;}else if (key == KeyCode.Return){SettingKey("Enter", 13);canSetting = true;break;}else if (key == KeyCode.UpArrow){SettingKey("Up", 273);canSetting = true;break;}else if (key == KeyCode.DownArrow){SettingKey("Down", 274);canSetting = true;break;}else if (key == KeyCode.LeftArrow){SettingKey("Left", 276);canSetting = true;break;}else if (key == KeyCode.RightArrow){SettingKey("Right", 275);canSetting = true;break;}}}}//如果可以设置,再进行后续操作if (canSetting){//停止闪烁StartCoroutine(ResetTitleText());}}}private void SettingKey(string str, int ascII){//更新设置的信息FileManager.WasdNumKeysStrTemp[buttonsChoosedNum] = str;FileManager.WasdNumKeysTemp[buttonsChoosedNum] = ascII;//更新按键文本信息buttonsText[buttonsChoosedNum].text = FileManager.LanguageWasd[buttonsChoosedNum] + ":"+ str;}private IEnumerator FlashTitleText(){while (flashText) { alphaKeyPressTextShow = true;yield return new WaitForSeconds(0.1f);alphaKeyPressTextShow = false;yield return new WaitForSeconds(0.1f);}}private IEnumerator FlashTitleTextSecond(Func<bool> func){for (int i=0; i<5; i++){alphaKeyPressTextShow = true;yield return new WaitForSeconds(0.1f);alphaKeyPressTextShow = false;yield return new WaitForSeconds(0.1f);}alphaKeyPressTextShow = true;yield return new WaitForSeconds(0.1f);//闪烁完毕后才能移动canMove = true;//闪烁完毕后执行func();}private IEnumerator ResetTitleText(){flashText = false;yield return new WaitForSeconds(0.2f);alphaKeyPressTextShow = true;buttonsText[buttonsChoosedNum].enabled = true;canMove = true;}private void PlayChangeButton(){if (keyChangeClip != null){SoundManager.Instance.Play(keyChangeClip);}}private void PlaySelectButton(){if (keySelectClip != null){SoundManager.Instance.Play(keySelectClip);}}//先从配置文件读取配置信息void Start(){}// Update is called once per framevoid Update(){if (canInput){buttonsText[buttonsChoosedNum].enabled = alphaKeyPressTextShow;if (canMove){ChooseButton();}SelectButton();}}//翻页,现在不用private void ScrollUpOrDown(int count, bool isDown){/*if(count == 8 && isDown){scrollRect.normalizedPosition = new Vector2(0, 0);}else if (count == 7 && !isDown) {scrollRect.normalizedPosition = new Vector2(0, 1);}*/}public void Show(Action action) {//翻页,现在不用//scrollRect.normalizedPosition = new Vector2(0, 0);alphaKeyPressTextShow = true;buttonsChoosedNum = 0;initKeysObjects();this.nowScreenAction = action;Debug.Log("show Key Config");canvas.enabled = true;canInput = true;}private bool Reset(){for (int i = 0; i < 16; i++){//先把text内容改了buttonsText[i].text = FileManager.LanguageWasd[i] + ":" + FileManager.DefaultWasdNumKeysStr[i];//然后把临时数组改了FileManager.WasdNumKeysStrTemp[i] = FileManager.DefaultWasdNumKeysStr[i];FileManager.WasdNumKeysTemp[i] = FileManager.DefaultWasdNumKeys[i];}return true;}private bool Save(){for (int i = 0; i < 16; i++){//给实际用的赋值FileManager.WasdNumKeysStr[i] = FileManager.WasdNumKeysStrTemp[i];FileManager.WasdNumKeys[i] = FileManager.WasdNumKeysTemp[i];}//写入文件FileManager.SaveKeyConfig();return true;}private bool SaveAndClose(){Save();Close();return true;}public bool Close() {canvas.enabled = false;canInput = false;//上一个屏幕,改为接受输入if(nowScreenAction != null){nowScreenAction();}return true;//nowScreenManager.GetComponent<TitleScreen>().inputDetected = false;}}

这个类就是按键设置页面用的类,有光标上下移动功能、按钮选择后让字幕闪烁的功能、再次按键后设置新按键功能。

四、备注

unity代码比较复杂,直接复制粘贴是无法使用的,每人的场景元素也不一样,很多变量会不存在,仅供参考。

以上就是个人编写的设置按键的代码,大致逻辑如下:

1.游戏启动后,先判断有没有本地配置文件,如果有、就读取本地配置文件并初始化;如果没有,就用内置配置文件初始化,并把内置配置文件保存到本地。

2.进入按键选择页面时,上下方向键移动光标,按回车可以选择按键,此时按键闪烁,再按另一个键可以设置为新按键。

3.有恢复默认设置功能,有保存并退出功能,有直接退出功能;如果选保存并退出,才把设置的临时按键数组赋值到实际使用的按键数组,并保存到本地配置文件。

相关文章:

Unity实现按键设置功能代码

一、前言 最近在学习unity2D&#xff0c;想做一个横版过关游戏&#xff0c;需要按键设置功能&#xff0c;让用户可以自定义方向键与攻击键等。 自己写了一个&#xff0c;总结如下。 二、界面效果图 这个是一个csv文件&#xff0c;准备第一列是中文按键说明&#xff0c;第二列…...

C++ 入门速通-第3章【黑马】

内容来源于&#xff1a;黑马 集成开发环境&#xff1a;CLion 先前学习完了C第1章的内容&#xff1a; C 入门速通-第1章【黑马】-CSDN博客 C 入门速通-第2章【黑马】-CSDN博客 下面继续学习第3章&#xff1a; 数组&#xff1a; 字符数组&#xff1a; 多维数组&#xff1a; …...

JavaScript 中的 CSS 与页面响应式设计

JavaScript 中的 CSS 与页面响应式设计 JavaScript 中的 CSS 与页面响应式设计1. 引言2. JavaScript 与 CSS 的基本概念2.1 CSS 的作用2.2 JavaScript 的作用3. 动态控制样式:JavaScript 修改 CSS 的方法3.1 使用 `document.styleSheets` API3.2 使用 `classList` 修改类3.3 使…...

100.3 AI量化面试题:解释配对交易(Pairs Trading)的原理,并说明如何选择配对股票以及设计交易信号

目录 0. 承前1. 配对交易基本原理1.1 什么是配对交易1.2 基本假设 2. 配对选择方法2.1 相关性分析2.2 协整性检验 3. 价差计算方法3.1 简单价格比率3.2 回归系数法 4. 交易信号设计4.1 标准差方法4.2 动态阈值方法 5. 风险管理5.1 止损设计5.2 仓位管理 6. 策略评估6.1 回测框架…...

[SAP ABAP] Debug Skill

SAP ABAP Debug相关资料 [SAP ABAP] DEBUG ABAP程序中的循环语句 [SAP ABAP] 静态断点的使用 [SAP ABAP] 在ABAP Debugger调试器中设置断点 [SAP ABAP] SE11 / SE16N 修改标准表(慎用)...

WSL2中安装的ubuntu开启与关闭探讨

1. PC开机后&#xff0c;查询wsl状态 在cmd或者powersell中输入 wsl -l -vNAME STATE VERSION * Ubuntu Stopped 22. 从windows访问WSL2 wsl -l -vNAME STATE VERSION * Ubuntu Stopped 23. 在ubuntu中打开一个工作区后…...

走向基于大语言模型的新一代推荐系统:综述与展望

HightLight 论文题目&#xff1a;Towards Next-Generation LLM-based Recommender Systems: A Survey and Beyond作者机构&#xff1a;吉林大学、香港理工大学、悉尼科技大学、Meta AI论文地址&#xff1a; https://arxiv.org/abs/2410.1974 基于大语言模型的下一代推荐系统&…...

【深度分析】DeepSeek 遭暴力破解,攻击 IP 均来自美国,造成影响有多大?有哪些好的防御措施?

技术铁幕下的暗战&#xff1a;当算力博弈演变为代码战争 一场针对中国AI独角兽的全球首例国家级密码爆破&#xff0c;揭开了数字时代技术博弈的残酷真相。DeepSeek服务器日志中持续跳动的美国IP地址&#xff0c;不仅是网络攻击的地理坐标&#xff0c;更是技术霸权对新兴挑战者的…...

双指针算法思想——OJ例题扩展算法解析思路

大家好&#xff01;上一期我发布了关于双指针的OJ平台上的典型例题思路解析&#xff0c;基于上一期的内容&#xff0c;我们这一期从其中内容扩展出来相似例题进行剖析和运用&#xff0c;一起来试一下吧&#xff01; 目录 一、 基于移动零的举一反三 题一&#xff1a;27. 移除…...

初始Linux(7):认识进程(下)

1. 进程优先级 cpu 资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08; priority &#xff09;。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用&#xff0c;可以改善系统性能。 还可以把进程运行到指定的CPU 上&#xff0c;这样一来…...

人工智能第2章-知识点与学习笔记

结合教材2.1节&#xff0c;阐述什么是知识、知识的特性,以及知识的表示。人工智能最早应用的两种逻辑是什么&#xff1f;阐述你对这两种逻辑表示的内涵理解。什么谓词&#xff0c;什么是谓词逻辑&#xff0c;什么是谓词公式。谈谈你对谓词逻辑中的量词的理解。阐述谓词公式的解…...

Kotlin 协程 与 Java 虚拟线程对比测试(娱乐性质,请勿严谨看待本次测试)

起因 昨天在群里聊到虚拟线程的执行效率问题的时候虽然最后的结论是虚拟线程在针对IO密集型任务时具有很大的优势。但是讨论到虚拟线程和Kotlin 的协程的优势对比的话&#xff0c;这时候所有人都沉默了。所以有了本次的测试 提前声明&#xff1a;本次测试是不严谨的&#xff0…...

C++中的拷贝构造器(Copy Constructor)

在C中&#xff0c;拷贝构造器&#xff08;Copy Constructor&#xff09;是一种特殊的构造函数&#xff0c;用于创建一个新对象&#xff0c;该对象是另一个同类型对象的副本。当使用一个已存在的对象来初始化一个新对象时&#xff0c;拷贝构造器会被调用。 拷贝构造器的定义 拷…...

Spring Boot项目如何使用MyBatis实现分页查询

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…...

独立开发经验谈:如何借助 AI 辅助产品 UI 设计

我在业余时间开发了一款自己的独立产品&#xff1a;升讯威在线客服与营销系统。陆陆续续开发了几年&#xff0c;从一开始的偶有用户尝试&#xff0c;到如今线上环境和私有化部署均有了越来越多的稳定用户&#xff0c;在这个过程中&#xff0c;我也积累了不少如何开发运营一款独…...

笔灵ai写作技术浅析(三):深度学习

笔灵AI写作的深度学习技术主要基于Transformer架构,尤其是GPT(Generative Pre-trained Transformer)系列模型。 1. Transformer架构 Transformer架构由Vaswani等人在2017年提出,是GPT系列模型的基础。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全依赖自…...

https数字签名手动验签

以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构&#xff0c;由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体&#xff08;如子 CA 或终端实体&#xff09;颁发证书。层级结构的顶端是 根 CA&#xff08;Root CA&#xff09;&#xff0c;它是整个 PKI 体…...

为什么LabVIEW适合软硬件结合的项目?

LabVIEW是一种基于图形化编程的开发平台&#xff0c;广泛应用于软硬件结合的项目中。其强大的硬件接口支持、实时数据采集能力、并行处理能力和直观的用户界面&#xff0c;使得它成为工业控制、仪器仪表、自动化测试等领域中软硬件系统集成的理想选择。LabVIEW的设计哲学强调模…...

C# 操作符重载对象详解

.NET学习资料 .NET学习资料 .NET学习资料 一、操作符重载的概念 在 C# 中&#xff0c;操作符重载允许我们为自定义的类或结构体定义操作符的行为。通常&#xff0c;我们熟悉的操作符&#xff0c;如加法&#xff08;&#xff09;、减法&#xff08;-&#xff09;、乘法&#…...

git:恢复纯版本库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

java异常处理——try catch finally

单个异常处理 1.当try里的代码发生了catch里指定类型的异常之后&#xff0c;才会执行catch里的代码&#xff0c;程序正常执行到结尾 2.如果try里的代码发生了非catch指定类型的异常&#xff0c;则会强制停止程序&#xff0c;报错 3.finally修饰的代码一定会执行&#xff0c;除…...

【架构面试】二、消息队列和MySQL和Redis

MQ MQ消息中间件 问题引出与MQ作用 常见面试问题&#xff1a;面试官常针对项目中使用MQ技术的候选人提问&#xff0c;如如何确保消息不丢失&#xff0c;该问题可考察候选人技术能力。MQ应用场景及作用&#xff1a;以京东系统下单扣减京豆为例&#xff0c;MQ用于交易服和京豆服…...

A4988一款常用的步进电机驱动芯片

A4988 是一款常用的步进电机驱动芯片&#xff0c;广泛应用于 3D 打印机、CNC 机床和小型自动化设备中。它可以驱动多种类型的步进电机&#xff0c;但需要根据电机的参数&#xff08;如电压、电流、相数等&#xff09;进行合理配置。 一、A4988 的主要特性 驱动能力&#xff1a;…...

TypeScript语言的语法糖

TypeScript语言的语法糖 TypeScript作为一种由微软开发的开源编程语言&#xff0c;它在JavaScript的基础上添加了一些强类型的特性&#xff0c;使得开发者能够更好地进行大型应用程序的构建和维护。在TypeScript中&#xff0c;不仅包含了静态类型、接口、枚举等强大的特性&…...

A星算法两元障碍物矩阵转化为rrt算法四元障碍物矩阵

对于a星算法obstacle所表示的障碍物障碍物信息&#xff0c;每行表示一个障碍物的坐标&#xff0c;例如2 , 3; % 第一个障碍物在第二行第三列&#xff0c;也就是边长为1的正方形障碍物右上角横坐标是2&#xff0c;纵坐标为3&#xff0c;障碍物的宽度和高度始终为1.在rrt路径规划…...

什么情况下,C#需要手动进行资源分配和释放?什么又是非托管资源?

扩展&#xff1a;如何使用C#的using语句释放资源&#xff1f;什么是IDisposable接口&#xff1f;与垃圾回收有什么关系&#xff1f;-CSDN博客 托管资源的回收有GC自动触发&#xff0c;而非托管资源需要手动释放。 在 C# 中&#xff0c;非托管资源是指那些不由 CLR&#xff08;…...

【最长上升子序列Ⅱ——树状数组,二分+DP,纯DP】

题目 代码&#xff08;只给出树状数组的&#xff09; #include <bits/stdc.h> using namespace std; const int N 1e510; int n, m; int a[N], b[N], f[N], tr[N]; //f[i]表示以a[i]为尾的LIS的最大长度 void init() {sort(b1, bn1);m unique(b1, bn1) - b - 1;for(in…...

day37|完全背包基础+leetcode 518.零钱兑换II ,377.组合总和II

完全背包理论基础 完全背包与01背包的不同在于01背包的不同物品每个都只可以使用一次&#xff0c;但是完全背包的不同物品可以使用无数次 在01背包理论基础中&#xff0c;为了使得物品只被使用一次&#xff0c;我们采取倒序遍历来控制 回顾&#xff1a;>> for(int j …...

【VM】VirtualBox安装ubuntu22.04虚拟机

阅读本文之前&#xff0c;请先根据 安装virtualbox 教程安装virtulbox虚拟机软件。 1.下载Ubuntu系统镜像 打开阿里云的镜像站点&#xff1a;https://developer.aliyun.com/mirror/ 找到如图所示位置&#xff0c;选择Ubuntu 22.04.3(destop-amd64)系统 Ubuntu 22.04.3(desto…...

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中&#xff0c;所有事件都继承自 QEvent &#xff0c;并且每个事件都有特定的标识符&#xff0c;如&#xff1a;Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…...

DeepSeek 云端部署,释放无限 AI 潜力!

1.简介 目前&#xff0c;OpenAI、Anthropic、Google 等公司的大型语言模型&#xff08;LLM&#xff09;已广泛应用于商业和私人领域。自 ChatGPT 推出以来&#xff0c;与 AI 的对话变得司空见惯&#xff0c;对我而言没有 LLM 几乎无法工作。 国产模型「DeepSeek-R1」的性能与…...

【论文复现】基于Otsu方法的多阈值图像分割改进鲸鱼优化算法

目录 1.摘要2.鲸鱼优化算法WOA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种基于Otsu方法的多阈值图像分割改进鲸鱼优化算法&#xff08;RAV-WOA&#xff09;。RAV-WOA算法能够在分割灰度图像和彩色图像时&#xff0c;自动选择最优阈值&#xff0c;并确…...

Hive之数据定义DDL

Hive之数据定义DDL 文章目录 Hive之数据定义DDL写在前面创建数据库查询数据库显示数据库查看数据库详情切换当前数据库 修改数据库删除数据库创建表管理表(内部表)外部表管理表与外部表的互相转换 修改表重命名表增加、修改和删除表分区增加/修改/替换列信息 删除表 写在前面 …...

Golang 应用的 Docker 部署方式介绍及使用详解

本文将介绍如何使用 Docker 部署一个基于 Go 语言的后台服务应用 godco&#xff0c;并介绍如何配置 MongoDB 数据库容器的连接&#xff0c;确保应用能够成功启动并连接到容器方式部署的mongoDB数据库。 前提条件 1.已安装 Docker/Podman 2.已安装 MongoDB 数据库容器&#xff…...

SuccessFactors OData OAuth with SAP IAS-generated SAML assertion

导读 IAS:一句话说明白。SAP相关的系统可以通过IAS登录&#xff0c;只要IAS登录&#xff0c;其他系统免密登录。 作者&#xff1a;vivi&#xff0c;来源&#xff1a;osinnovation 上图有三个角色&#xff1a;brower&#xff0c;就是自己的浏览器&#xff0c;sp就是我们的目标…...

vue入门到实战 三

目录 3.1 v-bind 3.1.1 v-bind指令用法 ​编辑3.1.2 使用v-bind绑定class 3.1.3 使用v-bind绑定style 3.2.1 v-if指令 3.2.1 v-if指令 3.2.2 v-show指令 ​3.3 列表渲染指令v-for 3.3.1 基本用法 3.3.2 数组更新 3.3.3 过滤与排序 3.4 事件处理 3.4.1 使用v-on指令…...

音视频入门基础:RTP专题(7)——RTP协议简介

一、引言 本文对RTP协议进行简介。在简介之前&#xff0c;请各位先下载RTP的官方文档《RFC 3550》。该文档总共有89页&#xff0c;本文下面所说的“页数”是指在pdf阅读器中显示的页数&#xff1a; 二、RTP协议简介 根据《RFC 3550》第5页&#xff0c;实时传输协议&#xff08…...

06-机器学习-数据预处理

数据清洗 数据清洗是数据预处理的核心步骤&#xff0c;旨在修正或移除数据集中的错误、不完整、重复或不一致的部分&#xff0c;为后续分析和建模提供可靠基础。以下是数据清洗的详细流程、方法和实战示例&#xff1a; 一、数据清洗的核心任务 问题类型表现示例影响缺失值数值…...

《逆向工程核心原理》第三~五章知识整理

查看上一章节内容《逆向工程核心原理》第一~二章知识整理 对应《逆向工程核心原理》第三章到第五章内容 小端序标记法 字节序 多字节数据在计算机内存中存放的字节顺序分为小端序和大端序两大类 大端序与小端序 BYTE b 0x12; WORD w 0x1234; DWORD dw 0x12345678; cha…...

影视文件大数据高速分发方案

在当今的数字时代&#xff0c;影视行业的内容创作和传播方式经历了翻天覆地的变化。随着4K、8K高清视频的普及&#xff0c;以及虚拟现实(VR)和增强现实(AR)技术的发展&#xff0c;影视文件的数据量正以前所未有的速度增长。这就要求行业内的参与者必须拥有高效的大数据传输解决…...

使用朴素贝叶斯对散点数据进行分类

本文将通过一个具体的例子&#xff0c;展示如何使用 Python 和 scikit-learn 库中的 GaussianNB 模型&#xff0c;对二维散点数据进行分类&#xff0c;并可视化分类结果。 1. 数据准备 假设我们有两个类别的二维散点数据&#xff0c;每个类别包含若干个点。我们将这些点分别存…...

pytorch线性回归模型预测房价例子

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 import torch import torch.nn as nn import torch.optim as optim import numpy as np# 1. 创建线性回归模型类 class LinearRegressionModel(nn.Module):def __init__(self):super(LinearRegressionModel, self).…...

微信登录模块封装

文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…...

C++运算符重载

C的运算符重载&#xff1a;使对象的运算表现得和编译器内置类型一样 以复数类为例&#xff1a; #include <iostream> using namespace std;class CComplex { public:CComplex(int r 0, int i 0): mreal(r), mimage(i){}// 指导编译器怎么做CComplex类对象的加法操作CC…...

pandas(三)Series使用

一、Series基础使用 import pandasd {x:100,y:200,z:300} s1 pandas.Series(d) #将dict转化为Series print(s1)print("") l1 [1, 2, 3] l2 [a, b, c] s2 pandas.Series(l1, indexl2) #list转为Series print(s2)print("") s3 pandas.Series([11…...

PVE 中 Debian 虚拟机崩溃后,硬盘数据怎么恢复

问题 在 PVE 中给 Debian 虚拟机新分配硬盘后&#xff0c;通过 Debian 虚拟机开启 Samba 共享该硬盘。如果这个 Debian 虚拟机崩溃后&#xff0c;怎么恢复 Samba 共享硬盘数据。 方法 开启 Samba 共享相关知识&#xff1a;挂载硬盘和开启Samba共享。 新建一个虚拟机&#xf…...

【大数据技术】案例01:词频统计样例(hadoop+mapreduce+yarn)

词频统计(hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 在阅读本文前,请确保已经阅读过以上两篇文章,成功搭建了Hadoop+MapReduce+Yarn的大数据集群环境。 写在前面 Wo…...

PySPARK带多组参数和标签的SparkSQL批量数据导出到S3的程序

设计一个基于多个带标签SparkSQL模板作为配置文件和多组参数的PySPARK代码程序&#xff0c;实现根据不同的输入参数自动批量地将数据导出为Parquet、CSV和Excel文件到S3上&#xff0c;标签和多个参数&#xff08;以“_”分割&#xff09;为组成导出数据文件名&#xff0c;文件已…...

分享刷题过程中有价值的两道题目

小编在这里先祝大家新的一年里所愿皆得&#xff0c;万事顺意&#xff0c;天天开心&#xff01;&#xff01;&#xff01; 一.水仙花数 题目描述&#xff1a; 求100∼999中的水仙花数。若三位数ABCA^3B^3C^3&#xff0c;则称ABC为水仙花数。例如153&#xff0c;135333112527153&…...

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…...