Unity 基于navMesh的怪物追踪惯性系统
今天做项目适合 策划想要实现一个在现有的怪物追踪系统上实现怪物拥有惯性功能
以下是解决方案分享:
怪物基类代码:
using UnityEngine;
using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))]
[RequireComponent(typeof(AudioSource))]
public abstract class MonsterBase : MonoBehaviour
{public enum MonsterState { Idle, Patrol, Chase }//1.待机,2.巡逻,3.追击[Header("巡逻时的速度")]public float patrolSpeed = 2f;[Header("追击玩家时的速度")]public float chaseSpeed = 5f;[Header("怪物的加速度")]public float acceleration = 50f; // 大加速度[Header("怪物的旋转速度")]public float angularSpeed = 120f;[Header("怪物与目标的停止距离")]public float stoppingDistance = 0.1f;[Header("怪屋听觉能检测到玩家的范围")]public float detectionRange = 10f;[Space(30)][Header("视觉检测设置")][Tooltip("扇形检测半径")]public float visionRange = 5f;[Tooltip("扇形检测角度(度)")][Range(0, 360)]public float visionAngle = 90f;[Tooltip("检测层级(应包含玩家和障碍物)")]public LayerMask visionMask;[Header("声音设置")]public AudioClip howlSound;[Header("最大音量")]public float maxHowlVolume = 1f;[Header("开始嚎叫距离阈值")]public float howlDistance = 5f;protected NavMeshAgent agent;protected AudioSource audioSource;//怪物声音protected Transform player;protected MonsterState currentState = MonsterState.Patrol;protected Animator animator;protected SpriteRenderer spriteRenderer;//精灵组件private Vector2 lastPosition;//上一帧位置private Direction currentDirection = Direction.Down;//当前移动方向protected enum Direction { Up, Down, Left, Right }void Awake(){agent = GetComponent<NavMeshAgent>();audioSource = GetComponent<AudioSource>();animator = GetComponent<Animator>();spriteRenderer = GetComponentInChildren<SpriteRenderer>();player = GameObject.FindGameObjectWithTag("Player").transform;ConfigureAgent();}void ConfigureAgent(){agent.acceleration = acceleration;agent.angularSpeed = angularSpeed;agent.stoppingDistance = stoppingDistance;agent.updateRotation = false; // 禁用自动旋转,我们自己控制agent.updateUpAxis = false; // 保持2D平面}void Update(){UpdateState();UpdateAnimation();UpdateHowlSound();}/// <summary>/// 抽象状态机 /// </summary>protected abstract void UpdateState();public virtual void UpdateAnimation(){// 计算移动方向Vector2 movement = (Vector2)transform.position - lastPosition;lastPosition = transform.position;if (movement.magnitude > 0.01f) // 正在移动{if (Mathf.Abs(movement.x) > Mathf.Abs(movement.y)){currentDirection = movement.x > 0 ? Direction.Right : Direction.Left;}else{currentDirection = movement.y > 0 ? Direction.Up : Direction.Down;}//TODO:考虑设计CONST表// animator.SetBool("IsMoving", true);// animator.SetInteger("Direction", (int)currentDirection);}else // 待机{// animator.SetBool("IsMoving", false);}// 更新Sprite朝向if (currentDirection == Direction.Left){spriteRenderer.flipX = true;}else if (currentDirection == Direction.Right){spriteRenderer.flipX = false;}}/// <summary>/// 获取当前移动方向(归一化向量)/// </summary>protected Vector3 GetMovementDirection(){if (agent != null && agent.velocity.magnitude > 0.1f){return agent.velocity.normalized;}return transform.forward; // 默认使用面朝方向}protected bool CanSeePlayer(){if (player == null) return false;Vector3 directionToPlayer = player.position - transform.position;float distanceToPlayer = directionToPlayer.magnitude;// 距离检查if (distanceToPlayer > visionRange)return false;// 获取当前移动方向Vector3 moveDirection = GetMovementDirection();// 角度检查(基于移动方向)float angleToPlayer = Vector3.Angle(moveDirection, directionToPlayer);if (angleToPlayer > visionAngle / 2f)return false;// 视线遮挡检查RaycastHit hit;if (Physics.Raycast(transform.position, directionToPlayer.normalized, out hit, visionRange, visionMask)){return hit.collider.CompareTag("Player");}return false;}/// <summary>/// 在Scene视图中绘制视觉范围(调试用)/// </summary>/// <summary>/// 绘制基于移动方向的扇形检测范围/// </summary>private void OnDrawGizmos(){// 获取当前移动方向(编辑器中使用面朝方向,运行时用实际移动方向)Vector3 moveDir = Application.isPlaying ? GetMovementDirection() : transform.forward;// 设置扇形颜色Gizmos.color = new Color(1, 0.5f, 0, 0.3f); // 半透明橙色// 计算扇形边缘Vector3 center = transform.position;Vector3 forward = moveDir * visionRange;Vector3 left = Quaternion.Euler(0, -visionAngle / 2, 0) * forward;Vector3 right = Quaternion.Euler(0, visionAngle / 2, 0) * forward;// 绘制扇形边缘线Gizmos.DrawLine(center, center + left);Gizmos.DrawLine(center, center + right);// 绘制扇形弧线Vector3 lastPoint = center + left;int segments = 20;for (int i = 1; i <= segments; i++){float t = (float)i / segments;float angle = Mathf.Lerp(-visionAngle / 2, visionAngle / 2, t);Vector3 nextPoint = center + Quaternion.Euler(0, angle, 0) * forward;Gizmos.DrawLine(lastPoint, nextPoint);lastPoint = nextPoint;}// 绘制移动方向指示器Gizmos.color = Color.red;Gizmos.DrawLine(center, center + moveDir * 1.5f);}void UpdateHowlSound(){if (howlSound == null) return;float distanceToPlayer = Vector3.Distance(transform.position, player.position);if (distanceToPlayer <= howlDistance){if (!audioSource.isPlaying){audioSource.clip = howlSound;audioSource.Play();}// 距离越近声音越大float volume = Mathf.Lerp(0.1f, maxHowlVolume, 1 - (distanceToPlayer / howlDistance));audioSource.volume = volume;}else if (audioSource.isPlaying){audioSource.Stop();}}protected void ChangeState(MonsterState newState){if (currentState == newState) return;currentState = newState;switch (currentState){case MonsterState.Idle:agent.isStopped = true;break;case MonsterState.Patrol:agent.speed = patrolSpeed;agent.isStopped = false;break;case MonsterState.Chase:agent.speed = chaseSpeed;agent.isStopped = false;break;}}void OnCollisionEnter(Collision collision){if (collision.gameObject.CompareTag("Player")){Debug.Log("触碰到玩家");//TODO:玩家死亡//collision.gameObject.GetComponent<PlayerController>().Die();}}
带有惯性的怪物实现:
using UnityEngine;
using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))]
[RequireComponent(typeof(Rigidbody))]
public class Angry : MonsterBase
{[Header("数据配置表")]public MonsterConfig config;[Header("巡逻点数组")]public Transform[] patrolPoints;[Header("每个巡逻点的停留时间")]public float waitTimeAtPoint = 2f;[Header("探测范围(圆)")] public float AngrydetectionRange = 2f;[Header("移动惯性超出系数")]public float overshootFactor = 1.8f;[Header("急撒系数")]public float brakeForce = 4f;[Header("最小启动惯性移动阈值速度")]public float overshootMinSpeed = 0.5f;[Header("触发惯性移动距离倍速")]public float overshootTriggerDistance = 1.5f; // 私有变量private int currentPatrolIndex = 0;private float waitTimer = 0f;private bool isWaiting = false;private bool isPlayerMove = false;// 惯性相关private Vector3 lastVelocity;private bool isOvershooting = false;private Rigidbody rb;private Vector3 overshootStartPosition;public void Start(){// 获取组件rb = GetComponent<Rigidbody>();agent = GetComponent<NavMeshAgent>();player = GameObject.FindGameObjectWithTag("Player").transform;// 初始化配置detectionRange = config.detectionRange;stoppingDistance = config.stoppingDistance;acceleration = config.acceleration;angularSpeed = config.angularSpeed;howlDistance = config.howlDistance;chaseSpeed = config.chaseSpeed;patrolSpeed = config.patrolSpeed;maxHowlVolume = config.maxHowlVolume;howlSound = config.howlSound;// 代理设置agent.autoBraking = false;agent.updatePosition = false;agent.updateRotation = false;// 刚体设置rb.isKinematic = false;rb.interpolation = RigidbodyInterpolation.Interpolate;rb.collisionDetectionMode = CollisionDetectionMode.Continuous;rb.constraints = RigidbodyConstraints.FreezeRotation | RigidbodyConstraints.FreezePositionY;// 初始巡逻目标if (patrolPoints.Length > 0){SetPatrolDestination();}isPlayerMove = player.GetComponent<Movement>().IsPlayerMoving();}private void Update(){UpdateState();// 记录速度用于惯性(仅当代理活跃时)if (agent.velocity.magnitude > 0.1f && !isOvershooting && agent.isActiveAndEnabled){lastVelocity = agent.velocity;}}private void FixedUpdate(){if (isOvershooting){HandleOvershoot();}else if (agent.isOnNavMesh){// 同步NavMeshAgent和Rigidbody位置agent.nextPosition = rb.position;rb.velocity = agent.velocity;}}protected override void UpdateState(){float distanceToPlayer = Vector3.Distance(transform.position, player.position);bool canSeePlayer = CanSeePlayer();// 只在非惯性状态下处理状态转换if (!isOvershooting){if (canSeePlayer){ChangeState(MonsterState.Chase);ChasePlayer();}else if (distanceToPlayer <= AngrydetectionRange && isPlayerMove){ChangeState(MonsterState.Chase);ChasePlayer();}else if (currentState == MonsterState.Chase){ChangeState(MonsterState.Patrol);// 返回巡逻时立即设置目标if (patrolPoints.Length > 0) SetPatrolDestination();}if (currentState == MonsterState.Patrol){Patrol();}}}void ChasePlayer(){if (isOvershooting) return;agent.speed = chaseSpeed;agent.SetDestination(player.position);// 接近玩家时触发惯性float distanceToPlayer = Vector3.Distance(transform.position, player.position);if (distanceToPlayer < agent.stoppingDistance * overshootTriggerDistance){StartOvershoot();}}void Patrol(){if (patrolPoints.Length == 0){ChangeState(MonsterState.Idle);return;}if (isWaiting){waitTimer += Time.deltaTime;if (waitTimer >= waitTimeAtPoint){isWaiting = false;waitTimer = 0f;currentPatrolIndex = (currentPatrolIndex + 1) % patrolPoints.Length;SetPatrolDestination();}return;}// 使用路径状态和距离判断if (!agent.pathPending && agent.remainingDistance <= agent.stoppingDistance + 0.2f){isWaiting = true;}// 添加目标丢失的重新设置逻辑else if (!agent.hasPath || agent.pathStatus != NavMeshPathStatus.PathComplete){SetPatrolDestination();}}void SetPatrolDestination(){if (isOvershooting || patrolPoints.Length == 0 || currentPatrolIndex >= patrolPoints.Length) return;agent.speed = patrolSpeed;NavMeshHit hit;if (NavMesh.SamplePosition(patrolPoints[currentPatrolIndex].position, out hit, 2.0f, NavMesh.AllAreas)){agent.SetDestination(hit.position);agent.isStopped = false;}else{Debug.LogWarning($"无法导航到巡逻点: {patrolPoints[currentPatrolIndex].name}");// 自动跳到下一个点currentPatrolIndex = (currentPatrolIndex + 1) % patrolPoints.Length;SetPatrolDestination();}}void StartOvershoot(){isOvershooting = true;overshootStartPosition = transform.position;agent.isStopped = true;// 计算惯性速度(保留原有方向但增加速度)lastVelocity = lastVelocity.normalized * agent.speed * overshootFactor;rb.velocity = lastVelocity;}void HandleOvershoot(){// 应用减速lastVelocity = Vector3.Lerp(lastVelocity, Vector3.zero, brakeForce * Time.fixedDeltaTime);rb.velocity = lastVelocity;// 检查是否该停止惯性if (lastVelocity.magnitude < overshootMinSpeed || Vector3.Distance(overshootStartPosition, transform.position) > chaseSpeed * 3f){EndOvershoot();}}void EndOvershoot(){isOvershooting = false;rb.velocity = Vector3.zero;if (agent.isOnNavMesh){agent.Warp(transform.position);agent.isStopped = false;// 根据当前状态恢复行为if (currentState == MonsterState.Patrol){SetPatrolDestination();}else if (currentState == MonsterState.Chase && Vector3.Distance(transform.position, player.position) <= AngrydetectionRange){ChasePlayer();}}}void OnCollisionEnter(Collision collision){if (isOvershooting){// 撞墙反弹效果if (collision.gameObject.CompareTag("Wall")){lastVelocity = Vector3.Reflect(lastVelocity, collision.contacts[0].normal) * 0.7f;rb.velocity = lastVelocity;}// 撞到玩家if (collision.gameObject.CompareTag("Player")){//TODO://collision.gameObject.GetComponent<PlayerHealth>().TakeDamage(1);EndOvershoot();}}}public override void UpdateAnimation(){Vector3 moveDirection = isOvershooting ? rb.velocity : agent.velocity;//TODO:添加Animation后更新启用// if (moveDirection.magnitude > 0.1f)// {// animator.SetBool("IsMoving", true);// // // 确定方向(2.5D游戏通常只需要4方向)// if (Mathf.Abs(moveDirection.x) > Mathf.Abs(moveDirection.z))// {// animator.SetInteger("Direction", moveDirection.x > 0 ? 2 : 3); // Right/Left// }// else// {// animator.SetInteger("Direction", moveDirection.z > 0 ? 0 : 1); // Up/Down// }// // // 设置动画速度(惯性时更快)// animator.SetFloat("MoveSpeed", moveDirection.magnitude / (isOvershooting ? chaseSpeed * 1.5f : chaseSpeed));// }// else// {// animator.SetBool("IsMoving", false);// }//// // 更新惯性状态// animator.SetBool("IsOvershooting", isOvershooting);}void OnDrawGizmosSelected(){// 绘制巡逻路径if (patrolPoints != null && patrolPoints.Length > 0){Gizmos.color = Color.yellow;for (int i = 0; i < patrolPoints.Length; i++){if (patrolPoints[i] != null){Gizmos.DrawSphere(patrolPoints[i].position, 0.3f);if (i < patrolPoints.Length - 1 && patrolPoints[i+1] != null){Gizmos.DrawLine(patrolPoints[i].position, patrolPoints[i+1].position);}}}}// 绘制当前目标if (currentState == MonsterState.Patrol && patrolPoints != null && currentPatrolIndex < patrolPoints.Length){Gizmos.color = Color.red;Gizmos.DrawLine(transform.position, patrolPoints[currentPatrolIndex].position);}}
ok分享结束!
相关文章:
Unity 基于navMesh的怪物追踪惯性系统
今天做项目适合 策划想要实现一个在现有的怪物追踪系统上实现怪物拥有惯性功能 以下是解决方案分享: 怪物基类代码: using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …...
【OpenCV】【XTerminal】talk程序运用和linux进程之间通信程序编写,opencv图像库编程联系
目录 一、talk程序的运用&Linux进程间通信程序的编写 1.1使用talk程序和其他用户交流 1.2用c语言写一个linux进程之间通信(聊天)的简单程序 1.服务器端程序socket_server.c编写 2.客户端程序socket_client.c编写 3.程序编译与使用 二、编写一个…...
中断的硬件框架
今天呢,我们来讲讲中断的硬件框架,这里会去举3个开发板,去了解中断的硬件框架: 中断路径上的3个部件: 中断源 中断源多种多样,比如GPIO、定时器、UART、DMA等等。 它们都有自己的寄存器,可以…...
大数据面试问答-Hadoop/Hive/HDFS/Yarn
1. Hadoop 1.1 MapReduce 1.1.1 Hive语句转MapReduce过程 可分为 SQL解析阶段、语义分析阶段、逻辑计划生成阶段、逻辑优化阶段、物理计划生成阶段。 SQL解析阶段 词法分析(Lexical Analysis):使用Antlr3将SQL字符串拆分为有意义的token序列 语法分析(Syntax An…...
【小沐学GIS】基于C++绘制三维数字地球Earth(QT5、OpenGL、GIS、卫星)第五期
🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…...
初始图形学(3)
昨天休息了一天,今天继续图形学的学习 向场景发射光线 现在我们我们准备做一个光线追踪器。其核心在于,光线追踪程序通过每个像素发送光线。这意味着对于图像中的每个像素点,程序都会计算一天从观察者出发,穿过该像素的光线。并…...
如果想在 bean 创建出来之前和销毁之前做一些自定义操作可以怎么来实现呢?
使用生命周期扩展接口(最灵活) 创建前拦截可以通过实现 InstantiationAwareBeanPostProcessor 接口的 postProcessBeforeInstantiation 方法,在Bean实例化前执行逻辑 在销毁前拦截可以通过实现 DestructionAwareBean 接口的 postProcessBe…...
【甲子光年】DeepSeek开启AI算法变革元年
目录 引言人工智能的发展拐点算力拐点:DeepSeek的突破数据拐点:低参数量模型的兴起算法创新循环算法变革推动AI普惠应用全球AI科技竞争进入G2时代结论 引言 2025年,人工智能的发展已经走到了一个战略拐点。随着技术能力的不断提升࿰…...
Go语言--语法基础4--基本数据类型--整数类型
整型是所有编程语言里最基础的数据类型。 Go 语言支持如下所示的这些整型类型。 需要注意的是, int 和 int32 在 Go 语言里被认为是两种不同的类型,编译器也不会帮你自动做类型转换, 比如以下的例子会有编译错误: var value2 in…...
MCP基础学习计划详细总结
MCP基础学习计划详细总结 1.MCP概述与基础 • MCP(Model Context Protocol):由Anthropic公司于2024年11月推出,旨在实现大型语言模型(LLM)与外部数据源和工具的无缝集成。 • 核心功能: • 资…...
大模型到底是怎么产生的?一文揭秘大模型诞生全过程
前言 大模型到底是怎么产生的呢? 本文将从最基础的概念开始,逐步深入,用通俗易懂的语言为大家揭开大模型的神秘面纱。 大家好,我是大 F,深耕AI算法十余年,互联网大厂核心技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 【专栏介绍】: 欢迎关注《…...
Node.js介绍
一、Node.js 核心定义 本质:基于 Chrome V8 引擎构建的 JavaScript 运行时环境,用于在服务器端执行 JavaScript 代码。 定位:非阻塞、事件驱动的 I/O 模型,专为高并发、实时应用设计。 诞生:2009 年由 Ryan Dahl 发布…...
DRABP_NSGA2最新算法神圣宗教算法优化BP做代理模型,NSGA2反求最优因变量和对应的最佳自变量组合,Matlab代码
一、神圣宗教算法(DRA)优化BP代理模型 1. DRA的核心原理 DRA是一种模拟宗教社会层级互动的元启发式算法,通过“追随者学习”、“传教士传播”和“领导者引导”三种行为模式优化搜索过程。在BP神经网络优化中,DRA通过以下步骤调整…...
Android Studio 在 Windows 上的完整安装与使用指南
Android Studio 在 Windows 上的完整安装与使用指南—目录 一、Android Studio 简介二、下载与安装1. 下载 Android Studio2. 安装前的依赖准备3. 安装步骤 三、基础使用指南1. 首次启动配置2. 创建第一个项目3. 运行应用4. 核心功能 四、进阶功能配置1. 配置 SDK 和工具2. 自定…...
Matlab学习笔记五十:循环语句和条件语句的用法
1.说明 循环语句:for…end,while…end 条件语句:if…end,switch…case…end 其中if语句语法还可以是:for…else…end,for…elseif…else…end 2.简单for程序实例 for x1:5 %循环遍历1~5 yx5 end [1…...
大漠流光:科技牧歌的未来-内蒙古鄂尔多斯
故事背景 故事发生在中国内蒙古鄂尔多斯,这里是蒙古族文化的摇篮,也是科技与自然交织的未来舞台。在这片广袤的土地上,蒙古族少女、老牧人和工程师们共同谱写着一曲科技与传统共生的赞歌。未来的鄂尔多斯,不再是单一的沙漠或草原…...
MySQL与Oracle深度对比
MySQL与Oracle深度对比:数据类型与SQL差异 一、数据类型差异 1. 数值类型对比 数据类型MySQLOracle整数TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(内部仍为NUMBER)小数DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…...
GESP2023年12月认证C++七级( 第一部分选择题(6-10))
选择题第八题: #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int MAXN 1005; // 假设字符串长度不超过1000 char s1[MAXN], s2[MAXN]; int dp[MAXN]; // 一维DP数组int main() {while (cin >>…...
腾势品牌欧洲市场冲锋,科技豪华席卷米兰
在时尚与艺术的交汇点,米兰设计周的舞台上,一场汽车界的超级风暴正在酝酿,腾势品牌如一头勇猛无畏的雄狮,以雷霆万钧之势正式向欧洲市场发起了冲锋。其最新力作——腾势Z9GT的登场,仿佛是一道闪电划破夜空,…...
双指针、滑动窗口
一、双指针 双指针是指在算法中使用两个指针(通常是索引或迭代器)来解决问题,通过移动这两个指针来扫描数据结构(如数组或链表),从而达到高效的目的。双指针的核心思想是利用两个指针的相对位置或移动方式…...
《数据密集型应用系统设计》读书笔记:第二章
我们继续拆解 第2章:数据模型与查询语言。这章讲的是如何组织数据、如何访问数据,也是你选择数据库种类的根本依据。 第2章:数据模型与查询语言 一、为何数据模型重要? Martin 开篇就强调,数据模型影响: …...
ubuntu24.04LTS安装向日葵解决方案
去向日葵官方下载ubuntu使用的deb包 向日葵 输入如下命令安装,将具体版本修改成自己下载的版本 andrew in ~/下载 λ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 正在选中未选择的软件包 sunloginclient。 (正在读取数据库 ... 系统当前共安装有 290947…...
Python基础语法1
目录 1、认识Python 1.1、计算机 1.2、编程 1.3、编程语言的类别 1.4、Python背景 1.5、Python的应用场景 1.6、Python的优缺点 1.7、Python前景 1.8、Python 环境 2、常量和表达式 3、变量和类型 3.1、定义变量 3.2、使用变量 3.3、变量的类型 3.3.1、整形 3.3…...
深度学习中多机训练概念下的DP与DDP
在进行单机多卡/多机多卡训练时,通常会遇到DP与DDP的概念,为此基于kimi大模型对二者的差异进行梳理。使用DP/DPP的核心是数据并行,也就是根据显卡数量对数据集进行分治,每一个显卡都有一个独立完整的模型和一个局部数据。在多个显…...
设计模式(结构型)-桥接模式
目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域,随着系统规模和复杂性的不断攀升,如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…...
精品推荐 | 湖仓一体电商数据分析平台实践教程合集(视频教程+设计文档+完整项目代码)
精品推荐,湖仓一体电商数据分析平台实践教程合集,包含视频教程、设计文档及完整项目代码等资料,供大家学习。 1、项目背景介绍及项目架构 2、项目使用技术版本及组件搭建 3、项目数据种类与采集 4、实时业务统计指标分析一——ODS分层设计与数…...
【LangChain少样本提示工程实战】FewShotPromptTemplate原理与应用解析——附运行代码
目录 引言 重点提炼 一、FewShotPromptTemplate作用 1. 整合示例与模板,构建结构化提示 2. 引导模型理解任务逻辑 3. 提升少样本场景下的模型性能 4. 支持动态示例选择(扩展功能) 5. 与其他模块…...
基于LSTM的文本分类3——模型训练
前言 之前已经完成了模型搭建和文本数据处理,现在做一下模型训练。 源码 # -*- coding: UTF-8 -*- import numpy as np import torch import torch.nn as nn import torch.nn.functional as F from sklearn import metrics # 导入评估指标 import time from uti…...
【JS】关于原型/原型链
本文会讲解什么是原型,什么是原型链,以及查找原型的方法,最后会实现一个函数:判断某对象是否有某属性。 定义 原型:函数都有prototype属性,称作原型/原型对象 原型可以放一些方法和属性,共享…...
猫咪如厕检测与分类识别系统系列【五】信息存储数据库改进+添加猫咪页面制作+猫咪躯体匹配算法架构更新
前情提要 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如…...
k8s的配置文件总结
在 Kubernetes 中,配置文件 是定义集群资源的核心,通常以 YAML 或 JSON 格式编写。以下是 Kubernetes 中关键的配置文件类型及其作用: 1. 核心工作负载配置 (1) Deployment • 用途:定义无状态应用的 Pod 副本管理策略ÿ…...
插值算法 - 最近邻插值实现
目录 1. 导入必要的库 2. nearest_neighbor_interpolation 3. 测试代码 数学原理 完整代码 本文实现了基于最近邻插值算法的图像缩放功能。 它使用 Python 编写,主要依赖于NumPy和PIL(Python Imaging Library)库。 NumPy用于高效的数值计算,而PIL仅用于图像的加载和…...
QEMU源码全解析 —— 块设备虚拟化(19)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(18) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社 特此致谢! QEMU启动…...
常见的归一化(Normalization)方法
本文详解深度学习中常见的归一化方法。 【归一化是将数据按比例缩放,使之落入一个特定的区间】目录 1. 批量归一化(Batch Normalization,BN)1.1 数学原理1.2 代码示例 2. 层归一化(Layer Normalization,LN&…...
架构师面试(二十九):TCP Socket 编程
问题 今天考察网络编程的基础知识。 在基于 TCP 协议的网络 【socket 编程】中可能会遇到很多异常,在下面的相关描述中说法正确的有哪几项呢? A. 在建立连接被拒绝时,有可能是因为网络不通或地址错误或 server 端对应端口未被监听&#x…...
【高性能缓存Redis_中间件】二、redis进阶 高级特性及应用
一、前言 在第一篇文章中,我们已经对 Redis 消息队列有了基础的认识,掌握了其基本使用方法。然而,在实际的复杂业务场景中,仅仅运用基础功能是远远不够的。本篇文章将深入探讨 Redis 消息队列的高级特性,如消息确认机…...
vs2022 pcl1.15.0注意点
pcl1.15.0的版本变化很大,其中有一个地方需要设置成如下图所示 如果不设置生成的时候可能有以下错误: 严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 C1189 #error: "Potential runtime error due to…...
React Router路由
例子 // 创建Router实例对象 const router createBrowserRouter([{path:/login,element:<div>我是登录</div>},{path:/article,element:<div>我是文章</div> }])在jsx中配置一个RouterProvider组件 绑定 router{router} 常规的组件配置...
深度学习(一)
(Ⅰ)神经网络和深度学习 一,ReLU激活函数 ReLU(Rectified Linear Unit)函数,输入大于0时,直接输出该值;输入小于0时,输出0 代码实现: 图中的每个节点都可以是ReLU激活函数的一部分 二,循环神经…...
【LeetCode 热题100】二叉树遍历入门:从中序遍历到层序与右视图(力扣94 / 102/199)(Go语言版)
🌳 二叉树遍历入门:从中序遍历到层序与右视图 本文涵盖 LeetCode 上的三道基础但极具代表性的二叉树遍历题: 二叉树的中序遍历 二叉树的层序遍历 二叉树的右视图 通过这些题目,我们将从 DFS 到 BFS,深入理解如何处理…...
Tauri 2.3.1+Leptos 0.7.8开发桌面应用--Sqlite数据库的写入、展示和选择删除
在前期工作的基础上(Tauri2Leptos开发桌面应用--Sqlite数据库操作_tauri sqlite-CSDN博客),尝试制作产品化学成分录入界面,并展示数据库内容,删除选中的数据。具体效果如下: 一、前端Leptos程序 前端程序主…...
MySQL 5.7.43 二进制安装指南:从零开始的高效快速实现安装部署
目录 引言:为什么选择二进制安装? 1 环境准备 1.1 基础环境检查 1.2 系统安全设置 2 系统优化配置 2.1 磁盘调度策略 2.2 系统资源限制 3 mariadb删除 4 依赖包安装 5 MySQL二进制安装包下载 6 MySQL安装部署 6.1 解压安装包 6.2 创建用户以…...
使用U盘安装 ubuntu 系统
1. 准备U 盘制作镜像 1.1 下载 ubuntu iso https://ubuntu.com/download/ 这里有多个版本以供下载,本文选择桌面版。 1.2 下载rufus https://rufus.ie/downloads/ 1.3 以管理员身份运行 rufus 设备选择你用来制作启动项的U盘,不能选错了;点…...
【家政平台开发(42)】筑牢家政平台安全防线:安全测试与漏洞修复指南
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
JavaWeb-04-Web后端基础(SpringBootWeb、HTTP协议、分层解耦、IOC和DI)
目录 一、SpringBootWeb入门 1.1 概述 1.2 入门程序 1.2.1 需求 1.2.2 开发步骤 1.3 入门解析 二、HTTP协议 2.1 HTTP概述 2.1.1 介绍 2.1.2 特点 2.2 HTTP请求协议 2.2.1 介绍 2.2.2 获取请求数据 2.3 HTTP响应协议 2.3.1 格式介绍 2.3.2 响应状态码 2.3…...
随笔 20250413 Elasticsearch 的 term 查询
你这个问题非常经典,来自于 Elasticsearch 的 term 查询是 ✅精确匹配(case-sensitive,大小写敏感)! 🧨 为什么查不到 "World"? 你的查询语句是: GET /movie/_search {&…...
zk(Zookeeper)实现分布式锁
Zookeeper实现分布式锁 1,zk中锁的种类: 读锁:大家都可以读,要想上读锁的前提:之前的锁没有写锁 写锁:只有得到写锁的才能写。要想上写锁的前提是:之前没有任何锁 2,zk如何上读锁 创…...
操作系统简要概述
操作系统是计算机系统的核心软件,它管理和控制计算机硬件与软件资源,为用户提供方便、高效、安全的使用环境。以下是关于操作系统的详细介绍: 一、定义 操作系统(Operating System,简称 OS)是计算机硬件与…...
开漏模式的触发条件和工作状态
MOS管的漏-栅-源三极 漏极开路--开漏 电路整体概述 这是开漏(Open - Drain)电路结构,核心由输出控制模块和一对互补的MOS管(P - MOS和N - MOS)组成。开漏电路的特点是MOS管漏极开路,这种结构常用于需要实现…...
【Java学习笔记】Java第一课,梦开始的地方!!!
目录 1. 基本内容介绍和软件安装 2. 快速入门之第一个程序 hello world 3. 学习方法 基本介绍和软件安装 一、 Java 岗位与应用场景 说明:java 基础也称javaSE 岗位 1. javaEE 软件工程师 电商领域 团购 众筹 sns(社交网络) 教育 金…...