虚幻引擎5 Gameplay框架(一)

GamePlay概论与打包和批处理脚本

GamePlay简介与创建项目

  • GamePlay框架:用于设计游戏规则,组织和管理游戏核心逻辑、规则以及交互的一套结构化体系。
    • Default Pawn Class:定义角色行为逻辑,接收玩家控制器的输入,一般都写在这个类中
    • HUD Class:告诉游戏玩家目前的状态,HUD主要用于管理UUserWidget
    • Player Controller Class:主要控制Pawn的Actor,本质上就是代表人类的意愿
      • 相机管理
      • 输入系统
      • Player Controller与Player的关联
      • 管理HUD
      • 网络语言通话功能
    • Game State Class:游戏层面的数据变化,例如:游戏是否开始了,阵营得分,存放所有玩家的PlayerState。随关卡的生成销毁
    • Player State Class:用于存放每个玩家在游戏中状态的类,玩家自己的数据。随关卡的生成销毁
    • Spectator Class:Spectator类通常指的是游戏中的观战者模式相关的类
      在这里插入图片描述
  • 虚幻引擎3C概念:Controller、Camera、Character:逻辑闭环
    • Controller:用于接收来自输入设备的输入信号,Controller并不直接控制角色的物理运动,而是通过与对应的Pawn(可能是Character类型)进行交互,发送命令和更新状态。主要用于控制Pawn,通过输入信号又可以控制玩家角色,然后配合相机,从游戏获取信息,控制Character的反馈。
    • Camera:实时为玩家显示游戏中画面。设置Camera与Controller配合,可以实现第一人称视角(FPV)、第三人称视角(TPV)和其他多种视角模式,同时也可以调整相机的视野、远近裁剪面、缩放等因素,以增强玩家的游戏体验。
    • Character:游戏中代表的玩家或者非玩家实体对象(AI控制)。Character 类通常是从 Pawn 类派生而来,Character通常带有骨骼动画系统支持,能够进行复杂的动作表现,并且与物理系统相结合,进行运动和碰撞检测。
综上所述,“3C”构成了虚幻引擎中角色控制和视觉表达的核心要素,它们相互协同工作,共同实现了游戏中角色的交互行为及玩家的视觉感知。

模版代码:Character初始化构造

  • GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);
    • 初始化胶囊体的宽高度
    • 头文件:#include “Components/CapsuleComponent.h”
  • 让相机不做旋转
 	bUseControllerRotationPitch = false;bUseControllerRotationYaw = false;bUseControllerRotationRoll = false;
  • GetCharacterMovement()->bOrientRotationToMovement= true;
    • 角色在输入方向时,进行旋转
    • 头文件:#include “GameFramework/CharacterMovementComponent.h”
    • 如果是这里是false,就会反方向行走
      请添加图片描述
  • GetCharaterMovement()->RotationRate= FRotator(0.0f, 500.0f, 0.0f);
    • 控制角色转向时的速率
	//跳跃高度GetCharacterMovement()->JumpZVelocity = 700.f;//跳跃向前浮动移动速率GetCharacterMovement()->AirControl = 0.35f;//最大移动速度GetCharacterMovement()->MaxWalkSpeed = 500.f;//以最小模拟摇杆倾斜行走时,我们应该加速到的地面速度GetCharacterMovement()->MinAnalogWalkSpeed = 20.f;//行走时减速,不加加速度。这是一个恒定的反作用力,它直接使速度降低一个恒定值GetCharacterMovement()->BrakingDecelerationWalking = 2000.f;
  • CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT(“CameraBoom”));
    • 创建一个相机臂组件
    • 头文件:#include “GameFramework/SpringArmComponent.h”
  • CreateDefaultSubobject:这是一个模版函数
	template<class TReturnType>TReturnType* CreateDefaultSubobject(FName SubobjectName, bool bTransient = false){UClass* ReturnType = TReturnType::StaticClass();return static_cast<TReturnType*>(CreateDefaultSubobject(SubobjectName, ReturnType, ReturnType, /*bIsRequired =*/ true, bTransient));}
  • 相机臂就可以理解为一个自拍杆,这样就可以查看角色的最佳角度
