在Scene里面绘制编辑工具
功能要求
- 策划要在scene模式下编辑棋子摆放。
- 用handle.GUI绘制来解决了。
问题
- 在scene模式下编辑产生的数据,进入游戏模式后就全不见了。
- 改为executeAlways也没用。
- 我的解决办法是把编辑数据序列化保存到本地。
- 在OnEnable的时候再读取。
- 但是我忽然想到,直接把这些数据暴露在Inspector面板上,让unity帮我来序列化不就好了。这样就实现scene和play的数据通用,不会丢失数据了。
- 第二个事情
- 就是Scene模式下进行位置判断也很麻烦。因为他没有play模式下的那个相机。
- 所以我这边是用射线检测来做的。
- 第三个事情
- 按键检测也很麻烦。和play模式下不一样
- 第四事情
- 按键必须要在合适的时机进行Use,不然事件会传递给unity的工具本身。
- 下面是所有代码
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEditor.Rendering;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Pool;
using static PieceEditor;
using static UnityEngine.GridBrushBase;//[Serializable]
//class EditContext
//{
// public int currLayMode;
// public int currSelectRank;
// public Vector2 scrollPos;
// public string levelName;
// public int mode;
// public bool isNewFile;
// public List<string> dataNames = new List<string>();
// public List<string> levelTools = new List<string>();
//}
[ExecuteInEditMode]
public class SpecialLevelEditor : MonoBehaviour
{public List<Color> pieceColor;public SpriteRenderer SpriteRenderer;public Piece LayItemPrefab;public Transform PoolObj;Dictionary<Vector2Int, Piece> allPieces = new Dictionary<Vector2Int, Piece>();int currWidth => currLevelData.currWidth;int currHeight => currLevelData.currHeight;#region Property[HideInInspector] public int currLayMode;// { get { return editContext.currLayMode; } set { editContext.currLayMode = value; } }[HideInInspector] public int currSelectRank;// { get { return editContext.currSelectRank; } set { editContext.currSelectRank = value; } }[HideInInspector] public int mode;//{ get { return editContext.mode; } set { editContext.mode = value; } }[HideInInspector] public Vector2 scrollPos;// { get { return editContext.scrollPos; } set { editContext.scrollPos = value; } }[HideInInspector] public string levelName;// { get { return editContext.levelName; } set { editContext.levelName = value; } }[HideInInspector] public bool isNewFile;//{ get { return editContext.isNewFile; } set { editContext.isNewFile = value; } }#endregion[HideInInspector] public SpecialLevelData currLevelData;GUILayoutOption widthSetting => GUILayout.Width(120);GUILayoutOption heightSetting => GUILayout.Height(30);//Dictionary<string, path> allData = new Dictionary<string, SpecialLevelData>();List<string> dataNames = new List<string>();//=> editContext.dataNames;List<string> levelTools = new List<string>();//=> editContext.levelTools;private void Start(){}private void OnDestroy(){}// EditContext editContext;private void OnEnable(){SpriteRenderer.enabled = !Application.isPlaying;allPieces.Clear();if (currLevelData != null){var allData = currLevelData.GetComponentsInChildren<Piece>();foreach (var item in allData){allPieces.Add(item.PieceData.LayPos, item);}}dataNames.Clear();levelTools.Clear();ReadAllData(dataNames, "Assets/Resources/ShowLevels");ReadAllData(levelTools, "Assets/Resources/LevelTool");Debug.Log("编辑器启用");SceneView.duringSceneGui += DrawSceneGUI;pool = new ObjectPool<Piece>(CreateFunc, OnGet, OnRelease);}private void OnDisable(){// 移除每帧更新的回调SceneView.duringSceneGui -= DrawSceneGUI;//if(editContext != null)//{// string projectPath = Application.dataPath;// string filePath = Path.Combine(projectPath, "TempEditData.txt");// File.WriteAllText(filePath, JsonUtility.ToJson(editContext));// editContext = null;//}Debug.Log("禁用编辑器");}string GetPath(string prefabName){return $"Assets/Resources/ShowLevels/{prefabName}.prefab";}string GetToolPath(string prefabName){return $"Assets/Resources/LevelTool/{prefabName}.prefab";}void ReadAllData(List<string> container, string folder){// 目标文件夹路径string folderPath = folder;// 获取文件夹中的所有资源的 GUID(包括子文件夹)string[] guids = AssetDatabase.FindAssets("", new[] { folderPath });// 遍历 GUID,并打印出文件路径和文件名foreach (string guid in guids){// 将 GUID 转换为资源路径string path = AssetDatabase.GUIDToAssetPath(guid);// 获取文件名(通过路径)string fileName = System.IO.Path.GetFileNameWithoutExtension(path);container.Add(fileName);}}void SetColliderSize(){SpriteRenderer.GetComponent<BoxCollider>().size = new Vector3(currWidth, currHeight, 1);}private void DrawSceneGUI(SceneView sceneView){ 通过 Handles 绘制一个按钮Handles.BeginGUI();GUILayout.BeginVertical();DrawFile();DrawLevelData(sceneView);GUILayout.EndVertical();DrawRightBottom(sceneView);DrawRightUp(sceneView);if (mode == 1){Selection.activeObject = null;}Handles.EndGUI();}void DrawLine(){GUI.color = Color.red;GUILayout.Button("", GUILayout.Width(125), GUILayout.Height(5));GUI.color = Color.white;}void InstBorder(int index, Vector3 pos, Vector3 scale){GameObject obj = null;BoxCollider collider = null;if (currLevelData.BoxColliders == null || currLevelData.BoxColliders.Count < index + 1){obj = new GameObject();collider = obj.AddComponent<BoxCollider>();currLevelData.BoxColliders.Add(collider);}else{collider = currLevelData.BoxColliders[index];obj = collider.gameObject;}if (index == 2 || index == 3){obj.tag = UIManager.Ground;}obj.transform.position = pos;obj.transform.localScale = scale;obj.transform.SetParent(currLevelData.transform);}void AddBorder(){InstBorder(0, new Vector3(currWidth / 2f, 0, 0), new Vector3(0.1f, currHeight, 1));InstBorder(1, new Vector3(-currWidth / 2f, 0, 0), new Vector3(0.1f, currHeight, 1));//InstBorder(2, new Vector3(0, currHeight / 2f, 0), new Vector3(currWidth, 0.1f, 1));InstBorder(2, new Vector3(0, -currHeight / 2f, 0), new Vector3(currWidth, 0.1f, 1));}void Save(){if (currLevelData != null){AddBorder();using (ListPool<Vector2Int>.Get(out var keys)){keys.AddRange(allPieces.Keys);foreach (var item in keys){if (allPieces[item] == null){Debug.Log("检测到丢失");allPieces.Remove(item);}}}currLevelData.Pieces.Clear();foreach (var item in allPieces){currLevelData.Pieces.Add(item.Value.PieceData);}ResetPiece();// 将修改应用到预制体(保存实例修改)if (isNewFile){dataNames.Add(levelName);PrefabUtility.SaveAsPrefabAsset(currLevelData.gameObject, GetPath(levelName));}else{PrefabUtility.ApplyPrefabInstance(currLevelData.gameObject, InteractionMode.UserAction);}ClearObj();}}void ClearObj(){//ResetPiece();DestroyImmediate(currLevelData.gameObject);currLevelData = null;levelName = null;allPieces.Clear();}void DrawLevelData(SceneView sceneView){if (currLevelData != null){GUILayout.BeginHorizontal(widthSetting, heightSetting);GUILayout.Button("宽");var val = EditorGUILayout.IntField(currWidth);if (currLevelData.currWidth != val){currLevelData.currWidth = val;ResetPiece();}GUILayout.EndHorizontal();GUILayout.BeginHorizontal(widthSetting, heightSetting);GUILayout.Button("高");var hVal = EditorGUILayout.IntField(currHeight);if (currLevelData.currHeight != hVal){currLevelData.currHeight = hVal;ResetPiece();}GUILayout.EndHorizontal();SetColliderSize();SpriteRenderer.size = new Vector2(currWidth, currHeight);HandleClick(sceneView);foreach (var item in levelTools){if (GUILayout.Button(item, widthSetting, heightSetting)){var obj = PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(GetToolPath(item))) as GameObject;obj.transform.parent = currLevelData.transform;obj.transform.position = Vector3.zero;Selection.activeGameObject = obj;mode = 0;}}}}public void ResetPiece(){foreach (var item in allPieces){pool.Release(item.Value);}allPieces.Clear();}void DrawFile(){scrollPos = GUILayout.BeginScrollView(scrollPos, widthSetting, GUILayout.Height(200));for (int i = dataNames.Count - 1; i >= 0; i--){var item = dataNames[i];GUILayout.BeginHorizontal();if (currLevelData != null && currLevelData.name == item){GUI.backgroundColor = Color.green;}if (GUILayout.Button(item)){if (currLevelData != null){if (item == currLevelData.name){return;}else{ClearObj();}}levelName = item;isNewFile = false;// 加载预制体并实例化var obj = PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(GetPath(item))) as GameObject;currLevelData = obj.GetComponent<SpecialLevelData>();var childs = currLevelData.Pieces;foreach (var child in childs){InnerLay(child);}}GUI.backgroundColor = Color.white;if (GUILayout.Button("删除")){// 检查文件是否存在// 删除预制体文件if (item == levelName){ClearObj();}bool success = AssetDatabase.DeleteAsset(GetPath(item));if (success){Debug.Log($"Prefab at {item} deleted successfully.");dataNames.Remove(item);}else{Debug.LogError($"Failed to delete prefab at {item}.");}}GUILayout.EndHorizontal();}GUILayout.EndScrollView();levelName = GUILayout.TextField(levelName, widthSetting, heightSetting);GUILayout.BeginHorizontal(widthSetting, heightSetting);if (GUILayout.Button("新建文件")){if (string.IsNullOrEmpty(levelName)) return;Save();var obj = new GameObject();currLevelData = obj.AddComponent<SpecialLevelData>();obj.name = levelName;isNewFile = true;// var prefabPath = GetPath(levelName);//#if UNITY_EDITOR// //#endif}if (GUILayout.Button("保存文件")){Save();}GUILayout.EndHorizontal();}void DrawRightUp(SceneView sceneView){// 动态计算右上角的位置Vector2 windowSize = new Vector2(sceneView.position.width, sceneView.position.height);Vector2 padding = new Vector2(10, 10); // 边距Vector2 size = new Vector2(150, 40 * 9); // UI 的宽高Rect rect = new Rect(windowSize.x - size.x - padding.x, // X 坐标:窗口宽度 - UI 宽度 - 边距padding.y, // Y 坐标:直接使用顶部边距size.x,size.y);// 绘制背景框GUI.Box(rect, GUIContent.none);// 使用 GUILayout 自动布局内部内容GUILayout.BeginArea(rect);GUILayout.Label("数字棋子", EditorStyles.boldLabel);currSelectRank = GUILayout.SelectionGrid(currSelectRank, new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, 1, GUILayout.Width(120));GUILayout.Space(20);currLayMode = GUILayout.SelectionGrid(currLayMode, new string[] { "正常棋子", "墙壁", "冰封", }, 1, GUILayout.Width(120));GUILayout.EndArea();}public void DestroyItem(Vector2Int pos){// lineRenderer.gameObject.SetActive(false);//那就进行一个移除var curSlot = allPieces[pos];allPieces.Remove(pos);pool.Release(curSlot);}void InnerLay(PieceData data){var normalize = data.LayPos;if (allPieces.ContainsKey(normalize)){//那就进行一个移除var curSlot = allPieces[normalize];allPieces.Remove(normalize);pool.Release(curSlot);}var obj = pool.Get();obj.transform.SetParent(currLevelData.transform);obj.transform.position = TransferCenterPos(data.LayPos);obj.SetRankEditor(data);allPieces.Add(data.LayPos, obj);}public void SpecialLay(PieceData data){switch ((LayMode)currLayMode){case LayMode.NormalPiece:if (currSelectRank == null) return;data.PieceType = PieceType.Piece;InnerLay(data);break;case LayMode.Wall:data.PieceType = PieceType.Wall;InnerLay(data);break;case LayMode.Ice://如果是冰就要先判断是否存在棋子,如果有棋子就赋予其状态。if (allPieces.ContainsKey(data.LayPos)){var piece = allPieces[data.LayPos];if (piece.PieceData.PieceType != PieceType.Wall){allPieces[data.LayPos].SetIceState();}}break;default:break;}}#region 对象池ObjectPool<Piece> pool;Piece CreateFunc(){var obj = GameObject.Instantiate<Piece>(LayItemPrefab, PoolObj);return obj;}void OnRelease(Piece obj){obj.transform.parent = PoolObj;obj.gameObject.SetActive(false);}void OnGet(Piece obj){obj.gameObject.SetActive(true);}#endregionpublic bool Transfer(Vector2 clickPos, out Vector2Int normalize){normalize = Vector2Int.zero;var originPosX = -(float)currWidth / 2;var originPosY = -(float)currHeight / 2;var localPos = SpriteRenderer.transform.InverseTransformPoint(clickPos);var offsetX = localPos.x - originPosX;var offsetY = localPos.y - originPosY;//获得相对于左下角的坐标之后再来进行判断var cellX = Mathf.FloorToInt(offsetX);var cellY = Mathf.FloorToInt(offsetY);var realX = cellX + 0.5f;var realY = cellY + 0.5f;if (cellX >= currWidth || cellX < 0) { return false; }if (cellY >= currHeight || cellY < 0) { return false; }normalize = new Vector2Int(cellX, cellY);return true;}public Vector3 TransferCenterPos(Vector2Int centerPos){var originPosX = -(float)currWidth / 2;var originPosY = -(float)currHeight / 2;var realX = centerPos.x + 0.5f;var realY = centerPos.y + 0.5f;// Debug.Log($"{realX}_{realY}");var temp = new Vector2(realX + originPosX, realY + originPosY);//判断完成之后再转回世界坐标var pos = SpriteRenderer.transform.TransformPoint(temp);return pos;}void DrawRightBottom(SceneView sceneView){// 计算 UI 的位置(右下角)int width = 120; // UI 宽度int height = 180; // UI 高度int padding = 20; // 边距Rect rect = new Rect(sceneView.position.width - width - padding,sceneView.position.height - height - padding,width,height);// 绘制背景框GUI.Box(rect, GUIContent.none);// 绘制内容GUILayout.BeginArea(rect);GUILayout.Label("模式转换", EditorStyles.boldLabel);var val = GUILayout.SelectionGrid(mode, new string[] { "自由模式", "棋子模式", }, 1, widthSetting, GUILayout.Height(60));mode = val;if (GUILayout.Button("清空棋盘")){ClearObj();}// DrawSpecialTool();GUILayout.EndArea();}private void HandleClick(SceneView sceneView){if (mode != 1) return;Event e = Event.current;if (e.type == EventType.MouseDown && e.button == 0) // 左键点击{// 获取鼠标点击的屏幕坐标,转换为世界空间中的射线Ray ray = HandleUtility.GUIPointToWorldRay(e.mousePosition);RaycastHit hit;// 使用射线检测场景中的物体if (Physics.Raycast(ray, out hit)){if (hit.collider.gameObject != SpriteRenderer.gameObject) { return; }// 打印点击的位置(世界空间坐标)Debug.Log("Clicked on object at position: " + hit.point);if (Transfer(hit.point, out var normalize)){var data = new PieceData() { LayPos = normalize, Rank = currSelectRank + 1 };SpecialLay(data);Selection.activeGameObject = null;e.Use();}}else{Debug.Log("No hit detected.");}}if (e.type == EventType.MouseDown && e.button == 1) // 左键点击{// 获取鼠标点击的屏幕坐标,转换为世界空间中的射线Ray ray = HandleUtility.GUIPointToWorldRay(e.mousePosition);RaycastHit hit;// 使用射线检测场景中的物体if (Physics.Raycast(ray, out hit)){if (hit.collider.gameObject == SpriteRenderer.gameObject){// 打印点击的位置(世界空间坐标)Debug.Log("Clicked on object at position: " + hit.point);if (Transfer(hit.point, out var normalize)){if (allPieces.ContainsKey(normalize)){DestroyItem(normalize);e.Use();}}}}else{Debug.Log("No hit detected.");}}}
}
相关文章:
在Scene里面绘制编辑工具
功能要求 策划要在scene模式下编辑棋子摆放。用handle.GUI绘制来解决了。 问题 在scene模式下编辑产生的数据,进入游戏模式后就全不见了。改为executeAlways也没用。我的解决办法是把编辑数据序列化保存到本地。在OnEnable的时候再读取。但是我忽然想到ÿ…...
深入探索 Vue 3 Markdown 编辑器:高级功能与实现
目录 1. 为什么选择 Markdown 编辑器?2. 选择合适的 Markdown 编辑器3. 安装与基本配置安装 配置 Markdown 编辑器代码说明 4. 高级功能实现4.1 实时预览与双向绑定4.2 插入图片和图像上传安装图像上传插件配置图像上传插件 4.3 数学公式支持安装 KaTeX配置 KaTeX 插…...
动手学图神经网络(3):利用图神经网络进行节点分类 从理论到实践
利用图神经网络进行节点分类:从理论到实践 前言 在之前的学习中,大家对图神经网络有了初步的了解。本次教程将深入探讨如何运用图神经网络(GNNs)来解决节点分类问题。在节点分类任务里,大家往往仅掌握少量节点的真实标签,却要推断出其余所有节点的标签,这属于归纳式学…...
具身智能研究报告
参考: (1)GTC大会&Figure:“具身智能”奇点已至 (2)2024中国具身智能创投报告 (3)2024年具身智能产业发展研究报告 (4)具身智能行业深度:发展…...
LabVIEW春节快乐
尊敬的LabVIEW开发者与用户朋友们: 灵蛇舞动辞旧岁,春风送暖贺新年!值此癸巳蛇年新春佳节来临之际,向每一位深耕LabVIEW开发领域的伙伴致以最诚挚的祝福:愿您与家人在新的一年里平安顺遂、阖家幸福,事业如…...
MybatisX插件快速创建项目
一、安装插件 二、创建一个数据表测试 三、IDEA连接Mysql数据库 四、选择MybatiX构造器 五、配置参数 六、项目结构...
技术周总结 01.13~01.19 周日(Spring Visual Studio git)
文章目录 一、01.14 周二1.1)问题01:Spring的org.springframework.statemachine.StateMachine 是什么,怎么使用?:如何使用StateMachine: 1.2)问题02:Spring StateMachine 提供了一系列高级特性 …...
【C++】List的模拟实现
文章目录 1.ListNode 结构体2.List成员变量与typedef3.迭代器iterator4.begin()、end()、size()、empty()、构造函数5. insert()、erase()6.push_back()、pop_back()、push_front()、pop_front()7.拷贝构造、赋值、析构8.总代码 以后有时间会更新其它成员函数 1.ListNode 结构…...
剑指 Offer II 002. 二进制加法
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20002.%20%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8A%A0%E6%B3%95/README.md 剑指 Offer II 002. 二进制加法 题目描述 给定两个 01 字符串 a 和 b ,请计算…...
(15)基于状态方程的单相自耦变压器建模仿真
1. 引言 2. 单相降压自耦变压器的状态方程 3. 单相降压自耦变压器的simulink仿真模型 4. 实例仿真 5. 总结 1. 引言 自耦变压器的原边和副边之间存在直接的电气连接,所以功率是通过感应和传导从原边转移到副边的,这与双绕组变压器不同,后者的原边和副边是电气隔离的。从…...
03.01、三合一
03.01、[简单] 三合一 1、题目描述 三合一。描述如何只用一个数组来实现三个栈。 你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。 构造函数会传入一个stackSize参数…...
.git/hooks/post-merge 文件的作用
.git/hooks/post-merge 文件是 Git 版本控制系统中的一个钩子(hook)脚本,其作用是在合并(merge)操作完成后自动执行一些特定的操作。以下是关于 .git/hooks/post-merge 文件作用的详细解释: 作用 自动化任…...
SpringBoot项目创建
一、创建新的工程 二、配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http…...
评估训练模型所需的算力
1.模型规模(核心因素) 1.1 参数量决定算力下限: 10亿参数模型:需约1-10 PetaFLOP/s-days(等效1万亿次浮点运算持续1天) 千亿参数(如GPT-3):约3,000-5,000 PetaFLOP/s-days 万亿参数模型:超过50,000 PetaFLOP/s-days 1.2 显存需求公式: 显存(GB) ≈ (参数量 20 by…...
Tez 0.10.1安装
个人博客地址:Tez 0.10.1安装 | 一张假钞的真实世界 具体安装步骤参照官网安装手册即可。此处只对官网手册进行补充。 从官网下载apache-tez-0.10.1-bin.tar.gz进行安装未成功,出现下面的异常。最终按照官网源代码编译的方式安装测试成功。 环境 Had…...
代码随想录算法训练营第三十八天-动态规划-完全背包-139.单词拆分
类似于回溯算法中的拆分回文串题目是要求拆分字符串,问这些字符串是否出现在字典里。但这道题可以反着来考虑,从字典中的单词能不能组成所给定的字符串 如果这样考虑, 这个字符串就背包,容器字典中的单词就是一个一个物品问题就转…...
selenium clear()方法清除文本框内容
在使用Selenium进行Web自动化测试时,清除文本框内容是一个常见的需求。这可以通过多种方式实现,取决于你使用的是哪种编程语言(如Python、Java等)以及你的具体需求。以下是一些常见的方法: 1. 使用clear()方法 clear…...
新增文章功能
总说 过程参考黑马程序员SpringBoot3Vue3全套视频教程,springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 之前又偷懒几天。回老家没事干,玩也玩不好,一玩老是被家里人说。写代码吧还是,他们都看不懂&a…...
【设计测试用例自动化测试性能测试 实战篇】
🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 设计测试用例…...
【算法与数据结构】动态规划
目录 基本概念 最长递增子序列(中等) 最大子数组和(中等) 基本概念 重叠子问题 一个问题可以被分解为多个子问题,并且这些子问题在求解过程中会被多次重复计算。例如,在计算斐波那契数列时,…...
扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(14)
在数字化时代,音频内容的重要性不言而喻。无论是在线课程、有声读物,还是各种多媒体应用,音频都是传递信息、增强体验的关键元素。扣子平台的音频功能,为开发者和内容创作者提供了一个强大而灵活的工具,让音频的使用和…...
【CS61A 2024秋】Python入门课,全过程记录P4(Week7 Generators开始,更新于2025/1/29)
文章目录 关于基本介绍👋新的问题更好的解决方案Week7Mon Generators阅读材料Lab 05: Iterators, MutabilityQ1: WWPD: List-MutationQ2: Insert Items 关于 个人博客,里面偶尔更新,最近比较忙。发一些总结的帖子和思考。 江湖有缘相见&…...
JUC--ConcurrentHashMap底层原理
ConcurrentHashMap底层原理 ConcurrentHashMapJDK1.7底层结构线程安全底层具体实现 JDK1.8底层结构线程安全底层具体实现 总结JDK 1.7 和 JDK 1.8实现有什么不同?ConcurrentHashMap 中的 CAS 应用 ConcurrentHashMap ConcurrentHashMap 是一种线程安全的高效Map集合…...
【Linux网络编程】网络层说明
目录 前言: 1,网络层介绍 2,IP协议 3,IP协议的格式 4,网段划分 5,特殊的IP地址 6,私有IP地址和公网IP地址 前言: 网络层对于程序员来说不太重要,这方面知识大致了…...
002-基于Halcon的图像几何变换
本节将简要介绍Halcon中有关图像几何变换的基本算子及其应用,主要涉及五种常见的二维几何变换形式:平移、镜像、旋转、错切和放缩。这几种变换可归结为一类更高级更抽象的空间变换类型,即仿射变换(Affine transformationÿ…...
unity学习22:Application类其他功能
目录 1 是否允许后台运行 1.1 Application.runInBackground,显示是否允许后台运行 1.2 设置的地方 2 打开URL 2.1 Application.OpenURL("") 打开超链接 3 退出游戏 3.1 Application.Quit() 退出游戏 4 场景相关 5 返回游戏状态 6 控制游戏的行…...
配置cursor进行Java springboot项目开发
本文用于记录如何配置cursor进行Java SpringBoot项目开发,因为项目团队同事基本都是在使用idea开发工具,所以在尝试cursor新ide的时候发现还是有一些小坑要处理一下的。 首先为了后续在多个不同的java项目之间进行切换的时候不想翻来覆去的总配置指定jdk…...
ChirpIoT技术的优势以及局限性
ChirpIoT是一种由上海磐启微电子开发的国产无线射频通讯技术,ChirpIoT技术基于磐启多年对雷达等线性扩频信号的深入研究,并在此基础上对线性扩频信号的变化进行了改进,实现了远距离传输的一种无线通信技术。相关产品型号有E29-400T22D、E290-…...
ODP(OBProxy)路由初探
OBProxy路由策略 Primary Zone 路由 官方声明默认情况,会将租户请求发送到租户的 primary zone 所在的机器上,通过 Primary Zone 路由可以尽量发往主副本,方便快速寻找 Leader 副本。另外,设置primary zone 也会在一定成都上减少…...
【25考研】人大计算机考研复试该怎么准备?有哪些注意事项?
人大毕竟是老牌985,复试难度不会太低!建议同学认真复习!没有机试还是轻松一些的! 一、复试内容 由公告可见,复试包含笔试及面试,没有机试! 二、参考书目 官方无给出参考书目,可参照…...
阿里云域名备案
一、下载阿里云App 手机应用商店搜索"阿里云",点击安装。 二、登录阿里云账号 三、打开"ICP备案" 点击"运维"页面的"ICP备案"。 四、点击"新增网站/App" 若无备案信息,则先新增备案信息。 五、开始备案...
实现基础的shell程序
1. 实现一个基础的 shell 程序,主要完成两个命令的功能 cp 和 ls 1.1.1. cp 命令主要实现: ⽂件复制⽬录复制 1.1.2. ls 命令主要实现: ls -l 命令的功能 1.1. 在框架设计上,采⽤模块化设计思想,并具备⼀定的可扩…...
yolov5错误更改与相关参数详解(train.py)
1.错误更改 main中相关参数 if __name__ __main__:parser argparse.ArgumentParser()parser.add_argument(--weights, typestr, default, helpinitial weights path)parser.add_argument(--cfg, typestr, defaultmodels/yolov5s.yaml, helpmodel.yaml path)parser.add_arg…...
(详细)Springboot 整合动态多数据源 这里有mysql(分为master 和 slave) 和oracle,根据不同路径适配不同数据源
文章目录 Springboot 整合多动态数据源 这里有mysql(分为master 和 slave) 和oracle1. 引入相关的依赖2. 创建相关配置文件3. 在相关目录下进行编码,不同路径会使用不同数据源 Springboot 整合多动态数据源 这里有mysql(分为maste…...
20.Word:小谢-病毒知识的科普文章❗【38】
目录 题目 NO1.2.3文档格式 NO4.5 NO6.7目录/图表目录/书目 NO8.9.10 NO11索引 NO12.13.14 每一步操作完,确定之后记得保存最后所有操作完记得再次删除空行 题目 NO1.2.3文档格式 样式的应用 选中应用段落段落→开始→选择→→检查→应用一个一个应用ctr…...
arkui-x跨平台与android java联合开发
华为鸿蒙系统采用的是arkts,支持跨平台crossplatform 即前端为arkts,arkui-x框架,后端为其他的语言框架。 本篇示例后端采用的是java,android studio工程。 主要方式是前端鸿蒙完成界面元素、布局等效果,后面androi…...
G. Rudolf and CodeVid-23
题目链接:Problem - G - Codeforces 题目大意: 一种病有 n≤10 种症状。 一种病情可以用一个长度为 n 的01 串表示,其中第 i 个字符表示是否出现该种症状。 现有 m(∑m≤103) 种药,每种药用两个无交集的 01 串表示。第一个 01…...
基于STM32的智能宠物喂食器设计
目录 引言系统设计 硬件设计软件设计 系统功能模块 定时喂食模块远程控制与视频监控模块食物存量检测与报警模块语音互动与用户交互模块数据记录与智能分析模块 控制算法 定时与手动投喂算法食物存量检测与低存量提醒算法数据记录与远程反馈算法 代码实现 喂食控制代码存量检测…...
css中的animation
css的animation animation是一个综合属性,是animation-name, animation-duration, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, animation-fill-mode, animation-play-state, and animation-timeline这些属性的简写 不过在…...
[内网安全] 内网渗透 - 学习手册
这是一篇专栏的目录文档,方便读者系统性的学习,笔者后续会持续更新文档内容。 如果没有特殊情况的话,大概是一天两篇的速度。(实验多或者节假日,可能会放缓) 笔者也是一边学习一边记录笔记,如果…...
VMware 中Ubuntu无网络连接/无网络标识解决方法【已解决】
参考文档 Ubuntu无网络连接/无网络标识解决方法_ubuntu没网-CSDN博客 再我们正常使用VMware时,就以Ubuntu举例可能有时候出现无网络连接,甚至出现无网络标识的情况,那么废话不多说直接上教程 环境:无网络 解决方案&#…...
区块链在能源行业的创新
技术创新 1. 智能合约与自动化交易 智能合约是区块链技术的核心组件之一,它允许在没有中介的情况下自动执行合同条款。在能源行业,这可以用于自动化电力交易、支付流程以及管理复杂的供应链。例如,当太阳能板产生的电量达到预设值时&#x…...
skynet 源码阅读 -- 核心概念服务 skynet_context
本文从 Skynet 源码层面深入解读 服务(Service) 的创建流程。从最基础的概念出发,逐步深入 skynet_context_new 函数、相关数据结构(skynet_context, skynet_module, message_queue 等),并通过流程图、结构…...
前端react后端java实现提交antd form表单成功即导出压缩包
前端(React Ant Design) 1. 创建表单:使用<Form>组件来创建你的表单。 2. 处理表单提交:在onFinish回调中发起请求到后端API,并处理响应。 import React from react; import { Form, Input, Button } from ant…...
2025 = 1^3 + 2^3 + 3^3 + 4^3 + 5^3 + 6^3 + 7^3 + 8^3 + 9^3
【算法代码】 #include <bits/stdc.h> using namespace std;int year2025; int main() {cout<<year<<" ";int i1;while(year) {cout<<i<<"^3";if(i<9) cout<<" ";year-pow(i,3);i;}return 0; }/* 202…...
程序代码篇---C++常量引用
文章目录 前言第一部分:C常量常量变量const与指针1.指向常量的指针2.常量指针3.指向常量的常量指针 常量成员函数const_cast运算符总结 第二部分:C引用引用的基本概念引用的声明引用的使用引用的特性1.不可变性2.无需解引用3.内存地址 引用的用途1.函数参…...
DeepSeek-R1本地部署笔记
文章目录 效果概要下载 ollama终端下载模型【可选】浏览器插件 UIQ: 内存占用高,显存占用不高,正常吗 效果 我的配置如下 E5 2666 V3 AMD 590Gme 可以说是慢的一批了,内存和显卡都太垃圾了,回去用我的新设备再试试 概要 安装…...
golang通过AutoMigrate方法自动创建table详解
一.AutoMigrate介绍 1.介绍 在 Go 语言中,GORM支持Migration特性,支持根据Go Struct结构自动生成对应的表结构,使用 GORM ORM 库的 AutoMigrate 方法可以自动创建数据库表,确保数据库结构与定义的模型结构一致。AutoMigrate 方法非常方便&am…...
如何看待 OpenAI 的12天“shipmas”发布计划?
openAI的“Shipmas”并非单纯的营销活动,而是在用户增长、技术创新和市场竞争中的综合布局和战略体现。 史上最寒酸的发布会?继十月马斯克在好莱坞电影城高调发布特斯拉三款最新产品(无人出租车、无人巴士、人形机器人)后,十二月,OpenAI CEO 奥特曼宣布 OpenAI 将连续12…...
Vue 3 30天精进之旅:Day 07 - Vue Router
引言 在前几天的学习中,我们深入探讨了Vue的表单输入绑定及其处理机制。今天,我们将学习Vue Router,这是Vue.js官方提供的路由管理器,用于构建单页面应用(SPA)。通过使用Vue Router,你可以轻松…...