通过代码实现人物的基本控制,以及各种逻辑
为了规整代码,现在porject--asset中新建一个文件夹起名为scripts用于存放所有的代码,在创建一个子文件Player用于保存与人物相关的代码
接下来再Player中创建一个代码c#,命名为Player Controller,用于设置人物基本的走动跳跃
然后稍等一下,unity会对代码进行编译,编译之后就可以使用了
在创建好之后,可以在inspector窗口中预览代码的详细内容
代码开头public class
class代表一个类,class后面是类名
文件名字要与class后的类名一致,如果不一致,那么无法使用该代码,所以一开始创建的时候,就要把名字改好(创建之后就要立即改名,否则会不方便,脚本名统一用大驼峰的形式,在命名变量的时候可以使用小驼峰的方式,尽量使用统一的代码规则,方便对代码进行纠错),然后就可以将这个代码添加到Player的身上
选择Player--add component搜索Player Controller,添加(也可以通过拖拽的方法添加到Player、上)
双击可以打开代码编译器
using代表我们调用了UnityEngine这个命名空间,这个库里面的所有内容,我们所有需要的东西已经放入这个库当中,只要使用using就可以调用UnityEngine里面的所有内容了
public class是类名,叫做Player Controller,在其他地方想要调用的时候,通过这个名字在获得这个类的证明
把里面的代码删掉,得到一个空代码,保存代码
在使用代码之前,要使用的是unity全新的输入系统
接下来创建一个全新的输入系统
首先要把unity升级到新的input system
edit--project settings--input Manager旧的输入系统,不太容易进行跨平台操作
unity已经设置好了全新的输入系统,在左侧的Player中找到Other settings打开other settings向下滑,修改两个部分的内容
可以修改api的适用等级Api Compatibillity level:NET Framework
Active input Handing:input System Package(New)选择全新的input系统,点击一下unity会重启
重启之后可以使用全新的操作系统
重启之后
window---package manager--左上角选择unity registry,在这里面可以查到package
右上角输入input,查到input system目前版本为1.5,点击install,成功安装好了install system
点击documentation可以查看代码手册接下来要创建新的信息输入系统
创建一下输入系统全新的配置文件
在project中找到settings的文件夹(和管线有关的内容,在创建新项目的时候自带的),在settings中再新建一个文件夹叫做input ststem
选中input system点击project下方的加号选择iinput Actions(这个就是我们全新的这套输入系统)起名为input Controls
双击之后就可以打开
可以添加需要输入检测的按键
点击小加号,就可以添加action map(可以帮助我们在不同的条件下进行切换,在游戏试玩时可有一套输入系统;在暂停时或者控制UI时可以添加另一套输入系统)可以通过切换map来实现不同的操作内容先设置一个action map命名为Gameplay;New action命名为Movement控制人物移动
在右侧有action Type (button按钮,value值的形式)
选择value
control Type控制方式是value的按钮的方式,选择Vector2二维的向量(纵轴和横轴移动的输入检测)
点击movement右侧的“+”
选择Add up/down/left/right,点击以后生成2D Vector ,快速添加上下左右的移动
上面的<No binding>先删去
在2D Vector下的up--path--搜索w,选择w[Keyboard]
将向上移动设置为键盘上的w键
如果想要检测手柄上的按键
在path中点击下拉菜单,点击listen,这个时候他会监听我们输入的按键,比如说手柄的左侧遥感,移动手柄摇杆,会自动提示,希望输入检测那个一个手柄的值,这样就实现了多种输入的绑定
将2D Vector改名为WASD,主要用于保存键盘上的操作
按照上述方法依次设置移动的内容,第一个绑定的按键就是WASD,还希望还希望绑定我们手柄的操作监控
Movement--“ + ”--Add Binding
path选择gamepad
gamepad是一个大的分类,下边有详细的子的分类gamepad中虽然都是手柄,但是也可以区分是PlayStation手柄还是switch手柄或者是xbox的手柄
如果想要包含所有子类的话,可以直接使用gamepet这个类型,检测的是用左侧stick摇杆,来控制方向,这样就成功实现了两种设备的输入检测
想给两种输入检测进行详细的设置,设置什么时候用哪一种输入方法来进行检测
在左上角点击添加一个控制的配置表
命名为Keyboard
下方选择为Keyboard
然后点击save
然后我们在这里就可以看到和Keyboard有关的
然后我们要添加另外一个在重复上述过程
点击左上角add control sheme
添加手柄的控制器,命名为Gameplay
手柄选择最高级,包含了所有的手柄类型
这时候我们旁边就出现了两个选项
当前输入属于哪一个配置表,选择哪个
选择Gameplay
然后在左上方的第二行选择keyboard
里面将不会显示Gamepad的输入
选择Gamepad的话,就只能看到Gamepad的输入,不能看到keyboard的输入
WASD默认不会有任何分类,可以放着不管
所有和案件有关的和单独绑定的话,我们可以用配置表来进行一个区分,方便我们快速显示
上方看到了“ * ”代表我们没有保存,我们可以手动点击保存,或者点击Auto-Save来自动保存我们的配置表
***在此游戏设计中,不使用此方法,所以我们不保存,删除input control***
我们刚才手动去添加,我们刚才也提到了,有的时候我们在map当中,除了gameplay以外,我们也会在ui方面做一些操作,所以我希望unity自动帮我生成一个默认的input action的配置表
接下来我们要这样做
点击Player ---add component--搜索player input(这是一个input system的一个组件,在这个组件当中,我们也可以通过这样的方式,去监听我们的一些操作)
在此当中可以看到他当前提示我,这里你没有input action,你需要创建一个吗,我们可以点击Create Actions创建
点击Create Actions创建
选择Assets文件夹--Settings--input system
命名为Player input control.inputactions点击保存
接下来我们就可以看到他自动生成了我们刚才做的配置表
可以看到它有一些默认的操作
点开move可以看到,包括我们的摇杆,虚拟摇杆,以及WASD都已经帮助我们做好了
WASD当中也是双极的,不仅可以用WASD也可以用右边的上下左右的方向键来进行操作也是可以的
点金UI,我们会发现
在UI这方面也帮助我们提前配置好了,当然了我们还是需要单独设置里面的按键,不过大体的分类这个模板已经做好了
比如说我们的确认按钮,现在显示的是amy,就是按哪个键都可以,稍后我们会来进行调整
那Player这个位置已经提前做好了,我们可以适当的给他改个名字
由于我们项目当中会有许多与Player有关的,如果我们在用Player,很可能会让我们有一些概念上的模糊的
所以我们给他改名为Gameplay,然后手动保存
现在我们先保持着默认的配置表
回头我们会在这里进行删除或者修改
先知道我们已经创建好了就行了
然后现在我们看一下WASD,他读取的数值是2D Vector,也就是xy的值
然后他的方式是Digital Normalized(也就是取整的方式来检测我们输入的数值)
比如说你按一下a或者d,他就可以检测到-1和+1这个数值了
好的我们点击关闭
这样我们就创建好了我们的player input control那么我们如何来使用Player control
刚才我们在Player身上挂载了Player Input之后呢,我们就可以在这里面来进行使用了
他现在我们默认的采取内容是any,就是任何一个,这个就是我们刚才自己手动创建过的,比如说keyboard或者game pad,那在这里默认我们选择any
第一种使用的简单方法呢,就可以在behavior这个里边,我们选择Invoke Unity Events
然后在Events当中,出现了Gameplay和UI
我们就可以看到我们之前做过的move,look和fire,这是系统默认自带的模板
然后你在这个move的位置移动的时候,你想检测执行什么内容,你就可以在这里面添加一些函数方法
这是一个比较传统的最基本的使用方法,也可以使用
不过在这个项目当中,我们以写代码的方式来调用我们的player input
那我们就把这个组件Player Input移除掉了
点击右上角三个点,选择*****Remove Component*******
那么我们怎样通过代码的方式去调用我们的player input action呢
我们选中我们project中的player input control
在Inspector框中有Generate c# Class勾选上,然后点击apply(class就是一个类,所以我勾选了这个选项之后,点击apply,他就会按照我当前的这个名字,来生成一个c#代码,然后我就可以通过这个c#代码的类,来访问它)
我们现在已经创建好了之后呢,我们可以看到这里已经生成一个脚本了,然后他的类名就是player input control
然后我们接下来返回到我们的player control这个代码当中,双击打开
想使用新的unity的输入系统,我们就要调用这个库,也就是调用他的命名空间
在这个上面我们要输入UnityEngine.InputSystem;(“ . ”就代表我们可以访问unityengine这个大库里面的具体的某一个内容,以分号;结束,这样我们就会调用input system相关的内容了)
那接下来,我在这里面就可以创建了,比如说我们创建一个public代表公开的意思
保存你的代码,这样我们就可以创建了一个可以调用我们刚才的input system这个控制有关的代码内容
那就通过这个变量,就可以访问我们刚才创建的所以的内容了
那我们创建了这个变量,我们怎么来启用它呢,这里边要说到一些面向对象的内容了
关于c#的每一个类,我们想要调用他,我们要创建一个实例出来,也是我们常说的要new一个出来
那我们要在游戏的最开始最开始来创建它
我们游戏的一开始是start,那有比start还要早一点运行的叫做awake(这个awake会在start之前运行,我们可以查看一下代码周期函数中的详细说明)
在这个里面我们要把我们的inputControl实例化出来,用等号,让他等于new player input control,这样我们就成功建立了一个input control的实例了
那接下来我就可以调用一些这里面使用的方法了,实例化之后呢,我们会在另外两个函数中,把我们的input control启用和关闭
OnEnable(就是在我们的当前的这个物体被启动的时候,我们对应也把我们的input control启动起来)
OnDisable(在我的物体被关闭的时候,对应的input control也要关闭)
那什么时候是关闭,什么时候是启动
我们先保存代码返回到应用当中,我们来看一下
我们现在的Player选择之后在名字旁边有一个勾选的检查框
检测框如果关闭,人物在场景当中就没有了,关闭的时候就会执行undisable这个函数
勾选启动的时候就会执行OnEnable这个函数
我们可以看到OnEnable,start,awake都是在启动的时候执行
他们的顺序是awake--OnEnable--Start
现在我们大概了解一下这是一个基本的结构,让我们inputControl 新的inputsystem可以启动起来
那接下来,我们怎么实现读取我们移动的数值呢
我们在返回的应用当中,我们双击打开我们的输入
在输入当中我们有一个action叫做move,我们要获得move里面读取的数值,他的数值类型是Vector 2,也就是一个二维向量的数值,y轴和x轴的数值,
那么我们可以创建一个变量来读取这个数值,也方便我们在我们的unity当中去进行查看
回到代码当中
创建一个公开的变量,代表我在unity公开的窗口可以查看到
创建一个Vector 2 的变量,命名为inputDirection(以小驼峰的方式来命名)他可以存储一个Vector 2 的变量
保存代码,返回应用
点击Player,我们可以看到出现InputDirection的变量,有xy值
我希望这里可以显示我们键盘的输入,或者手柄的输入内容
在代码中实现将数值读过去
在周期函数中,有一个叫做update,他是每一帧都会执行,所以我们在每一帧当中去监测我键盘和手柄当中的输入,那输入内容传递到我们的inputDirection,inputDirection去读取我们的inputControl当中的Gameplay中的Move,Read Value读取当中的数值,然后要输入<>(中间要填写输入的类型Vector2)
这样我们就成功在input action当中读到我们设置好的move对应的Vector 2 的值了,我们返回到运行当中来检测一下
点击运行
我们可以看到,当点击WASD时,input Direction上的xy值会发生变化
这样我们就可以通过数值,将数值传递给我们的人物,使人物朝指定的方向运动
我们点开Rigidbody 2D的组件
在info当中,我们可以看到,他其实有一些隐藏的变量的
其中一个非常重要的变量就是他的坐标,这个坐标会重写我的transform的坐标
还有一个非常重要的,就是Velocity速度
既然是模拟物理,我们也会有模拟他的移动速度
所以我们给他x轴一个速度,他就会沿着这个方向持续不断的进行移动
**编译器当中的提示**
扳手的标识,通常代表里面的一些参数和变量
菱形紫色方块,代表的是函数方法
闪电的标识,通常代表一些事件的方法,调用事件的启动和关闭