Unity汉化一个插件 制作插件汉化工具

news2024/11/26 16:28:21
我是编程一个菜鸟,英语又不好,有的插件非常牛!我想学一学,页面全是英文,完全不知所措,我该怎么办啊...

尝试在Unity中汉化一个插件

效果:

请添加图片描述

思路:

如何在Unity中把一个自己喜欢的插件变成中文?

在Unity中编写插件一般会用到编辑器扩展
在编辑器扩展中想在Inspector显示自己想要的属性名或者别的什么,就需要用到编辑器扩展的API
把这些固定的API存到一个字典里,例如“EditorGUILayout.PropertyField”,“LabelField”...

我可以尝试先读取我们想要汉化插件的Editor文件夹下的每一个代码的每一行
把每一行的每个字符与字典做一个对比
对比成功就说明此行代码可以被汉化,收集可以被汉化的代码行,然后把可以被汉化的代码行替换成我们想要的代码
替换成功后保存代码

听起来好像没啥问题,试试看
  • 创建一个存储字典的代码
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu()]
public class SearchCharacterData : ScriptableObject
{
    [Header("检索字符对")]
    public List<Item> items;
    [Header("添加字符对")]
    public bool addItem = false;
    private void OnValidate()
    {
        if (addItem)
        {
            addItem = false;
            items.Add(new Item());
        }
    }
    /// <summary>
    /// 物品数据
    /// </summary>
    [System.Serializable]
    public class Item
    {
        public string startStr;
        public string endStr;
    }
}

  • 完成之后我们就可以在项目中创建一个自定义字典了
    在这里插入图片描述

  • 在字典中添加几对常用AIP用来测试
    在这里插入图片描述

  • 创建一个编辑器窗口代码

using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

[System.Serializable]
public class Editor_ChinesizationTool : EditorWindow
{
    private static Editor_ChinesizationTool _window;
    [MenuItem("Tools/汉化编辑器")]
    public static void GUIDRefReplaceWin()
    {
        Rect wr = new Rect(0, 0, 300, 1000);//窗口大小
        _window = (Editor_ChinesizationTool)GetWindow(typeof(Editor_ChinesizationTool), true, "汉化编辑");// false 表示不能停靠的
        _window.Show();

    }
}
没想到要去翻译一个插件,竟然要自己先写一个...造孽啊~
  • 读文件
	 	/// <summary>
        /// 读取数据
        /// </summary>
        /// <returns></returns>
        public List<string> ReadFileInfo(bool IsUpdateNewData = true)
        {
            Datas.Clear();
            CurrentDatas.Clear();
            CurrentSplitDatas.Clear();
            if (IsUpdateNewData) NewSplitDatas.Clear();
            StreamReader sr = null;//读取
            string assetsName = FileInfo.FullName;
            sr = File.OpenText(assetsName.Substring(assetsName.IndexOf("Assets")));//读取文件
            //读取所有行
            int line = 0;
            string data = null;
            do
            {
                data = sr.ReadLine();
                if (data != null)
                {
                    Datas.Add(data);
                    CurrentDatas.Add(data);
                    foreach (var item in searchCharacterData.items)
                    {
                        string csData = FindString(data, item.startStr, item.endStr);
                        if (csData != "")
                        {
                            CurrentSplitDatas.Add(new NewCSData(line, csData));
                            if (IsUpdateNewData) NewSplitDatas.Add(new NewCSData(line, csData));
                            break;
                        }
                    }
                }
                line++;
            } while (data != null);
            sr.Close();//关闭流
            sr.Dispose();//销毁流
            return CurrentDatas;
        }
  • 将改好的数据进行写入
		void WriteFileInfo(List<string> datas)
        {
            StreamWriter sw;//写入
            if (!FileInfo.Exists)
            {
                Debug.LogError("无法写入,没有该文件");
                return;
            }
            ClearData(path);
            sw = FileInfo.AppendText();//打开文件
            foreach (string linedata in datas)
            {
                sw.WriteLine(linedata);
            }
            sw.Flush();//清除缓冲区
            sw.Close();//关闭流
            sw.Dispose();//销毁流
            //ReadFileInfo();
        }
  • 稍稍修正一下编辑器页面,随便导入一个插件试试看
    在这里插入图片描述

源码

注意!此文件需要放在Editor文件夹下才可以正常使用
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

