【Unity入门】25.入门结课Demo--神鸟大战怪兽
【Unity入门】入门结课Demo--神鸟大战怪兽
大家好,我是Lampard~~
欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢
(一) 前言
经过了两个月的学习,我们也顺利的完成了入门课程,最后就用一个Demo作为我们的结课句号吧,这篇文章会带大家从0完成这些~~文末会附带项目资源包,一定要看到最后哇 (●'◡'●)
(二) 搭建环境
(1) 下载unityHub
开发第一步那当然是得配置开发环境,我们可以从https:unity.cn,下载我们的unity开发引擎。unity需要通过一个unityHub,来管理开发用到的引擎(编译器)和项目。所以我们第一步是在上述网站上下载一个unityHub
(2) 注册账号和获得开发许可证
在下载玩Hub之后,我们需要先注册一个unity的账号,可以用邮箱或者手机,过程就不表了和其他平台的注册没啥两样 。那么登录了之后就可以了吗?NONONO,我们还需要获得一个unity的许可证,来证明我们的使用目的是学习用途而不是商用
打开Hub,在设置界面选择许可证,点击添加按钮,勾选个人用途就可以免费使用unity进行学习啦。在申请免费个人版许可证之后,可能需要等待个几十秒,然后就可以在许可证页面看到自己申请的许可证了
(3) 下载编辑器(引擎lts版本)
申请许可证后,我们就可以下载我们用到的游戏引擎了,我们可以选择最新版本的引擎,也可以选择LTS类型的引擎。什么是LTS呢?就是long team support的缩写,是官方会长期维护的版本。换言之就是bug比较少的引擎咯。我们现在开始学习,当然就不求新求稳啦~2020和2021的lts随便选一个,我就选择2020的
(4) 创建Unity项目
当我们下载完毕之后,应该会在桌面上看到这两个图标。白白的是我们的unityHub,黑色的就是我们的引擎编译器了。和cocos不同,直接点击编译器是没有反应的。我们需要通过Hub来生成和管理项目,下面我们打开Hub,在项目页签点击右上角的创建按钮
我们看到有2d,3d还有下面两个不知道什么鬼的选项(哈哈哈哈用不上先不管了),我们现在选择3d的项目,然后给项目设置一个存放路径和项目名就可以了
(5) 打开Unity项目
创建完毕之后,返回项目页签就可以在项目页签看到刚才创建的项目
点进去之后,Hub就会帮助你在编译器中打开这个项目,当你看到这个界面之后,恭喜你环境搭好啦~
(三) 导入项目所需的资源
(1)模型资源
我们这个Demo是实现一个类似于飞机大战之类,控制己方射击敌方的小射击玩法。那要实现这个功能,首先就要导入双方的模型资源
我们只需要把文末的资源包拖动到Assert目录下,点击Import就可以了
首先看看我们的主角神鸟模型,它是一个FBX类型的模型:里面包含了一个mesh网格文件,一个materials材质文件和一个png格式的纹理
什么是网格?
我们看到的3D物体,实际上是由一个个小的三角形组成的。所谓网格数据其实就是描述构成模型的一个个三角形,所包含的顶点数据,纹理坐标,法线信息等等的一系列数据
什么是材质?
物体的物质的性质、特征或组成。材质可以是金属、塑料、木材、玻璃、陶瓷、纺织品等等。正确选择材质可以决定物体的质量、外观、特性和使用寿命。材质也可以用于表示3D模型的外观和质感。在计算机图形学中,材质通常用纹理、颜色、反射率、粗糙度、透明度等参数来描述
什么是纹理?
现实生活中,物体很少会遇到纯色的。肯定每一个物体,甚至物体的每一个地方都有区别,而用于呈现它们具有的不同外表的东西就叫纹理
扯远了,我们继续看看怪兽的模型。怪兽的模型由两个部分组成:分别是本体和盔甲。它模型内部有两个和材质,但是它的网格数据是共用的
直接把它们托到层级管理器Hierarchy中就可以生成两个模型对象了
(2)天空盒
首先什么是天空盒?
在实时渲染中,如果要绘制非常远的物体,例如远处的山、天空等,随着观察者的距离的移动,这个物体的大小是几乎没有什么变化的。而实现这种“无穷远”的背景技术就是天空盒技术
unity自带了一个蓝天黑地的天空盒,为了美观一些,我们可以替换天空盒的纹理和材质
首先点击Window餐单栏下面的Rending->Lighting子菜单,然后在Enviroment页签下,找到天空盒定义材质和纹理的地方,把我们实现准备好的天空盒材质和资源替换上去即可
(3)子弹
既然是大神鸟打小怪兽,那肯定得有一个攻击用的子弹。至于子弹我们就简单用一个Unity自带得球体就可以了
我们可以从界面左上方的GameObject处选择生成的对象,也可以在层级控制Hierarchy处鼠标右键选择生成物体,选中Sphere就可以创建一个球体。修改一下命名和大小就可以得到子弹对象了
(四) 搭建脚本开发环境
(1)下载visual studio
接下来就要编写脚本了,首先我们要搭建好开发环境。在我们下载unity编译器的时候,会让我们选择当前unity编译器搭配的vs编译器。我们最好就直接勾选上,或者可以自己手动下载vs,在vs的installer里勾选unity引擎开发需要的环境
(2)unity中设置脚本编译器
下载好了之后,我们要在unity中更新vs作为脚本编译器。方式很简单,打开编译器,选择Edit -> Preferences目录 ,在 External Tools 页签里,选择 VS 作为脚本编辑器
(3)设置随脚本修改重新编译
为了方便之后的开发调试,我们需要设置每当脚本修改了之后,unity自动帮我们编译这个脚本,让改动可以实时的生效。选择Edit -> Preferences目录 ,在 General 页签里,把Script Change While playing 选项调整为:Recompile After Finished Playing即可
(五) 碰撞检测
(1)子弹移动脚本
想要实现子弹从神鸟往怪兽方向移动,我们可以通过创建一个C#脚本,在脚本中每一帧更新子弹的transform组件位置,最后把这个脚本挂在子弹对象上即可
其中Translate方法可以帮助我们便捷的调整对象的位置,Time.deltaTime可以访问到当前帧距离上一帧的执行时间,因此帧更新位置的代码如下:
void Update(){float DisPreSec = 6f; // 移动速度this.transform.Translate(0, 0, DisPreSec * Time.deltaTime);}
下面看看效果:
(2)Collider组件
子弹径直从怪兽身上传过去,显然不是我们想要的效果。若要实现子弹击中怪兽,就和怪兽一并消失的效果,那我们就需要监听碰撞检测
监听碰撞检测需要三个条件:首先双方物体对象都有碰撞体Collider组件,Unity提供了以下的碰撞体组件选择
1. Box Collider(盒子碰撞器):一个基于矩形的碰撞体,用于模拟长方体或立方体物体的碰撞。
2. Sphere Collider(球形碰撞器):一个基于球形的碰撞体,用于模拟球体物体的碰撞。
3. Capsule Collider(胶囊碰撞器):一个基于胶囊形状的碰撞体,用于模拟某些具有胶囊形状的物体的碰撞,比如人物角色。
4. Mesh Collider(网格碰撞器):一个基于游戏对象模型的碰撞体,用于模拟复杂的几何形状的物体的碰撞,比如地形、建筑等。
5. Terrain Collider(地形碰撞器):一个基于 Unity 地形的碰撞体,用于模拟地形的碰撞。
6. Wheel Collider(车轮碰撞器):一个专门针对车辆的碰撞体,用于模拟车辆的轮子与地面的碰撞。
7. Character Controller(角色控制器):一个专门为人物角色设计的碰撞体,用于模拟人物角色的移动和碰撞。
子弹是Unity自带的3d物体,本身带有一个碰撞体组件。我们只需要给怪物模型也加上碰撞体就可以了,我们可以选择一个箱体的Colider,调整其大小直至覆盖住怪物即可(绿框框),下面是添加过程:
(3)设置触发器和运动学刚体属性
刚体我们知道是物理学中研究的一个物体对象概念,那运动学刚体是什么呢?
运动学刚体不受物理引擎的计算和影响,而是由开发者手动控制它的运动。运动学刚体可以设置为运动、旋转或缩放,但不会受到重力、碰撞等物理效果的影响。运动学刚体通常用于模拟精确的动画或特效效果,或者用于实现一些特定的游戏机制
给子弹添加Rigidbody刚体组件,里面有一个可以选择Is Kinematic的参数,选中就可以让子弹对象成为一个运动学刚体
然后再把子弹Colider组件中的isTrigger给勾选上,就可以监听碰撞事件的发生
(4)设置碰撞监听函数
在前面这些都准备好之后,我们就可以给子弹对象加上碰撞监听函数了
isTrigger 是 Collider(碰撞体)组件中的一个属性,用于指定碰撞体是否为触发器。
当一个碰撞体的 isTrigger 属性被设置为 true 时,该碰撞体就不会影响游戏对象的物理运动,也不会产生碰撞效果,而只是用于检测游戏对象是否进入了该碰撞体的范围内。当游戏对象进入触发器时,就会触发 OnTriggerXXX 系列函数(比如 OnTriggerEnter、OnTriggerStay、OnTriggerExit)
因此在子弹脚本中添加OnTriggerEnter方法之后,在碰撞发生时就会被监听到事件的发生。 再用Destory静态方法,把碰撞体(子弹)和碰撞对象(怪兽)一起销毁即可
看看效果:
(5)自毁
子弹命中怪兽后能够正常的销毁,但是正常游戏中应该没有什么怪兽会呆呆的站在那里让你打。那些打不中怪物的子弹应该加上一个自毁方法,来避免内存泄漏
此时我们需要用到unity的计时器Invoke类
Unity 的 Invoke() 方法是一种用于延迟执行某个方法的方式。Invoke() 方法可以在指定的时间(以秒为单位)后执行指定的方法
Invoke() 方法的语法如下:
```
Invoke(string methodName, float time);
```
其中,`methodName` 是要执行的方法的名称,`time` 是要延迟的时间(以秒为单位)
因此我们调用Invoke方法,设定一个自毁时间,若时间到了子弹对象还存在,则去销毁它
看看效果:
(六) 玩家主控逻辑
(1)发射逻辑
子弹的逻辑我们已经写好,下面就要开始制作神鸟的逻辑了。首先需要给神鸟创建一个C#脚本,命名就叫PlayerLogic好了
紧接着,给神鸟脚本加上第一个功能,发射子弹。需要怎么做呢?首先声明一个子弹的对象用于克隆
[Tooltip("子弹节点的预制体")]public GameObject bulletPrefab;
然后编译器选中这神鸟对象,就可以看到我们刚才声明的属性,把已经制作好的子弹拖过去就可以被访问到了
紧接着我们可以定义一个Fire方法,通过引擎自带的Instantiate静态方法,生成子弹对象
private void Fire(){// 实例化一个子弹节点GameObject node = Instantiate(bulletPrefab);}
把Fire方法在Start的时候调用,就会在游戏开始的时候被执行一次,也就是发射一次
void Start(){Fire();}
但是这一点都不猛,为了让主角火力更猛一些,我们可以给它安排一个突突冒蓝火的加特林,实现一个连发功能,具体做法就是调用我们的InvokeRepeat方法,实现方法循环调用
void Start(){InvokeRepeating("Fire", 0.1f, 0.1f);}
比如这样我就可以0.1秒开一炮,看看效果:
(2)移动逻辑
紧接着要给神鸟加上移动逻辑,希望它和很多游戏一样,通过wsad键,进行上下左右移动
首先移动的逻辑我们可以和子弹对象一样,通过translate方法实现。问题的关键就是如何监听键盘按下的事件了:
键盘可以获取它的按下,长按和抬起状态。分别需要调用Input.GetKeyDown,Input.GetKey 和 Input.GetKeyUp 来实现
比如这样就可以监听W键的按下和抬起:
void Update(){if (Input.GetKeyDown(KeyCode.W)){Debug.Log("正在执行W键的按下");}if (Input.GetKeyUp(KeyCode.W)){Debug.Log("正在执行W键的抬起");}}
在神鸟脚本中的Update方法里加上这样的代码,就可以实现前后左右移动的功能:
看看效果:
(3)修改子弹生成对象的
不难发现,神鸟是能动了,但是子弹还是呆在原地,我们需要在子弹生成的时候,把子弹生成的位置设置成神鸟的位置即可
private void Fire(){// 实例化一个子弹节点GameObject node = Instantiate(bulletPrefab);// 调整子弹的发射结点node.transform.position = this.transform.position;}
(七) 怪物脚本
(1)蛇皮走位
到了最后一步,就是给怪物也加上脚本逻辑了。首先要实现的就是怪物的蛇皮走位,毕竟呆呆的站在原地让人打也太没意思了
过程分两步,首先控制怪兽往Z方向(玩家方向)定速移动
然后,需要让怪物随机的左右移动来躲避子弹。随机效果的实现可以定义一个速度的数组,然后定时利用Random.Range方法,从速度数组中选择一个,然后怪兽就按照这个速度在X方向进行移动即可
和子弹相似,若怪物没有被击中,我们不能让怪物永远的存在,因此可以判定怪物的位置,若已经超出了击中范围,就自动销毁
好的,我们来看看效果:
(2)批量生产怪物
下一步就是批量生成怪物,之前我们把批量生成子弹的逻辑写在玩家身上,那批量生成怪物写在哪里比较好呢?
一般的项目都有一个main方法,我们也可以创建一个Main脚本,把控制游戏流程的东西放在里面。生成流程与子弹相似,就不重复赘述了
MainLogic随便创建一个空节点挂上去就可以生效了
看看目前的效果,怪物可以批量创建,然后子弹击中也可以令怪物消失
(3)艺术就是派大星
至此我们的主要逻辑就写的差不多了,但是现在的击中效果未免也太弱了。有一位名人说过,“艺术就是爆炸”
为此我们可以给子弹击中的时候加上绚丽的粒子特效效果。特效的资源我们已经放在了Effect的目录下方
使用的方法也很简单,首先需要在子弹脚本中声明一个粒子特效对象,在编辑器中把特效挂上去,子弹脚本就可以访问到特效资源了。
然后和普通的预制体一样,在碰撞发生的时候(OnTriggerEnter),通过Instantiate方法创建,并把其位置设定成子弹的位置即可,注意单次播放的粒子特效播放一次之后就自动销毁,无需手动Destory
(4)背景音乐
为了更有趣味一些,我们还可以给游戏加上背景音乐。其中用到的是AudioSource组件
audioSource是指音频源,它是Unity中AudioSource组件的一个属性,用于存储音频剪辑或音频资源的引用,并控制播放、暂停、停止、音量等音频的相关属性。在Unity中,AudioSource组件可以附加到游戏对象上,使其能够播放音频文件,例如背景音乐、音效等
至于使用方法就更简单了,首先右键生成组件,挂在主控结点上。然后把事先准备的MP3资源挂在AudioSource组件的autoclip上即可
好啦,看看DEMO的最终成果吧:
真是泰酷辣!!!
(八)结语
至此入门的Demo已经完成了,感谢这两个月的陪伴~
但是!很快我们就会续更基础,和高级Unity系列的文章,敬请期待!!!
下载资源链接在这里:【Unity入门Demo项目资源】
点赞,关注!!!
相关文章:

【Unity入门】25.入门结课Demo--神鸟大战怪兽
【Unity入门】入门结课Demo--神鸟大战怪兽 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一) 前言 经过了两个月的学习,我们也顺利的完成了入门课程,最后就用一个Demo作为我们的结课句号吧&am…...

HTTP协议基本格式
HTTP即HyperText Transfer Protocol(超文本传输协议),HTTP基于TCP/IP协议传输数据。 目录 Chrome抓包Fiddler代理抓包HTTP协议格式HTTP请求首行URL方法Get方法Post方法Get与Post的区别 请求报头中的属性Cookie和SessionCookie与Session的区别…...

在 ubuntu 22.04 上配置界面服务器 xrdp
文章目录 图形界面解决方案VNCXRDP XRDP 实例安装和配置使用 XRDP 使用原理谁更快 : X11转发 > XRDP > VNC 图形界面解决方案 1. VNC 2. XRDP 3. X11 ssh : // https://blog.csdn.net/u011011827/article/details/131065690VNC 外部开放端口 用的 是 5901-5910 桌面用…...

53、基于51单片机蓄电池充电器过充过放保护LCD液晶屏显示系统设计(程序+原理图+PCB源文件+参考论文+参考PPT+元器件清单等)
方案选择 单片机的选择 方案一:AT89C52是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&…...

【C/C++】详解 函数重载和应用
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c系列专栏:C/C零基础到精通 🔥 给大…...

WPF开发txt阅读器4:字体控件绑定
文章目录 控件折叠字体尺寸绑定选择字体字体的中文名称 txt阅读器系列: 需求分析和文件读写目录提取类💎列表控件与目录 控件折叠 作为一个txt阅读器,至少能够设置文字字体、尺寸,段落行间距等,还得有护眼模式等一系…...

CoreDX DDS应用开发指南(8)开发订阅应用程序
11 应用数据类型Application Data Types 11.1 概述 每个DDS主题都包含一个且仅包含一个数据类型,这是在主题上进行通信时使用的用户定义的数据类型。在大多数情况下,应用程序开发人员以数据定义语言(DDL)格式定义这些DDS数据类型。编译器用于将这些DDL类型定义转换为适当的…...

基于Python的接口自动化-读写配置文件
目录 引言 configparser模块功能介绍 引言 在编写接口自动化测试脚本时,有时我们需要在代码中定义变量并给变量固定的赋值。为了统一管理和操作这些固定的变量,咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中,后续需要用到这…...

useEffect的基础知识和底层机制
useEffect 是 React 中一个重要的 Hook,用来处理组件的副作用操作。它的基础知识包括两个方面:执行时机和参数。 执行时机: useEff ect 的执行时机包括两种情况: 组件挂载时,即第一次渲染之后。组件更新时ÿ…...

chatgpt赋能python:Python中如何加空格
Python中如何加空格 Python是一门广泛应用于科学计算、数据分析、人工智能、Web开发等领域的高级编程语言。在Python编程过程中,经常需要使用到空格,以实现程序的格式化和美观,同时也有助于提高代码的可读性和可维护性。本文主要介绍Python中…...

软件测试之路已不再是坦途
去年下半年才跳了槽,过程非常顺利,没有经历大家所说的工作荒的境地,所以一直没有直观地感受到软件测试就业形势到底有多严峻。 近来看到一些机构频频发出某某测试员在糟糕的就业形势下逆袭拿下XXW的某厂offer,然后推荐测试进阶课…...

扫雷——C语言实现
扫雷 文章目录 扫雷实现代码什么是扫雷基本功能实现显示选择菜单定义几个二维数组?确定数组大小初始化数组布置地雷打印展示数组排查地雷记录指定区域周围地雷的个数判断排雷成功排查地雷实现代码 基本功能的实现代码和效果展示 拓展功能简化游戏界面改变字体颜色实…...

CSS基础学习--6 CSS Text(文本)
一、文本颜色 color:red; 颜色属性被用来设置文字的颜色。 颜色是通过CSS最经常的指定: 十六进制值 - 如: #FF0000一个RGB值 - 如: RGB(255,0,0)颜色的名称 - 如: red body {color:red;} h1 {color:#00ff00;} h2 {color:rgb(255,0,0);} 二、文本的…...

高精度电压源的应用场合有哪些
高精度电压源是一种能够提供恒定、稳定电压输出的设备,被广泛应用于各种领域。高精度电压源是现代电力、通信、控制等领域中重要的测试仪器之一,其主要功能是提供稳定可靠的直流或交流电源,并具有高精度和高分辨率的特点。在实际应用中&#…...

Android约束布局
一、嵌套布局效率可能很低。 在 Android 开发中,我们常常需要使用嵌套布局来实现某些较复杂的界面效果。但是嵌套层级太深会带来一些问题,主要包括: 视图层级过深,导致内存占用过高和性能下降。Android 需要为每个 View 对象分配内存,嵌套层级过深会创建很多 View 对象,占用较…...

selenium基础语法
文章目录 selenium基础语法1.定位页面元素2.元素的操作1) 模拟键盘输入(send_keys)2) 点击操作(click)3) 清除去对象输入的文本内容(clear)4) 获取文本(gettext) 3. 等待4. 信息打印5. 窗口6. 导航7. 弹窗8. 鼠标和弹窗9.选择框10.文件上传11.屏幕截图 selenium基础语法 1.定位…...

