Unity中实现预制体自动巡逻与攻击敌人的完整实现指南

news2024/11/23 16:39:43

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Unity中实现预制体自动巡逻与攻击敌人的完整实现指南

文章目录

    • 前言
    • 1. 巡逻功能:
      • 1.1 引入命名空间
      • 1.2 定义 Patrol 类
      • 1.3 声明公共变量
      • 1.4 声明私有变量
      • 1.5 Start 方法
      • 1.6 Update 方法
      • 1.7 设置随机巡逻点的逻辑
      • 1.8 巡逻等待的协程
      • 1.9 巡逻功能总结
    • 2. 发现敌人:
      • 2.1 类声明
      • 2.2 声明公共变量
      • 2.3 声明私有变量
      • 2.4 Update 方法
      • 2.5 MoveToEnemy 方法
      • 2.6 发现敌人总结
    • 3. 攻击敌人:
      • 3.1 类声明
      • 3.2 声明公共变量
      • 3.3. 声明私有变量
      • 3.4. Update 方法
      • 3.5 Attack 方法
      • 3.6 攻击敌人总结
    • 4. 整合逻辑:
      • 4.1 定义枚举类型
      • 4.2 声明当前状态
      • 4.3 Update 方法
        • 4.3.1 巡逻状态
        • 4.3.2 追逐状态
        • 4.3.3 攻击状态
      • 4.4 整合逻辑总结
    • 总结

前言

  在当今游戏开发领域,自动化行为技术的应用已经成为游戏开发者们追求的热门话题。无论是为了增加游戏的趣味性、提升游戏体验,还是为了减轻开发者的工作负担,实现预制体自动化行为已经成为许多游戏项目的必备功能之一。本文将深入探讨如何在Unity游戏引擎中实现预制体自动巡逻并攻击敌人的全过程。

  在游戏开发中,预制体是一种非常常见的游戏对象,它们可以被重复使用并在场景中多次实例化。然而,让预制体具备自主行为、能够在游戏世界中自主移动、探索并与敌人交互,是一项具有挑战性的任务。本文将引导读者逐步实现预制体的自动化行为,包括目标位置到达后的随机巡逻、敌人发现与追击、攻击等关键步骤。

  通过本文的指导,读者将深入了解自动化行为背后的技术原理,学习如何利用Unity强大的功能和工具,为游戏角色赋予更加智能和自主的行为。无论是想要开发一款冒险游戏、射击游戏还是策略游戏,本文都将为您提供宝贵的指导和灵感,帮助您实现游戏中角色的自动化行为,为玩家带来更加丰富和有趣的游戏体验。

1. 巡逻功能:

  预制体在到达目标位置后,会在设定的范围内随机选择一个点作为新的目标位置,并移动到该点。

using UnityEngine;
using UnityEngine.AI;
 
public class Patrol : MonoBehaviour
{
    public Transform centerPoint; // 巡逻的中心点
    public float patrolRadius = 10f; // 巡逻半径
    public float patrolWaitTime = 2f; // 巡逻停留时间
    private NavMeshAgent agent;
    private Vector3 targetPosition;
 
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        SetRandomPatrolPoint();
    }
 
    void Update()
    {
        if (!agent.pathPending && agent.remainingDistance < 0.5f)
        {
            StartCoroutine(PatrolWait());
        }
    }
 
    // 设置随机的巡逻点
    void SetRandomPatrolPoint()
    {
        Vector3 randomDirection = Random.insideUnitSphere * patrolRadius;
        randomDirection += centerPoint.position;
        NavMeshHit hit;
        NavMesh.SamplePosition(randomDirection, out hit, patrolRadius, 1);
        targetPosition = hit.position;
        agent.SetDestination(targetPosition);
    }
 
    // 巡逻点到达后的等待
    IEnumerator PatrolWait()
    {
        yield return new WaitForSeconds(patrolWaitTime);
        SetRandomPatrolPoint();
    }
}

  这段代码是一个 Unity 脚本,主要用于实现一个 AI 角色的巡逻行为。下面是对代码的逐行解释:

1.1 引入命名空间

using UnityEngine;
using UnityEngine.AI;
  • UnityEngine 是 Unity 的核心命名空间,包含大多数常用类。

  • UnityEngine.AI 是用于处理导航和 AI 行为的命名空间,包含 NavMeshAgent 类。

1.2 定义 Patrol 类

public class Patrol : MonoBehaviour

  定义一个名为 Patrol 的公共类,继承自 MonoBehaviour。这使得 Patrol 可以被附加到 Unity 的游戏对象上,并具有 Unity 生命周期方法(如 Start 和 Update)。

1.3 声明公共变量

public Transform centerPoint; // 巡逻的中心点
public float patrolRadius = 10f; // 巡逻半径
public float patrolWaitTime = 2f; // 巡逻停留时间
  • centerPoint: 一个 Transform 类型的公共变量,用于定义巡逻的中心点(AI 角色的巡逻范围中心)。

  • patrolRadius: 一个 float 类型的公共变量,定义 AI 角色巡逻的半径,默认为 10。

  • patrolWaitTime: 一个 float 类型的公共变量,定义 AI 角色在每个巡逻点停留的时间,默认为 2 秒。

1.4 声明私有变量

private NavMeshAgent agent;
private Vector3 targetPosition;
  • agent: 一个 NavMeshAgent 类型的私有变量,用于获取和控制 AI 角色的导航行为。

  • targetPosition: 一个 Vector3 类型的私有变量,用于存储 AI 角色当前巡逻的目标位置。

1.5 Start 方法

void Start()
{
    agent = GetComponent<NavMeshAgent>();
    SetRandomPatrolPoint();
}

Start 方法在游戏开始时被调用。

  • agent = GetComponent(): 获取附加在该游戏对象上的 NavMeshAgent 组件,并将其赋值给 agent 变量。

  • SetRandomPatrolPoint(): 调用 SetRandomPatrolPoint 方法,初始化 AI 的巡逻目标点。

1.6 Update 方法

void Update()
{
    if (!agent.pathPending && agent.remainingDistance < 0.5f)
    {
        StartCoroutine(PatrolWait());
    }
}

Update 方法在每一帧被调用。

  • if (!agent.pathPending && agent.remainingDistance < 0.5f): 检查 AI 角色是否已经到达目标位置(remainingDistance 小于 0.5 表示接近目标)。pathPending 表示当前是否还有路径计算未完成。

  • StartCoroutine(PatrolWait()): 如果到达目标位置,则启动一个协程,调用 PatrolWait 方法。

1.7 设置随机巡逻点的逻辑

void SetRandomPatrolPoint()
{
    Vector3 randomDirection = Random.insideUnitSphere * patrolRadius;
    randomDirection += centerPoint.position;
    NavMeshHit hit;
    NavMesh.SamplePosition(randomDirection, out hit, patrolRadius, 1);
    targetPosition = hit.position;
    agent.SetDestination(targetPosition);
}
  • Vector3 randomDirection = Random.insideUnitSphere * patrolRadius;: 生成一个在球体内的随机方向,并乘以 patrolRadius,以得到一个随机方向的偏移量。

  • randomDirection += centerPoint.position;: 将随机偏移量添加到巡逻中心点的坐标,确定目标位置。

  • NavMeshHit hit;: 声明一个 NavMeshHit 变量,用于接收导航网格采样结果。

  • NavMesh.SamplePosition(randomDirection, out hit, patrolRadius, 1);: 在 randomDirection 位置附近采样,找到一个有效的导航网格位置,并将结果存储在 hit 中。

  • targetPosition = hit.position;: 将有效的目标位置赋值给 targetPosition。

  • agent.SetDestination(targetPosition);: 将 AI 角色的目标位置设置为新的巡逻点,使其开始移动。

1.8 巡逻等待的协程