[System.Serializable]
public class Editor_ChinesizationTool : EditorWindow
{
    private static Editor_ChinesizationTool _window;
    public string modelPath = "Assets";
    public List<CSData> cslist = new List<CSData>();
    public static Rect modelRect;
    int maxLineCount = 5;
    Vector2 csDataPos, contentPos;
    SearchCharacterData searchCharacterData = null;
    CSData CurrentCSData = null;
    [MenuItem("Tools/汉化编辑器")]
    public static void GUIDRefReplaceWin()
    {
        Rect wr = new Rect(0, 0, 300, 1000);//窗口大小
        _window = (Editor_ChinesizationTool)GetWindow(typeof(Editor_ChinesizationTool), true, "汉化编辑");// false 表示不能停靠的
        _window.Show();

    }

    private Material m_material;//1
    private void OnEnable()
    {
        m_material = new Material(Shader.Find("Hidden/Internal-Colored"));//2
        m_material.hideFlags = HideFlags.HideAndDontSave;//3
    }
    void OnGUI()
    {
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("将文件夹拖拽到此处");
        EditorGUILayout.Space();
        GUI.SetNextControlName("input1");//设置下一个控件的名字
        modelRect = EditorGUILayout.GetControlRect();
        modelPath = EditorGUI.TextField(modelRect, modelPath);
        EditorGUILayout.Space();
        DragFolder();

        EditorGUILayout.Space();
        searchCharacterData = EditorGUILayout.ObjectField("", searchCharacterData, typeof(SearchCharacterData), true) as SearchCharacterData;
        // 导出材质
        if (searchCharacterData == null)
        {
            GUILayout.Label("请添加字典");
            return;
        }
        if (GUILayout.Button("读取文件"))
        {
            ReadFile();
            CurrentCSData = null;
        }
        if (CurrentCSData == null)
        {
            int currentLineCount = 1;
            csDataPos = EditorGUILayout.BeginScrollView(csDataPos, GUILayout.Width(1000), GUILayout.Height(500));
            bool isLineEnd = true;
            maxLineCount = EditorGUILayout.IntField("每行显示脚本的个数", maxLineCount);

            foreach (CSData csdate in cslist)
            {
                if (currentLineCount == 1)
                {
                    GUILayout.BeginHorizontal();
                    isLineEnd = false;
                }
                if (GUILayout.Button(csdate.name))
                {
                    CurrentCSData = csdate;
                }
                if (currentLineCount == maxLineCount)
                {
                    GUILayout.EndHorizontal();
                    currentLineCount = 0;
                    isLineEnd = true;
                }
                currentLineCount++;
            }
            if (isLineEnd == false)
            {
                GUILayout.EndHorizontal();
            }
            GUILayout.EndScrollView();
        }
        if (CurrentCSData != null)
        {
            EditorGUILayout.BeginVertical("HelpBox");
            GUILayout.BeginHorizontal();
            csDataPos = EditorGUILayout.BeginScrollView(csDataPos, GUILayout.Width(500), GUILayout.Height(700));
            #region 显示代码
            int line = 1;
            lineLocations.Clear();
            foreach (var date in CurrentCSData.CurrentDatas)
            {
                GUILayout.Label(line + "  " + date);
                foreach (var item in CurrentCSData.CurrentSplitDatas)
                {
                    if (line == item.line)
                    {
                        LineLocation lineLocation = new LineLocation();
                        Rect rect = GUILayoutUtility.GetLastRect();
                        lineLocation.FirstRect = new Vector2(rect.x, rect.y - csDataPos.y);
                        lineLocation.FirstRectOffset = csDataPos;
                        lineLocations.Add(lineLocation);
                    }
                }
                line++;
            }
            GUILayout.EndScrollView();
            GUILayout.Space(100);
            #endregion
            contentPos = EditorGUILayout.BeginScrollView(contentPos, GUILayout.Width(700), GUILayout.Height(700));

            for (int i = 0; i < CurrentCSData.CurrentSplitDatas.Count; i++)
            {
                //GUILayout.BeginHorizontal();
                GUILayout.Label(CurrentCSData.CurrentSplitDatas[i].line + 1 + "  " + CurrentCSData.CurrentDatas[CurrentCSData.CurrentSplitDatas[i].line]);//找到可更换数据
                lineLocations[i].FirstRect.y += contentPos.y;
                lineLocations[i].LastRectOffset = contentPos;
                Rect rect = GUILayoutUtility.GetLastRect();
                lineLocations[i].LastRect = new Vector2(rect.x, rect.y);
                CurrentCSData.NewSplitDatas[i].data = EditorGUILayout.TextField(CurrentCSData.NewSplitDatas[i].data);

                //GUILayout.EndHorizontal();
            }
            foreach (var item in lineLocations)
            {
                m_material.SetPass(0);//4
                GL.Begin(GL.LINES);
                GL.Color(Color.red);
                GL.Vertex3(item.FirstRect.x - 100+10, LimitMax(item.FirstRect.y + 30,690+ item.LastRectOffset.y, item.LastRectOffset.y), 0);
                GL.Vertex3(item.FirstRect.x - 105+10, LimitMax(item.FirstRect.y + 30, 690+ item.LastRectOffset.y, item.LastRectOffset.y), 0);
                GL.End();

                GL.Begin(GL.LINES);
                GL.Color(Color.black);
                GL.Vertex3(item.FirstRect.x - 100+10, LimitMax(item.FirstRect.y + 30,690 + item.LastRectOffset.y, item.LastRectOffset.y), 0);
                //================================================================================================
                GL.Vertex3(item.LastRect.x-10, LimitMax(item.LastRect.y + 10, 690 + item.LastRectOffset.y, item.LastRectOffset.y), 0); 
                GL.End();

                GL.Begin(GL.LINES);
                GL.Color(Color.red);
                GL.Vertex3(item.LastRect.x-10, LimitMax(item.LastRect.y + 10, 690 + item.LastRectOffset.y, item.LastRectOffset.y), 0);
                GL.Vertex3(item.LastRect.x-5, LimitMax(item.LastRect.y + 10, 690 + item.LastRectOffset.y, item.LastRectOffset.y), 0);
                GL.End();
                //Debug.Log("FirstRect:" + item.FirstRect+"__"+ "LastRect:"+ item.LastRect);
                //break;
            }


            GUILayout.EndScrollView();

            GUILayout.EndHorizontal();
            GUILayout.BeginHorizontal();
            if (GUILayout.Button("确认更改"))
            {
                CurrentCSData.ReadFileInfo(false);
                for (int i = 0; i < CurrentCSData.CurrentSplitDatas.Count; i++)
                {
                    CurrentCSData.CurrentDatas[CurrentCSData.CurrentSplitDatas[i].line] =
                    ReplaceStr(CurrentCSData.CurrentDatas[CurrentCSData.CurrentSplitDatas[i].line],
                        CurrentCSData.CurrentSplitDatas[i].data,
                        CurrentCSData.NewSplitDatas[i].data);
                }
                for (int i = 0; i < CurrentCSData.Datas.Count; i++)
                {
                    CurrentCSData.Datas[i] = CurrentCSData.CurrentDatas[i];
                }
                CurrentCSData.WriterData();
                AssetDatabase.Refresh();
            }
            if (GUILayout.Button("重新选择文件"))
            {
                CurrentCSData = null;
            }
            GUILayout.EndHorizontal();
            GUILayout.EndVertical();
        }

        EditorGUILayout.Space();

    }
    List<LineLocation> lineLocations = new List<LineLocation>();
    public class LineLocation
    {
        public Vector2 FirstRectOffset;
        public Vector2 FirstRect;
        public Vector2 LastRectOffset;
        public Vector2 LastRect;
    }
    public void ReadFile()
    {
        GetAllFilesAndDertorys(modelPath, searchCharacterData);
    }
    /// <summary>
    /// 获得拖拽文件
    /// </summary>
    void DragFolder()
    {
        //鼠标位于当前窗口
        if (mouseOverWindow == this)
        {
            //拖入窗口未松开鼠标
            if (Event.current.type == EventType.DragUpdated)
            {
                DragAndDrop.visualMode = DragAndDropVisualMode.Generic;//改变鼠标外观
                                                                       // 判断区域
                if (modelRect.Contains(Event.current.mousePosition))
                    GUI.FocusControl("input1");
            }
            //拖入窗口并松开鼠标
            else if (Event.current.type == EventType.DragExited)
            {
                string dragPath = string.Join("", DragAndDrop.paths);
                // 判断区域
                if (modelRect.Contains(Event.current.mousePosition))
                    modelPath = dragPath;

                // 取消焦点(不然GUI不会刷新)
                GUI.FocusControl(null);
            }
        }
    }
    static string FindString(string str, string StartStr, string EndStr)
    {
        if (str.Length < 3)
            return "";
        int index3 = str.IndexOf(StartStr);
        if (index3 != -1)
        {
            int index4 = str.IndexOf(EndStr, index3);
            if (index4 != -1)
            {
                return str.Substring(index3 + StartStr.Length, index4 - index3 - StartStr.Length);
            }
        }
        return "";
    }
    void GetAllFilesAndDertorys(string _path, SearchCharacterData searchCharacterData)
    {
        //判断路径是否存在
        if (Directory.Exists(_path))
        {
            #region 找到Editor文件夹
            DirectoryInfo dir = new DirectoryInfo(_path);
            DirectoryInfo[] allDirs = dir.GetDirectories("*", SearchOption.AllDirectories);
            string EditorPath = "";
            foreach (var item in allDirs)
            {
                //忽略.meta
                if (item.Name.EndsWith(".meta")) continue;
                string assetsName = item.FullName;
                assetsName = assetsName.Substring(assetsName.IndexOf("Assets"));
                if (item.Name == "Editor")
                {
                    EditorPath = assetsName;
                    break;
                }
            }
            #endregion

            if (EditorPath != "")
            {
                #region 得到Editor文件夹下所有的.cs文件
                DirectoryInfo editorDir = new DirectoryInfo(EditorPath);
                cslist.Clear();
                int ListIndex = 0;
                foreach (var item in editorDir.GetFiles("*", SearchOption.AllDirectories))
                {
                    //忽略.meta
                    string assetsName = item.FullName;
                    assetsName = assetsName.Substring(assetsName.IndexOf("Assets"));
                    if (item.Name.EndsWith(".meta")) continue;
                    if (item.Name.EndsWith(".cs"))
                    {
                        cslist.Add(new CSData(ListIndex, item, assetsName, searchCharacterData, this));
                    }
                    ListIndex++;
                }
                #endregion
                foreach (var item in cslist)
                {
                    item.ReadFileInfo();
                }
            }
            else
            {
                Debug.LogError("该目录没有Editor文件夹");
            }
        }
    }
    string ReplaceStr(string str, string oldStr, string newStr)
    {
        if (str.Length < 3)
            return "";
        int strIndex = str.IndexOf(oldStr);
        if (strIndex != -1)
        {
            string startStr = str.Substring(0, strIndex);
            string endStr = str.Substring(strIndex + oldStr.Length);
            return startStr + newStr + endStr;
        }
        return "";
    }
    public float LimitMax(float f, float maxValue = 690, float minValue = 0)
    {
        //return f;
        return Math.Min(maxValue, Math.Max(f, minValue));
    }
    [System.Serializable]
    public class CSData
    {
        Editor_ChinesizationTool editor_ChinesizationTool = null;
        SearchCharacterData searchCharacterData = null;
        public string name;
        private FileInfo fileInfo;
        public int ListIndex = -1;
        public string path;
        /// <summary>
        /// 原始数据
        /// </summary>
        public List<string> Datas = new List<string>();
        /// <summary>
        /// 当前数据
        /// </summary>
        public List<string> CurrentDatas = new List<string>();
        /// <summary>
        /// 新数据
        /// </summary>
        public List<NewCSData> CurrentSplitDatas = new List<NewCSData>();
        public List<NewCSData> NewSplitDatas = new List<NewCSData>();

