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

【unity】制作一个角色的初始状态(左右跳二段跳)【2D横板动作游戏】

前言

        hi~ 大家好!欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中,实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用状态机进行实现的。

        本系列是跟着视频教程走的,所写也是作者个人的学习记录笔记。如有错误请联系我指正!

观看教程链接:https://www.udemy.com/course/2d-rpg-alexdev/

教程游戏资源链接:https://pan.baidu.com/s/1IlUbYlUB0LP0dQfQPkvjZA 
提取码:0721

目录

一、Unity和资源准备

二、状态机创建和Debug测试

1.有限状态机描述

2.有限状态机编码基础

三、动画控制器和动画组件

三、玩家初始状态制作

1.玩家闲置和移动状态的切换

2.玩家整体的翻转

3.玩家在地面状态和跳跃状态的切换

碰撞检测

4.玩家实现二段跳


一、Unity和资源准备

        下载Unity,制定好程序编辑器,创建2D项目,进入unity编辑器界面。(我使用的版本:2022.3.2f1c1)

        如上图所示,如果没有Console组件(程序控制台)、Animation(动画控制、动画)组件,如下图展示打开路径。

        然后将我们的游戏资源导入(游戏的美术资源),如下图:

        导入成功后,我们可以开始准备制作游戏了。

二、状态机创建和Debug测试

1.有限状态机描述

        我一开始就提到了状态机。这里的状态机指的是unity中的有限状态机,我们将使用它来控制接下来角色状态的转换。

        我们从角色状态来具体到有限状态机有什么作用。

        闲置状态、移动状态、跳跃状态。角色初始为闲置状态,我们通过键盘上的a和d键切换角色的状态,变为移动状态,在闲置和移动状态(地面状态)中可以通过space切换角色为跳跃状态,并且在第一段跳跃状态中可以切换为二段跳。

        可以看到,角色的状态有一个初始的状态,并且我们可以随时的进行切换状态,切换状态是存在条件的。并且一个状态实际上存在开始、执行、结束(起始,中间、结束)的过程,那么切换状态时均需要实现这些过程。

        切换状态过程我可以以跳跃距离,比如我们从闲置状态切换到跳跃状态,跳跃状态的初始过程就需要我们给予一个向上的速度,持续过程中不需要。

        上述描述的其实就是有限状态机。做的就是将有限的一些状态通过条件决定切换。可以发现,通过这个,我们实际上就可以完成每个状态的独立。可以想象,如果不存在状态机,那么我们在编写角色状态切换时,就需要同时考虑到其他状态的情况,比如攻击时不可移动等,那么随着新的状态加入,我们需要自己写的限制条件就会越来越多,导致编码困难。

2.有限状态机编码基础

        回到我们的当前游戏上。有限状态机要完成的是状态的切换,我们需要两个组件:状态机(StateMachine)和对应的状态类型(PlayerState)。另外,我们需要unity中的组件,对他们进行一个调用,此组件就是Player玩家组件(Player)。

        括号中就是我们需要进行的C#编程文件。C#是一种面向对象语言,接下来我们实现状态机的过程很多就是用的面向对象的思想(类、继承、多态)。

[Assets->Script]

        首先说明一下编码的目的和基本过程:我们需要通过Player来获取游戏对象的组件,并且能够在游戏开始时通过其Unity脚本达成每帧调用(MonoBehaviour)。而我们的状态并不需要继承MonoBehaviour类,也就不会参与到游戏的调用中(顺便也节约了资源)。另外,状态机设置初始阶段和切换状态(注意其中的三个过程:开始、中间、结束)。而Player状态则表示我们操作的角色所有状态的父类,它不继承任何类(状态机也是),可以通过多态操作,让角色状态做一些共同的事情(比如随时检测玩家的Xspeed水平方向的输入),这也是多态的目的。最后在Player中完成对这些状态对象的创建,通过状态机在update中完成对某一状态的随帧调用,然后在具体的状态中检测条件完成切换。

        实际上,有时候状态的切换,此状态可能时一些状态的集合,比如闲置和移动状态,它们都是在地面上,地面上随时可以进行跳跃。通过继承和多态我们可以随便完成这些集合切换的要求(多态->子类对象调用重写的方法时会执行父类的被重写函数方法)

        利用下面一张图解释上面的说法:

        我们首先创建角色的闲置、移动状态(PlayerState的子类),在Player中完成基础的调用。代码如下:

