当前位置: 首页 > news >正文

四、综合案例(Unity2D)

一、2D渲染

1、2D相机基本设置

上面是透视,下面是正交

2、图片资源

在Unity中,常规图片导入之后,一般不在Unity中直接使用,而是转为精灵图Sprite

将图片更改为即可使用Unity内置的图片切割功能

无论精灵图片是单个的还是多个的,都可以选择中心点

3、相关组件

 

在排序图层中,越靠下的,越先渲染

也就是说,靠近摄像机的因该是最下方的图层

二、Unity输入系统

1、按键检测

关于键盘的

if (Input.GetKeyDown(KeyCode.A))
{Debug.Log("A按下了!");
}
if (Input.GetKey(KeyCode.A))
{Debug.Log("A持续按住!");
}
if (Input.GetKeyUp(KeyCode.A))
{Debug.Log("A弹起了!");
}

 

2、鼠标检测

和键盘区别不大,只是调用的API不同

注:0是左键;1是右键;2是鼠标中键

if (Input.GetMouseButtonDown(0))
{Debug.Log("鼠标左键按下");
}
if (Input.GetMouseButton(0))
{Debug.Log("鼠标左键按住");
}
if (Input.GetMouseButtonUp(0))
{Debug.Log("鼠标左键抬起");
}

 

3、InputManager

在Unity的设置中找到输入部分,即可看到默认绑定的按键

一个简单的移动代码

float inputX = Input.GetAxis("Horizontal");
float inputY = Input.GetAxis("Vertical");
float speed = 5;
transform.Translate(Time.deltaTime * speed * new Vector3(inputX, inputY, 0));

注:这里的速度乘以时间,放在前面,避免一些不必要的消耗

三、Unity2D动画概览

1、Animator组件

先在窗口上添加一个动画组件

一定是下面这个。上面这个是比较老的技术了

2、AnimatorController:动画控制器

3、AnimationClip:动画片段 

四、动画录制 

在Unity内制作动画

在录制时,必须开启录制按钮,可以选择数据,也可以修改数据,录制时会自动记录下来

也可以添加颜色

 五、动画切换

 

通过参数进行切换,小于或者大于

 2D人物的简单移动代码

public Animator animator;
public float movespeed = 0.00001f;
public SpriteRenderer spriteRenderer;
private void Start()
{spriteRenderer= gameObject.GetComponent<SpriteRenderer>();
}// Update is called once per frame
void Update()
{animator.GetComponent<Animator>();float inputX = Input.GetAxis("Horizontal");float inputY = Input.GetAxis("Vertical");//修改动画bool isMove = inputX != 0 || inputY!=0;animator.SetBool("Move", isMove);//转向if (inputX > 0) spriteRenderer.flipX = false;else if (inputX < 0) spriteRenderer.flipX = true;//位移Vector3 pos =new Vector3(inputX * Time.deltaTime * movespeed,inputY * Time.deltaTime * movespeed,0);transform.Translate(pos, Space.Self);
}

六、动画事件

在动画的某一帧触发某个函数;

原理是:在当前动画物体上的脚本里面 是否有一个事件;必须是公开的

在此处添加动画事件;

选择动画事件代码

public void Colore()
{transform.localScale=new Vector3(3, 3, 3);Debug.Log("1");
}

 

执行到这个事件时,会执行这个函数 

七、2D物理系统

每个人都需要有碰撞器,只要有一个有刚体

事件触发函数

private void OnCollisionEnter2D(Collision2D collision)
{}
private void OnCollisionStay2D(Collision2D collision)
{}
private void OnCollisionExit2D(Collision2D collision)
{}

碰撞与触发不能共存

触发函数代码

private void OnTriggerEnter2D(Collider2D collision)
{}
private void OnTriggerStay2D(Collider2D collision)
{}
private void OnTriggerExit2D(Collider2D collision)
{}

 八、主角控制(综合案例)

在玩家身上挂载一个触发器,不需要碰撞

挂载脚本