        public FileInfo FileInfo
        {
            get
            {
                if (fileInfo == null)
                {
                    editor_ChinesizationTool.ReadFile();
                    fileInfo = editor_ChinesizationTool.cslist[ListIndex].FileInfo;
                }
                return fileInfo;
            }
            set => fileInfo = value;
        }

        public CSData(int mListIndex, FileInfo mfileInfo, string path, SearchCharacterData searchCharacterData, Editor_ChinesizationTool parent)
        {
            FileInfo = mfileInfo;
            this.path = path;
            this.name = FileInfo.Name;
            this.searchCharacterData = searchCharacterData;
            this.ListIndex = mListIndex;
            this.editor_ChinesizationTool = parent;
        }
        /// <summary>
        /// 写入数据
        /// </summary>
        public void WriterData()
        {
            WriteFileInfo(Datas);
        }
        /// <summary>
        /// 读取数据
        /// </summary>
        /// <returns></returns>
        public List<string> ReadFileInfo(bool IsUpdateNewData = true)
        {
            Datas.Clear();
            CurrentDatas.Clear();
            CurrentSplitDatas.Clear();
            if (IsUpdateNewData) NewSplitDatas.Clear();
            StreamReader sr = null;//读取
            string assetsName = FileInfo.FullName;
            sr = File.OpenText(assetsName.Substring(assetsName.IndexOf("Assets")));//读取文件
            //读取所有行
            int line = 0;
            string data = null;
            do
            {
                data = sr.ReadLine();
                if (data != null)
                {
                    Datas.Add(data);
                    CurrentDatas.Add(data);
                    foreach (var item in searchCharacterData.items)
                    {
                        string csData = FindString(data, item.startStr, item.endStr);
                        if (csData != "")
                        {
                            CurrentSplitDatas.Add(new NewCSData(line, csData));
                            if (IsUpdateNewData) NewSplitDatas.Add(new NewCSData(line, csData));
                            break;
                        }
                    }
                }
                line++;
            } while (data != null);
            sr.Close();//关闭流
            sr.Dispose();//销毁流
            return CurrentDatas;
        }
        void WriteFileInfo(List<string> datas)
        {
            StreamWriter sw;//写入
            if (!FileInfo.Exists)
            {
                Debug.LogError("无法写入,没有该文件");
                return;
            }
            ClearData(path);
            sw = FileInfo.AppendText();//打开文件
            foreach (string linedata in datas)
            {
                sw.WriteLine(linedata);
            }
            sw.Flush();//清除缓冲区
            sw.Close();//关闭流
            sw.Dispose();//销毁流
            //ReadFileInfo();
        }
        void ClearData(string path)
        {
            StreamWriter tmpWrite = new StreamWriter(path);
            tmpWrite.Write("");
            tmpWrite.Close();
        }
    }
    [System.Serializable]
    public class NewCSData
    {
        public int line = 0;
        public string data = "";