//附加到根组件上
CameraBoom->SetupAttachment(RootComponent);
//相机臂长度
CameraBoom->TargetArmLength = 400.0f;
//打开相机臂的旋转,让控制器控制相机臂,之前让相机不做旋转,因为相机被相机臂控制
//这里就像自拍时,我们借助一个自拍杆来更好调整相机角度
CameraBoom->bUsePawnControlRotation = true; 
  • FollowCamera = CreateDefaultSubobject(TEXT(“FollowCamera”));
    • 创建相机组件
    • 头文件:#include “Camera/CameraComponent.h”
//将摄像机固定在吊杆的末端,让吊杆调整到与控制器方向相匹配的位置
FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); 
/*
让相机不相对于手臂旋转,即便这里是true也无妨, 因为最终还是根据相机臂的旋转进行。
除非相机臂的旋转是false,那这里为true就会进行以相机为中心进行旋转
*/
FollowCamera->bUsePawnControlRotation = false;

模版代码:增强输入逻辑流程

  • 增强输入系统是一个插件,首先我们就得在项目中添加增强输入这个插件
    在这里插入图片描述
  • 然后我们要区分行为与映射上下文
    • UInputMappingContext:映射上下文,理解是管理行为的管理员
    • UInputAction:理解为行为操作
	/** MappingContext */UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))class UInputMappingContext* DefaultMappingContext;/** Jump Input Action */UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))class UInputAction* JumpAction;/** Move Input Action */UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))class UInputAction* MoveAction;/** Look Input Action */UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))class UInputAction* LookAction;
  • 这里声明的映射上下文要与行为,要与虚幻引擎对应相接,因为我们需要从虚幻中去获取用户输入的行为操作,进行数据逻辑响应该有的操作

在这里插入图片描述

  • 行为需要绑定函数进行行为控制,此函数必须传入FInputActionValue
    • 头文件:#include "InputActionValue.h",因为在.h中声明头文件,一定要在#include "GamePlayCodeParsingCharacter.generated.h"上方添加头文件
    • FInputActionValue:获取虚幻中行为的值类型,以下四种类型
    • using Button = bool;
    • using Axis1D = float;
    • using Axis2D = FVector2D;
    • using Axis3D = FVector;
	/** Called for movement input */void Move(const FInputActionValue& Value);/** Called for looking input */void Look(const FInputActionValue& Value);
  • 为行为绑定函数操作,需要将用户输入组件强转为增强输入组件进行绑定操作,问就是虚幻官方定义的规则必须遵循
  • 头文件:#include "EnhancedInputComponent.h"
void AGamePlayCodeParsingCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{// Set up action bindingsif (UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent)) {//JumpingEnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump);EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);//MovingEnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AGamePlayCodeParsingCharacter::Move);//LookingEnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AGamePlayCodeParsingCharacter::Look);}
}

移动的实现原理

void AGamePlayCodeParsingCharacter::Move(const FInputActionValue& Value)
{// input is a Vector2DFVector2D MovementVector = Value.Get<FVector2D>();if (Controller != nullptr){// find out which way is forwardconst FRotator Rotation = Controller->GetControlRotation();const FRotator YawRotation(0, Rotation.Yaw, 0);// get forward vectorconst FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);// get right vector const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);// add movement AddMovementInput(ForwardDirection, MovementVector.Y);AddMovementInput(RightDirection, MovementVector.X);}
}
  • 那就来浅浅解释一下虚幻5中为什么这样写逻辑
    • 已知虚幻中的X:Pitch,Y:Yaw,Z:Roll

    • 我们获取到FInputActionValue这个结构体中的FVector2D,注意这里是FVector2D,这是数学平面坐标系
      FVector2D MovementVector = value.Get<FVector2D>();//获取速度
      在这里插入图片描述

    • 而在UE三维移动中,我们只需要关注Yaw(也就是Y)
      FRotator YawRotation = FRotator(0, Rotation.Yaw, 0);
      在这里插入图片描述

    • 然后在虚幻中默认为右方向以角色右手为正方向,所以那平面坐标系里面X是不是就是前后了,Y是左右
      FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
      FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
      在这里插入图片描述

    • 此时我们已经得到了前后左右的单位向量后,回到开始的逻辑因为UE5增强输入系统传入的是FInputActionValue结构体了,然后获取的是FVector2D这是个数学平面坐标系,所以添加到角色移动中,这里前后就是数学平面坐标系的Y了,左右就是X了
      AddMovementInput(ForwardDirection, MovementVector.Y);
      AddMovementInput(RightDirection, MovementVector.X);
      在这里插入图片描述

  • AddMovementInput函数源码:最后返回就是WorldDirection * ScaleValue,而这个ScaleValue值正负决定前后,这里的AddMovementInput(ForwardDirection, MovementVector.Y);传入的正负值由映射上下文的修改器决定了,对于移动来说,一切都是线性的,正为前进,负为后退