public class Game : MonoBehaviour
{public Animator animator;public float movespeed;public SpriteRenderer spriteRenderer;bool Big=false;private void Start(){spriteRenderer= gameObject.GetComponent<SpriteRenderer>();}// Update is called once per framevoid Update(){animator.GetComponent<Animator>();float inputX = Input.GetAxis("Horizontal");float inputY = Input.GetAxis("Vertical");//修改动画bool isMove = inputX != 0 || inputY!=0;animator.SetBool("Move", isMove);//转向if (inputX > 0) spriteRenderer.flipX = false;else if (inputX < 0) spriteRenderer.flipX = true;//位移Vector3 pos =new Vector3(inputX * Time.deltaTime * movespeed,inputY * Time.deltaTime * movespeed,0);transform.Translate(pos, Space.Self);}}

由于人物比较小,调节一下摄像机距离

九、发射子弹

子弹一般都是预制体;

需要一个公开获取预制体;一个生成子弹的点位;一个if循环判断按键和实例化

子弹飞行是自己的逻辑;挂载在预制体上面;

private void Shoot()
{if (Input.GetKeyDown(KeyCode.J)){//实例化GameObject star=GameObject.Instantiate(starPrefab);star.transform.position = starShootPoint.position;}
}

创建一个动画,模拟子弹射出

旋转360° 然后旋转720°

将动画勾选为循环

在预制体子弹上面挂在一个动画状态机,放入旋转动画

挂载子弹的代码

public float moveSpeed;private Vector3 moveDir;public float destroyTime=3;private float destroyTimer;//计时器public void Init(Vector3 dir){moveDir = dir;destroyTimer = destroyTime;}// Update is called once per framevoid Update(){transform.Translate(moveSpeed * Time.deltaTime * moveDir,Space.World);if (destroyTimer <= 0){Destroy(gameObject);}else{destroyTimer-=Time.deltaTime;}}

由于子弹自身有旋转,所以坐标会一直更改,需要传入一个方向初始化

在玩家代码中调用

//实例化
GameObject star=GameObject.Instantiate(starPrefab);
star.transform.position = starShootPoint.position;
bool isRightDir = spriteRenderer.flipX == false;
Vector3 moveDir = isRightDir ? transform.right : -transform.right;
Debug.Log(moveDir);
star.GetComponent<Star>().Init(moveDir);

先实例化这个预制体;把生成点赋值给预制体的当前坐标

通过bool判断是左还是右

然后获取预制体代码中的初始化方法,并传入方向

然后写一个计时器,让子弹销毁

public class Game : MonoBehaviour
{public Animator animator;public float movespeed;public SpriteRenderer spriteRenderer;public GameObject starPrefab;public Transform starShootPoint;//CDprivate float shootCD = 1;private float shootCDTimer;private void Start(){spriteRenderer= gameObject.GetComponent<SpriteRenderer>();}// Update is called once per framevoid Update(){Move(); Shoot();}private void Move(){animator.GetComponent<Animator>();float inputX = Input.GetAxis("Horizontal");float inputY = Input.GetAxis("Vertical");//修改动画bool isMove = inputX != 0 || inputY != 0;animator.SetBool("Move", isMove);//转向if (inputX > 0) spriteRenderer.flipX = false;else if (inputX < 0) spriteRenderer.flipX = true;//位移Vector3 pos =new Vector3(inputX * Time.deltaTime * movespeed,inputY * Time.deltaTime * movespeed,0);transform.Translate(pos, Space.Self);}private void Shoot(){if (shootCDTimer > 0){shootCDTimer-= Time.deltaTime;return;}if (Input.GetKeyDown(KeyCode.J)){shootCDTimer = shootCD;//实例化GameObject star=GameObject.Instantiate(starPrefab);star.transform.position = starShootPoint.position;bool isRightDir = spriteRenderer.flipX == false;Vector3 moveDir = isRightDir ? transform.right : -transform.right;Debug.Log(moveDir);star.GetComponent<Star>().Init(moveDir);}}
}

十、怪物生成

1、配置一些坐标生成怪物

创建一个空物体,挂载怪物的代码

对怪物的基础配置进行设置:

这里有一个方法;使用class类,然后把这个类作为一个数组,公开这个数组为public即可

/// <summary>
/// 怪物生成点
/// </summary>
[Serializable]
public class MonsterSpawnPoint
{public Transform spawnPoint;//生成点public GameObject monsterPrefab;//怪物预制体public float spawnInterval;//怪物生成间隔//这里的计时器不想序列化,但是需要获取,所以改为属性public float SpawnTimer { get; set; }
}
public MonsterSpawnPoint[] monsterSpawnPoints;

 

小技巧:把动画片段全部选中拖拽进入层级面板中,可以快速地生成动画和动画状态

2、按照一个频率生成怪物

现在面板上设置了预制体和生成间隔

我们做一个计时器,计时器命名为Timer

用一个for循环遍历这5个数组

声明一个局部变量类,让每一次循环都赋值给这个局部变量类,也就是每一次循环Point都获取了数组中的参数;

使用计时器,先让他小于零;

做一个判断如果小于零,那么就把生成间隔赋值给计时器;

并且实例化类中的预制体,把类中的生成点赋值给怪物的当前位置;

private void Update()
{for (int i=0;i< monsterSpawnPoints.Length;i++){MonsterSpawnPoint point= monsterSpawnPoints[i];point.SpawnTimer-=Time.deltaTime;//这里的计时器一开始就会小于零if (point.SpawnTimer <= 0)//一定会小于零{point.SpawnTimer = point.spawnInterval;//就把生成间隔赋值给计时器GameObject monster = GameObject.Instantiate(point.monsterPrefab);monster.transform.position = point.spawnPoint.position;}}
}

现在对代码进行一下优化,

public class MonsterManager : MonoBehaviour
{/// <summary>/// 怪物生成点/// </summary>[Serializable]public class MonsterSpawnPoint{public Transform spawnPoint;//生成点public GameObject monsterPrefab;//怪物预制体public float spawnInterval;//怪物生成间隔//这里的计时器不想序列化,但是需要获取,所以改为属性public float SpawnTimer { get; set; }public void Update(float deltaTime){SpawnTimer -= Time.deltaTime;//这里的计时器一开始就会小于零if (SpawnTimer <= 0)//一定会小于零{SpawnTimer = spawnInterval;//就把生成间隔赋值给计时器GameObject monster = GameObject.Instantiate(monsterPrefab);monster.transform.position = spawnPoint.position;}}}public MonsterSpawnPoint[] monsterSpawnPoints;private void Update(){for (int i=0;i< monsterSpawnPoints.Length;i++){monsterSpawnPoints[i].Update(Time.deltaTime);}}
}

因为update中调用其他类中的变量,不如直接调用update封装起来

所以在Update中定义一个参数(时间),因为调用这个update传入的参数是Time.deltatime

把生成的逻辑封装起来在Update中

在主update中,每一个for循环之后,数组的第i次循环调用这个UPdate,并传入每时每秒。

十一、怪物移动逻辑

一直去追玩家,如果解除了玩家则玩家失败;

首先把玩家设置成单例;在怪物类中先设置一个判断;判断玩家是否为空,也就是死亡状态

if (Game.Instance == null) return;

计算玩家到敌人的距离,方法是使用向量,用敌人的当前坐标 减去 自己的当前坐标

Vector3 moveDir=Game.Instance.transform.position-transform.position;

 然后进行位移

transform.Translate(moveSpeed * Time.deltaTime * moveDir,Space.World);

 此时敌人背面朝着敌人移动,所以使用Bool判断玩家在左或者右

 如果玩家的坐标小于怪物的坐标,说明是在左侧,那么更改怪物的缩放值X

bool isRight=transform.position.x>Game.Instance.transform.position.x;
if (isRight) transform.localScale = new Vector3(-1, 1, 1);
else transform.localScale = new Vector3(1, 1, 1);

 

十二、子弹消灭怪物

1、怪物被攻击,减少血量

首先,把死亡的动画片段拖进两个敌人的动画控制器中

我选择使用触发 作为死亡的条件

//接触子弹
if (collision.gameObject.CompareTag("Bullet"))
{Destroy(collision.gameObject);//取消子弹穿透hp -= 1;if (hp == 0){animator.SetTrigger("Death");}
}

如果血量为零,则播放死亡动画 

2、血量为0,播放死亡动画,销毁自己

#region 动画事件private void OnDeathAnimationEnd(){Destroy(gameObject);}
#endregion

 在死亡动画的最后一帧执行销毁

十三、鼠标指向为攻击方向 

使用屏幕坐标 到 世界坐标 

public new Camera camera;Vector3 mouseWorldPosition=camera.ScreenToWorldPoint(Input.mousePosition);

获取到的屏幕坐标,因为两个方法都需要,所以作为参数传进来 

十四、玩家生命值以及状态 

不适用UI;

把血条作为摄像机的子物体,防止血条跟随摄像机改变位置;

不让摄像机在玩家的子物体下,通过代码跟随

使用LateUpdate,让摄像机慢一帧追逐玩家

public Transform target;
private void LateUpdate()
{transform.position = target.position;
}

 此时,出现问题。

因为2d的,摄像机到玩家的距离是-10,运行后摄像机与玩家重合会看不见

修改代码,固定Z轴坐标

Vector3 pos=target.position;
pos.z = -10;
transform.position = pos;

因为血条是几张图片切换实现的

所以,在玩家身上公开一个变量HP,把Hp设置为字段,get无所谓,set设置切换 

[SerializeField]private int hp;
public int Hp 
{get => hp;set{ hp = value;} 
}

然后引用血量图,做成一个数组 

public SpriteRenderer hpSpriteRenderer;
public Sprite[] spriteRenderers;

然后在字段中,把精灵图第几个赋值给血条上 

public int Hp 
{get => hp;set{ hp = value;hpSpriteRenderer.sprite = hpSprites[hp];} 
}

初始化中,把数组长度作为血量值传进来

private void Awake()
{Instance = this;Hp = hpSprites.Length-1;
}

十五、怪物干掉玩家

怪物碰到玩家,掉血,玩家掉血为0则死亡

在此处遇到问题:怪物与玩家无法碰撞,碰撞代码逻辑未执行;

原因是刚体的数值未设置正确。

public class CameraController : MonoBehaviour
{public Transform target;private Game game1;private void Awake(){game1 = FindObjectOfType<Game>();if (game1 == null){Debug.Log("没找到");}}private void LateUpdate(){int xue = game1.Hp;Debug.Log(xue);if (xue == 0){return;}Vector3 pos=target.position;pos.z = -10;transform.position = pos;}
}

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//using UnityEngine.Windows;public class Game : MonoBehaviour
{public static Game Instance;public Animator animator;public float movespeed;public SpriteRenderer spriteRenderer;public GameObject starPrefab;public Transform starShootPoint;public new Camera camera;[SerializeField]private int hp;public SpriteRenderer hpSpriteRenderer;public Sprite[] hpSprites;//CDprivate float shootCD = 0.1f;private float shootCDTimer;public int Hp {get => hp;set{ hp = value;hpSpriteRenderer.sprite = hpSprites[hp];if (hp == 0){Dead();}} }private void Awake(){Instance = this;Hp = hpSprites.Length-1;}private void Start(){spriteRenderer= gameObject.GetComponent<SpriteRenderer>();}// Update is called once per framevoid Update(){Debug.Log(Hp);Vector3 mouseWorldPosition=camera.ScreenToWorldPoint(Input.mousePosition);//Debug.Log(mouseWorldPosition);Move(mouseWorldPosition); Shoot(mouseWorldPosition);}private void Move(Vector3 mouseWorldPosition){animator.GetComponent<Animator>();float inputX = Input.GetAxis("Horizontal");float inputY = Input.GetAxis("Vertical");//修改动画bool isMove = inputX != 0 || inputY != 0;animator.SetBool("Move", isMove);//转向if (mouseWorldPosition.x > transform.position.x) spriteRenderer.flipX = false;else if (mouseWorldPosition.x < transform.position.x) spriteRenderer.flipX = true;//位移Vector3 pos =new Vector3(inputX * Time.deltaTime * movespeed,inputY * Time.deltaTime * movespeed,0);transform.Translate(pos, Space.Self);}private void Shoot(Vector3 mouseWorldPosition){if (shootCDTimer > 0){shootCDTimer-= Time.deltaTime;return;}if (Input.GetMouseButton(0)){shootCDTimer = shootCD;//实例化GameObject star=GameObject.Instantiate(starPrefab);star.transform.position = starShootPoint.position;Vector3 moveDir = (mouseWorldPosition - transform.position).normalized;star.GetComponent<Star>().Init(moveDir);}}internal void Hurt(){if (Hp <= 0) return;Hp -= 1;}private void Dead(){animator.SetTrigger("Dead");}private void DestroyPlayer(){Destroy(gameObject);}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Monster : MonoBehaviour
{public float moveSpeed;public int hp;public Animator animator;private void Update(){if (Game.Instance == null) return;Vector3 moveDir=Game.Instance.transform.position-transform.position;transform.Translate(moveSpeed * Time.deltaTime * moveDir,Space.World);bool isRight=transform.position.x>Game.Instance.transform.position.x;if (isRight) transform.localScale = new Vector3(-1, 1, 1);else transform.localScale = new Vector3(1, 1, 1);}private void OnTriggerEnter2D(Collider2D collision){Debug.Log("碰撞对象标签:" + collision.gameObject.tag);if (hp == 0) return;//接触子弹if (collision.gameObject.CompareTag("Bullet")){Debug.Log("子弹接触怪物了");Destroy(collision.gameObject);//取消子弹穿透hp -= 1;if (hp == 0){animator.SetTrigger("Death");}}else{//接触玩家if (collision.gameObject.CompareTag("Player")){Debug.Log("11");collision.gameObject.GetComponent<Game>().Hurt();Debug.Log("怪物接触玩家了");}}}#region 动画事件private void OnDeathAnimationEnd(){Destroy(gameObject);}
#endregion}

相关文章:

四、综合案例(Unity2D)

一、2D渲染 1、2D相机基本设置 上面是透视&#xff0c;下面是正交 2、图片资源 在Unity中&#xff0c;常规图片导入之后&#xff0c;一般不在Unity中直接使用&#xff0c;而是转为精灵图Sprite 将图片更改为即可使用Unity内置的图片切割功能 无论精灵图片是单个的还是多个的…...

50周学习go语言:第1周 环境搭建

以下是为零基础学习者准备的详细第1周教程&#xff0c;包含环境搭建、工具配置和首个Go程序的完整操作指南&#xff1a; 一、Go语言环境安装&#xff08;Windows/macOS/Linux通用&#xff09; 1. 下载安装包 官网地址&#xff1a;https://go.dev/dl//根据系统选择对应版本&am…...

Docker Desktop 入门教学

引言 Docker Desktop 是 Docker 官方为开发者提供的桌面应用程序&#xff0c;支持在 Windows 和 macOS 上轻松构建、运行和共享容器化应用程序。它集成了 Docker 引擎、Docker CLI 客户端以及 Docker Compose 等工具&#xff0c;方便您在本地开发和测试。 一、快速安装 1. 系…...

BOOST电路设计

目录 1电路模型 2器件选型 2.1设计需求 2.2参数计算 2.2.1电感L计算 2.2.2电容计算 2.2.3电阻计算 3仿真测试 4参数测试 4.1负载调整率 4.2电容测试 4.3电感测试 5实际应用 1电路模型 Boost升压电路,可以工作在电流断续工作模式(DCM)和电流连续工作模式(CCM)。CCM工…...

Qt常用控件之标签QLabel

标签QLabel QLabel 标签用来显示文本和图片&#xff0c;在 Qt 中使用频率很高。 1. Label属性 属性说明textQLabel 中的文本。textFormat文本的格式。其中 Qt::PlainText 为纯文本&#xff1b;Qt::RichText 为富文本&#xff08;支持 html 格式&#xff09;&#xff1b; Qt:…...

基于Spring Boot的公司资产网站设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

网络安全知识--网络、网络安全产品及密码产品概述

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 网络结构 网络设备&#xff1a;交换机、路由器、负载均衡 安全设备&#xff1a; 通信网络安全类:通信安全、网络监测与控制 区域边界安全类&#xff1a;隔离类…...

【mysql中mvcc的含义和作用及原理】

MySQL中的MVCC&#xff08;多版本并发控制&#xff09;是一种用于提高数据库并发性能的机制&#xff0c;通过维护数据的多个版本&#xff0c;实现读写操作的无锁并发。以下是其核心要点&#xff1a; 1. MVCC的含义 全称&#xff1a;Multi-Version Concurrency Control&#xf…...

【Android】Android 悬浮窗开发 ( 动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

文章目录 一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后返回处理 二、悬浮窗 前台服务和通知1、前台服务 启动 悬浮窗 的必要性① 保持悬浮窗存活② 悬浮窗的要求③ 悬浮窗版本兼容 2、其它类型服务简介① 前台服务…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Live View Kit (1)

1.问题描述&#xff1a; 客户端创建实况窗后&#xff0c;通过Push kit更新实况窗内容&#xff0c;这个过程是自动更新的还是客户端解析push消息数据后填充数据更新&#xff1f;客户端除了接入Push kit和创建实况窗还需要做什么工作&#xff1f; 解决方案&#xff1a; 通过Pu…...

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …...

java实现多图合并加字和画框等

java实现多图合并加字和画框等 在wutool中&#xff0c;封装了图片处理工具类&#xff0c;基于java自带的BufferedImage类&#xff0c;实现多图合并和加字、图片画框等。 关于wutool wutool是一个java代码片段收集库&#xff0c;针对特定场景提供轻量解决方案&#xff0c;只要…...

腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票

腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票 作者:某七年数据开发工程师 | 2025年02月23日 关键词:SQL窗口函数、连续问题、股票分析、腾讯面试题 一、问题背景与难点拆解 在股票量化分析场景中,"连续N天满足条件"是高频面试题类型。本题要求在单表stoc…...

Elasticsearch 自动补全搜索 - autocomplete

作者&#xff1a;来自 Elastic Amit Khandelwal 探索处理自动完成的不同方法&#xff0c;从基础到高级&#xff0c;包括输入时搜索、查询时间、完成建议器和索引时间。 在本文中&#xff0c;我们将介绍如何避免严重的性能错误、Elasticsearch 默认解决方案为何不适用以及重要的…...

大屏自适应终极方案:基于比例缩放的完美适配实践(Vue3版)

需求背景 在数据可视化大屏开发中&#xff0c;我们常面临这样的挑战&#xff1a;如何让1920*1080的设计稿在不同分辨率设备上完美呈现&#xff1f;传统的响应式布局难以应对复杂的大屏元素排布&#xff0c;本文介绍一种基于CSS3变换的终极适配方案 实现思路 本方案的核心是动…...

云计算中的API网关是什么?为什么它很重要?

在云计算架构中&#xff0c;API网关&#xff08;API Gateway&#xff09;是一个重要的组件&#xff0c;主要用于管理、保护和优化不同服务之间的接口&#xff08;API&#xff09;通信。简单来说&#xff0c;API网关就像是一个中介&#xff0c;它充当客户端和后端服务之间的“桥…...

前端ES面试题及参考答案

目录 let/const 与 var 的区别?TDZ 是什么? 箭头函数与普通函数的区别?箭头函数能否作为构造函数? 模板字符串的嵌套表达式和标签模板用法? 解构赋值的应用场景及对象 / 数组解构差异? 函数参数默认值的生效条件及暂时性死区问题? 展开运算符(...)在数组 / 对象中…...

【架构思维基础:如何科学定义问题】

架构思维基础&#xff1a;如何科学定义问题 一、问题本质认知 1.1 问题矛盾 根据毛泽东《矛盾论》&#xff0c;问题本质是系统内部要素间既对立又统一的关系。例如&#xff1a; 电商系统矛盾演变&#xff1a; 90年代&#xff1a;商品供给不足 vs 消费需求增长00年代&#x…...

【网络安全】常见的web攻击

1、SQL注入攻击 定义&#xff1a; 攻击者在HTTP请求中注入恶意的SQL代码&#xff0c;当服务器利用参数构建SQL语句的时候&#xff0c;恶意的SQL代码被一起构建,并在数据库中执行。 示例&#xff1a; 用户登录&#xff1a; 输入用户名xx&#xff0c; 密码 or 1 …...

ECOLOGY流程表单字段由单行文本改成多行文本

用户需要把单行文本改成多行文本 1、数据库端处理 select lwnr from FORMTABLE_MAIN_237 where lwnr is not null FORMTABLE_MAIN_237 有记录。DESCRIBE OA.FORMTABLE_MAIN_237 LWNR VARCHAR2(999) 由999改成4000 ALTER TABLE OA.FORMTA…...

AI发展迅速,是否还有学习前端的必要性?

今天有个小伙伴跟我讨论&#xff1a;“现在 AI 发展迅速&#xff0c;是否还有学习 JS 或者 TS 及前端知识的必要&#xff1f;” 我非常肯定地说&#xff1a; 是的&#xff0c;学习 JavaScript/TypeScript 以及前端知识仍然非常必要&#xff0c;而且在可预见的未来&#xff0c;…...

视频的分片上传

分片上传需求分析&#xff1a; 项目中很多地方需要上传视频&#xff0c;如果视频很大&#xff0c;上传到服务器需要很多时间 &#xff0c;这个时候体验就会很差。所以需要前端实现分片上传的功能。 要实现分片上传&#xff0c;需要对视频进行分割&#xff0c;分割成不同的大小…...

pyside6学习专栏(二):程序图像资源的加载方式

pyside6中的QLabel控件可以加载图像和gif动画&#xff0c;可以直接从外部文件加载&#xff0c;也可以从QRC类型的文件(实际是一脚本文件)经编绎生成对应的资源.PY模块文件(就是将qrc文本中指定的资源文件的16制内容写入.py文件)来使用&#xff0c;本文对两种方式作了一简单的示…...

QQ登录测试用例报告

QQ登录测试用例思维导图 一、安全性测试用例 1. 加密传输与存储验证 测试场景&#xff1a;输入账号密码并提交登录请求。预期结果&#xff1a;账号密码通过加密传输&#xff08;如HTTPS&#xff09;与存储&#xff08;如哈希加盐&#xff09;&#xff0c;无明文暴露。 2. 二…...

56. 合并区间 (LeetCode 热题 100)

题目来源&#xff1a; 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目内容&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&am…...

冒泡排序(详解)c++

冒泡排序(Bubble Sort)也是⼀种简单的排序算法。它的⼯作原理是每次检查相邻两个元素&#xff0c;如果前⾯ 的元素与后⾯的元素满⾜给定的排序条件&#xff0c;就将相邻两个元素交换。当没有相邻的元素需要交换时&#xff0c; 排序就完成了。 由于在算法的执⾏过程中&#xff0…...

CSS背景属性

<!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>CSS背景属性</title><style>.c1{/* …...

10种方法教你又小又清晰地压缩视频

视频压缩是有可能会损失画质的&#xff0c;但也可以通过一些方法尽量减少画质损失。在有效压缩视频大小的同时&#xff0c;尽量控制视频压缩画质在人眼无法察觉的范围内。下面就从10个角度向大家介绍10个不同的视频压缩方法&#xff0c;并推荐相关的视频压缩软件&#xff0c;整…...

当使用vcpkg安装的qt5时,在VS调用出现libcrypto-*-x64.dll不是有效路径时

英文解决站点 applocal.ps1 fails in Visual Studio 2019 because of wildcard path in VcpkgAppLocalDLLs Issue #28614 microsoft/vcpkg 虽然这个bug不影响生成exe文件,第一次会弹出该错误,再次运行就正常,vcpkg会把对应的libcrypto-*-x64.dll版本复制到exe路径下..但是对…...

AI大模型学习(四): LangChain(三)

Langchain构建代理 语言模型本身无法执行动作,他们只能输出文本,代理是使用大型语言模型(LLM)作为推理引擎来确定要执行的操作以及这些操作的输入应该是什么,然后这些操作的结果可以反馈到代理中,代理将决定是否需要更多的操作,或者是否可以结束 例如:我们想要查询现在北京的…...

JavaScript函数-arguments的使用

在JavaScript编程语言中&#xff0c;函数是构建复杂逻辑和实现代码复用的关键组件。虽然现代JavaScript&#xff08;尤其是ES6及之后版本&#xff09;提供了更多灵活的方式来处理函数参数&#xff08;如剩余参数、默认参数等&#xff09;&#xff0c;但arguments对象仍然是一个…...

C# 从基础神经元到实现在0~9数字识别

训练图片:mnist160 测试结果:1000次训练学习率为0.1时,准确率在60%以上 学习的图片越多&#xff0c;训练的时候越长(比如把 epochs*10 10000或更高时)效果越好 using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Windo…...

【每日八股】计算机网络篇(一):概述

OSI 的 7 层网络模型&#xff1f; OSI&#xff08;Open Systems Interconnection&#xff0c;开放互联系统&#xff09;是由国际标准化组织&#xff08;ISO&#xff09;提出的一种网络通信模型。 自上而下&#xff0c;OSI 可以被分为七层&#xff0c;分别是&#xff1a;应用层…...

Jupyter里面的manim编程学习

1.Jupyterlab的使用 因为我之前一直都是使用的vscode进行manim编程的&#xff0c;但是今天看的这个教程使用的是Jupyter&#xff0c;我也很是好奇这个manim在Jupyter这样的交互式下面会生成怎么样的效果&#xff0c;所以今天尝试了jupyter&#xff0c;并且对于两个进行比较和说…...

Web刷题之PolarDN(简单)

1.swp 考点&#xff1a;敏感文件、preg_match()函数绕过 什么是swp文件&#xff1a; vim中的swp即swap文件&#xff0c;在编辑文件时产生&#xff0c;它是隐藏文件。这个文件是一个临时交换文件&#xff0c;用来备份缓冲区中的内容。如果原文件名是data&#xff0c;那么swp文件…...

JVM 深入理解与性能优化

JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;是 Java 代码运行的核心&#xff0c;它负责 内存管理、类加载、字节码执行、垃圾回收&#xff08;GC&#xff09;和 JIT 编译。理解 JVM 有助于优化 Java 应用的性能&#xff0c;提高调试和排错能力。 …...

【人工智能】蓝耘智算平台盛大发布DeepSeek满血版:开创AI推理体验新纪元

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 蓝耘智算平台 蓝耘智算平台核心技术与突破元生代推理引擎快速入门&#xff1a;三步调用大模型接口&#xff0c;OpenAI SDK无缝兼容实战用例文…...

minio作为K8S后端存储

docker部署minio mkdir -p /minio/datadocker run -d \-p 9000:9000 \-p 9001:9001 \--name minio \-v /minio/data:/data \-e "MINIO_ROOT_USERjbk" \-e "MINIO_ROOT_PASSWORDjbjbjb123" \quay.io/minio/minio server /data --console-address ":90…...

关于 BK3633 上电时受串口 UART2 影响而无法启动的问题说明

1. 问题描述 BK3633 SDK 版本&#xff1a;BK3633_DesignKit_V06_2310 使用 BK3633 UART2 与指纹模块进行通讯&#xff0c;为了降低功耗&#xff0c;通过 GPIO 控制了指纹模块的供电电源。但每次给整个系统板子上电时&#xff0c;BK3633 很大概率会实际而无法正常运行程序&…...

运维Ansible面试题及参考答案

目录 简述 Ansible 的工作原理,它是如何实现对远程主机管理的? Ansible 是基于什么语言开发的?这门语言的特性对 Ansible 的功能实现有哪些帮助? 解释 Agentless 在 Ansible 中的含义,与基于 Agent 的自动化工具相比,优势体现在哪? Ansible 中的 Inventory 文件是什…...

Spring Boot 日志管理(官网文档解读)

摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容&#xff0c;文章主要参考官网文章的描述内容&#xff0c;并在其基础上进行一定的总结和拓展&#xff0c;以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…...

Svelte 最新中文文档教程(17)—— 生命周期钩子

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte 以…...

Windows 上源码安装 FastGPT

FastGPT 是一个强大的 AI RAG 平台&#xff0c;值得我们去学习了解。与常见的 Python 体系不同&#xff0c;Fast GPT 采用 Node.js/Next.js 平台&#xff08;对于广大 JS 开发者或前端开发者比较亲切友好&#xff09;&#xff0c;安装或部署比较简单。虽然一般情况下推荐简单的…...

RT-Thread+STM32L475VET6——icm20608传感器

文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟&#xff0c;并修改时钟树1.2 打开I2C3&#xff0c;参数默认即可(I2C根据自己需求调整&#xff09;1.3 打开串口1.4 生成工程 2. 添加icm20608软件包3. 使能传感器&#xff0c;打开动态链接库4.…...

超高清大图渲染性能优化实战:从页面卡死到流畅加载

目录 问题背景&#xff1a;1.为什么大图会导致页面卡死&#xff1f;一、DOM树构建&#xff08;HTML Parsing&#xff09;二、 资源加载&#xff1a;下载完整图片文件&#xff08;可能高达30MB&#xff09;三、解码处理&#xff08;Decoding & Rasterization&#xff09;、四…...

基于javaweb的SpringBoot个人博客系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

轻量级日志管理平台Grafana Loki

文章目录 轻量级日志管理平台Grafana Loki背景什么是Loki为什么使用 Grafana Loki&#xff1f;架构Log Storage Grafana部署使用基于 Docker Compose 安装 LokiMinIO K8s集群部署Loki采集Helm 部署方式和案例 参考 轻量级日志管理平台Grafana Loki 背景 在微服务以及云原生时…...

SOME/IP--协议英文原文讲解12(完结)

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.3 Compa…...

Linux 命令大全完整版(12)

Linux 命令大全 5. 文件管理命令 ln(link) 功能说明&#xff1a;连接文件或目录。语  法&#xff1a;ln [-bdfinsv][-S <字尾备份字符串>][-V <备份方式>][--help][--version][源文件或目录][目标文件或目录] 或 ln [-bdfinsv][-S <字尾备份字符串>][-V…...

AI学习第二,三天-Python基础

变量、运算符与数据类型详解 注释 在 Python 中&#xff0c;注释是用于增加代码可读性、解释代码功能但不会被程序执行的部分。 单行注释&#xff1a;使用 # 符号&#xff0c;从 # 开始到本行末尾的内容均为注释。例如&#xff1a; 收起 python # 这是一个单行注释&#xff…...