深入了解Unity的Input类:一份详细的技术指南(六)

前言

在Unity开发中,我们通常需要获取并处理用户的输入,这时我们就需要用到Unity的Input类。它允许我们通过键盘,鼠标,触摸屏,游戏手柄等多种方式从用户那里接收输入。在本篇文章中,我会用一万字以上深度解析Unity的Input类,并提供其属性和方法的详细使用方式。


  1. 按键状态相关
    属性:
    Input.anyKey:如果用户按下任何键,返回true(只读)
    Input.anyKeyDown:如果用户在当前帧中按下任何键,返回true(只读)
    方法:
    Input.GetKey(KeyCode key):如果按着指定的键,则返回 true
    Input.GetKeyDown(KeyCode key):如果按下了指定的键,则返回 true
    Input.GetKeyUp(KeyCode key):如果释放了指定的键,则返回 true

Input.anyKey: 检测最后一帧中是否有任何键被按下(bool)
如果用户按下了任何键,或者按下了鼠标按钮,或者触控设备有任何的触控输入,这里的"任何键"包括键盘按键,鼠标按键,以及触控输入。它会在用户按住键不放的整个过程中一直返回 true

void Update()
{if (Input.anyKey){Debug.Log("按着一个键");}
}

Input.anyKeyDown: 检测在当前帧中是否有任何键被按下(bool)
只在用户刚刚开始按下任何键的那一帧,也就是说,只有在按键刚被按下的那一帧,它才会返回 true,之后的帧,即使按键仍然被按住,它也会返回 false。同样的,这里的"任何键"也包括键盘按键,鼠标按键,以及触控输入

void Update()
{if (Input.anyKeyDown){Debug.Log("刚按了一个键");}
}

Input.GetKey(KeyCode key):这个方法可以用来检测用户是否按下了任何指定的键。如果用户按下了指定的键,该方法会返回true,否则返回false,键的名称以KeyCode的形式作为参数。
如果用户一直按住该键,那么此方法会在每一帧都返回 true。

Input.GetKeyDown(KeyCode):只在用户开始按下指定的键的那一帧返回 true。也就是说,只有在按键刚被按下的那一帧,它才会返回 true,之后的帧,即使按键仍然被按住,它也会返回 false

Input.GetKeyUp(KeyCode):只在用户释放指定的键的那一帧返回 true。当用户松开按键时,这个方法在那一帧返回 true,其余时间返回 false

void Update() {if (Input.GetKey(KeyCode.Space)) {Debug.Log("空格键被按着");}if (Input.GetKeyDown(KeyCode.Space)) {Debug.Log("空格键被按下");}if (Input.GetKeyUp(KeyCode.Space)) {Debug.Log("空格键被松开");}
}

  1. 按钮状态相关
    方法:
    Input.GetButton(string buttonName):如果按着指定的虚拟按钮,则返回 true
    Input.GetButtonDown(string buttonName):如果按下了指定的虚拟按钮,则返回 true
    Input.GetButtonUp(string buttonName):如果释放了指定的虚拟按钮,则返回 true
    上面这三个方法用于检测特定的游戏按钮的状态,它们都需要一个字符串参数,这个字符串是你在 Unity 的 Input Manager 中定义的按钮名

Input.GetButton(string buttonName):如果用户按下了指定的虚拟按钮,该方法会返回true,否则返回false。按钮的名称以字符串的形式作为参数。如果一直按住该按钮,那么此方法会在每一帧都返回 true

Input.GetButtonDown(string buttonName):只在用户开始按下指定的按钮的那一帧返回 true。也就是说,只有在按钮刚被按下的那一帧,它才会返回 true,之后的帧,即使按钮仍然被按住,它也会返回 false

Input.GetButtonUp(string buttonName):只在用户释放指定的按钮的那一帧返回 true。当用户松开按钮时,这个方法在那一帧返回 true,其余时间返回 false。