void APawn::AddMovementInput(FVector WorldDirection, float ScaleValue, bool bForce /*=false*/)
{UPawnMovementComponent* MovementComponent = GetMovementComponent();if (MovementComponent){MovementComponent->AddInputVector(WorldDirection * ScaleValue, bForce);}else{Internal_AddMovementInput(WorldDirection * ScaleValue, bForce);}
}

视角旋转实现原理

  • 添加偏航和俯仰输入到控制器
    • AddControllerYawInput(LookAxisVector.X):Yaw轴左右转向,数学坐标系中X左右
    • AddControllerPitchInput(LookAxisVector.Y):Pitch轴抬头低头,数学坐标系中Y上下
void AGamePlayCodeParsingCharacter::Look(const FInputActionValue& Value)
{// input is a Vector2DFVector2D LookAxisVector = Value.Get<FVector2D>();if (Controller != nullptr){// add yaw and pitch input to controllerAddControllerYawInput(LookAxisVector.X);AddControllerPitchInput(LookAxisVector.Y);}
}
  • 甚至可以在这控制抬头与低头的范围
void AGamePlayCodeParsingCharacter::Look(const FInputActionValue& Value)
{// input is a Vector2DFVector2D LookAxisVector = Value.Get<FVector2D>();if (Controller != nullptr){// add yaw and pitch input to controllerAddControllerYawInput(LookAxisVector.X);if (GetControlRotation().Pitch < 270.f && GetControlRotation().Pitch>180.f && LookAxisVector.Y > 0.f){return;}if (GetControlRotation().Pitch < 180.f && GetControlRotation().Pitch>45.f && LookAxisVector.Y < 0.f){return;}AddControllerPitchInput(LookAxisVector.Y);}
}
  • 添加映射上下文,别问为什么这么长,虚幻官方规定的规则
void AGamePlayCodeParsingCharacter::BeginPlay()
{// Call the base class  Super::BeginPlay();//Add Input Mapping Contextif (APlayerController* PlayerController = Cast<APlayerController>(Controller)){if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer())){Subsystem->AddMappingContext(DefaultMappingContext, 0);}}
}
  • 最后在虚幻中填写修改器与行为次数值
    在这里插入图片描述
    在这里插入图片描述

虚幻引擎中的网络模式

  • 虚幻引擎中的四种网络模式
    • NM_Standalone:单机的游戏服务器,但任被认为是服务器
    • NM_DedicatedServer:独立服务器,没有本地玩家的服务器
    • NM_ListenServer:有本地玩家,网络上的其他玩家可以使用的服务器
    • NM_Client:客户端连接到远程服务器,因为这是枚举类型,是可以做对比的,注意每一个小于这个值的模式都是一种服务器,所以检查NetMode < NM Client总是某种类型的服务器
enum ENetMode
{/** Standalone: a game without networking, with one or more local players. Still considered a server because it has all server functionality. */NM_Standalone,/** Dedicated server: server with no local players. */NM_DedicatedServer,/** Listen server: a server that also has a local player who is hosting the game, available to other players on the network. */NM_ListenServer,/*** Network client: client connected to a remote server.* Note that every mode less than this value is a kind of server, so checking NetMode < NM_Client is always some variety of server.*/NM_Client,NM_MAX,
};
  • 模式的运行规则
    在这里插入图片描述
  • 四种网络模式的区别
    在这里插入图片描述
  • NM_DedicatedServer需要单独打包,所以虚幻引擎中是没有选择项的
    在这里插入图片描述
  • NM_ListenServer下运行,本地窗口既是服务器又是客户端一
    在这里插入图片描述

独立服务器和客户端打包

  • 打包之前要项目设置几点
    • 创建压缩烘焙包
      在这里插入图片描述
    • 选中自己游戏里面有多少张地图就要选择多少张,然后需要的编译模式
      在这里插入图片描述
  • 打独立单机包,这里的二进制配置文件如果是项目里面编译模式对应的话,就会打包得快一些
    在这里插入图片描述
    在这里插入图片描述

