【AI游戏】Unity PlayMaker可视化状态机

news2026/3/14 4:43:06
【AI游戏】专栏-直达Unity PlayMaker 可视化状态机完全指南一、引言在Unity游戏开发的生态系统中PlayMaker无疑是一款极具影响力的可视化编程工具。作为Unity Asset Store中最受欢迎的可视化脚本工具之一PlayMaker以其独特的可视化状态机Finite State MachineFSM编辑方式彻底改变了开发者构建游戏逻辑的方式。它让那些不擅长编程的开发者也能够创建复杂的游戏功能同时也为资深程序员提供了一种快速原型设计和可视化调试的强大工具。PlayMaker的核心价值在于将抽象的代码逻辑转化为直观的可视化图形。开发者不再需要编写大量的C#代码而是通过拖拽状态、连接转换线、配置事件的方式来完成游戏功能的开发。这种工作方式不仅降低了Unity的学习门槛还大大提高了开发效率使得游戏原型可以在极短的时间内从概念变为可运行的版本。本文将全面介绍PlayMaker的各个方面从基础概念到高级应用从状态机设计到与其他系统的集成。我们将通过大量的示例和实践指南帮助读者掌握这款强大的可视化工具无论你是刚入门的新手还是有经验的开发者都能从本文中获得有价值的信息。二、PlayMaker 基础概念2.1 什么是状态机状态机Finite State MachineFSM是一种抽象的计算模型它描述了一个系统如何根据当前状态和输入事件在不同的状态之间转换。在游戏开发中状态机被广泛用于管理游戏对象的行为逻辑如NPC的人工智能、UI界面的交互流程、动画状态的切换等。一个典型的状态机包含以下核心要素状态State表示系统在某一时段的特定行为模式。例如一个敌人AI可能处于“巡逻”、“追击”、“攻击”或“逃跑”等状态。每个状态定义了在这种状态下系统应该做什么。转换Transition表示状态之间的有向连接。转换定义了从一个状态切换到另一个状态的条件。当转换条件满足时状态机会从当前状态转换到目标状态。事件Event触发状态转换的信号。事件可以是来自用户的输入、时间的流逝、碰撞的发生或者是任何自定义的事件。动作Action在状态中执行的具体操作。动作可以是移动、播放动画、改变颜色、发送消息等任何游戏行为。2.2 PlayMaker的核心架构PlayMaker的架构设计围绕状态机展开提供了完整的可视化编辑环境和运行时系统。编辑器组件PlayMaker编辑器由以下几个主要部分组成FSM编辑器用于创建和编辑状态机的核心界面。FSM Inspector显示选中状态或转换的详细属性。Action浏览器列出所有可用的Actions供用户添加到状态中。Event浏览器管理项目中的所有自定义事件。变量管理器管理FSM中使用的变量。运行时系统PlayMaker的运行时系统负责执行FSM逻辑FsmComponent挂载在游戏对象上的组件用于运行FSM。Fsm保存FSM数据的核心类。FsmState代表单个状态的类。FsmTransition代表状态转换的类。FsmEvent代表事件的类。2.3 PlayMaker的特点与优势PlayMaker相比其他可视化编程工具具有以下独特优势零代码开发完全可视化的编辑方式无需编写任何代码即可创建复杂的游戏逻辑。这使得游戏设计师、美术人员等非程序员也能参与游戏开发。状态机优先专注于状态机范式提供完善的状态、转换、事件系统。这使得管理具有明确状态的AI变得非常简单。丰富的Action库内置超过200个Actions覆盖了Unity的各个方面。从基本的Transform操作到复杂的物理、网络功能都有对应的Action。易于学习PlayMaker的学习曲线相对平缓官方提供了大量教程和示例项目。用户可以在短时间内掌握基本使用方法。社区支持PlayMaker拥有活跃的社区开发者可以分享自己创建的Actions和FSM模板。三、核心功能详解3.1 FSM编辑器界面PlayMaker的FSM编辑器是整个插件的核心工作区。编辑器采用多面板设计每个面板负责不同的功能。主编辑区域主编辑区域是创建和编辑FSM的画布。在这个区域中每个状态表示为一个矩形节点。状态之间通过转换线连接。可以拖拽状态节点来调整布局。双击状态可以编辑状态的名称。右键点击可以添加新的状态或转换。状态列表在主区域左侧是状态列表显示FSM中所有的状态。点击状态列表中的项目可以在主区域中选中对应的状态节点。转换列表在主区域右侧是转换列表显示所有定义的转换。转换列表可以帮助用户快速查看FSM中的所有转换关系。Inspector面板当在编辑器中选中状态、转换或FSM本身时Inspector面板会显示相应的属性和配置选项。3.2 状态State的创建与配置在PlayMaker中创建状态非常简单在FSM编辑器中右键点击空白区域。选择Add State创建新状态。双击状态节点可以编辑名称。选中状态后可以在Inspector中添加Actions。状态属性每个状态有以下属性Name状态的名称必须唯一。Color状态在编辑器中显示的颜色便于区分不同类型的状态。Description可选的状态描述用于文档化。Actions附加到该状态的Actions列表按顺序执行。Events该状态可以发送的事件列表。Local Variables该状态的局部变量。3.3 转换Transition的设置转换连接两个状态定义状态之间的转换条件。创建转换选中源状态。右键点击状态节点边缘拖拽到目标状态。释放鼠标创建转换连接。配置转换每个转换包含以下配置Event触发转换的事件名称。Condition可选的条件列表只有满足所有条件时转换才会触发。Global Transition是否是全局转换可以在任何状态时触发。Self Transition是否是自我转换转换到自身。3.4 事件系统事件是PlayMaker状态机运转的驱动力。理解事件系统是掌握PlayMaker的关键。内置事件PlayMaker提供了一系列内置事件Finished当状态的所有Actions执行完毕后触发。Update每帧触发。Late Update在LateUpdate时触发。Fixed Update在FixedUpdate时触发。Collision Enter/Stay/Exit碰撞相关事件。Trigger Enter/Stay/Exit触发器相关事件。Mouse Events鼠标输入事件。Key Events键盘输入事件。自定义事件除了内置事件开发者还可以创建自定义事件在FSM编辑器中点击Events选项卡。点击Add Event按钮。输入事件名称。自定义事件可以通过Send Event Action在代码中触发也可以通过转换条件在其他FSM中触发。3.5 Actions详解Actions是PlayMaker中实现具体功能的模块。每个Action执行一个特定的操作如移动物体、播放声音、发送消息等。常用Actions分类Transform类Set Position设置游戏对象的位置。Set Rotation设置游戏对象的旋转。Set Scale设置游戏对象的缩放。Move Towards向目标位置移动。Look At朝向目标。Physics类Add Force施加力。Set Velocity设置速度。Is Kinematic设置是否为运动学刚体。Raycast发射射线。Animation类Play Animation播放动画。Set Animation Speed设置动画速度。Crossfade淡入淡出过渡。Game Object类Create Object创建对象。Destroy Object销毁对象。Find Game Object查找游戏对象。Get Component获取组件。变量操作类Set Float/Int/Bool/String设置相应类型的变量值。Get Random Float/Int获取随机数。Compare比较变量值。Actions的工作方式Actions在状态中按顺序执行。当一个Action完成时返回true下一个Action开始执行。当所有Actions执行完毕后状态自动发送Finished事件。每个Action都有输入参数可以在Inspector中设置。例如Move Towards Action需要设置移动速度、目标位置等参数。3.6 变量系统PlayMaker提供了完整的变量系统支持多种数据类型。变量类型Float浮点数。Int整数。Bool布尔值。String字符串。Vector2/Vector3向量。GameObject游戏对象。Material材质。Texture纹理。Color颜色。变量作用域变量有以下几种作用域Local Variable局部变量只在当前状态中可见。FSM VariableFSM级变量在FSM的所有状态中都可见。Global Variable全局变量在同一场景的所有FSM中都可见。变量操作在Inspector中直接设置变量值。使用Actions动态修改变量值。通过事件携带变量数据。四、解决的问题与应用场景4.1 解决的问题降低编程门槛PlayMaker最大的价值在于让非程序员也能参与游戏开发。游戏设计师可以使用PlayMaker快速实现游戏原型验证设计想法而不必等待程序员的配合。加速原型开发使用PlayMaker可以快速搭建游戏原型。将一个想法变成可运行的版本可能只需要几分钟而不是几小时或几天。可视化调试PlayMaker的状态机以图形方式展示游戏逻辑使得调试变得直观。开发者可以直接看到状态之间的转换快速定位问题。逻辑与代码分离使用PlayMaker处理游戏逻辑可以让程序员更专注于底层系统的开发。逻辑变化不需要修改代码只需要调整FSM。团队协作可视化的工作方式使得策划、美术和程序之间的沟通更加顺畅。团队成员可以在同一FSM上协作或者由专人负责FSM的维护。4.2 典型应用场景NPC AI系统PlayMaker非常适合构建NPC的AI系统巡逻行为定义巡逻状态配置随机移动或路径点移动。感知系统使用碰撞和射线检测实现视野感知。追击行为检测到玩家后转换到追击状态。攻击行为进入攻击范围后执行攻击动作。状态转换使用事件触发状态之间的转换。玩家控制虽然PlayMaker不是专门的玩家控制器但它可以很好地处理简单的玩家输入和状态管理移动和跳跃状态。攻击动作序列。玩家状态站立、蹲下、游泳等。动画状态同步。UI交互PlayMaker可以用于管理UI的交互逻辑按钮点击响应。菜单切换动画。屏幕淡入淡出。分数和进度的更新。游戏流程管理使用PlayMaker管理游戏的主流程开始菜单 → 游戏 → 暂停 → 结束。关卡加载和切换。游戏状态管理。交互对象游戏中需要与玩家交互的对象可收集的物品。可开关的门。机关和陷阱。触发器区域。五、快速入门指南5.1 安装与初始化PlayMaker可以通过Unity Asset Store购买和下载。安装完成后打开Unity编辑器PlayMaker会自动初始化。在菜单栏出现PlayMaker菜单。在GameObject菜单下出现Add FSM选项。在Window菜单下出现PlayMaker Editor选项。5.2 创建第一个FSM让我们创建一个简单的例子让一个敌人AI在发现玩家时追击玩家否则在原地巡逻。步骤一创建FSM创建一个Cube作为敌人对象。选择对象在Inspector中点击Add Component。搜索PlayMakerFSM并添加。PlayMaker会自动创建一个包含一个默认状态的FSM。步骤二创建状态在FSM编辑器中右键点击添加三个状态Patrol、Chase、Attack。分别设置每个状态的颜色可选。步骤三添加Actions在Patrol状态中添加Find Closest Game Object查找最近的玩家对象。Move Towards向玩家方向移动。Get Distance获取与玩家的距离。在Chase状态中添加Move Towards向玩家快速移动。Get Distance获取与玩家的距离。在Attack状态中添加Destroy Target模拟攻击。Wait攻击后的停顿。步骤四创建转换从Patrol状态创建到Chase状态的转换事件名为See Player条件为距离小于10。从Chase状态创建到Attack状态的转换事件名为Close Enough条件为距离小于2。从Attack状态创建回Patrol状态的转换事件名为Player Lost条件为距离大于15。步骤五测试运行按下Play按钮观察敌人AI的行为。可以在Game视图中看到状态之间的转换。5.3 进阶技巧使用全局事件全局事件可以在不同FSM之间通信创建一个全局事件PlayerDetected。在敌人AI的FSM中当检测到玩家时发送PlayerDetected事件。其他AI可以订阅这个事件做出相应反应。使用变量合理使用变量可以简化FSM的设计创建Target变量来存储目标对象。多个状态共享同一个变量。通过变量传递数据。使用Templates创建可重用的FSM模板设计一个通用的敌人AI模板。将FSM保存为Template。在多个敌人对象上应用Template只需调整参数。六、AI设计实践6.1 敌人AI架构使用PlayMaker设计敌人AI时推荐采用分层架构顶层行为选择使用顶层FSM决定AI应该执行哪种行为States: - Idle: 空闲状态 - Patrol: 巡逻状态 - Chase: 追击状态 - Attack: 攻击状态 - Flee: 逃跑状态 Transitions: - Idle → Patrol: 初始化完成 - Patrol → Chase: 发现玩家 - Chase → Attack: 进入攻击范围 - Attack → Chase: 玩家逃离 - Any → Flee: 生命值过低中层行为实现每个行为状态内部可以有更详细的状态机例如Patrol状态内部可以有等待 → 移动 → 等待 → 移动...底层感知系统独立的感知系统负责检测环境信息视野检测使用射线和角度计算。距离检测计算与目标的距离。声音检测检测声音事件。6.2 巡逻行为实现随机巡逻使用随机数实现无规律的巡逻行为创建Wander状态。添加Get Random FloatAction获取随机X和Z偏移。计算新的目标位置。使用Move Towards移动到新位置。添加WaitAction在到达后等待。转换回Wander状态。路径巡逻沿着预设路径移动创建空对象作为路径点。在FSM中使用数组存储路径点。依次访问每个路径点。到达终点后回到起点。6.3 追击与攻击行为追击行为当AI发现玩家时进入追击状态检测到玩家后保存玩家引用到变量。使用Move Towards向玩家移动。每帧检查与玩家的距离。根据距离判断是否进入攻击状态或继续追击。攻击行为进入攻击范围后执行攻击播放攻击动画。计算对玩家造成的伤害。应用伤害到玩家对象。添加攻击冷却时间。根据情况选择继续攻击或撤退。6.4 感知系统实现视野检测使用射线和角度计算实现视野检测// 计算目标方向 Vector3 direction target.position - transform.position; float angle Vector3.Angle(transform.forward, direction); // 检查是否在视野角度内 if (angle viewAngle / 2) { // 发射射线检测遮挡 if (!Physics.Raycast(transform.position, direction, out hit, viewDistance, obstacleLayer)) { // 目标可见 } }在PlayMaker中可以使用Actions组合实现这个逻辑Get Angle Between Directions计算角度。Float Compare比较角度。Raycast检测遮挡。距离检测简单的距离检测Get Distance获取与目标的距离。Float Compare比较距离与阈值。满足条件时发送相应事件。6.5 高级AI模式群体AI多个AI协同工作使用全局变量存储群体信息。每个AI检测附近的同伴。根据群体行为规则调整自身行为。使用全局事件协调行动。分级AI不同类型的敌人有不同行为创建基础FSM模板。为不同类型敌人创建变体。共享基础行为添加特有行为。学习型AI虽然PlayMaker本身不直接支持机器学习但可以创建简单的适应性行为记录玩家行为模式。根据历史调整AI参数。实现简单的难度调整。七、与其他系统集成7.1 NavMesh集成PlayMaker可以与Unity的NavMesh系统配合使用寻路ActionsNavMesh Agent设置NavMesh代理属性。Get Agent Remaining Distance获取剩余距离。Set Agent Destination设置寻路目标。使用示例给游戏对象添加NavMeshAgent组件。在FSM中使用Set Agent Destination设置目标。使用Get Agent Remaining Distance检测是否到达。根据结果转换到下一个状态。7.2 动画系统集成PlayMaker与Unity动画系统深度集成Animation ActionsPlay Animation播放动画。Crossfade动画过渡。Set Animation Speed调整播放速度。Get Animation State Info获取动画状态信息。Animator ActionsSet Animator Bool/Int/Float设置Animator参数。Get Animator Bool/Int/Float获取Animator参数。Animator Play播放Animator状态。同步动画与FSM在Animator中使用Animation Events触发FSM事件。在FSM中使用Actions控制Animator参数。实现动画状态与FSM状态的同步。7.3 物理系统集成PlayMaker提供了丰富的物理系统Actions刚体控制Add Force施加力。Set Velocity设置速度。Is Kinematic设置运动学状态。Get Rigidbody Velocity获取刚体速度。碰撞检测Collision Event碰撞事件。Trigger Event触发器事件。Raycast射线检测。Sphere Cast体球投射。7.4 网络功能集成使用PlayMaker创建简单的网络功能网络ActionsNetwork Connect/Disconnect连接/断开网络。Network Instantiate网络实例化。Network Send Message发送网络消息。使用注意PlayMaker的网络功能相对基础。复杂网络功能建议使用专门的插件。可以通过自定义Actions扩展网络功能。八、性能优化与最佳实践8.1 性能优化技巧减少FSM数量每个FSM都有一定开销尽量将相关逻辑放在同一个FSM中。避免为每个行为创建独立FSM。使用状态而不是FSM来区分行为。优化Update频率不是所有逻辑都需要每帧执行使用Every N SecondsAction降低更新频率。对于简单AI可以使用较低的帧率。使用Run FSMAction进行批量处理。优化Actions移除不必要的Actions。避免每帧执行的复杂计算。使用Get Component Once缓存组件引用。使用对象池频繁创建销毁对象会影响性能使用对象池管理频繁创建的对象。重用而不是销毁不活跃的对象。8.2 调试技巧使用断点PlayMaker支持在状态和转换上设置断点选中状态或转换右键选择Toggle Breakpoint。运行游戏时会在断点处暂停。可以检查变量值和执行状态。查看执行日志启用日志输出在PlayMaker设置中启用详细日志。使用Debug Actions输出信息。查看Unity Console中的日志。使用可视化调试启用FSM的可视化调试。观察状态之间的转换。监视变量值的变化。8.3 常见问题与解决方案问题一FSM不执行排查步骤确认FSM已启用。确认有初始状态。检查状态是否有Actions。查看是否有错误信息。问题二状态转换不触发可能原因事件名称不匹配。转换条件不满足。事件被其他FSM拦截。问题三Actions不执行检查点Actions是否添加到状态中。Actions的参数是否正确设置。Actions的执行顺序是否正确。问题四性能问题优化方案减少FSM复杂度。降低更新频率。使用对象池。优化感知系统。8.4 代码最佳实践命名规范使用清晰的命名。事件名称使用大写字母。变量名称使用有意义的名称。FSM结构保持FSM简洁清晰。使用子FSM模块化复杂逻辑。合理使用全局变量。注释文档为复杂FSM添加说明。使用状态描述功能。记录重要的设计决策。九、扩展与自定义9.1 创建自定义ActionsPlayMaker支持创建自定义Actions来扩展功能using UnityEngine; using HutongGames.PlayMaker; [ActionCategory(My Custom Category)] [Tooltip(My custom action description)] public class MyCustomAction : FsmStateAction { [RequiredField] public FsmGameObject targetObject; [Tooltip(Movement speed)] public FsmFloat speed 5f; public override void OnUpdate() { if (targetObject.Value null) return; // 移动逻辑 targetObject.Value.transform.position transform.forward * speed.Value * Time.deltaTime; } }自定义Actions的结构继承自FsmStateAction或FsmStateAction。使用属性定义Action分类和描述。使用public字段定义参数。重写生命周期方法实现功能。9.2 自定义Events可以创建项目专用的自定义事件在FSM编辑器中点击Events选项卡。点击Add Event按钮。输入事件名称。在Actions中使用Send Event触发事件。9.3 创建FSM Templates创建可重用的FSM模板设计完成一个FSM。在FSM菜单中选择Save Template。选择保存位置和文件名。在其他项目中可以导入并使用这个模板。9.4 与第三方插件集成PlayMaker可以与多种第三方插件集成DOTween集成创建使用DOTween的ActionsTween Position/Rotation/Scale。Tween Color/Alpha。控制Tween播放。2D Toolkit集成为2D游戏创建专用Actions2D精灵控制。2D物理操作。2D动画控制。自定义集成为任何Unity插件创建对应的Actions分析插件提供的API。创建包装Actions。添加到PlayMaker。十、实战案例完整游戏原型10.1 项目概述让我们通过一个完整的游戏原型来实践PlayMaker的使用。这个原型将包含玩家控制移动、跳跃、攻击。敌人AI巡逻、追击、攻击。收集系统收集物品、计分。UI系统分数显示、游戏结束。10.2 玩家控制系统FSM结构States: - Idle: 站立状态 - Run: 奔跑状态 - Jump: 跳跃状态 - Attack: 攻击状态 - Dead: 死亡状态 Transitions: - Idle → Run: 收到移动输入 - Run → Idle: 停止移动 - Idle/Run → Jump: 收到跳跃输入 - Jump → Idle: 落地 - Idle/Run → Attack: 收到攻击输入 - Attack → Idle: 攻击完成 - Any → Dead: 生命值归零Actions配置Input Actions获取用户输入。Transform Actions控制移动。Animation Actions控制动画。Collision Event检测碰撞。10.3 敌人AI系统基础AI FSMStates: - Patrol: 巡逻状态 - Chase: 追击状态 - Attack: 攻击状态 - Return: 返回巡逻点 Transitions: - Patrol → Chase: 玩家进入感知范围 - Chase → Attack: 进入攻击范围 - Attack → Chase: 玩家逃离 - Chase → Return: 玩家脱离感知范围 - Return → Patrol: 到达巡逻点10.4 收集系统物品FSMStates: - Idle: 等待被收集 - Collected: 被收集状态 Events: - OnCollisionEnter: 碰撞事件 Actions: - Destroy Object: 销毁物品 - Send Message: 通知计分系统计分系统States: - Playing: 游戏中 - GameOver: 游戏结束 Actions: - Add Score: 增加分数 - Update UI: 更新界面显示10.5 游戏流程管理主菜单FSMStates: - MainMenu: 主菜单 - Playing: 游戏中 - Pause: 暂停 - GameOver: 游戏结束 Transitions: - MainMenu → Playing: 点击开始 - Playing → Pause: 按下暂停键 - Pause → Playing: 继续游戏 - Playing → GameOver: 玩家死亡 - GameOver → MainMenu: 返回主菜单十一、总结与展望11.1 核心要点回顾通过本文的详细介绍读者应该对PlayMaker有了全面的了解状态机基础理解状态机的概念和PlayMaker的架构。编辑器使用掌握FSM编辑器的使用方法。Actions库熟悉常用Actions的功能和使用方法。变量系统理解变量的类型和作用域。AI设计掌握使用PlayMaker设计AI的方法。系统集成了解与其他Unity系统的集成方式。性能优化学会优化PlayMaker的性能。11.2 适用人群PlayMaker特别适合以下开发者独立开发者需要快速实现游戏原型。游戏设计师需要验证设计想法。初学者学习游戏开发的基本概念。非程序员希望参与游戏开发。原型开发需要快速构建可运行版本。11.3 使用建议从简单项目开始学习。参考官方示例和教程。参与社区交流学习。逐步掌握高级功能。注意性能优化。11.4 未来发展PlayMaker作为Unity生态中的重要工具将持续发展和完善增强与新版本Unity的兼容性。提供更多内置Actions。改进编辑器性能。增加协作功能。PlayMaker为游戏开发提供了一种独特的可视化方法。无论你是独立开发者还是团队成员无论你是专业程序员还是游戏爱好者PlayMaker都能帮助你更快地将游戏创意变为现实。希望本文能够帮助读者掌握这款强大的工具并在游戏开发中获得成功。欢迎点赞留言探讨更多人加入进来能更加完善这个探索的过程

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

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

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

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…