PlayerState

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerSate
{protected Player player;  // 方便调用游戏中获取的资源protected StateMachine stateMachine;  // 游戏状态机,实现状态的切换protected string stateBoolName;  // 状态名字 - 和后面游戏对象的动画机组件相关public PlayerSate(Player _player, StateMachine _stateMachine, string _stateBoolName){player = _player;stateMachine = _stateMachine;stateBoolName = _stateBoolName;}// 开始状态public virtual void Enter(){}// 中间状态public virtual void Update(){}// 退出状态public virtual void Exit(){}
}

StateMachine

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StateMachine
{public PlayerSate currentState { get; private set; }  // 想让外界访问,但是不允许修改// 初始状态public void Initialize(PlayerSate _startState){currentState = _startState;currentState.Enter();  // 启动开始阶段}// 转换状态public void ChangeState(PlayerSate _newState){currentState.Exit();  // 前一个状态先退出currentState = _newState;currentState.Enter();  // 执行开始阶段}}

Player 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Player : MonoBehaviour
{#region Componentprivate StateMachine stateMachine;#endregion#region State  // C#语法,可以整理段落public PlayerIdleState idleState { get; private set; }  // 后续在状态中可能会调用到,但是不希望被修改public PlayerMoveState moveState { get; private set; }#endregion// 初始化变量private void Awake(){stateMachine = new StateMachine();idleState = new PlayerIdleState(this, stateMachine, "Idle");moveState = new PlayerMoveState(this, stateMachine, "Move");}void Start(){stateMachine.Initialize(idleState);  // 一开始为闲置状态}void Update(){stateMachine.currentState.Update();  // 多态调用 父类对象调用重写方法,实现同种类型展示出不同的效果}}

        然后我们在Unity层次界面内创建空对象,将Player脚本挂接上去。这样游戏加载时就能加载Player脚本代码。点击游戏窗口,敲f键时观察代码控制台,查看状态的切换。

        注意红色标注,按此时控制台显示的重复信息会显示成数字置于消息框右下角,避免刷屏。

        另外,在脚本编辑过程中,子类生成虚函数和构造函数时,点击选中当前类名,alt + enter键可以快速构造:

        可以看到,此时我们的脚本已经可以完成基础的转换的演示,那么我们让它实际运行起来,展示对玩家基础状态的演示。

三、动画控制器和动画组件

        在正式制作之前,先介绍一下Unity内的动画组件。窗口的创建先前布局时已经说过,其中Animator就是动画控制器,在这里可以制作动画切换条件,动画顺序等。那么在动画控制之前,我们还需要一段一段的动画,通过Animation进行控制(将美术资源中的动画一张一张连续播放出来)。

        我们在美术资源中找到角色精灵图:

        在此精灵图中,实际上已经都切分好了,这里简单介绍一下如何切分精灵图的(本质是由一张一张的图组合而成,到Unity中进行切分而已)

        模式中我们选中Multiple多个模式,选择图片编辑器(Sprite Editor)进行编辑

        在如何切分中我们可以选择三种进行切分,看好如何切分,这也和美术资源整理时相关,尽量每张子图一致,Point表示这张图的支点(有时图片不一致时利用此存在对齐的效果)。切分好后按apply进行应用。

        应用完后,Pixels Per Unit表示单位像素数,在此可以设计图片大小......

        我们将其中一张闲置图片拖到场景界面上,此时Unity会为我们默认创建一个对象(命名为Animator),将其挂载在Player对象下成为子对象,调整子对象的距离,将我们父对象的中心点对号角色对象的中心点。

        为Animator组件添加 Animator组件,其就是动画控制的组件,另外此对象为空,我们需要在文件中进行创建不同的动画控制对象,以便不同的对象控制不同的状态动画。

上图为创建玩家控制器的过程(可以利用文件夹进行分类)

        将对象托拽到玩家子对象Animator组件Animator上去,在选择此对象的状态的条件下查看动画控制窗口(Animator)就可以看到如下图:

        这个就很容易看出和我们的状态机对应的关系,但是存在一个任意状态。也就是说,在没有状态机的条件下我们也可以进行创作角色状态转换,只不过互相之间的制约需要玩家自己控制,非常麻烦。

        最后在看一下某一段动画编辑。选中玩家动画控制器的情况下,点击下图中的Create就可以创建一段动画序列。

        将角色一段闲置动画序列拖进此窗口,在此窗口的右边三小点上选择Show Sample Rate来控制动画的播放速度。

 

可以像上图那样观察角色动画状态。

        移动类似创建。这样在动画控制窗口我们可以创建条件来决定动画状态的切换了。其中右键角色状态,选择make transition创建动画过渡连线,在右边窗口的Animation的+创建条件,因为状态机的切换与Player组件挂钩使用通用的Bool,所以创建两个条件Idle和Move作为切换条件。点击连线选择条件切换,控制前后两端动画的退出状态和过度状态,这里两个切换我们均不设置退出时间和转换持续时间。

         就这样,对动画序列和动画控制的基本了解到此结束,需要更详细的了解请前去学习。

三、玩家初始状态制作

        首先,我们需要在player玩家脚本上获取角色的动画控制组件(以便设置条件为true控制动画的播放),每次在切换或者初始状态的时对条件进行控制(公共操作,在父类上进行)。另外,我们需要我们的角色拥有重力,所以需要Unity中的组件Rigidbody 2D对玩家进行基本的物理控制。所以对Player(注意获取的组件还存在子类的组件)脚本和PlayerState脚本的修改如下:

player:

PlayerState:

        设置玩家物理控制组件的基本状态:

        禁止Z轴旋转(这和我们重力下降相关),同时需要调整参数插值和重力检测为连续。(因为重力元素,作用到碰撞器上后,角色由于形状因素,由于是2D平面,导致z轴旋转让其倒下)

        然后创建一个简单平台,增加角色和平台的碰撞器(存在碰撞器才能发生碰撞以及检测)。需要注意碰撞器的类型和2D状态。效果如下:

         初始状态研究完毕,开始游戏我们就会看到玩家角色掉落,并且不会发生图片z轴翻转。

1.玩家闲置和移动状态的切换

        动画序列和动画控制我们在之前的步骤已经完成,现在我们只需要在脚本里进行控制即可实现此状态的切换。

        由于状态机初始状态就是闲置状态,一开始我们角色就应该播出闲置动画。在闲置的动画状态类里,由于此时状态是此,在游戏对象的随帧Update调用中,当我们检测到玩家按下了a和d键(Unity中存在Horizontal对AD的检测,使用方法GetAxis进行检测即可)时,应该从闲置状态切换到移动状态。但是即然存在移动,我们就需要方向上的确定,获取的ad状态存在方向,由于多种状态需要此值,可以设计xSpeed检测方向于PlayerState上。

        移动状态需要进行移动,我们通过Player脚本获取其脚本进行速度位移。但是速度位移的很多状态下都需要进行控制,我们将其方法设计到Player下,形参传递x和y方向上的速度即可。初始和中间过程均需要维持速度。当检测到xSpeed为0时,移动状态应该转换为闲置状态,并且闲置状态的速度应该为0,所以在闲置状态的开始状态速度设置为0。

        由于我们需要能够在Unity中自由控制玩家的速度,在Player声明空开变量MoveSpeed来控制角色位移速度。 

        脚本编写:

Player:

 

PlayerState:

PlayerIdleState: 

PlayerMoveState:

        我们试着运行一下:

        可以看到我们实现了角色闲置状态和移动状态的切换。但是此时发现一个bug,角色图片只有向右的动画,没有向左的动画,需要重写制作动画设置条件吗?并不需要,我们利用脚本就可以控制。 

2.玩家整体的翻转

        我们是不是只需要角色在往左移动的时候将角色整体向左翻转即可?

        那么我们只需要控制角色方向切换移动时能够进行控制翻转,而我们输入的xSpeed正好可以管控角色输入的方向。但是需要注意,翻转时比如x<0向左翻转,但是必须控制当前情况需要为向右的状态,如果本来是向左的状态那么翻转就失败了。

        控制是否左右的变量我们设置在Player(isRight bool),并且为了之后的碰撞检测线的翻转问题,我们留下positionDir指定玩家-1为左移动,1为右移动。初始均为右移动。因为翻转是随时的,并且在改变速度时才可翻转,那么我们设置在Player上的意义又多了一个。将Dir设置为公开,isRight设置为私有并且为true。start时检测外界是否修改,修改需要设置对应false。这样翻转才正确。

Player:

修改上述文件即可,我们查看效果即可。 

3.玩家在地面状态和跳跃状态的切换

        在之前的状态机中我们已经谈过,我们处于地面状态时(移动和闲置),均可以进行跳跃。利用类与对象基础的关系,我们床在移动和闲置类的父类,玩家状态类的子类,由此地面类进行控制玩家从地面状态到跳跃状态的切换。

        跳跃状态在一开始需要一个向上的速度,我们需要空开jump跳跃数据进行控制。但是跳跃状态存在两种动画:向上跳动画+向下跳动画。那么我们如何控制这两种动画的切换呢?

        首先通过动画序列创建向上跳和向下跳的动画序列(之前的资源进行寻找)。然后在动画控制界面我们做一点不一样的事情,此时条件变成了一个float数,从1到-1.我们通过创建混合树的方式,控制角色在空中时的状态:

        然后玩家跳跃后在PlayerState可为其添加角色下落速度方向为其修改(整个空中状态)。

        因为此时为状态树模式,我们控制的状态在同一时刻存在一种状态,所以常见的无限跳bug也解决了,但是玩家落地的时候如何判定为落地状态呢?能只是简单的判断y方向上为0吗?比如玩家滑行模式中(fly?)y方向速度为0不应该为闲置状态,我们需要的是碰撞检测。

碰撞检测

        我们需要实现一个地面碰撞检测,为了方便后续,我们同步实现墙体检测(滑墙和登墙跳操作)。

        地面检测我们通过Unity的Physics2D中的Raycast向量检测进行。此函数能够在空间中确定一个从起点到上、下、左、右方向的距离的一个向量,并且可指定layerMask(层级蒙版)来检测特定的layer,当此向量检测到存在对应的碰撞体时,就会返回相应个数(实际我们只需要知道碰撞到即可)

        墙面检测类似。那么我们想要将其形象化的表示出来才能进行更好的调节参数。表示出来我们可以使用Gizmos中的DrawLine功能,就能进行绘画向量,由起始和终点位置决定。并且为了更好的进行调节实现,起点位置的GameObject可以公开出去,这样我们可以自由决定检测的起始位置。

        另外,你是否存在这种想法:玩家跳跃时表明一个状态即可,墙体检测IsGroundCheck随时在update。是的,如果只是维持一个文件表明此跳跃空中状态的化,由于初始给予向上速度和IsGroundCheck可能重叠,导致跳跃失败的情况出现。(可自行测试)

        综上,我们的设计思路如下:(分成两个文件表示跳跃的上跳和下跳也和之后的实现相关)

 代码整理:

        首先文件确定如下:

        PlayerAirState文件表示空中状态,为PlayerJumpState和PlayerFallState的父类,能执行一些共同的事情,比如update检测YDir,空中能随时的确定x速度和方向,后续的多段跳功能。JumpState表示上跳过程,Enter给予向上的速度,Player脚本设计JumpSpeed确定数值。update只需检测如果玩家刚体速度小于0进行切换到下落状态。FallState表示下落过程,注意Update检测是否地面碰撞。(分开的主要原因错开初始向上速度和地面检测重叠一起,导致跳跃失败)

        Player文件new上述状态,并且提供Draw方法和向量检测,暴露一些属性决定位置和数值大小。

Player:

 

PlayerAirState:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerAirState : PlayerState
{public PlayerAirState(Player _player, StateMachine _stateMachine, string _stateBoolName) : base(_player, _stateMachine, _stateBoolName){}public override void Enter(){base.Enter();}public override void Exit(){base.Exit();}public override void Update(){base.Update();player.SetVelocity(xDir * player.moveSpeed, player.rb.velocity.y);// 随时控制跳跃的上跳和下跃状态player.animator.SetFloat("YDir", player.rb.velocity.y);}
}

 PlayerJumpState:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerJumpState : PlayerAirState
{public PlayerJumpState(Player _player, StateMachine _stateMachine, string _stateBoolName) : base(_player, _stateMachine, _stateBoolName){}public override void Enter(){base.Enter();// 初始给玩家一个向上跳的动作player.SetVelocity(player.rb.velocity.x, player.jumpSeed);}public override void Exit(){base.Exit();}public override void Update(){base.Update();if (player.rb.velocity.y < 0) stateMachine.ChangeState(player.fallState);}
}

PlayerFallState:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerFallState : PlayerAirState
{public PlayerFallState(Player _player, StateMachine _stateMachine, string _stateBoolName) : base(_player, _stateMachine, _stateBoolName){}public override void Enter(){base.Enter();}public override void Exit(){base.Exit();}public override void Update(){base.Update();// 地面检测,如果碰撞到了地面,转换为闲置状态if (player.IsGroundCheck()) stateMachine.ChangeState(player.idleState);}
}

 Player中地面和墙体检测表现效果:

4.玩家实现二段跳

        那么我们要实现二段跳如何实现?设想一下,是不是我们只要能在跳跃状态中在检测一下空格键,转换为跳跃状态是否就能实现多段跳功能?

        但是只是上述那个条件,就可以造成无限跳了。为了限制为2段跳,我们不妨设计一个计数器,记录为2个,每往上跳一次--,落地时恢复为2,在空中状态中按下空格键时检测计数器是否>0即可。那么此计数器必须在状态切换时始终唯一,所以该变量就设在Player中去,Jump文件控制--,Fall文件确定恢复。双段跳就可以简单的实现出来了:

Player:

PlayerAirState:

 

 PlayerJumpState:

PlayerFallState:

 

实际效果:

 

相关文章:

【unity】制作一个角色的初始状态(左右跳二段跳)【2D横板动作游戏】

前言 hi~ 大家好&#xff01;欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中&#xff0c;实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用状态机进行实现的。 本系列是跟着视频教程走的&#xff0c;所写也是作者个人的学习记录笔记。如有错…...

不死马的利用与克制(基于条件竞争)及变种不死马

不死马即内存马&#xff0c;它会写进进程里&#xff0c;并且无限地在指定目录中生成木马文件 这里以PHP不死马为例 测试代码&#xff1a; <?phpignore_user_abort(true);set_time_limit(0);unlink(__FILE__);$file .test.php;$code <?php if(md5($_GET["pass…...

计算机竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…...

Java代理简介

代理简介 Java中的代理是一种设计模式&#xff0c;它允许一个对象&#xff08;代理对象&#xff09;代表另一个对象&#xff08;真实对象&#xff09;来控制对真实对象的访问。代理对象通常拥有与真实对象相同的接口&#xff0c;这使得客户端可以通过代理来访问真实对象&#…...

rust元组

一、元组定义 &#xff08;一&#xff09;语法 let tuple_name: (data_type1, data_type2, data_type3) (value1, value2, value3);可以不显式指定类型 let tuple_name (value1,value2,value3);使用一对小括号 () 把所有元素放在一起&#xff0c;元素之间使用逗号 , 分隔。…...

HTTPS工作过程,国家为什么让http为什么要换成https,Tomcat在MAC M1电脑如何安装,Tomcat的详细介绍

目录 引言 一、HTTPS工作过程 二、Tomcat 在访达中找到下载好的Tomcat文件夹&#xff08;这个要求按顺序&#xff09; zsh: permission denied TOMCAT的各部分含义&#xff1a; 引言 在密码中一般是&#xff1a;明文密钥->密文&#xff08;加密&#xff09; &#xff…...

第十课 贪心

文章目录 第十课 贪心lc 322.零钱兑换--中等题目描述代码展示 lc860.柠檬水找零--简单题目描述代码展示 lc455.分发饼干--简单题目描述代码展示 lc122.买卖股票的最佳时机II--中等题目描述代码展示 lc45.跳跃游戏II--中等题目描述代码展示 lc1665.完成所有任务的最少初始能量--…...

5分钟理解什么是卷积的特征提取

大家好啊&#xff0c;我是董董灿。 卷积算法之所以重要&#xff0c;关键在于其提取特征的能力。 5分钟入门卷积算法中提到&#xff0c;卷积模仿的就是人眼识图的过程&#xff0c;以“感受野”的视角去扫描图片&#xff0c;从而获取不同区域的图片信息。 在这一过程中&#x…...

Legion Y9000X IRH8 2023款(82Y3)原装出厂OEM预装Windows11系统

lenovo联想电脑笔记本拯救者原厂win11系统镜像 下载链接&#xff1a;https://pan.baidu.com/s/15G01j7ROVqOFOETccQSKHg?pwdt1ju 系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;ISO…...

【Acwing1010】拦截导弹(LIS+贪心)题解

题目描述 思路分析 本题有两问&#xff0c;第一问直接用lis的模板即可&#xff0c;下面重点看第二问 思路是贪心&#xff1a; 贪心流程&#xff1a; 从前往后扫描每一个数&#xff0c;对于每个数&#xff1a; 情况一&#xff1a;如果现有的子序列的结尾都小于当前的数&…...

DevicData-D-XXXXXXXX勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

引言&#xff1a; 在数字时代&#xff0c;数据安全成为一项至关重要的挑战。DevicData-D-XXXXXXXX勒索病毒&#xff08;以下简称DevicData病毒&#xff09;是这场战斗中的新敌人&#xff0c;它能够以毁灭性的方式加密您的数据&#xff0c;迫使您在数据和时间之间做出艰难的选择…...

从入门到精通,30天带你学会C++【第七天:for循环和while循环以及数组的学习】(学不会你找我)

目录 Everyday English 前言 数组 数组的概念 数组的定义 数组的下标 for循环 循环是什么 基本格式 多重循环 while循环 do-while循环 总结 Everyday English To shine , not be illuminated. 去发光&#xff0c;而不是被照亮。 前言 好久不见&#xff0c…...

Python 编程基础 | 第五章-类与对象 | 5.2、数据成员

一、数据成员 数据成员是指类中定义的变量&#xff0c;即属性&#xff0c;根据定义位置&#xff0c;又可以分为类属性和实例属性&#xff0c;下面分别进行介绍。 1、实例属性 实例属性是指定义在类的方法中的属性&#xff0c;该属性属于当前实例&#xff0c;例如&#xff1a;…...

PHP 个人愿望众筹网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 个人愿望众筹网站系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php 个人愿望众筹网站 代码 https://download.csdn.net/download/qq_41221322/8…...

JS--判断空值(null、undefined、NaN、false、空字符串等)

原文网址&#xff1a;JS--判断空值(null、undefined、NaN、false、空字符串等)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍JavaScript判断空值的方法。 空值包括&#xff1a;undefined&#xff0c;null&#xff0c;NaN&#xff0c;&#xff0c;false&#xff0c;{}&#xff0…...

ChatGPT 背后包含了哪些技术?

ChatGPT 是由OpenAI开发的一款基于GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;的人工智能语言模型。这个模型是使用多种编程语言和技术组合编写的。 首先&#xff0c;ChatGPT 使用了 Python 作为主要的编程语言。Python 是一种流行的高级编程语言&…...

Vue Router(二)

目录 一、嵌套路由 1、路由定义 2、代码例子 3、重定向 二、懒加载 1、缘由 2、代码例子 三、导航守卫 1、全局前置守卫 2、全局后置守卫 3、meta元信息 四、生命周期 1、解释 2、执行顺序 3、例子 五、keep-alive组件缓存&#xff08;保活&#xff09; 1、介…...

ELK整合springboot(第二课)

一、创建一个springboot的项目 pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…...

运维常见的22个故障排查和10个问题解决技巧大汇总!

作为运维&#xff0c;多多少少会碰见这样那样的问题或故障&#xff0c;从中总结经验&#xff0c;查找问题&#xff0c;汇总并分析故障的原因&#xff0c;这是一个运维工程师良好的习惯。每一次技术的突破&#xff0c;都经历着苦闷&#xff0c;伴随着快乐&#xff0c;可我们还是…...

解决 TensorFlow 2.x 中的 “AttributeError: module ‘tensorflow‘ has no attribute ‘placeholder‘“ 错误

项目场景&#xff1a; 在使用 TensorFlow 框架实现深度学习应用时&#xff0c;可能会遇到以下错误&#xff1a; AttributeError: module tensorflow has no attribute placeholder问题描述 在 TensorFlow 1.x 版本中&#xff0c;placeholder 函数用于创建占位符张量。然而&a…...

新风机注意事项有哪些?

选择和使用新风机时&#xff0c;有几个关键注意事项需要牢记&#xff1a; 安装位置&#xff1a;新风机的安装位置很重要。通常情况下&#xff0c;应将其安装在室外以避免室内产生噪音和减少室内的体积占据。确保选择合适的安装位置&#xff0c;以便新风机能够顺利引入新鲜空气。…...

GitHub基础

1、仓库是什么意思&#xff1f;仓库拥有者是谁&#xff1f; 在软件开发或版本控制系统中&#xff0c;"仓库"&#xff08;Repository&#xff09;是指存储项目代码、配置文件、文档等相关文件的地方。它可以看作是一个中央存储库&#xff0c;用于管理和跟踪项目的各个…...

读书笔记--未来简史关键金句和阅读感悟

借着国庆假期&#xff0c;终于有时间研读了尤瓦尔.赫拉利的《未来简史》&#xff0c;作者的写作方式、文笔、观察视角都是我喜欢的类型&#xff0c;作者从古到今&#xff0c;谈到了上帝、神、宗教、科技、生物、智人到未来的超人智神&#xff08;数据主义&#xff09;&#xff…...

【Vue2.0源码学习】生命周期篇-销毁阶段(destroy)

文章目录 1. 前言2. 销毁阶段分析3. 总结 1. 前言 接下来到了生命周期流程的最后一个阶段——销毁阶段。从官方文档给出的生命周期流程图中可以看到&#xff0c;当调用了vm.$destroy方法&#xff0c;Vue实例就进入了销毁阶段&#xff0c;该阶段所做的主要工作是将当前的Vue实例…...

代理IP与Socks5代理在多领域的卓越应用

随着数字化时代的到来&#xff0c;网络工程师在跨界电商、爬虫、出海业务、网络安全和游戏等多个领域中扮演着至关重要的角色。在这些领域中&#xff0c;代理IP与Socks5代理技术已经成为网络工程师的得力助手&#xff0c;本文将深入探讨它们在技术世界中的卓越应用。 1. 跨界电…...

kafka怎么实现零拷贝(Zero-Copy)的?

Kafka 实现零拷贝&#xff08;Zero-Copy&#xff09;主要依赖于操作系统和底层网络库的支持&#xff0c;而不是特定的算法。这是因为零拷贝是一种优化数据传输的技术&#xff0c;通常是通过操作系统和硬件来实现的。以下是 Kafka 如何实现零拷贝的一般原理&#xff1a; 直接内存…...

Hive【Hive(四)函数-单行函数】

函数 函数简介 方便完成我们一些复杂的操作&#xff0c;就好像我们 Spark 中的 UDF 函数&#xff0c;避免用户反复写逻辑。 Hive 提供了大量的内置函数&#xff0c;主要可以分为以下几类&#xff1a; 单行函数聚合函数炸裂函数窗口函数 下面的命令可以查看内置函数的相关…...

C语言学生成绩录入系统

一、系统概述 该系统是一个由链表创建主菜单的框架&#xff0c;旨在快速创建学生成绩录入系统的主菜单结构。其主要任务包括&#xff1a; 实现链表的创建、插入和遍历功能&#xff0c;用于存储和展示学生成绩录入系统各个模块的菜单项。 2. 提供用户友好的主菜单界面&#xf…...

操作系统对内存的管理:分配与回收,虚拟内存,内存容量的扩充,内存保护,补充(链接方式、装入方式)

内存&#xff1a;即内存条&#xff0c;也称主存储器&#xff08;简称主存&#xff09;&#xff0c;用于存放数据。 为了缓和CPU和外存&#xff08;磁盘&#xff09;的速度矛盾&#xff0c;外存的程序先放入内存才能被CPU处理。 内存地址从0开始&#xff0c;每个内存地址对应一…...

[开源]基于Vue的拖拽式数据报表设计器,为简化开发提高效率而生

一、开源项目简介 Cola-Designer 是一个 基于VUE&#xff0c;实现拖拽 配置方式生成数据大屏&#xff0c;为简化开发、提高效率而生。 二、开源协议 使用GPL-2.0开源协议 三、界面展示 概览 部分截图&#xff1a; 四、功能概述 特性 0 代码 实现完全拖拽 配置式生成…...

移动应用开发大专出来做什么/seo优化方案策划书

试题编号&#xff1a; 201703-1试题名称&#xff1a; 分蛋糕时间限制&#xff1a; 1.0s内存限制&#xff1a; 256.0MB问题描述&#xff1a;问题描述小明今天生日&#xff0c;他有n块蛋糕要分给朋友们吃&#xff0c;这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, a…...

wordpress如何导入数据/营销管理系统

1、 搭建了mariadb galera集群后,整个集群停掉后如何启动呢,我们要先启动那个节点呢,今天我尝试把集群机器全部停掉&#xff0c;然后任意启动一个节点,发现报如下的错误: 170620 21:32:55 [ERROR] WSREP: It may not be safe to bootstrap the cluster from this node. It wa…...

dede网站地图位置/关键词排名代发

2019独角兽企业重金招聘Python工程师标准>>> 其实微博是个好东西&#xff0c;关注一些技术博主之后&#xff0c;你不用再逛好多论坛了&#xff0c;因为一些很好的文章微博会告诉你&#xff0c;最近看到酷勤网推荐的一篇文章《30个提 高Web程序执行效率的好经验》&am…...

个人网站首页/网络培训机构

转自&#xff1a;https://blog.csdn.net/wwt18811707971/article/details/107551124 1. 概述 电源完整性&#xff1a; 如何保证电源分配系统&#xff08;Power Distribution Network—— PDN&#xff09;满足负载芯片对电源的要求&#xff0c;即为电源完整性。 解释一下&…...

网站制作网站/深圳优化公司

在Qtpro文件中添加Qtgui QImage的帮助中写的很清楚 Header: #include <QImage> qmake: QT gui...

网站编程培训学校招生/搜索引擎优化文献

提交一个 服务器请求&#xff08;support request&#xff09; 然后在你的服务请求中同时提供下面的信息。 Confluence 服务器 登录 Confluence 然后访问管理员控制台。 将 系统信息&#xff08;System Information&#xff09;页面的中内容进行截图&#xff0c;或者保存页面为…...