void Update() {if (Input.GetButton("Jump")) {Debug.Log("Jump按钮被按住.");}if (Input.GetButtonDown("Jump")) {Debug.Log("Jump按钮被按下.");}if (Input.GetButtonUp("Jump")) {Debug.Log("Jump按钮被松开.");}
}

  1. 鼠标状态、位置和移动相关
    属性:
    Input.mousePresent:如果有鼠标设备连接上,返回 true(只读)
    Input.mousePosition:返回当前的鼠标位置(只读)
    Input.mouseScrollDelta:返回鼠标滚轮的滚动量(只读)
    方法:
    Input.GetMouseButton(int button):如果按着鼠标按钮,则返回 true
    Input.GetMouseButtonDown(int button):如果按下了鼠标按钮,则返回 true
    Input.GetMouseButtonUp(int button):如果释放了鼠标按钮,则返回 true

Input.mousePresent:这是一个布尔值,如果用户的设备支持并且连接了鼠标设备,则返回 true,否则返回 false。在下面这个例子中,我们在游戏启动时检查鼠标是否连接。

void Start()
{if (Input.mousePresent)  {Debug.Log("“鼠标已连接");}else{Debug.Log("“鼠标未连接");}
}

Input.mousePosition:获取鼠标在屏幕上的位置,这是一个 Vector3 类型的值,表示当前鼠标在屏幕上的位置。位置的 x 和 y 值表示鼠标在屏幕上的像素坐标,z 值通常为 0(在 2D 空间中)。请注意,此坐标的原点(0,0)在屏幕的左下角。

void Update()
{Vector3 mousePosition = Input.mousePosition;Debug.Log(mousePosition); //(-16.0, 221.0, 0.0)
}

Input.mouseScrollDelta:这是一个 Vector2 类型的值,表示自上一帧以来鼠标滚轮的滚动量。x 值表示水平滚动,y 值表示垂直滚动。

void Update()
{Vector2 scrollDelta = Input.mouseScrollDelta;if (scrollDelta.y > 0){Debug.Log("鼠标滚轮向上滚动: " + scrollDelta.y);}else if (scrollDelta.y < 0){Debug.Log("鼠标滚轮向下滚动: " + scrollDelta.y);}
}

Input.GetMouseButton(int button):此方法接收一个整数参数,代表鼠标的按钮索引(0 表示左键,1 表示右键,2 表示中键),并在按钮被持续按下时返回 true

Input.GetMouseButtonDown(int button):此方法同样接收一个整数参数代表鼠标的按钮索引,并只在按钮被首次按下的那一帧返回 true

Input.GetMouseButtonUp(int button):此方法同样接收一个整数参数,代表鼠标的按钮索引,并只在按钮被释放的那一帧返回 true

void Update()
{if (Input.GetMouseButton(0)){Debug.Log("“正在按鼠标左键");}if (Input.GetMouseButtonDown(0)){Debug.Log("“按下了鼠标左键");}if (Input.GetMouseButtonUp(0)){Debug.Log("“松开了鼠标左键");}
}

  1. 其他输入控制相关方法:
    Input.GetAxis(string axisName):根据指定的轴名返回轴的值
    Input.GetAxisRaw(string axisName):根据指定的轴名返回轴的值,没有平滑过滤。
    Input.IsJoystickPreconfigured(string joystickName):检查名为 joystickName 的手柄是否已在 Unity 输入管理器中预配置
    Input.GetJoystickNames():返回当前连接的所有游戏控制器的名称

Input.GetAxis(string axisName): 返回指定虚拟轴的值,轴的名称以字符串的形式作为参数。该值在 -1 和 1 之间,这个值会在没有输入时平滑地返回到 0。这个方法非常有用,可以用来获取预定义的虚拟轴的值,如“Horizontal”或“Vertical”:

void Update() {float horizontalInput = Input.GetAxis("Horizontal");float verticalInput = Input.GetAxis("Vertical");Debug.Log("水平输入: " + horizontalInput);Debug.Log("垂直输入: " + verticalInput);
}

Input.GetAxisRaw(string axisName):提供和GetAxis方法类似的功能,但是该方法不会对值进行平滑处理,它直接返回输入值。当你需要更精确的控制时可以使用该方法,示例同上。