IEnumerator PatrolWait()
{
    yield return new WaitForSeconds(patrolWaitTime);
    SetRandomPatrolPoint();
}
  • IEnumerator PatrolWait(): 定义一个协程方法,允许使用 yield return。

  • yield return new WaitForSeconds(patrolWaitTime);: 暂停协程执行,等待 patrolWaitTime 秒。

  • SetRandomPatrolPoint();: 等待结束后,调用 SetRandomPatrolPoint 方法,设置新的巡逻目标点。

1.9 巡逻功能总结

  这段代码实现了一个 AI 角色在指定中心点周围巡逻的行为。它会在每个目标点停留一定时间后,再随机选择新的目标点,并利用 Unity 的导航系统(NavMesh)来处理移动。这样可以创建一个简单的巡逻行为,适用于 NPC(非玩家角色)在游戏中的导航。

2. 发现敌人:

  在巡逻过程中,如果在一定范围内发现敌人(使用 Physics.OverlapSphere 或者 Physics.Raycast),预制体会停止巡逻并向敌人移动。

public class DetectEnemy : MonoBehaviour
{
    public float detectionRadius = 15f; // 发现敌人的范围
    public LayerMask enemyLayer; // 敌人的图层
    private GameObject enemyTarget;
 
    void Update()
    {
        Collider[] hitColliders = Physics.OverlapSphere(transform.position, detectionRadius, enemyLayer);
        if (hitColliders.Length > 0)
        {
            enemyTarget = hitColliders[0].gameObject;
            MoveToEnemy();
        }
    }
 
    void MoveToEnemy()
    {
        NavMeshAgent agent = GetComponent<NavMeshAgent>();
        agent.SetDestination(enemyTarget.transform.position);
    }
}

  这段 Unity 脚本代码实现了一个 AI 角色检测敌人并朝向敌人移动的功能。下面是对代码逐行的解释:

2.1 类声明

public class DetectEnemy : MonoBehaviour

  定义一个名为 DetectEnemy 的公共类,继承自 MonoBehaviour。这意味着该类可以被附加到 Unity 中的游戏对象,并能够使用 Unity 的生命周期方法。

2.2 声明公共变量

public float detectionRadius = 15f; // 发现敌人的范围
public LayerMask enemyLayer; // 敌人的图层
  • detectionRadius: 一个公共变量,类型为 float,用于定义 AI 角色检测敌人的半径,默认为 15。

  • enemyLayer: 一个公共变量,类型为 LayerMask,用于指定哪些图层被视为敌人。这使得该 AI 角色能够仅检测特定类型的对象。

2.3 声明私有变量

private GameObject enemyTarget;
  • enemyTarget: 一个私有变量,类型为 GameObject,用于存储检测到的敌人对象的引用。

2.4 Update 方法

void Update()
{
    Collider[] hitColliders = Physics.OverlapSphere(transform.position, detectionRadius, enemyLayer);
    if (hitColliders.Length > 0)
    {
        enemyTarget = hitColliders[0].gameObject;
        MoveToEnemy();
    }
}

Update 方法在每一帧被调用,用于检查和更新 AI 角色的状态。

  • Collider[] hitColliders = Physics.OverlapSphere(transform.position, detectionRadius, enemyLayer);: 使用 Physics.OverlapSphere 方法在 AI 角色的位置(transform.position)周围创建一个球体,以 detectionRadius 为半径,检测所有与 enemyLayer 图层相交的碰撞体(即敌人)。返回的碰撞体存储在 hitColliders 数组中。

  • if (hitColliders.Length > 0): 检查是否检测到了任何敌人(即 hitColliders 数组的长度是否大于 0)。

  • enemyTarget = hitColliders[0].gameObject;: 如果检测到敌人,获取第一个敌人的引用,并将其赋值给 enemyTarget 变量。

  • MoveToEnemy();: 调用 MoveToEnemy 方法,指示 AI 角色朝向敌人移动。

2.5 MoveToEnemy 方法

void MoveToEnemy()
{
    NavMeshAgent agent = GetComponent<NavMeshAgent>();
    agent.SetDestination(enemyTarget.transform.position);
}
  • void MoveToEnemy(): 定义一个私有方法,用于处理朝向敌人移动的逻辑。

  • NavMeshAgent agent = GetComponent();: 获取附加在该游戏对象上的 NavMeshAgent 组件,并将其赋值给 agent 变量,以便使用导航功能。

  • agent.SetDestination(enemyTarget.transform.position);: 将 AI 角色的目标位置设置为 enemyTarget(即敌人)的当前位置,使 AI 角色开始向敌人移动。