        public NewCSData(int line, string data)
        {
            this.line = line;
            this.data = data;
        }
    }
}

最后的最后:

我自己反正没实践过,可以先拿这个玩玩看还是挺有意思的~
觉得有意思可以改巴改巴,也可以把建议放在评论区,有空我就更新一下~
Demo源码

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

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

相关文章

Flutter 最优秀动画库「完全商业化」,Rive 2 你全面了解过吗?

说到 rive &#xff0c;非 Flutter 开发者可能会感觉比较陌生&#xff0c;而做过 Flutter 开发的可能对 rive 会有所耳闻&#xff0c;因为 rive 在一开始叫 flare &#xff0c;是 2dimensions 公司的开源动画产品&#xff0c;在发布之初由于和 Flutter 团队有深入合作&#xff…

golang获取prometheus数据(prometheus/client_golang包)

文章目录 1. 创建链接1.1 语法1.2 完整示例 2. 简单查询2.1 语法2.2 完整示例 3. 范围值查询3.1 语法3.2 完整示例 【附官方示例】 1. 创建链接 1.1 语法 语法 func NewClient(cfg Config) (Client, error)结构体 type Config struct {Address stringClient *ht…

16-数据结构-图的存储结构

简介&#xff1a;主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码&#xff0c;邻接矩阵又分为有权图和无权图&#xff0c;区别就是有数据的地方填权值&#xff0c;无数据的地方可以填0或者∞&#xff0c;而有权图和无权图&#xff0c;又细分为有向图和无向…

阿里云服务器退款政策及退款流程解析

阿里云服务器如何退款&#xff1f;云服务器在哪申请退款&#xff1f;在用户中心订单管理中的退订管理中退款&#xff0c;阿里云百科分享阿里云服务器退款流程&#xff0c;包括申请退款入口、云服务器退款限制条件、退款多久到账等详细说明&#xff1a; 目录 阿里云服务器退款…

FPGA GTH 全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTH 全网最细解读GTH 基本结构GTH 发送和接收处理流程GTH 的参考时钟GTH 发送接口GTH 接收接口GTH IP核调用和使用 4、设计思路框架视频源选择silicon9011解码芯片配置及采集动态彩条视频数据组包GTH aurora 8b/10…

【Java 基础篇】深入理解 Java 内部类:嵌套在嵌套中的编程奇妙世界

在 Java 编程中&#xff0c;内部类&#xff08;Inner Class&#xff09;是一个非常强大且灵活的概念&#xff0c;它允许在一个类的内部定义另一个类。内部类可以访问外部类的成员&#xff0c;包括私有成员&#xff0c;这使得内部类在许多编程场景中都非常有用。本篇博客将详细介…

js如何实现数组去重的常用方法

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Set&#xff08;ES6&#xff09;⭐ 使用 filter 和 indexOf⭐ 使用 reduce⭐ 使用对象属性⭐ 使用 includes 方法&#xff08;ES6&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方…

$ref属性的介绍与使用

在Vue.js中&#xff0c;$ref是一个特殊的属性&#xff0c;用于访问Vue组件中的DOM元素或子组件实例。它允许你直接访问组件内部的DOM元素或子组件&#xff0c;并且可以在需要时进行操作或修改。以下是有关$ref的详细介绍和示例演示&#xff0c;给大家做一个简单的介绍和概念区分…

库中是如何实现string类的?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

如何查看B站UP主数据?如何看懂B站数据?

bilibili是独特且稀缺的PUGC视频社区&#xff0c;拥有浓厚社区氛围的视频社区。有别于短视频&#xff0c;PUGC视频创作门槛高&#xff0c;视频内容更充实&#xff0c;bilibili是PUGC视频行业的领跑者&#xff0c;同时&#xff0c;bilibili拥有社区产品特有的高创作渗透率和高互…

SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server&#xff0c;Redis &#xff0c;Oracle ,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加微信号 l…

分类任务评价指标

分类任务评价指标 分类任务中&#xff0c;有以下几个常用指标&#xff1a; 混淆矩阵准确率&#xff08;Accuracy&#xff09;精确率&#xff08;查准率&#xff0c;Precision&#xff09;召回率&#xff08;查全率&#xff0c;Recall&#xff09;F-scorePR曲线ROC曲线 1. 混…

配置Jenkins

主要是配置Jenkins和jdk,maven的插件

Spring Cloud Alibaba Nacos配置导入问题解决方案

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

论文复现--lightweight-human-pose-estimation-3d-demo.pytorch(单视角多人3D实时动作捕捉DEMO)

分类&#xff1a;动作捕捉 github地址&#xff1a;https://github.com/Daniil-Osokin/lightweight-human-pose-estimation-3d-demo.pytorch 所需环境&#xff1a; Windows10&#xff0c;conda 4.13.0&#xff1b; 目录 conda环境配置安装Pytorch全家桶安装TensorRT&#xff08;…

[数据集][目标检测]裸土识别裸土未覆盖目标检测数据集VOC格式857张2类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;857 标注数量(xml文件个数)&#xff1a;857 标注类别数&#xff1a;2 标注类别名称:["luotu","n…

Python网络爬虫中这七个li标签下面的属性值,不是固定的,怎样才能拿到他们的值呢?...

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 愚以为宫中之事&#xff0c;事无大小&#xff0c;悉以咨之&#xff0c;然后施行&#xff0c;必能裨补阙漏&#xff0c;有所广益。 大家好&#xff0c;我…

Java8实战-总结21

Java8实战-总结21 使用流归约元素求和无初始值 最大值和最小值 使用流 归约 到目前为止&#xff0c;见到过的终端操作都是返回一个boolean(allMatch之类的)、void(forEach)或optional对象(findAny等)。也见过了使用collect来将流中的所有元素组合成一个List。 如何把一个流中…

r7 7840u和r7 7840hs差距 锐龙r77840u和r77840hs对比

锐龙7 7840U 采用Zen3架构、8核心16线程&#xff0c;基准频率疑似3.3GHz&#xff0c;同样集成RDNA3架构核显Radeon 780M&#xff0c;也是12个CU单元 r7 7840U 的处理器在 Cinebench R23 中多核跑分 14825 分 选r7 7840u还是 R7 7840HS这些点很重要 http://www.adiannao.cn/dy …

小红书笔记爬虫

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…