Input.IsJoystickPreconfigured(string joystickName):检查名为 joystickName 的手柄是否已经在 Unity 的输入管理器中预配置。返回 true 表示已经预配置,false 表示没有预配置。

bool isPreconfigured = Input.IsJoystickPreconfigured("Xbox360Controller");

Input.GetJoystickNames():返回当前连接的所有游戏控制器的名称,返回的是一个字符串数组。

string[] joystickNames = Input.GetJoystickNames();
foreach(string joystickName in joystickNames)
{Debug.Log(joystickName);
}

  1. 触摸相关
    属性:
    Input.touchCount:返回当前帧中的触摸数量(只读)
    Input.touches:返回从触摸屏接收的所有触摸信息的数组(只读)
    Input.multiTouchEnabled:设置或获取是否启用多点触控。
    Input.touchSupported:如果设备支持触摸输入,则返回true
    Input.simulateMouseWithTouches:如果启用,则将触摸事件作为鼠标事件进行处理,返回布尔值
    Input.stylusTouchSupported:如果设备支持使用触摸笔作为输入,则返回true
    Input.touchPressureSupported:如果设备支持检测触摸压力,则返回true
    方法:
    Input.GetTouch(int index):返回触摸数据。可以访问正在发生触摸的特定指数

Input.touchCount: 返回一个整数,代表在当前帧被触摸的触摸点数量。对于多点触控设备非常有用,例如在触摸屏设备上实现手势操作。

void Update()
{int touchCount = Input.touchCount;Debug.Log("触摸数量: " + touchCount);   //触摸数量:2
}

Input.touches: 返回一个 Touch[] 数组,包含了当前帧所有的触摸点。每个 Touch 对象包含了该触摸点的详细信息,如位置、压力、相对于上一帧的移动等。

void Update()
{   //遍历所有的触摸点,并在控制台输出它们的位置foreach (Touch touch in Input.touches){Debug.Log("触摸位置: " + touch.position);}
}

Input.multiTouchEnabled: 这个属性是一个布尔值,用于开启或关闭多点触控功能。默认情况下该功能是开启的。如果设为 false,则不论设备上有多少个触摸点,Input.touches 只会返回最早的那个触摸点。

void Start()
{//多点触控功能关闭Input.multiTouchEnabled = false;
}

Input.touchSupported:是一个只读的布尔值属性,它用于检查当前设备是否支持触摸输入。如果支持,它将返回 true,否则返回 false。

if (Input.touchSupported)
{Debug.Log("“本设备支持触摸");
}
else
{Debug.Log("“本设备不支持触摸");
}

Input.simulateMouseWithTouches: 获取或设置是否应该模拟鼠标输入的触摸事件(bool)。
默认情况下,Input.simulateMouseWithTouches 为 true,触控点将模拟鼠标事件,这意味着在多点触控设备上,你可以像在使用鼠标一样处理用户的输入。然而,如果你的应用程序需要处理多点触控,你可能需要将此设置为 false,以防止对触控事件的鼠标模拟。

     //禁用模拟触摸鼠标Input.simulateMouseWithTouches = false;

Input.stylusTouchSupported: 获取设备是否支持手写笔输入(bool),在开发针对触控笔的应用程序时,这是非常有用的

if (Input.stylusTouchSupported)
{Debug.Log("本设备支持手写笔");
}
else
{Debug.Log("本设备不支持手写笔");
}

Input.touchPressureSupported:是一个只读的布尔值属性,它用于检查当前设备是否支持触摸压力(深度触摸)。如果支持,它将返回 true,否则返回 false。对于像 Apple 的 3D Touch 功能这样的技术,这是非常有用的。

if (Input.touchPressureSupported)
{Debug.Log("该设备支持触摸压力");
}
else
{Debug.Log("该设备不支持触摸压力");
}

Input.GetTouch(int index): 这个方法返回指定索引的 Touch 对象。索引应该小于 Input.touchCount数量,否则会抛出异常。下面例子中,如果存在触摸点,就获取第一个触摸点,并输出它的位置。