2.6 发现敌人总结

  这段代码实现了一个基本的敌人检测系统,允许 AI 角色在指定半径内检测到敌人,并朝向第一个检测到的敌人移动。它利用 Unity 的物理系统(Physics.OverlapSphere)和导航系统(NavMeshAgent)来实现这一功能。这个脚本可以用于游戏中 AI 角色的敌人追踪行为。

3. 攻击敌人:

  当预制体靠近敌人一定距离时,执行攻击动作。

public class AttackEnemy : MonoBehaviour
{
    public float attackRange = 2f; // 攻击范围
    public float attackCooldown = 1.5f; // 攻击冷却时间
    private float lastAttackTime;
 
    void Update()
    {
        if (enemyTarget != null && Vector3.Distance(transform.position, enemyTarget.transform.position) <= attackRange)
        {
            if (Time.time >= lastAttackTime + attackCooldown)
            {
                Attack();
                lastAttackTime = Time.time;
            }
        }
    }
 
    void Attack()
    {
        // 攻击行为,例如减去敌人生命值
        Debug.Log("Attacking the enemy!");
    }
}

  这段 Unity 脚本代码实现了一个 AI 角色攻击敌人的功能。下面是对代码逐行的解释:

3.1 类声明

public class AttackEnemy : MonoBehaviour

  定义一个名为 AttackEnemy 的公共类,继承自 MonoBehaviour。这意味着该类可以被附加到 Unity 的游戏对象上,并能够使用 Unity 的生命周期方法。

3.2 声明公共变量

public float attackRange = 2f; // 攻击范围
public float attackCooldown = 1.5f; // 攻击冷却时间
  • attackRange: 一个公共变量,类型为 float,用于定义 AI 角色攻击的有效范围,默认为 2(单位通常为米)。

  • attackCooldown: 一个公共变量,类型为 float,用于定义攻击之间的冷却时间,默认为 1.5 秒。

3.3. 声明私有变量

private float lastAttackTime;
  • lastAttackTime: 一个私有变量,类型为 float,用于记录上一次攻击的时间。这有助于管理攻击的冷却时间。

3.4. Update 方法

void Update()
{
    if (enemyTarget != null && Vector3.Distance(transform.position, enemyTarget.transform.position) <= attackRange)
    {
        if (Time.time >= lastAttackTime + attackCooldown)
        {
            Attack();
            lastAttackTime = Time.time;
        }
    }
}

Update 方法在每一帧被调用,用于检查 AI 角色的攻击条件。

  • if (enemyTarget != null && Vector3.Distance(transform.position, enemyTarget.transform.position) <= attackRange):

首先检查 enemyTarget 是否为 null,确保 AI 角色已经有目标。

使用 Vector3.Distance 方法计算 AI 角色与敌人之间的距离。如果距离小于或等于 attackRange,则表示敌人在攻击范围内。

  • if (Time.time >= lastAttackTime + attackCooldown): 检查当前时间是否大于等于上一次攻击时间加上冷却时间。如果满足条件,表示可以进行下一次攻击。

  • Attack();: 调用 Attack 方法,执行攻击动作。

  • lastAttackTime = Time.time;: 更新 lastAttackTime 为当前时间,以记录本次攻击的时间。

3.5 Attack 方法

void Attack()
{
    // 攻击行为,例如减去敌人生命值
    Debug.Log("Attacking the enemy!");
}
  • void Attack(): 定义一个私有方法,用于处理攻击行为。

  在方法中,通过 Debug.Log 输出信息,表示正在攻击敌人。这一行代码只是示例,实际游戏中可以替换为减少敌人生命值、播放攻击动画、音效等攻击逻辑。

3.6 攻击敌人总结

  这段代码实现了 AI 角色在一定范围内检测敌人并进行攻击的功能。它使用冷却机制来控制攻击的频率,确保 AI 不会在攻击之间过于频繁地进行攻击。这个脚本可以与敌人检测和移动脚本结合使用,以实现完整的 AI 行为模式。

4. 整合逻辑:

  将巡逻、发现敌人和攻击的逻辑整合在一个脚本或通过多个脚本管理,使得预制体能在巡逻、发现敌人、追逐敌人和攻击之间进行状态切换。你可以使用状态机来更清晰地管理这些状态的切换。

public enum AIState { Patrol, Chase, Attack }
public AIState currentState = AIState.Patrol;
 
void Update()
{
    switch (currentState)
    {
        case AIState.Patrol:
            Patrol();
            if (DetectEnemy())
                currentState = AIState.Chase;
            break;
        case AIState.Chase:
            ChaseEnemy();
            if (IsInAttackRange())
                currentState = AIState.Attack;
            break;
        case AIState.Attack:
            AttackEnemy();
            if (!IsInAttackRange())
                currentState = AIState.Chase;
            break;
    }
}

  这段 Unity 脚本代码实现了一个简单的 AI 状态机,用于控制 AI 角色在不同状态下的行为。这种设计模式可以帮助开发者管理复杂的角色行为,使其在不同情境下表现出不同的反应。以下是对代码逐行的解释:

4.1 定义枚举类型

public enum AIState { Patrol, Chase, Attack }

public enum AIState: 定义一个公共枚举类型 AIState,用于表示 AI 角色的不同状态。

  • 枚举包含三个状态:

  • Patrol: 巡逻状态。

  • Chase: 追逐状态。

  • Attack: 攻击状态。

4.2 声明当前状态

public AIState currentState = AIState.Patrol;

  public AIState currentState: 声明一个公共变量 currentState,用于存储 AI 角色的当前状态。

  • = AIState.Patrol: 初始化 currentState 为 Patrol,表示 AI 角色开始时处于巡逻状态。

4.3 Update 方法

void Update()
{
    switch (currentState)
    {
        case AIState.Patrol:
            Patrol();
            if (DetectEnemy())
                currentState = AIState.Chase;
            break;
        case AIState.Chase:
            ChaseEnemy();
            if (IsInAttackRange())
                currentState = AIState.Attack;
            break;
        case AIState.Attack:
            AttackEnemy();
            if (!IsInAttackRange())
                currentState = AIState.Chase;
            break;
    }
}

Update 方法在每一帧被调用,用于检查并执行 AI 角色的行为。

  • switch (currentState): 根据 currentState 的值,执行不同的代码块。
4.3.1 巡逻状态
case AIState.Patrol:
    Patrol();
    if (DetectEnemy())
        currentState = AIState.Chase;
    break;
  • Patrol();: 调用 Patrol 方法,执行巡逻行为。

  • if (DetectEnemy()): 检测是否发现敌人,如果发现,切换状态为 Chase(追逐)。

4.3.2 追逐状态
case AIState.Chase:
    ChaseEnemy();
    if (IsInAttackRange())
        currentState = AIState.Attack;
    break;
  • ChaseEnemy();: 调用 ChaseEnemy 方法,执行追逐敌人的行为。

  • if (IsInAttackRange()): 检查是否在攻击范围内,如果是,切换状态为 Attack(攻击)。

4.3.3 攻击状态
case AIState.Attack:
    AttackEnemy();
    if (!IsInAttackRange())
        currentState = AIState.Chase;
    break;
  • AttackEnemy();: 调用 AttackEnemy 方法,执行攻击行为。

  • if (!IsInAttackRange()): 检查是否不再处于攻击范围内。如果不在攻击范围内,切换状态为 Chase(追逐),重新开始追逐敌人。

4.4 整合逻辑总结

  这段代码实现了一个简单的 AI 状态机,使得 AI 角色能够根据当前的状态执行相应的行为:巡逻、追逐或攻击敌人。通过使用状态机,AI 能够更灵活地管理行为,便于扩展和维护。具体的巡逻、追逐和攻击行为需要在其他方法(如 Patrol、ChaseEnemy 和 AttackEnemy)中实现。