运行后端SpringBoot项目
目录 一、注册微信开发者账号 1. 注册开发者账号 2. 获取appid和密钥 二、开通腾讯云TRTC服务 1. TRTC业务介绍 2. 为什么不使用阿里云的实时音视频服务,偏要选用腾讯云TRTC服务? 3. 开通TRTC服务 4. 领取TRTC的AppID和密钥 三、导入 emos-api …...

#如何对待工作中的失误?# 如何对待工作与生活中的失误——一些不成熟的忠告
关于如何对待工作与生活中的失误的忠告 1.在面对失误而带来的指责和沮丧时,应该如何做?1.1 正确认识失误1.2 处理失误后情绪与问题的途径1.2.1 接受现实,不要否认错误1.2.2 不要过度臆想1.2.3 安排调整情绪的时间1.2.4 向他人寻求帮助 2.发生…...

Shell脚本文本三剑客之awk编辑器
目录 一、awk简介 二、awk工作原理 三、awk命令格式 四、awk命令的使用 1.print操作按行输出文本 2.print操作按字段截取输出文本 3.使用BEGIN和END指定操作 4.使用管道符号,双引号调用shell命令 5.使用操作getline 6.使用操作OFS 7.配合数组使用 一、…...

Focal Loss介绍
目录 前言一. Focal Loss二. 总结 前言 在目标检测算法中,我们会经常遇到Focal Loss这个东西,今天我们就来简单的分下下这个损失。 一. Focal Loss 在深度学习训练的时候,在遇到目标类别不平衡时,如果直接计算损失函数࿰…...