void Update()
{if (Input.touchCount > 0){Touch firstTouch = Input.GetTouch(0);Debug.Log("第一个触摸点: " + firstTouch.position);}
}

  1. 加速度相关属性:
    Input.acceleration:返回由加速度传感器测量的设备当前加速度(只读)
    Input.accelerationEventCount:返回当前帧中发生的加速度事件的数量(只读)
    Input.accelerationEvents:返回一个包含所有在当前帧中发生的加速度事件的数组(只读)

Input.acceleration: 返回从加速度传感器中获取的设备加速度(Vector3)

void Update()
{Vector3 acceleration = Input.acceleration;Debug.Log(acceleration);//可能会输出如"(-0.00, -0.70, 0.10)"这样的三维向量,这些数字表示设备在x, y, z轴上的加速度。
}

Input.accelerationEventCount: 返回加速度传感器事件的数量(int)

void Update()
{int accelerationEvents = Input.accelerationEventCount;Debug.Log(accelerationEvents);//可能会输出类似于"1"或"0"的数字,这取决于最后一帧中发生了多少加速度事件。
}

Input.accelerationEvents: 这个属性返回一个 AccelerationEvent[] 数组,包含了当前帧所有的加速度事件。每个 AccelerationEvent 对象包含了该事件的详细信息,如加速度和时间戳。这个属性通常用于处理设备的加速度数据。

void Update()
{//遍历所有的加速度事件,并在控制台输出它们的加速度值foreach (AccelerationEvent accEvent in Input.accelerationEvents){Debug.Log("加速度: " + accEvent.acceleration);}
}

  1. 设备行为相关属性:
    Input.backButtonLeavesApp:当这个值为 true 时,按下返回按钮会导致应用程序退出,否则,操作系统将处理返回按钮

Input.backButtonLeavesApp: 设置 Android 的返回按钮是否会让应用程序离开(bool)。以下示例设置返回按钮使应用退出:(只能在Android、Windows Phone或Windows平板电脑上使用)

void Start()
{Input.backButtonLeavesApp = true;
}

  1. 游戏控制器相关属性:
    Input.compensateSensors:启用或禁用输入传感器是否根据屏幕方向进行自动补偿
    Input.deviceOrientation:设备的方向(只读)
    Input.compass:访问设备的指南针,返回一个Compass对象
    Input.gyro:访问设备的陀螺仪,返回一个Gyroscope对象。

Input.compensateSensors: 这是一个布尔值类型的属性,用于启用或禁用是否应补偿设备的自然方向,默认值为 false。当启用此设置时,Unity将尝试自动调整传感器数据,以便自然方向对应于屏幕向上的方向。注意,此设置可能会影响到陀螺仪、加速度计和指南针的数据。

void Start()
{Input.compensateSensors = true;//启用了自动补偿
}

Input.deviceOrientation: 返回设备的物理方向

void Update()
{DeviceOrientation orientation = Input.deviceOrientation;Debug.Log(orientation);//可能会输出"Portrait", "LandscapeLeft", "LandscapeRight"等等,这取决于设备的当前方向。
}

Input.compass: 提供设备罗盘的访问
这个属性返回一个 Compass 对象,它可以提供设备指南针的数据。在使用指南针数据之前,需要先通过调用 Input.compass.enabled = true 来启用指南针

void Start()
{Input.compass.enabled = true;
}void Update()
{Debug.Log("罗盘方向: " + Input.compass.trueHeading);
}
//上述代码首先启用了指南针,然后每一帧都打印出真实的地理方向。

Input.gyro: 提供设备陀螺仪的访问
这个属性返回一个 Gyroscope 对象,可以提供设备陀螺仪的数据。在使用陀螺仪数据之前,需要先通过调用 Input.gyro.enabled = true 来启用陀螺仪