总结

  通过使用Unity中的NavMeshAgent实现预制体的随机巡逻,结合Physics.OverlapSphere检测敌人并触发追击状态,以及在距离足够近时执行攻击动作,我们成功地实现了预制体的自动化行为。通过合理的状态切换逻辑管理预制体的行为,我们为游戏角色赋予了智能和自主性,使其能够在游戏世界中自主探索、发现敌人并进行攻击。这种综合应用不仅提升了游戏的交互性和挑战性,也为开发者们提供了实现自动化行为的有效方法,为游戏开发注入了新的活力和可能性。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

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

相关文章

C语言 | Leetcode C语言题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; const int dx[4] {0, 1, 0, -1}; const int dy[4] {1, 0, -1, 0};int dfs(int x, int y, int** grid, int n, int m) {if (x < 0 || x > n || y < 0 || y > m || grid[x][y] 0) {return 1;}if (grid[x][y] 2) {return 0;}g…

读数据工程之道:设计和构建健壮的数据系统02数据工程师

1. 背景和技能 1.1. 数据工程是一个快速发展的领域&#xff0c;关于如何成为一名数据工程师仍然存在很多问题 1.2. 进入数据工程领域的人在教育、职业和技能方面有着不同的背景 1.2.1. 每个进入该领域的人都应该投入大量的时间进行自学 1.3. 从一个邻近的领域转到数据工程是…

【STM32开发之寄存器版】(七)-PWM脉冲宽度调制

一、前言 PWM简介 PWM&#xff08;脉宽调制&#xff09;是一种通过调节信号的脉冲宽度来控制功率输出的技术。其基本原理是保持固定频率的信号&#xff0c;将其高电平和低电平的持续时间调整&#xff0c;达到控制平均功率的目的。应用方面&#xff0c;PWM广泛用于电机控制、LED…

LeetCode 3310. 移除可疑的方法

LeetCode 3310. 移除可疑的方法 你正在维护一个项目&#xff0c;该项目有 n 个方法&#xff0c;编号从 0 到 n - 1。 给你两个整数 n 和 k&#xff0c;以及一个二维整数数组 invocations&#xff0c;其中 invocations[i] [ai, bi] 表示方法 ai 调用了方法 bi。 已知如果方法 k…

Qt创建插件及使用

本文使用“Qt Creator 6.0.1”和“Qt 6.2.2”完成插件创建及使用&#xff0c;主要有如下步骤&#xff1a;&#xff08;1&#xff09;创建子目录项目MyProject&#xff1b;&#xff08;2&#xff09;在子目录项目中创建应用程序项目MyApp&#xff1b;&#xff08;3&#xff09;在…

python实现RC4加解密算法

RC4算法 一、算法介绍1.1 背景1.2 密钥调度算法(KSA)1.3 伪随机生成算法(PRGA) 二、代码实现三、演示效果 一、算法介绍 1.1 背景 RC4算法是由Ron Rivest在1987年为RSA数据安全公司设计的一种流密码算法&#xff0c;其安全性主要依赖于其密钥流的随机性和不可预测性。该算法因…

Spring Cloud 3.x 集成admin快速入门Demo

1.什么是Spring Boot Admin&#xff1f; Spring Boot Admin(SBA)是一个社区开源项目&#xff0c;用于管理和监视Spring Boot 应用程序&#xff0c;它提供详细的健康(Health)信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Spring Boot 缓存…

Steam Deck掌机可装“黑苹果” 开发者成功安装macOS 15 Sequoia

在Steam Deck掌机上运行Windows 11相对轻松&#xff0c;但要让其成功搭载“黑苹果”系统则颇具挑战性。近日&#xff0c;有博主勇于尝试&#xff0c;将macOS 15 Sequoia安装到了Steam Deck上。 开发者kaitlyn在X平台上分享道&#xff1a;“在朋友们的鼎力相助下&#xff0c;我…

【机器学习】KNN算法及鸢尾花案例练习

KNN 算法 knn算法思想 : K-近邻算法&#xff08;K Nearest Neighbor&#xff0c;简称KNN&#xff09;。比如&#xff1a;根据你的“邻居”来推断出你的类别 如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别 常见距…

Mybatis测试案例

1.创建springboot工程 创建实体类user和接口 user类 注意&#xff1a;java和mysql的对象的属性数据类型要一致 mapper接口 2.配置mybatis(连接数据库信息) # spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #地址url spring.datasource.urljdbc:mysql://localho…

虚拟仿真产品图册生成器,上传PDF即可实现

随着科技的飞速发展&#xff0c;我国各行各业对虚拟仿真的需求越来越大&#xff0c;尤其在产品设计、制造、销售等领域&#xff0c;虚拟仿真技术已经成为了企业提高竞争力的重要手段。为了让企业能够更方便、快捷地展示产品&#xff0c;给大家推荐一款创新性的工具——FLBOOK在…

说说BPMN概念及应用

BPMN&#xff08;Business Process Modeling and Notation&#xff09;即业务流程建模与标注&#xff0c;是一种由OMG&#xff08;Object Management Group&#xff0c;对象管理组织&#xff09;制定的业务流程建模语言。以下是对BPMN标准的详细解释&#xff1a; 一、BPMN的起…

Linux操作系统垃圾清理

Linux操作系统虽然是一个占用资源少、结构简洁的计算机系统软件&#xff0c;但长时间频繁使用、安装软件较多后也是会产生不少系统垃圾的。使用Debian系Linux操作系统的用户可以使用麒麟管家中的垃圾清理工具清理&#xff0c;也可以下载安装BleachBit软件进行清理操作。 一、麒…

Studying-多线程学习Part3 - condition_variable与其使用场景、C++11实现跨平台线程池

来源&#xff1a;多线程学习 目录 condition_variable与其使用场景 生产者与消费者模型 C11实现跨平台线程池 condition_variable与其使用场景 生产者与消费者模型 生产者-消费者模式是一种经典的多线程设计模式&#xff0c;用于解决多个线程之间的数据共享和协作问题。…

『网络游戏』动态界面制作创建角色UI【02】

将上一章的登录界面隐藏 创建空物体重命名为CreateWnd 自适应铺满父物体 创建image重命名为bg并铺满 将以下资源图片放进Art文件夹 设置为精灵模式 填充背景 创建介绍Image面板与角色按钮 制作将3D模型动态防止UI界面上 首先创建RawImage 创建RenderTextures文件夹 创建Render…

输电线路缺陷图像检测数据集,导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 1988张

输电线路缺陷图像检测数据集&#xff0c;分为导线散股&#xff0c;塔材锈蚀两类&#xff0c;分别为581张和1407张&#xff0c;标注为xml和txt格式 数据集名称 输电线路缺陷图像检测数据集 (Transmission Line Defect Detection Dataset) 数据集概述 该数据集是一个专门用于训…

红队apt--文本宏病毒攻击思路整理

免责声明:本文仅用于了解攻击方手法&#xff0c;用于提高防范意识。禁止用于非法用途 前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理文本类病毒攻击思路 宏简介 这个东西可以直接当做编程理解。用于创建模版(简历模版),定制化需求&#xff0c;自…

【数据管理】DAMA-元数据专题

导读&#xff1a;元数据是关于数据的组织、数据域及其关系的信息&#xff0c;是描述数据的数据。在数据治理中&#xff0c;元数据扮演着至关重要的角色&#xff0c;是数据治理的基础和支撑。以下是对数据治理中元数据专题方案的详细介绍&#xff1a; 目录 一、元数据的重要性 …

基于STM32的智能门锁控制系统设计

引言 本项目基于STM32微控制器设计了一个智能门锁控制系统&#xff0c;用户可以通过密码输入或指纹识别来控制门锁的开关。该系统集成了键盘、指纹传感器、舵机等外设&#xff0c;实现了门锁的安全、便捷控制&#xff0c;同时也具备了较强的扩展性。该项目展示了STM32在安防领…