打包服务器与客户端的前提要素

  • 打包服务器与客户端前需要
    • 复制两个Editor.Target.cs文件进行改写
      在这里插入图片描述
      在这里插入图片描述
    • 添加这两个改好名字的现有项到项目中
      在这里插入图片描述
  • 然后修改这两个文件里面的代码错误,然后进行编译
  • GamePlayCodeParsingClient.Target .cs
// Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;
using System.Collections.Generic;public class GamePlayCodeParsingClientTarget : TargetRules
{public GamePlayCodeParsingClientTarget(TargetInfo Target) : base(Target){Type = TargetType.Client;DefaultBuildSettings = BuildSettingsVersion.V2;IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;ExtraModuleNames.Add("GamePlayCodeParsing");}
}
  • GamePlayCodeParsingServer.Target.cs
// Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;
using System.Collections.Generic;public class GamePlayCodeParsingServerTarget : TargetRules
{public GamePlayCodeParsingServerTarget(TargetInfo Target) : base(Target){Type = TargetType.Server;DefaultBuildSettings = BuildSettingsVersion.V2;IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;ExtraModuleNames.Add("GamePlayCodeParsing");}
}
  • 编译过后,就会出现这两个打包项
    在这里插入图片描述

打包服务器

  • 然后进行打包服务器
  • 此时就已经打包好了,独立服务器是不进行渲染的,打开是看不到游戏界面的,但是可以看见日志消息
    在这里插入图片描述
    • 创建这个.exe的快捷方式,然后在属性里面添加命令行 -log命令参数就可以看见日志消息
      在这里插入图片描述
      在这里插入图片描述

打包客户端

  • 打包客户端
    在这里插入图片描述
  • 创建这个.exe的快捷方式,然后在属性里面添加命令行 -WINDOWED -ResX=800 -ResY=450,可以让运行的项目不是全屏状态
    在这里插入图片描述
    在这里插入图片描述

建立客户端与服务器连接逻辑

  • 首先创建自己的控制器
    在这里插入图片描述
  • 然后在GameMode里面注册我们的控制器
    在这里插入图片描述
  • 在控制器里面重写BeginPlay,然后在BeginPlay里面连接服务器
  • ETravelType源码
    在这里插入图片描述
    在这里插入图片描述
  • 虚幻里面默认端口为7777
    在这里插入图片描述
void AGamePlayPlayerController::BeginPlay()
{Super::BeginPlay();//获取当前网络模式ENetMode NM = GetNetMode();if (NM == NM_Standalone){FURL map;map.Host = "127.0.0.1";//本地地址map.Port = 7777;//虚幻默认端口号map.Map = "ThirdPersonMap";//旅行到不同的地图或者地址ClientTravel(map.ToString(), ETravelType::TRAVEL_Absolute);}
}

使用批处理脚本打包

  • 当我们打包后,如果需要改代码就得重新进行打包
  • 我们使用一个批处理脚本进行打包
  • 虚幻引擎官方文档:虚幻命令行参数文档
echo off
echo -----------------------------------------------------
echo     Run Package                 
echo -----------------------------------------------------set ProjectName= 这里是你自己的项目名::设置编译类型
set /p BuildType=Set BuildType (1-DebugGame 2-Development 3-Test 4-Shipping) :
if %BuildType% equ 1 set Config=DebugGame
if %BuildType% equ 2 set Config=Development
if %BuildType% equ 3 set Config=Test
if %BuildType% equ 4 set Config=Shipping::根据目标设置打包参数
set /p Target=Set TargetType (1:Client 2:Server 3:Game) :
if %Target% equ 1 set Args=-cookcultures=zh-Hans+zh-Hant+en -CrashReporter -Client
if %Target% equ 2 set Args=-serverplatform=Win64 -Server -noclient
if %Target% equ 3 set Args=-cookcultures=zh-Hans+zh-Hant+en -CrashReporter start %~dp0..\..\UnrealEngine-5.2\Engine\Build\BatchFiles\RunUAT.bat BuildCookRun ^-project=%~dp0%ProjectName%.uproject ^-platform=Win64 ^-clientconfig=%Config% ^-serverconfig=%Config% ^-allmaps ^%Args% ^-build ^-cook ^-stage
  • 将这个批处理文件放在项目目录下
    在这里插入图片描述

  • 项目在Development Server下生成一下,因为之前就是Development Editor下编译的,这样使用这个服务器会比较快一点
    在这里插入图片描述

  • 然后使用批处理程序进行服务器打包
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 然后使用批处理程序进行客户端打包

  • 项目在Development Client下生成一下
    在这里插入图片描述
    在这里插入图片描述

  • 然后再使用两个脚本打开服务器与客户端

  • 客户端脚本