void Start()
{if (SystemInfo.supportsGyroscope) //利用SystemInfo类,判断设备是否支持陀螺仪{Input.gyro.enabled = true;}void Update(){Debug.Log("陀螺仪旋转速度: " + Input.gyro.rotationRate);}
}

  1. 其他
    属性:
    Input.compositionCursorPos:获取或设置输入法编辑器(IME)的位置。返回一个Vector2,表示IME的屏幕坐标
    Input.compositionString:返回用户正在使用输入法编辑器(IME)输入的字符串
    Input.imeCompositionMode:获取或设置当前的输入法编辑器(IME)组合模式
    Input.imeIsSelected:检查输入法编辑器(IME)是否在活动状态并且已选择一个区域进行组合(只读)
    Input.inputString:返回上一帧中键盘或按键输入的字符(只读)
    Input.location:访问设备的位置功能,返回一个LocationService对象
    方法:
    Input.ResetInputAxes():重置所有输入,这将忽略所有的按键/按钮输入和轴移动

Input.compositionCursorPos:这是一个Vector2类型的属性,表示IME组合字符串的屏幕位置。你可以通过设置这个属性来改变屏幕上组合字符串的位置。

Input.compositionCursorPos = new Vector2(100, 200);
//上面的代码将组合字符串的位置设置为屏幕上的(100, 200)的位置

Input.compositionString:这是一个字符串属性,表示当前正在由IME组合的字符串。这在处理非拉丁字符输入时非常有用,如中文输入

string composition = Input.compositionString;
Debug.Log(composition);  // 输出:正在输入的IME组合字符串

Input.imeCompositionMode:控制系统如何处理在屏幕键盘中的文本输入
①这是一个枚举类型的属性(IMECompositionMode枚举),用于控制IME的组合模式。
②允许用户通过标准键盘输入复杂的字形,如中文、日文或韩文等非拉丁语系的语言。
③这个属性有三个值:Auto和On、Off。

On:开启IME。当你希望用户使用IME输入文本时,应将此属性设置为On
Off:关闭IME。如果你不希望用户使用IME输入文本,例如在需要处理原始键盘输入的情况下,应将此属性设置为Off
Auto:自动开启或关闭IME。Unity将根据用户是否正在编辑可输入的文本字段来自动开启或关闭IME。如果用户正在编辑文本字段,IME将开启;否则,IME将关闭。

例如:在用户打开一个需要输入文本的UI界面时,你可能想要开启IME,以便用户可以输入复杂的字形。在用户关闭这个界面时,你可能想要关闭IME,以便可以直接处理键盘输入。

// 开启IME,以便用户可以输入复杂的字形
Input.imeCompositionMode = IMECompositionMode.On;// 当用户完成输入后,关闭IME
Input.imeCompositionMode = IMECompositionMode.Off;// 或者,让Unity根据是否有文本字段正在编辑,自动处理IME的开启或关闭
Input.imeCompositionMode = IMECompositionMode.Auto;

Input.imeIsSelected:是一个只读的布尔型属性,用于判断当前是否选中了输入法编辑器(IME)的输入字段。
当IME正在编辑状态时,这个属性值为true,否则为false

Input.inputString: 返回自上次帧的字符输入(string)

void Update()
{string input = Input.inputString;if (!string.IsNullOrEmpty(input)){Debug.Log(input);}
}

Input.location: 提供了一个用于获取设备的地理位置信息的服务。这个服务可以提供如经度、纬度、海拔、方向和速度等信息
注意:这个服务默认是关闭的,你需要通过调用 Input.location.Start() 来启动位置服务。启动服务可能会消耗一些时间,所以你可能需要一些机制来等待服务完全启动。在启动服务后,你可以通过检查 Input.location.status 来确认位置服务的状态。

    //检查用户是否开启服务if (!Input.location.isEnabledByUser){Debug.Log("用户未启用位置服务");}//开启位置服务Input.location.Start();//检查位置服务是否可用if (Input.location.status == LocationServiceStatus.Failed){Debug.Log("无法确定设备位置");}else{Debug.Log("位置: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude);  //Location: 37.785834 122.406417}//停止位置服务Input.location.Stop();

注意:当你不再需要位置服务时,应通过调用 Input.location.Stop() 来停止服务,以节省设备的电池寿命。
如果想了解更多关于location里的方法和属性的相关内容,有需要的话我会在之后的文章详细说明。