【数据结构与算法】04 哈希表 / 散列表 (哈希函数、哈希冲突、链地址法、开放地址法、SHA256)
一种很好用,很高效,又一学就会的数据结构,你确定不看看? 一、哈希表 Hash Table1.1 核心概念1.2 哈希函数 Hash Function1.3 哈希冲突 Hash Collision1.4 哈希冲突解决1.41 方法概述1.42 链地址法 Separate Chaining1.43 开放寻址…...

每日一道面试题之介绍一下Java的序列化和反序列化!
什么是序列化? 序列化是将对象转换为容易传输的格式的过程,它是一种用来处理对象流的机制,将对象的内容流化,从而使流化后的对象传输于网络之间,以便它们可以在网络上传输或在磁盘上存储。反序列化是将序列化后的数据…...

Netty实战(十一)
预置的ChannelHandler和编解码器(一)HTTP和SSL/TLS的添加和使用 一、SSL和TLS添加二、基于Netty的HTTP程序2.1 HTTP解码器、编码器和编解码器2.2 聚合HTTP消息2.3 HTTP压缩 一、SSL和TLS添加 作为一个通讯框架,通讯数据的安全性也是不可或缺的…...

Qos服务质量、心跳机制、保留消息,遗嘱信息,用户密码认证
这里写目录标题 Qos服务质量使用ESP8266接收QoS1的MQTT消息保留消息(retainFlag)心跳机制遗嘱信息 Qos服务质量 若想实现QoS>0,订阅端连接服务端时cleanSession需要设置为false,订阅端订阅主题时QoS>0,发布端发…...