@echo off
echo ------------------------------------
echo       Run Client
echo ------------------------------------set ProjectName=你的项目
set ClientMapName=你的地图名字::编译目标配置
set /p Config=set[1:DebugGame 2:Test 3:Shipping 4:Development]:
if %Config% equ 1 set BinConfig=DebugGame
if %Config% equ 2 set BinConfig=Test
if %Config% equ 3 set BinConfig=Shipping
if %Config% equ 4 set BinConfig=Developmentset /p Name=Select player name: 1-AAA 2-BBB :
if %Name% equ 1 set PlayerName=AAA
if %Name% equ 2 set PlayerName=BBB::启动客户端
start "CLIENT<%ClientMapName%>" ^Saved/StagedBuilds/WindowsClient/%ProjectName%/Binaries/Win64/%ProjectName%Client.exe ^%ClientMapName% ^-game ^-PlayerName=%PlayerName% ^-nothreadtimeout ^-notimeouts ^-windowed ^-ResX=900 ^-ResY=500 ^-log log=Client.log ^-locallogtimes
exit /B 1
  • 服务器脚本
@echo off
echo ------------------------------------
echo       Run Server
echo ------------------------------------set ProjectName=GamePlayCodeParsing
set MapName=ThirdPersonMap
set ServerName=GamePlay_Server::编译目标配置
set /p Config=set[1:DebugGame 2:Test 3:Shipping 4:Development]:
if %Config% equ 1 set BinConfig=DebugGame
if %Config% equ 2 set BinConfig=Test
if %Config% equ 3 set BinConfig=Shipping
if %Config% equ 4 set BinConfig=Developmentstart "SERVER<%MapName%>" ^Saved/StagedBuilds/WindowsServer/%ProjectName%/Binaries/Win64/%ProjectName%Server.exe ^%ProjectName% %MapName%?Listen?MaxPlayers=10 ^-server ^-game ^-ServerName=%ServerName% ^-notimeouts ^-log log=Server.log ^-locallogtimes
  • 然后打开服务器脚本
    在这里插入图片描述
    在这里插入图片描述
  • 打开两个客户端看看是否连接上了
    在这里插入图片描述
    在这里插入图片描述

使用批处理脚本运行独立进程游戏模式

  • 通过批处理脚本在未打包的情况下运行服务器与客户端

  • 使用DebugGame Editor编译模式生成一下,这样就会出现UnrealEditor-Win64-DebugGame.exe
    在这里插入图片描述
    在这里插入图片描述

  • 服务器脚本

@echo off
echo ------------------------------------
echo       Run EditorServer Debug
echo ------------------------------------set ProjectName=GamePlayCodeParsing
set MapName=ThirdPersonMapstart "EditorServer_%ProjectName%_%MapName%" ^%~dp0..\..\UnrealEngine-5.2\Engine\Binaries\Win64\UnrealEditor-Win64-DebugGame.exe ^%~dp0%ProjectName%.uproject %MapName% ^-server ^-notimeouts ^-log log=Log_EditorServer_%ProjectName%_%MapName%.log
  • 客户端脚本
@echo off
echo ------------------------------------
echo       Run EditorClient DebugGame
echo ------------------------------------set ProjectName=GamePlayCodeParsing
set MapName=ThirdPersonMapset /p Name=Select player name: 1-Xiaogua 2-Dagua :
if %Name% equ 1 set PlayerName=Xiaogua
if %Name% equ 2 set PlayerName=Daguastart "EditorClient<%PlayerName%>" ^%~dp0..\..\UnrealEngine-5.2\Engine\Binaries\Win64\UnrealEditor-Win64-DebugGame.exe ^%~dp0%ProjectName%.uproject %MapName% ^-game ^-PlayerName=%PlayerName% ^-windowed ^-ResX=900 ^-ResY=500 ^-notimeouts ^-log log=Log_EditorClient_%ProjectName%_%PlayerName%.log
  • 打开服务器与客户端批处理程序就可以不打包也能开启服务器与客户端
    在这里插入图片描述

  • 也可以使用虚幻引擎进行对接入服务器,我们逻辑写的是单机模式下才进行服务器连接,所以我们需要把网络模式换成NM_Standalone

  • 然后换成独立进程开启就可以连接上了

  • tisp:注意开虚幻引擎的时候不要用Windows调试器开,直接Ctrl+F7开虚幻引擎就可以连接了
    在这里插入图片描述

  • 连接
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