Input.ResetInputAxes() :重置所有输入,这通常用于情况更改时,需要重置可能已经启动并影响输入的动作。
例如,您可能在游戏暂停并重新开始时使用它,以防止玩家在暂停菜单中按下按钮并在游戏恢复后立即生效。

public void ResumeGame()
{// 假设我们当前的游戏暂停了,并且在这里正在恢复游戏...// 在恢复游戏之前,我们需要重置输入输入,以防止在暂停期间发生的任何输入影响游戏Input.ResetInputAxes();// 然后我们可以继续游戏...
}

在上面例子中,Input.ResetInputAxes() 在游戏恢复之前被调用,以清除在暂停期间发生的任何输入


通过使用Unity的Input类,我们可以轻松地获取和处理用户的输入,它是我们在Unity开发中处理用户输入的关键,它使我们能够创建出交互丰富、响应流畅的游戏,希望这篇文章能帮助你更好地理解和使用Unity的Input类。

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

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

相关文章

力扣简单1道_两数之和

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。你可以按任意顺序…

微信小程序开发学习之--地图绘制行政区域图

不知道大家有没有感觉就是在做微信小程序地图功能时刚刚接触时候真的感觉好迷茫呀&#xff0c;文档看不懂&#xff0c;资料找不到&#xff0c;就很难受呀&#xff0c;比如我现在的功能就想想绘制出一个区域的轮廓图&#xff0c;主要是为了显眼&#xff0c;效果图如下&#xff1…

一些学习资源

AI 00 前言 - AI-EDU|openAI 趣味编程 Coding Games and Programming Challenges to Code Better UI设计 创造狮 创意工作者导航 Java Java 技术书籍大全 GitHub - fenixsoft/jvm_book: 《深入理解Java虚拟机&#xff08;第3版&#xff09;》样例代码&勘误 OpenJDK …

【入门SpringCloud(一)】什么是SpringCloud?

一、概述 集群&#xff08;Cluster&#xff09;&#xff1a;同一种软件服务的多个服务节点共同为系统提供服务过程&#xff0c;称之为该软件服务集群。 分布式&#xff08;Distribute&#xff09;&#xff1a;分布式是一种系统架构&#xff0c;是将系统中的不同组件分布在不同…

Mac 安装配置adb命令环境(详细步骤)

一、注意&#xff1a;前提要安装java环境。 因为android sdk里边开发的一些包都是依赖java语言的&#xff0c;所以&#xff0c;首先要确保已经配置了java环境。 二、在Mac下配置android adb命令环境&#xff0c;配置方式如下&#xff1a; 1、下载并安装IDE &#xff08;andr…

springboot + (mysql/pgsql) + jpa 多数据源(不同类数据源)

配置文件&#xff1a; spring:datasource:primary:jdbc-url: jdbc:mysql://host:3306/数据库?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&failOverReadOnlyfalse&serverTimezoneAsia/Shanghai&zeroDateTimeBehaviorconvertToNullusername…

LLaMA系列 | LLaMA和LLaMA-2精简总结

文章目录 1、LLaMA1.1、模型结构1.2、训练方式1.3、结论 2、LLaMA-22.1、相比LLaMA1的升级2.3、模型结构2.3.1、MHA, MQA, GQA区别与联系 2.4、训练方式 1、LLaMA &#x1f525; 纯基座语言模型 《LLaMA: Open and Efficient Foundation Language Models》&#xff1a;https:/…

Unity3d C#快速打开萤石云监控视频流(ezopen)支持WebGL平台,替代UMP播放视频流的方案(含源码)

前言 Universal Media Player算是视频流播放功能常用的插件了&#xff0c;用到现在已经不知道躺了多少坑了&#xff0c;这个插件虽然是白嫖的&#xff0c;不过被甲方和领导吐槽的就是播放视频流的速度特别慢&#xff0c;可能需要几十秒来打开监控画面&#xff0c;等待的时间较…

机器学习笔记 - 什么是keras-core?

一、keras-core 简而言之,Keras Core 是 Keras API 的新多后端实现,支持 TensorFlow、JAX 和 PyTorch。 可以使用如下命令简单安装 pip install keras-core Keras 是一个用 Python 编写的用于深度学习的用户友好工具。它旨在与 AI 领域的另一个主要参与者TensorFlow一起使用…

Spring学习笔记之spring概述

文章目录 Spring介绍Spring8大模块Spring特点 Spring介绍 Spring是一个轻量级的控制反转和面向切面的容器框架 Spring最初的出现是为了解决EJB臃肿的设计&#xff0c;以及难以测试等问题。 Spring为了简化开发而生&#xff0c;让程序员只需关注核心业务的实现&#xff0c;尽…

SpringBoot启动流程及自动配置

SpringBoot启动流程源码&#xff1a; 1、启动SpringBoot启动类SpringbootdemoApplication中的main方法。 SpringBootApplication public class SpringbootdemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootdemoApplication.class, …

ubuntu 配置NAT配置内网网关服务器

本次完全参考 Ubuntu20.04服务器开启路由转发让局域网内其他电脑通过该服务器连接外网 ubuntu 官方防火墙文档 Security - Firewall 本人从前的操作 Ubuntu 18.04 通过 ufw route 配置网关服务器 网关 配置内网DNS 服务器 背景知识 从前总认为既然UFW简化了 iptables &…

Eureka 学习笔记2:客户端 DiscoveryClient

版本 awsVersion ‘1.11.277’ DiscoveryClient # cacheRefreshTask // 配置shouldFetchRegistry if (clientConfig.shouldFetchRegistry()) {// 配置client.refresh.intervalint registryFetchIntervalSeconds clientConfig.getRegistryFetchIntervalSeconds();// 配置expB…

深入理解Zookeeper分布式锁的概念及原理

深入理解Zookeeper分布式锁的概念及原理 1. 引言 在分布式系统中&#xff0c;锁是一种重要的机制&#xff0c;用于协调多个节点之间的并发访问。在大规模分布式系统中&#xff0c;实现高效且可靠的分布式锁是一个挑战。本篇博客将深入探讨Zookeeper分布式锁的概念及其原理&am…

HTML+CSS+JavaScript:轮播图的自动播放、手动播放、鼠标悬停暂停播放

一、需求 昨天我们做了轮播图的自动播放&#xff0c;即每隔一秒自动切换一次 今天我们增加两个需求&#xff1a; 1、鼠标点击向右按钮&#xff0c;轮播图往后切换一次&#xff1b;鼠标点击向左按钮&#xff0c;轮播图往前切换一次 2、鼠标悬停在轮播图区域中时&#xff0c;…

Verilog语法学习——LV5_位拆分与运算

LV5_位拆分与运算 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述&#xff1a; 现在输入了一个压缩的16位数据&#xff0c;其实际上包含了四个数据…

Layui网页模板

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>会员管理</title><link href"layui/c…

JAVA IO 的 Windows、Linux文件路径差异

因为文件路径是字符串拼接的&#xff0c;所以之前的路径是这样 D:\pics/bankslip/2023/08/01\fe68a2c16ecb498f89a88f9472a1361e.png /root/temp/bankslip/2023/08/01\fe68a2c16ecb498f89a88f9472a1361e.png 左斜杠、右斜杠都有的情况 那么在windows中这样的路径是正常的&#…

ComPDFKit 转档SDK OCR表格识别功能

我们非常高兴地宣布&#xff0c;适用于 Windows、iOS、Android 和服务器的 ComPDFKit 转档SDK 1.8.0 现已发布&#xff01;在该版本中&#xff0c;OCR 功能支持了表格识别&#xff0c;优化了OCR文字识别率。PDF to HTML 优化了html 文件结构&#xff0c;使转换后的 HTML 文件容…

css 四角边框移动效果

块是长宽相等的正方形&#xff0c;大小浏览器分辨率变化而变化利用平移变化translate来时实现边框到达鼠标划到的块&#xff0c;坐标是鼠标滑到块的offsetLeft和offsetTop <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&quo…