MATLAB 之 线性方程组求解
这里写目录标题 一、线性方程组求解1. 线性方程组的直接解法1.1 利用左除运算符的直接解法1.2 利用矩阵的分解求解线性方程组 2. 线性方程组的迭代解法2.1 Jacobi 迭代法2.2 Gauss-Serdel 迭代法 3. 求线性方程的通解 一、线性方程组求解 在 MATLAB 中,关于线性方程…...

华为OD机试真题 Java 实现【字符串序列判定】【2022Q4 100分】,附详细解题思路
一、题目描述 输入两个字符串a和b,都只包含英文小写字母。a长度<=100,b长度<=500,000。 判定a是否是b的有效子串。 判定规则: a中的每个字符在b中都能找到(可以不连续),且a在b中字符的前后顺序与a中顺序要保持一致。 (例如,a=”qwt”是b=”qwerty”的一个子…...

taro使用小记 —— 持续更新
目录 1、在 taro 中使用 axios2、在 taro 中添加全局组件自动引入和方法自动引入3、在 taro 中使用 pinia 1、在 taro 中使用 axios taro 3.6 版本已经支持了网络请求库。 需安装插件 tarojs/plugin-http 使用和注意事项说明: https://www.npmjs.com/package/taroj…...

【LeetCode】110. 平衡二叉树
110. 平衡二叉树(简单) 思路 对二叉树做先序遍历,从底至顶返回子树最大高度,若判定某子树不是平衡树则“剪枝”直接向上返回。 递归返回值: 当节点 root 左、右子树的高度差 > 1:返回 -1,代…...

SQL视图、存储过程、触发器
一、视图 (一)介绍 视图(view)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑&…...

DNS隧道穿透
介绍: DNS隧道,是隧道技术中的一种。当我们的HTTP、HTTPS这样的上层协议、正反向端口转发都失败的时候,可以尝试使用DNS隧道。DNS隧道很难防范,因为平时的业务也好,使用也罢,难免会用到DNS协议进行解析&am…...