【R语言】组合图:散点图+箱线图+平滑曲线图+柱状图

用算数运算符轻松组合不同的ggplot图&#xff0c;如图&#xff1a; 具体代码如下&#xff1a; install.packages("devtools")#安装devtools包 devtools::install_github("thomasp85/patchwork")#安装patchwork包 library(ggplot2) library(patchwork) #p1是…

[ACTF2020 新生赛]Upload--BUUCTF

题&#xff1a; 第一步&#xff1a;上传php文件&#xff0c;他提示&#xff0c;只能上传jpg、png、gif 第二步&#xff1a;使用bp抓上传jpg文件的包&#xff0c;在修改文件后缀名为phtml 修改前 修改后 第三步&#xff1a;进行放过&#xff0c;在访问浏览器 得到&#xff1a;U…

第07-4章 网络层详解

7.1 网络层协议 IP协议ARP&#xff08;地址解析协议&#xff09;RARP&#xff08;反向地址解析协议&#xff09;ICMP&#xff08;互联网控制消息协议&#xff09; 7.2 IP协议详解 7.2.1 IP协议功能 寻址和路由传递服务&#xff08;不可靠&#xff0c;尽最大努力&#xff0c…

线性代数基础1向量

1、向量是什么 1.1、向量的定义 在数学中&#xff0c;向量&#xff08;也称为欧几里得向量、几何向量、矢量&#xff09;&#xff0c;指具有大小和方向的量。它可以形象化地表示为带箭头的线段。箭头所指&#xff1a;代表向量的方向&#xff1b;线段长度&#xff1a;代表向量的…

Rust腐蚀服务器定制地图开服

Rust腐蚀服务器定制地图开服 大家好我是艾西一个做服务器租用的网络架构师。Rust腐蚀这个游戏有很多的插件mod作者&#xff0c;在地图制作这一块也是一样&#xff0c;有些好玩的地图可能大家在map网站找到了但是不知道怎么操作设置那么今天艾西给大家说下特定定制地图怎么弄。…

嬴图| ISO/IEC-GQL国际图语言标准发布,图技术开启新纪元

GQL作为继SQL之后的第二个数据库查询语言国际标准&#xff0c;近日正式发布。这标志着图技术开启新纪元——图时代即将到来&#xff01; 同时&#xff0c;这也预示着将有越来越多的组织采用“图”来解决各种复杂问题&#xff0c;更意味着SQL系统与负载将逐渐转向GQL&#xff0…

2024最新SSL证书在线申请系统源码 | 支持API接口 支持在线付费 二开优化版

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 2024最新SSL证书在线申请系统源码 | 支持API接口 支持在线付费 二开优化版 最新SSL证书在线申请系统源码 | 支持API接口 SSL证书保证网络安全的基本保障。向您介绍我们的在线生成SSL…

Ubuntu20.04安装 mysql8.0.32

检查删除原有的mysql(可以不做&#xff0c;自己记录) 1、 下载 MySQL :: Download MySQL Community Server (Archived Versions) wget https://cdn.mysql.com/archives/mysql-8.0/mysql-server_8.0.32-1ubuntu20.04_amd64.deb-bundle.tar 2、解压到指定目录下 tar xvf mysq…

GDPU Java 天码行空9

&#xff08;一&#xff09;实验目的 1、掌握JAVA中异常类型及其特点&#xff1b; 2、重点掌握异常的处理方法&#xff1b; 3、能创建自定义异常处理方法&#xff1b; 4、掌握文件操作方法。 &#xff08;二&#xff09;实验内容和步骤 1、try catch finally 如果catch里面有…

vue封装请求、合并js、合并多个js

vue封装请求、合并js、合并多个js 作为一个后端开发&#xff0c;写前端时发现&#xff0c;每次导入api接口都会有一堆代码&#xff0c;像下面这样&#xff1a; import {footprintList, footprintDelete} from /api/userApi.js import {addressList} from /api/userApi.js impor…

PHP定期给自己网站目录做个特征镜像供快速对比

效果图 上代码&#xff1a; <style> h1{font-size:24px;line-height:180%;font-weight:600;margin:1px 2px;color:#0180cf;} h2{font-size:20px;line-height:140%;font-weight:600;margin:2px 4px;color:green;} h3{font-size:16px;line-height:140%;font-weight:600;m…

如何把视频中的画面保存为图片?免费的工具不用白不用

在数字化时代&#xff0c;截取视频中的珍贵瞬间成为了人们创作、分享和保存回忆的重要方式。 那么&#xff0c;如何迅速捕捉视频中的精彩画面&#xff0c;留存美好瞬间呢&#xff1f;有人说直接截图就可以&#xff0c;如果直接截图就可以&#xff0c;小编就不用写这篇文章了&a…

《深入浅出.NET框架设计与实现》笔记2——C#源码从编写到执行的流程

中间语言&#xff08;Intermediate Language&#xff0c;IL&#xff09; C#编译器在编译时&#xff0c;会将源代码作为输入&#xff0c;并以中间语言形式输入出&#xff0c;该代码保存在*.exe文件中或*.dll文件中。 公共语言运行时&#xff08;CLR&#xff09; 可以将IL代码…

26版SPSS操作教程(高级教程第十三章)

前言 #今日世界读书日&#xff0c;宝子你&#xff0c;读书了嘛~ #本期内容&#xff1a;主成分分析、因子分析、多维偏好分析 #由于导师最近布置了学习SPSS这款软件的任务&#xff0c;因此想来平台和大家一起交流下学习经验&#xff0c;这期推送内容接上一次高级教程第十二章…

STM32cubemx和HAL库的使用入门--点亮一颗LED

一&#xff1a;流程介绍 &#xff08;1&#xff09;环境搭建 1 &#xff1a;stm32cubemx安装 2 &#xff1a;stm32xxFW安装 3 &#xff1a;MDK5安装 4 &#xff1a;生成MDK版本project &#xff08;2&#xff09;stm32cubemx创建工程&#xff0c;选择芯片型…

WAF防范原理

目录 一、什么是WAF 二、纵深安全防御 WAF的组网模式 WAF配置全景 WAF端 服务器 攻击端 拦截SQL注入&#xff0c;XSS攻击&#xff0c;木马文件上传 要求&#xff1a; 使用WAF&#xff0c;通过配置策略要求能防御常见的web漏洞攻击&#xff08;要求至少能够防御SQL、XSS、文…

云原生:10分钟了解一下Kubernetes架构

Kubernetes&#xff0c;作为当今容器编排技术的事实标准&#xff0c;以其强大的功能和灵活的架构设计&#xff0c;在全球范围内得到了广泛的应用和认可。本文将深入简出地探讨Kubernetes的核心架构&#xff0c;帮助大家了解Kubernetes&#xff0c;为今后的高效的学习打下良好的…

01-服务与服务间的通信

这里是极简版&#xff0c;仅用作记录 概述 前端和后端可以使用axios等进行http请求 服务和服务之间也是可以进行http请求的spring封装的RestTemplate可以进行请求 用法 使用bean注解进行依赖注入 在需要的地方&#xff0c;自动注入RestTemplate进行服务和服务之间的通信 注…

【Nginx】(二)Nginx 工作流程与模块功能详解

Nginx 工作流程 Nginx 的工作流程是一系列连续的步骤&#xff0c;从启动到接收请求&#xff0c;处理请求&#xff0c;直到关闭。以下是 Nginx 工作流程的简要概述&#xff1a; 开始&#xff1a;Nginx 服务的启动准备。启动 Nginx&#xff1a;加载配置文件 nginx.conf&#xff…

docker系列7:docker安装ES

目录 传送门 Docker安装ES 确定版本 拉取镜像 执行拉取ES镜像 查看ES镜像 运行ES 创建一个新的docker网络 启动一个Elasticsearch容器 查看运行结果 ES启动内存不足 访问ES 公网访问 传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜…