大家好,接下来我们来了解一下 unity 中的坐标系。 二 d 中使用的是大家都熟知的迪卡尔坐标系,它是一种正交坐标系,也称为直角坐标系。二维的直角坐标系是由两条相互垂直相交于原点的线构成的, 若空间涉及到三 d, 就需要在二 d 坐标系上添加一个新的深度轴,使其成为三 d 坐标系。 那么这个时候就引入了左手坐标系和右手坐标系的概念。左手坐标系如图所示,伸出大拇指 向右并朝向 x 轴的正方向。伸出食指向上并朝向 y 轴的正方向。伸出中指垂直于掌心,朝向掌心的方向指时,中指指向的方向即 z 轴的正方向。 而右手坐标系和左手坐标系是同理。伸出右手的大拇指向右并朝向 x 轴的正方向。伸出食指向上并朝向 y 轴的正方向。伸出中指 垂直于掌心朝向掌心的方向指时,中指指向的方向 z, z 轴的正方向。这个 y 轴也 称为 up, z 轴也称为 forward, x 轴也称为 right。 一般的在建模软件里,建模时模型的正面与 z 轴的方向是一致的, 移动一个物体时,一般就是让这个物体向前运动,也就是 forward。 那么接下来我们来了解一下世界坐标系要与本地坐标系。在 unit 的三 d 世界中有一个固定的左手坐标系, 每一个添加到 unit 的物体都会有一个相对于这个坐标的这个这个坐标系的位置。这个坐标系呢,就是世界坐标系,通过它就可以对 对每一个物体进行定位,也也就知道了所有的物体在三 d 世界里的关系的位置和关系,这个概念有点类似于我们熟知的经纬度,知道了经纬度就能定位到你在地球中的位置。 那么除了世界坐标系,每一个在 unit 三 d 世界里的物体还有一个自身的左手坐标系,即本地坐标系。 就比如遇到问路的人,人们会说他在我的正前方大概两百米的位置,这种以自己为坐标原点的坐标系就类似于本地坐标系。 好,那么这节课就到这,谢谢谢大家。
粉丝18获赞469

在本期视频开始之前,我首先要强调一下关于 unit hub 的汉化,在之前的视频当中有所提到,但是并没有详细的说明,今天来说明一下。 关于 hub 的汉化其实很简单,点击左上角编号设置,在编号设置里找到外观,这有一个 language 语言,在下方切换为简体中文, 也就是说关于 harm 的汉化不需要任何的插件,直接切换语言即可。 而关于编辑器内汉化,之前的视频当中有所提到编辑所展现, 找到这个 gi 缓存下的 language, 默认它可能是一个英格历史。在这里切换为简体中文 做之前,有一个前提条件,也就是你的编辑器必须是添加的这个简体中文模块,如果你没有添加,它是无法汉化的,这一点需要注意。 下面来今天的视频,今天视频带领大家了解一下关于 c 叉宝脚本的应用。首先我们创建一个文件夹, 命名为 sit up, 同时我们创建一个新的场景,命名为 scripts, 我们在这个 search up scripts 里边儿创建一个 search up 脚本,脚本名为 test, 等待编译成功, 双击打开。 如果你没有打开这个 vs 的话,记得去查看一下这个编辑首选项 这个外部工具,看看这个脚本编辑器是否指定成功,如果没有指定成功,可以参考我之前的视频进行指定,因为如果不指定的话,这个脚本无法打开。 回到脚本当中, 我们简单了解一下,顶部有三个以 using 为语句的这个命名空间,也就是我们整个脚本所所要引用的这个头文件。 我们可能之后也要选中一些其他的投文件, 下方有一个公有类类,名为 test, 这个类的名 车与我们脚本名称必须保持一致。它的后方有一个 mono behavior, 这是一个 unity 的基础类,也就是说所有在 unity 里边儿的 ctrl 脚本必须间接或直接继承于这个类,不然这个脚本无法使用。 在这个类里边默认定义了两个函数,两个方法,第一个 start, 第二个 update。 我们可以看一下注视 start 在第一针之前被调用,而 update 每一针都会被调用, 我们可以来测试一下。我们先写个注释,让他输出一点东西,比如说输出零。 关于 set up 的输出有两种方法,第一种是 debug 点 log, 在里边输出个零。 这个零是一个 int 类型的整形变量,也就是数字,当然你也可以把它变成字符串的形式。 里边有一个零,这样呢,可以他们两个所输出的内容是一样的。我们再次用这个上方的这个, 这里输出零,在 update 里边输出一 保存, 关于保存左侧的,这个是保存当前的这个脚本,右侧是保存所有这些在顶部的这些脚本。 我建议使用这个全部保存这个右侧,这个比较方便,防止遗漏。 我们先来推测一下,正常这个脚本执行之后,他在这个控制台输出的时候,会输出一个零,会输出很多个一零,先输出,以后输出, 这是我们的推测,我们来见证一下。回到编程器里, 这里需要注意,这个脚本必须得挂载到当前这个场景里边任何一个不会被销毁的物体上。 我们正常情况下会把它创建一个空物体,把它命名为 test, 位置先重置一下,然后把这个 test 的脚本拖拽过去, 这样这个脚本就挂载上了,如果你不挂载到这个物体上的话,这个脚本不起作用。 我们来点击播放 精致查看一下控制台输出的三百七十四条,往上滑,可以看到第一个输出的是零,以后全是一, 已验证了我们之前的推测, 而且可以发现这个零只被执行了一次, 也就是说在 star 的函数里边的在第一针之前执行,但只执行一次,这一点需要注意。 那么一般情况下,在 star 的函数当中,我们会放一些关于数据的初始化,对变量的复值等等, 先把它删掉, 那么接下来顺便介绍一下关于预制体方面的内容。 我们先创建一个文件夹,命名为 perfects, perfect 就是预制体的一个英文。 我们首先在场景里边创建一个立方体,再创建一个 平面, 我们把它附上一个彩纸,蓝色,红色。 首先先说一下这个预知题,预知体就是一个可重复使用的那么一个游戏对象, 我们先把这个立方体变成一个预制体,把这个某一个物体变成预制体的方法很简单,就是把这个物体拖拽到 assess 文件夹下的,或者任何一个在它下半 的一个文件夹里,都可以把它拖进来。这里我们拖断到这个 perfect 文件夹中,拖入松手,你会发现这个图标变成了蓝色,这就说明这个预制体已经生成成功。 这里可以看到有一个预制体资产,说明这个蓝色的就是预制体。 我们把在场景里边的这个 cube 先删掉保存,然后回到脚本里边, 这里我要做一个操作,也就是当我们点击播放的时候,在长键里边把这个 cube 生成出来,那么这里就需要用到一个方法,关于克隆。首先写一个注释叫克隆遇知题, 那么这个函数方法叫 extended 括号, 这个里面需要放的是一个,嗯,物体也好,一个带有这几个 position rotation 参数的也可以。我们为了方便一点,我们直接给他一个物体 获取预制体物体, 那么这个我们先使用一个最简单的,就是一个工友类型的一个 game more jack, 一个物体有些对象, 我们把这个名字命名为 cube gar p r e provide 的前缀,然后我们把这个 cube p r e 放到这个括号里边 保存,然后回到编辑器里边,我们点击这个 test, 这里可以看到这个 cube p r e 后面已经可以拖断这个物体了。我们把这个 cube 拖拽过去, 然后我们点击播放,看看这个立方体有没有生成, 哎,可以看到生成出来这个立方体了,这里有一个克隆的字样, 但当我们点击停止的时候,这个立方体就消失了,因为他只会在这个第一帧值前执行的时候会刻弄出来一个应字题,其他的时候不会出来。 我们再做一个其他的测试,我们 先把这个 cube 拖断到场景里边,我们在他的身上添加一个缸体组件 vg 包底, 这个钢铁组件是用来模拟真实的物理重力,我们给这个立方体抬高一点, 我们暂且先不让他克隆, 我们把相机视角对齐一下, 对齐视图,然后点击播放,看看有什么样的效果。你可以看到这个立方体 由高处下落,落到到这个地平面之上,之所以没有掉落到平面的下方,是由于这个平面有一个 match cleaner 网格碰撞器, 如果我们把这个碰撞器给禁用掉,看看它能否掉下去,嗯,可以看到它掉到了这个平面之下,歪嘴不断的增大, 这也就是之前简单介绍了一下那个 box cleaner 盒装碰撞器来防止一些穿膜的现象, 然后我们再把这 这个预制题给它打开测试保存, 然后我们把这个预知几也抬高到三。 为了和之前的这个在场景里边现在的这个物体错开,我们把这个位置做一下调整,防止重合。点击播放, 你可以看到在刚刚的这个带有钢铁组件的这个立方体掉落了下来,而之前的这个没有掉落,因为它没有钢铁组件。 虽然这个物体是由这个预制体拖断过去的,但是你在这个物体上做了修改,而这个物体本身预制体本体并没有做修改。那么怎么修改呢? 如果我们要把这个修改应用到预制体本体,我们可以在他的右侧预制件上,右侧有一个覆盖,点击应用所有, 这样我们点击这个预制体本体,可以看到有一个缸体组件, 当然你也可以直接在它的整体上添加组件,然后再拖拽过去,拖拽到场景里边两种方法,这时我们再点 你播放他们两个同时掉落, 这就是关于预制体本体与拖拽过去的这个预制体,他们两个之间如果做修改的话,怎样进行覆盖? 好,本期视频就到这里,感谢大家,我们下期再见。

大家好,我是游戏石匠,这里是 unit 零基础入门教程第二课, unit 编辑器基础。 我们将会介绍用力体编辑器的界面,并进行一些实际操作。我们先来打开上市创建的工程。 开始之前,先来说一下界面语言的问题。 unit 编辑企鹅默认语言是英语,如果我们想要让他使用简体中文的话,我们可以打开 unit hub, 点击 安装添加模块, 这里可以选择语言包,点上简体中文,点击完成就可以安装。这里我已经安装好了, 要在编辑器下切换语言,点击 adida preference, 然后在那个位置里面可以将这里选成中文,我在这里就不做演示了。我并不建议使用中文界面,这个功能只是试验性功能,有一部分的界面并没有进行翻译。 此外,使用英文界面的人还是占大多数,为了以后方便,还是使用英文界面比较好。 用力体的编辑器界面包含以下部分, 我们切到实际编辑器里面去看一下。 编辑器的最上方是菜单栏,这里有文件编辑等等常用操作。在菜单栏的下方是工具栏,工具栏的左侧是场景操作的一些功能,中间是播放按钮、暂停按钮, 右侧是账号乘级布局功能,在工具人的下方 左侧是 three 起成绩试图,包含了场景中所有物体的成绩结构。 进场景视图,在这里我们可以看到场景中所有的布置。 game 是图游戏运行时所能看到的画面。 右侧 inspector, 当我们选中层级中的任何一个物体,在 inspector 里可以看到这个物体的详情以及可以编辑的属性。 下方 project 方口包含了我们工程当中所有的文件, 左侧是树状式图,右侧则和我们的文件浏览器是类似的。接下来我们用一个实力来展示一下常用的操作。实力界面讲解 而转立方体,我们这一次的目的是要在场景中建立一个立方体,并对他进行移动、缩放、旋转等功能,借此来说明编辑器当中的常用操作。 在进行这一切操作之前,我们要先调整一下编辑器的布局, 可以看到当我们选中任何一个标签并对他进行拖动的时候,就可以改变编辑器的布局。现在将 game 视图拖动到信视图的右侧, 这样我们就可以同时看到场景视图和游戏视图。这个布局我们可以点击右侧的雷奥特将它保存, 也可以点击 reset 返回到默认的布局当中。接下来我们来进行操作, 我们把关注的焦点放到近视图里,之前说过,近视图包含了我们所有场景中摆放的物体,可以对他们进行一个观察。 而左侧乘机窗口展示了场景中物体的乘机结构。在这里点击鼠标右键 三 d game object 六步,可以看到在我们的场景当中出现了一个立方体,使用鼠标滚 可以拉近这个物体。这时候编辑器界面很明显和刚才不同了。首先在乘机窗口中出现了 q 部, 选中 q 部可以在 inspector 解释窗口中看到 cube 的属性。 同时在我们场景中出现了这个立方体。在右侧 game 视图中同样出现了这个立方体,但他的位置并不是在正中间的,要如何将他的位置放到正中间呢? 看右侧的减湿器窗口,从上到下有这么多的内容。最上面是物体的名字, 这里有一个对勾,当我们点击对勾的时候, 左侧 q 补变成了灰的,说明当前这个 q 补处于未激活状态。再点击一下可以看到, 接下来把关注的重点放在 transform 上。除了 transform 之外,还有 miss filter, miss render, books, cleaner 三个部分。 这些部分我们把它叫做主见用力体,当中的功能绝大部分是 通过主见来实现的。我们重回 transform, 在 transform 上面有三行,第一行 position, 点击的时候用力题会有提示,这里讲的是右侧显示的这个游戏物体相对于其不节点的相对位 xyz。 把注意力集中在场景视图上,在这个立方体上有三根轴, 分别是红色的轴、蓝色的轴和绿色的轴。坡动其中一条轴的时候, 立方体又在场景当中发生了一动, 同时在 games 图当中也发生了移动。可以看到,当我们进行移动的时候,我就请这里的 x 发生了变化。 我们把红色的轴叫做 x 轴,蓝色的轴叫做 z 轴,绿色的轴叫做 y 轴。当我们移动这几个不同的轴的时候, x、 y、 z 三个词都发生了变化。 x、 y, z 三个词 代表着在当前空间中的坐标,在场景试图当中可以对这些位置进行拨动来修改他的位置。 这里有很多种拖动方法, 刚才我进行的是平面拖动,大家可以观察右侧数值的变化。回到刚才的课题, 我们希望把这个立方体拖动到视野正中心,我们有更便捷的方法,但这一次我们还是通过拖动来实现目标。在场景试图中拖动立方体, 好,现在基本上在中间了,现在场景这边呢,建的是在中间,可以按住鼠标中间进行 拖拽,拖拽的同时场景视图就会发生变化。我们点击鼠标中间的时候, 这一行的操作栏中,这里已经发生了变化,我们也可以直接点击把它进行切换。 刚才进行的是拖拽操作, 而当按钮切换到箭头时,就恢复到了移动模式,可以拖动物体移动。现在游戏视图中立方体已经在 正中央了,但要看出他是个立方体,需要进行一下旋转。 第二行 rotation, 这里同样有三个字,我们来对这三个字进行一定修改。选中到原状态时, 操作指示变成了一个球体,这个球体由三个圈组成,绿色的圈, 红色的圈以及蓝色的圈。尝试来调一下绿色的圈。 在我们对他进行转动的同时,可以发现立方体发现了旋转。 刚才进行移动的时候说过,绿色是歪走切换回旋转的时候, 拖拽绿色的圈的时候,被选中的物体绕着歪轴进行旋转, 歪的直发生了变化,那同样的可以调节红色的走,也可以调节蓝色的走。 调节其他轴的时候,变化的不光只有一个数字,这里涉及到旋转。这个操作的数学本质,我们暂时不做讲解。 立方体发生了旋转,我们在右侧已经看到他的变化了,那接下来假如我们希望把它变大或者变小呢? 这里涉及到 transform 当中的第三行,说放 skill, skill 同样有三个分量, 接下来如法炮制,我们将工具栏的操作方式切换到播放。我们先通过滚动鼠标滚轮来调整一下场景视角的展示, 同样的还是有红色、蓝色、绿色三条指示线。通过前面的学习,我们已经可以举一反三。拖动绿色的轴的时候, y 值发生了变化的意味着物体在歪轴上的缩放发生了变化。同样红色代表 x 轴,蓝色代表 z 轴。 这里的数值当然也可以直接在点式器栏进行修改,这样我们就完成了对这个立方体的缩放操作。 此时如果想要保存对这个物体进行的修改, 点击 fire save, 或者是使用快捷键 ctrl 加 s 对当前我们编辑的场景进行保存。 说到这里,我们有必要解释场景的概念。每个 unit 工程创建出来的时候, 默认会创建一个场景,也就是我们这里看到的山坡信。 场景是一种容器,其中可以包含我们想要放在世界中的各种物体及其他内容。 默认的场景当中至少拥有门 camera 和 direction light 这两个物体。门 camera 是相机,是我们非常重要的主见。 direction net 是方向光,这个主见也很重要,我们将在后续的重要主见当中对他们进行介绍。 六点总结,一、编辑器界面的主要组成。 二、如何修改编辑器界面的布局。三、在成绩界面 点击右键创建新的物体。四、物体的 x 轴, y 轴, z 轴。五、通过在场景界面的操作修改物体的移动、旋转、缩放。 六、场景的概念这节课的内容就到此为止。 下节课我们会进一步阐述 unit 世界的构成。我是游戏石匠,谢谢观看,下次再见。

那么在之前的课程中,我们介绍了地形的创建方法,以及地形的笔刷的介绍和使用的方法, 那么接下来呢,我们就要实际的去进行一个地形的制作,那么在制作之前呢,我们可以先简单的去做一个地形的规划, 那么首先呢我们这个地形的大小我们先可以确定一下啊,比方说你觉得你的地形想要大一点,或者说我就要做一个简单一点的这个小的地形, 那我建议大家啊,这个大家可以自己去啊,在制作前期就去定好这个大小啊,在如果说你 要继续要做的很复杂了,然后再要去修改的话,就会对这个地形的整体会产生一些影响,还会产生一些整体的缩放。所以说我们 我建议大家可以之前在制作之前就把这个大小调好,我们先呃到 tyrant setting 这个设置按钮里面,然后去设置好我们进行的大小,比如说我要稍微大一点点,要一千二乘一千二, 然后回到我们的呃笔刷这里,那么这边呢,呃我就不创建他的这个那个相邻的地形了,那我们在这里呢,呃我们先规划一下啊,比如说我这个地形我是要放水的, 需要放水,那么我这个地形我是做一个小岛呢?还是做一个沙滩啊?这个这个都是可以的,都是可以的,比如说比较简单的我们可以做一个小岛,做一个小岛啊,我们先可以把这个地形这边呢我们先做一个小岛的一个 平台,先作为小岛平台,我们先可以用 rise or lower terror。 好,然后呢我们在这边呢先把整个的这个中间这一块小岛给它刷出来 啊,可以看一下我们这个笔刷好像强度比较大啊,把这个 opposite 调低调低,然后通过大的这个 brush size 先粗略的先绘制一个岛的形状, 当然导的上面呢可能会需要一些, 还有一些平台,还有一些山脉,这样子啊,那么有了岛之后, 有了这个小坡之后呢,我们接下来就要去 给它上面画一些啊,绘制一些山脉,绘制一些山脉。那么绘制山脉呢,我前面有给大家介绍过,是吧,你可以通过不同的笔刷去进行啊山脉的绘制,我们可以把这个 brush size 啊,笔刷的大小调的小一点, 然后 pass 键呢可以稍微调的强一点,然后我们可以去在这个地方去绘制一些山脉, 然后我们可以借助不同的笔刷啊,绘制出不同的这个三 d 的这个效果。 那么绘制过程中其实同学们还是可以去做一些修改,比方说你觉得这个地方好像啊不是太满意,或者说我画错了,我前面有说过,我们可以按住 shift 去去进行擦除, 好用通过不同的笔刷去进行一个简单的修饰 啊,那么接下来呢,就是我们要看一下这个啊,人,比如说能够走路的这个地方啊,也就是说我们需要会这些平台啊,当然这个岛现在好像还 不是特别的大,是不是好?没关系啊,我们先这样,然后呢我们要绘制出一些呃人能够走的一些平台,也就是说我们在这边呢,需要 去把它修改成啊,去找到它里面的有一个 set height, set height, 然后通过这个 set height 我们来设置一些高度,是吧?我们在这边我们先简单的看看, 我们设置一个高度,可以在鼠标这边啊,移到这个参数的边上,然后呢拖动这个鼠标啊,可以看到这个参数呢,是可以拖动的, 当我在这边绘制的时候,哎,可以看到这边呢就可以绘制出这个平台啊,可以绘制出平台,那我们先设置到合适的高度啊,稍微高一点点, 比方说这边我想画一些路出来,还是有一点低啊,我们再把它设置的高一些, 比如说这个地方是可以走的,可以在这边呢绘制一下,当然这个上面可以再有一些平台,比如说我这个高度再高一点的时候, 位置好,这边再有一层平台 啊,有点像山路这种感觉啊,那么在这个顶上啊,我们可以再加一些平台,然后这些平台呢可以用来啊种树种草, 再高一点啊,最后我们再设置一层 好了,那么这个小岛的这个简单的这样一个,呃, 主体造型就做好了啊,就做好了啊,然后呢就是我们要去啊,去进行这个贴图的绘制。当然如果说同学们在制作过程中啊,在制作过程中,如果说你要觉得有些地方太尖锐的话,你也可以用这个 smooth terrain 去进行 啊绘制和调整啊,有一些地方可能比较尖锐啊,那这边我们 smooth 一下, smooth 一下 地方好,就这样 okay, 好,那么在呃前面讲 讲的时候呢,我们有一个地方没有讲啊,就是在笔刷那个绘制山脉的时候,里面其中有一个,呃, steptarin, steptarin, 那么 stamp terrain 是做什么用的?那么 stamp terrain 啊,其实呢就是一个固定的高度啊,也就是说, 呃,每次我们在画的时候提升的这个高度都是相同的,那他和这个我们那个画笔按住,然后他会慢慢往上升的,这种效果不一样啊,也就是说我们在这个地方地方用 stamp terrain, 如果画的画,比方说你这个地方,我用 stamp terrain 给它一个 step height 啊,给它一个参数,然后我在这边刷的时候,你看它会出来一个坡,但是呢,如果我按住的话,它出来它是没有办法继续上去的啊,所以说你 只能够一次一次的去画啊,但是这个呢,对于有一些特殊的一些呃地形来说还是比较有用的啊,我们可以在高一点的地方,这个太大了, 是吧?通过不同的这个笔刷,然后来绘制出一些相同的这个高度啊,比如说这个,呃,河边的这个岩石,或者是海边的这些岩石块啊, 好可能画的有点夸张了啊,我们用 small tight 来稍微调整一下, 顶上呢,我想种一些树啊,那么我在这边我用 sit tight 啊,在这个高的地方,我们做一个高平台啊,能够太低了, 能够再高一点的上去的这种高平台啊,这边弄一些高平台,然后去种一些树,种一些树, 那如果说你觉得这个地方有些不自然,你可以通过 small tight 啊,把这个边缘再给它自然一点 啊。 ok, 那么这样呢,我们这个地形啊,我们地形的这个啊,地面的部分啊,基本上就创建好了,那么接下来呢,我们要去绘制这个贴图,绘制贴图, 那么大家在制作的过程中啊,大家记得要 save 啊,要 save ctrl s 啊,也可以通过这边 file save 啊来进行保存,那么他会默认保存到我们的这个 ass 资源里面的 thing 里面的 simple thing 这个案例场景中啊,当然如果你想另外存,那么你可以通过 save s 来进行另存, 那么大家注意这个目录啊,保存的这个场景的所在的目录啊,放在这个 since 目录里面,不要放到外部去。
![[Unity游戏教程]Buff系统的数据结构](https://p3-pc-sign.douyinpic.com/tos-cn-v-22574f/o0DBZVmCrghnUBLfCJKNjibb08AeMDDlgIwQAQ~tplv-dy-resize-origshort-autoq-75:330.jpeg?lk3s=138a59ce&x-expires=2092064400&x-signature=%2BrXxstl6cAB7IHR%2Ba4UbDXz4atg%3D&from=327834062&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=pcweb_cover&l=2026042101344381D08373B38CCF65CF5F)
大家好,最近张木成雪最近一直在忙于找工作的事情,今天终于安定下来,然后 我想把这个旋转英雄的 buff 系统给大家讲一下,因为这个项目本身其实没有太多的技术难点,但是这个 buff 系统的话是里面比较精华的东西。这个 buff 系统呢,它跟传统的 buff 系统差不多,但是它是用 script object 就是 so 去做 业务逻辑的载体的。那这个教程的目的呢?就是让大家学会如何去写一个游戏当中的 buff 系统。因为这个系统比较复杂,所以我会一点一点的讲,先从数据结构开始讲,讲完数据结构呢,后面会从 代码层面开始讲,那代码呢?我会以一个呃手敲的方式帮帮大家, 就是跟大家一起去做,去写一遍这这样 buff 系统。首先我们先讲 buff 系统的数据结构,那么 buff 系统呢?它有三个模块,一个是 buff 音 four, 一个是 呃基础的这个 buff moder 我们后面会讲。还有一个是 buff handle, 它是 buff 的一些处理的,一个处理的一个 model 脚本。那么我们先看这个 buff 音符里面有什么。第一个 buff data, buff data 也是定义整个 buff 的, 呃数据结构,这个数据结构呃有点复杂,但是没关系,我们一点一点来说。呃,首先我们看它的基本信息, buff 的基本信息有哪些呢?第一个是 id, 这个其实很容易理解,就是区分每个 buff, 他们的 就是是不是同一个 buff, 用这个来区分,这样你做 buff 叠成的时候也有用,他是主要是做这个作用的,那 buff 内蒙就不用这样了,表示他是什么样的一个 buff 的名称吗?这是描述这 buff 有什么效果?这个是爱康就他的 buff, buff 的这个 图片,它的一个图标,这是最大层数,最大层数的意思就是说你 buff 可以叠成的话,那么它能最大能叠几层这样一个数值限制,一般来说你一些 buff 都是一层,你如果五层的话也可以, 那还有一个是优先级,这个优先级主要是用来做什么呢?因为有些 buff 啊,他们之间是存在优先级关系的,比如说,呃,一个,一个让敌人立即死亡的 buff 和一个让敌人免疫死亡的 buff, 那这两个 buff 到底谁优先呢? 这是策划去定的,所以说需要一个优先级来指定这场 buff 到底谁先触发。第二个是,呃,还有一个,这个是 talk。 tug 是做什么用的呢?比如说我有一个回血 buff, 还有一个是,呃,毒毒属性的 buff, 伤害型 buff, 那么他们都是伤害型 buff, 那么他可能还带一个属性,他是毒属性,那如果是火属性的伤害型 buff, 那么就是这个 tug 里面就有火属性和伤害属性,就相当于 给 buff 做一个分类,这是基本信息。那么我们再看时间信息,时间信息有哪些?时间信息有一个 is forever, 这个 这是一个不而变量,他的意思就是说 buff 是不是永久的,如果是永久的话,他就不会进行时间的一个流逝,给 buff 做一个生命 的一个一个流失。如果是永久的话,第二个是持续时间,持续时间就很理解嘛, buff 到底持续多久?第三个是 take time, 这个 take 怎么理解呢? 比如说我有一个火焰 buff, 他是每三秒给给人造成十点伤害,那这个该怎么去定义呢?那么每三秒这个这个概念就是这个 tik time, 这个 tiktim 就是那个那个三秒的信息他记录的,然后 tiktim 结束了之后,就会给给这个 buff 的携带者造成三点伤害,就这么一个功能,那时间信息我们讲清楚了,我们再看这个回调点。回调点是整个 buff 系统最核心的一个部分,他也是 拓展性比较高的一个部分,那回调点它它是怎么?它是什么意思呢?它是由一个叫 basebuff mode 的一个回调 积累组成的,他是所有的,就是整个 buff 系统你到底能不能做出各种各样的效果都是由他来定义的。那么回调点的意思是什么呢?就是说在一些特殊的时间节点会触发这么一个 buff 效果,那么 那么我们可以看到底有哪?一般来说游戏里面有哪些回调点?比如说 uncreate 这个回调点的意思就是说当这个 buff 被创建到敌人身上的时候,或者玩家就任何人身上的时候,会触发的一个一个情况。比如说 我有一个 buff, 我获得的时候会提升百分之十的攻击力,那么这个时候你就可以把这个提升百分之十的攻击力这么一个回调的效果写放在这个 uncreate 这个回调点里面。那么还有哪些回调点呢?比如说 on remove, 就是当 buff 被移除的时候会发生那些事情,然后还有 on hate, on behind, 就说, 呃,当你攻击到玩家的时候,或攻击到什么东西的时候, on hit 就是攻击的时候。还有一个是 on behind, 就是当玩家受伤的时候,或者当角色受伤的时候会触发那些事情,还有 on kill 死亡的时候, 击杀敌人的时候 on be care 死亡的时候会出发什么事情,然后还有 ontake, 这个是跟就跟之前说的, 呃,就比如说之前举例的那个火焰伤害,每三秒造成时间火焰伤害的功能,对吧?那这个时候该怎么定义呢?比如说 tick time 就是定义为三,然后这个 tick time 计时结束的时候,就会触发这个 on tik 的回调,那么这个 毁掉里面就是将玩家的生命值减少十点,就做这么一个效果。 on tik 的意思,然后还有一些其他的业务毁掉点,这个这个等你熟悉了这么一套毁掉机制了之后呢?你可以在一些你具体的业务里面去添加一些毁掉。就比如说 旋转英雄里面不是有进入房间和退出房间的这两个点吗?如果你想把它做一些事情的话,你可以把它加到这个回调点里面,比如说当玩家进入房间的时候会触发哪些事情?当玩家退出房间的时候触发哪些事情,你可以写到这里面, 这是回调点的一个概念。还有个更新方式,这个其实主要针对于呃 buff 的这个叠加去做的,比如说这第一个更新方式,这是个媒体,这个是 buff 在添加的时候它的时间是怎么 要刷新的?比如说如果说 a、 d、 d 的话,这个其实很好理解,当 buff 添加上的时候,他如果说你 buff 已经有了,他这个时候会把层数往上叠一层,那叠一层会发生什么呢?时间到底怎么算呢? a d d 就是说时间进行累计,比如说你有一个五秒的 buff, 那么它叠了两层之后,这个时间就变成十秒,这是一个累计的一个效果。 replace, replace 是替换,比如说你 也有一个,我们以这个剑圣的高原血统举例,那剑圣的高原血统其实就是说你开大的时候,玩家这个剑圣的速度、攻速都会增加,那么他持续,比如说持续三十秒 的,当你这个时间只剩一秒的时候,这个时候你又又叠了一层这个 buff, 如果你是 replace, 那么它的时间就会再刷成三十秒,这个是一个替换的一个效。 还有一个是浪,什么都不做,就说你叠了这个 buff 作用时间,你时间不会不会进行操作,那就是该该怎么留,该怎么减少,怎么减少,最后减少为零的时候,那就把这个 buff 取消掉。还有一个媒体是用来标记什么的呢,当你这个 层数减少的时候,那就是说当你这个 buff 时间结束的时候,你这个叠成到底是怎么减少?比如说你有五层 buff, 你时间结束的时候,这个 buff 就直接就清掉了,就不管你有多少层,直接就没掉。还有一种是,呃,一层一层减少,就说 当你这个 buff 时间结束的时候,他会减少一层时间刷新变成四层这样的一个标记,那更新方式就就是这这几种。后面我们写距离代码的时候,如果你现在不理解的话,其实也没关系,后面 写到具体逻辑的时候,你就大概了解了更新方式有这些。第二个我们看 buff 音符,我们刚刚讲的是 buff data buff dat, 它实际上是定义 buff 的一个数据结构。 buff 音符是什么呢?它是 具体的 buff 的信息,以游戏里面创建的一个对象,那么这个对象里面包含什么呢?首先包含一个创建者,就是说你,你这个 buff 到底怎么怎么去,怎么去实现的, 是由 buff data 定义的,但是,但但,那这个 buff 加给谁?那个 buff 的目标和创建者是谁是吧?当前有有有多少层数?当天的时间,他是由这个 buff 音符来来去记录的,那么 它里面有有哪些对象?我们看有一个 creator, 还有一个 target, 这个这个几个很好理解,创建者是谁对吧? target 是这个 buff 的目标是谁?对谁 装在谁身上,对吧?还有一个是当前的,呃,当前的层数是多少?还有一个持续时间的一个计时器,持续时间清零的时候,那么就会执行一些移除 buff 的操作。还有一个是 tiktom, tiktom 是干嘛的呢?这个 tiktim 就是之前说的这个 ontic 回调点用的,当你这个 tiktok, 当你这个 tiktok 激活的时候,这个回调点有东西的时候,它会, 它会去记录嘛?比如说这里的时间信息, tick time 是三,那这个时候这个 tick timer 它就会记录这个三的值,等这个 tick time 清零的时候,它就会去触发这个 ticker, 然后最后再把它改成三秒的这个这个时间。 这里具体举个例子啊,比如说要说的火焰伤害,就是一个 buff 每三秒对玩家造成十点伤害,那这个时候该怎么去定义呢?就是说,呃, tick time 是三,然后这里的回掉点的这个特效是什么呢?减少玩家十点伤害,这里这里的一个回掉点的效果,这个 tick time 就是计时器, 比如说这个 tkm, 他一开始他是三秒,三秒之后触发了之后,触发了之后他会触发这个回调点,再把它这个 tkm 改成三,那这个三就是这里定义的这个三,这里定义的这个时间很好理解,一个计时器,一个一个时间值嘛? 这经典的时间记录的一个方式, buff 云 four 是这样,然后我们再看第二个块,第二块是,呃, basebuff moder, 这个是干什么的呢?就我们这这里说的 回调点,回调点的定义呢?我们可以看到他有一个抽象方法,因为他是一个鸡肋吗?这个是抽象内,抽象内有一个抽象方 方法,这个抽烟方法是什么呢?它叫 aplay, 然后它会传递一个 buff 音符的参数,就是当前这个 buff 的信息会传过来,然后还会传一个 damage 音符,这个 damage 音符其实很好理解,就伤害的一些处理嘛,比如说你这里的 unheat 和 unbe hunt 和 uncall unbecale 这四个回调点,他都是需要这个 demi info 的,因为因为只有造成伤害才会有这些回调点的效果嘛,所以说 这个参数也会也要传到这里来,因为他是一个引用类型的参数,就是说你的 buff 在处理的时候会对这个数值进行修改,那具体的修改的信息呢?就是说这个 damning four 最后被修改成什么样,是要等你所有的所有的这个 buff 执行完了之后, 他才会得到一个具体的最后的数值,那最后根据这个 buff 计算之后的结果进行一个结算,这是 buff 的这个回调点的一个定义。那还有一些其他的需要 buff 处理的对象,比如说之前旋转一写的那个房间, 那玩家进入房间和出房间的时候,我我是设置了两个回调点,那这两个回调点是不是需要房间作为一个处理对象,那这里你就可以加上房间的这一个对象,那比如说玩家进入房间的时候,把当前房间的这怪物的这个刷新量提高,那就是相当于是修改房间对象里面的这 怪物的刷新数值嘛,这是 buff 机类。然后还有一个是 buff 的处理器,处理者呢?是用来干什么的呢?比如说你我们刚刚说的这些这么一大堆东西,其实是具体的这个 buff 的操作 是由 buff 的寸系来的,那它最主要的方法是什么呢?这四个。第一个是添加 buff, 添加 buff 里面有一些添加 buff 的逻辑,这个后面我会讲,然后还有个移出 buff, 这个这个逻辑后面也会讲,因为它涉及到层数的这个修改。 还有一个是 buff ticker, 那 buff ticker 其实很好理解,就是我们之前说的这个处理所有的 buff ticker 这样一信息。还有一个是 buff sort, buff sort 是干什么的呢? 就是给 buff 进行排序的,因为他有优先级嘛,这里有个优先级需要给 buff 进行排序,最后按照顺序去执行所有的 buff, 这个 buff 缩成了具体的算法呢?可以后面再写具体代码的时候也会讲,整体的这个 buff 的数据结构就是这样子。


大家好,我是李老师蒋建琪,昨天我已给我已经给大家分享了这个斯奈德 m 三四零编程软件 uni pro 的一个硬件主态, 今天这一节我给大家分享的就是说如何使用这个 unit pro 软件。 首先我们嗯继续昨天的这个主态,完成之后的这个一个项目,再进入到这个 项目硬件主态完毕之后啊,我们就需要对这个项目进行一些个性化的一些设置,首先我们找到这个工具,然后项目设置,项目设置里面我们看一下有这个 最主要的几个地方,这个十区东八区,这个我们要需要设置一下, 设置成我们相应的时区就行了。然后我们需要在这个变量里面 这个允许前导数字,这是一个什么意思呢?就说我们在这个,嗯,使用这个对这个输入输出模块的一些 命名的时候,我们需要用的这个如果说有前导数字的话,我们需要把这个选上,然后我们把这个制服级, 他这个默认是标准,我们要选成这种 unicod, 在这个用选择 unicod 之后有什么好处呢?就说我们在这个, 嗯,我给大家演示一下,我在这里编程的时候,我新建一个段, 选择这个语言是梯形图,然后这个名称的话,如果我们选成优利扣的话,我们就可以用这个中文来表示,假如说我这个是一个几个名字叫电机控制, ok, 然后我们就可以在这里面来写一个程序了,这里面来写程序, 这是对这个项目的一个简单的一个设置。然后我们就说在编程的时候,我们的这个模拟量数字量输入和这个数字量输出,以及这个呃,模拟量输入,模拟量输出,他的一个 这个地址是如何表示的?有什么含义?我来给大家讲解一下。首先我们点到这个 ddi, ddi 幺六零二这个数字量输入模块,我们双击 双击之后我们选择这个这个地方 dia 幺六零二,选择 io 对象, 然后我们点击这个百分号 i, 然后更新网络,这里我们就能看到这个第一个模块的一个数字量输入模块的一个地址,以及他的这个类型。 首先我们看一下这个,嗯,百分号 i 零点幺, 他是什么意思? 我们看一下 百分号 i 就表示他是一个开关量输入,开关量输入数,或者叫数字量输入, 第一个零,第一个零这个地方,我们找到这个地方表示他的这个机架号,机架号,第零号机架,第零号机架, 然后这个一数字一数字一表示这个 零号接驾第一个模块第一个模块,然后最后一个数字零, 最后一个数字零表示第零号通道,第零号通道。然后我们看一下这个第二号第二个模块的这个嗯地址, 然后我们还是一样的选择这个 io 对象,点击这个百分号 i 点更新网络,这里我们看到的就是说百分号 i 代表这个模拟这个数字量输入 零就代表零号机架,二代表第二个模块,零号机架第二个模块,然后最后一个零表示第零个通道,他总共是从点零到点十五,十五,总共是十六个通道。 然后我们再看一下这个 ddo, ddo 的这个是一样的,跟他是内饰的 点 ddo 的时候,我们就点选择这个百分号 q, 百分号 q 更新网络, 一样的百分号 q 就代表他是一个数字量输入模块零, 第一个数字零表示零号机架,第一个数数字三表示第三个模块, 然后最后一个数字零表示零号通道,零号通道。 然后我们再看一下这个模拟量 输入模块,看一个模块就行了,模拟量输入模块他的这个地址的表示是怎么样的? 然后我们还是选择这个 ami 零四幺零,选择这个 io 对象,哦,这个时候我们就要选这个百分号 iw, 看到我们他有四个通道,零点四点零、零点四点一,零点四点二,零点四点三,这四个通道百分号 iw 表示是一个这个,嗯,输入模拟量输入模块 零代表是零号机架,第四个模块,第零个通道,他总共是零一二三 三四个通道。 然后我再给大家讲一下这个,就是说,嗯, 在这个 unici 软件中啊,数字量输入输出这个点如何对他进行一个备注? 假如说我们在这里写一个最简单的一个起宝亭的一个程序 启动停止,然后运行,然后我们再来一个字锁 这个, 我们怎么样给他把这个,让他这个进行一个备注,然后我们在这里还是点这个 ddi 幺六零二,点击这个 io 对象,百分号 i 更新网络, 然后我们在这里选择这个名称前缀,我们第一个通,第一个百分号零点零,百分号零点一点零,我们选择这个启动, 然后第二个我们选的这个停止,然后我们再 可以在这里注视停止, 然后我们启动停止,然后我们还有一个 q, 百分号 q, 快来, 我们在这个选择这个运行 run, 然后我们在这个程序里面来选择这个,我们这个要对他添加地址,我们点击这个常开机点双击我们,然后输入百分号 i 零点一点零,然后这个我们输入这个百分号,哎,零点一点一,然后这个我们选择这个运行 百分号 q, 零点三点零,这个,然后我们让他一个字数 好了,这就是我们一个最简单的一个起宝琴的一个程序, 我们下一节,下一节会给大家讲解一个这个各种指令的一个用法及含义,这一节就到这里,谢谢大家。

大家好,这节课我们来讲一讲 unity 资源文件的导入与导出。 在 unit 中我们有两种方式导入资源文件,第一种是在项目面板中单击鼠标右键,在弹出的菜单中选择导入新资源。我们来看一下, 这一张是我刚才导入的一张资源图片,我们先把它删除了,好,点击鼠标右键找到这个 import new assess, 选择我们要导入的资源文件 ipod, 这样就完成了一个资源文件的导入。 那么第二种方式呢,是直接将文件拖拽到项目的面板来看一下, 选择要导入的资源文件,直接把它拖进来,这样就完成了导入,非常的简单。 接下来是导出资源包,我们将刚才导入的这个文件导出,在 the explore package 导出像的对话框中勾选带导出的文件,我们看一下, 还是单击鼠标右键变成 import package, 把我们刚才需要导出的文件给勾选上,然后 export, 把它命名为 unity。 眼睛好深, 那么这个时候呢,我们就把刚才导入到项目中的资源文件给打包成一个资源包给导出来, 导出成功后, unity 资源包的拓展名为点 unity package 啊,这个我们可以看到 in the departed fire, 那么这个就是资源包的一个拓展名。 第三个呢是导入资源包,除了导入普通的文件, unit 中呢还可以导入大量的资源文件和 脚本的资源包,它的方式同样有三种,我们先看一下。第一种是在 import package 导入项对话框中直接导入资源包,那么在这里 我们选择 import package custom package 里面,我这里是在呃资源商店里下载的一个资源包,一个天空盒子的资源包,我们把它打开, 嗯在这里呢就可以看到这个天空盒子的资源包里面包含了大量的资源文件,有图片 还有一些材质,我们把它全部勾选上之后,全选之后导入, 那么资源文件有点多,所以它导入的时间会长一点。 那么第二种方式呢,就是将资源包直接的拨拽到项目面板中,也可完成导入,就是将我们的这个资源包 直接的拖拽到,直接拖拽到项目面板中。还有一个第三种方式呢,就是直接双击资源包文件,那么也可导入, 我们来看一下刚才的支援包,还有还有一点没有完全导入, 这个时候呢,完全导入之后我们就可以看到这里有一个八 k skybox head free, 这个就有 actor, 还有这个 material 材质,我们的你看到 那么以下两种方式,方式二,方式三呢比较简单,那么就不在此演示, 大家也可以在课后自自己到资源商店里面去下载更多的资源包,然后尝试把这些资源包导入到项目中,因为后续 如果在开发大型的项目的时候呢,我们会大量的使用到这些资源包。稳接好,那这节课就到这里,谢谢大家。

大家好,今天我们给大家讲解的是极速展 uv, 在学习过程中有不明白的可以给我们留言,我们会一个一个进行回复的哈。这节我们来调整一下模型的导入,然后呢,我们首先将一个这个爱豆啊拖到我们场景中去, 嗯,然后我们在这里点击创建一个 q 部,这个一个默认的一个 q 部单位,我们一般把它当成是一米的一个单位, 嗯,比如说我们在三 d max 里面一米一个单位进来的话,就应该跟这个 boss 是一样的,在 pro 加个点里面选中这个模型,然后点击 model 这一项,把它这个缩放音质修改一下,改成零点零一,我们再来看一下这个比例是否是否正常。 首先我们这个角色,我记得我们创建的时候是一米七还是一米八的样子,那我们把这个 q 部跟他弄到一起来对比一下,看他是不是符合我们的预期。呃,感觉差不多啊, 我们把这个 q 部来跟他比一比,这个 q 部是单位一一米,我们再把它拉高一点, 可以看到一米七,一米七,一米七一米八的样子,好,那就是说这个比例,嗯,他的那个 mother 的 factory 以这个零点零一的方式来就是合理的, 那么同样其他的几个模型数据也要做同样的一个设置,把这个缩放音质改成零点零一。 好,全部修改完毕, 接下来我们来看一下他的动画,找到这个挨到的动画,然后我们点击播放,看到人产生的轻微的一个移动,说明我们的动画数据也很好的进来了。 按选中他的网格物体,我们把材质连接上面,嗯,这是我们给一个 status 一还是黑色,然后 status 二是一个黄色的啊,我们就用这个 黄色吧。嗯,我们调整一下场景的一个光照,这是一个平行光,我们可以把它的颜色啊,强度啊,可以尝试的修改一下,然后把它的旋转调整一下就可以了。 然后选中这个 idol, 我们回到他的第二个面板,是绑定位置里面,然后这里的话他没有 no ever, 当前是我们要给他创建一个 ever 来进行,嗯,来进行对他的一个动画进行交互的一个处理, 然后这它也产生了一个艾力梅特主见。现在,嗯,产生这个主见呢,它需要一个孔丘了,来控制这个来管理它这个动画的切换。好,我们修改,然后点击那个,呃,点 比较快啊,每一个都做这样同样的一个修改, 我们按 ctrls 将场景进行保存一下,嗯,名称就叫 t 八百,放到生死这个文件夹下面来, 嗯,然后场景这个盛世文具甲里面出现了一个 t 八百,把默认这个压力场景给删除。 好到这里用力体的一个最初的准备阶段就基本的完毕了,到下一阶段就会开始有一点点复杂,有一点点难度啊,但是没有关系,只要跟着一步步做就可以了。我们下一节从他的动画模块开始关注,我们看后续内容。

哈喽,各位同学大家好,咱们这节课来讲解一下变量的基础原理,我们先从内存里面关于单位的问题开始讲起。 什么叫存储单位呢?内存中啊,可见的最小的存储单位是比特,代表零与一,就如下图所示,我们可以这么去理解,所谓的比特呢,其实就是内存当中啊,最小最小的一个小盒子了, 这个小盒子小到什么程度呢?那里面啊,就能存个零或者存个一。 ok, 那么了解了咱们内存当中最小的可见单位之后,那么咱们再聊一聊内存当中数据的最小存储单位。来,我们看下一句话, 内存中用于存储数据的最小单位是八个比特,也称为一个 bit 自己在这句话里面,咱们要了解的是, 我们新学到了一个单位叫做字节啊,他的英文名叫 bat, 一个 bat 是由八个比特所构成,如下图所示,我们可以看到八个比特呀,紧密排列在一起, 每一个比特里面都存储着一个零或者一个一,那么这八个比特放在一起呢,称为一个 bit 字结 好了,那在这里我们要思考一个问题,什么叫做存储数据的最小单位是一个 bit 字节呢? 这句话的意思是啊,在咱们计算机当中,不管你是存储一个整数,还是存储一个字符, 韩式存储一个小数啊,都是使用的 bit, 也就是自己作为单位去衡量的。比如存储一个整数,我们需要四个 bit, 存储一个字符,咱们需要两个 bit, 那存储一个小数呢?咱们啊也是需要四个 by 的,所以说你可以看到啊,在咱们的编程的语言之中, 各式各样的数据,他们的存储空间的计算啊,都是用字节作为计算单位,而不是用所谓的比特,也就是说呢,在咱 咱们编程当中,所有的数据至少占有一个 bit, 一个字节的数据大小。好了,那这就是这句话的意思啊, 接下来呢,我们来看一看在计算机当中的存储单位们都长成什么样子啊,这呢也是给大家做一个计算机啊里面的科普, 我们经常在磁盘上面啊看到叫做一 k b 的大小啊,比如一张图片,它是多少多少 k b 的大小,那所谓的 k b 呢,就是等于一零二四个 bites, 那也就是一零二四个字节, 这就是 k b。 我们也会看到一张图片,如果是个高清的图片的话,可能啊它的大小是两三个 m m b, 那一个 m b 它的大小是一零二四 k b。 同理,一个 g b 等于一零二四 m b, 一个 t b 等于一零二四 g b。 好,那这就是计算机当中的各个的数值单位, 那看完了内存的单位相关的事情之后,那么我们呢就可以正式看一看在变量啊当中是如何去分配内存的 变量内存的分配案例,咱们在这里使用一个案例给大家讲解一下变量是如何在内存当中被分配出来的。 变量在生成的时候啊,咱们的系统会分配给这个变量一块大小合适的内存, 我们都知道根据变量类型不一样,分配给这个变量的内存大小也会不一样, 比如说咱们写下面这句代码, int number 等于十一,也就是说我做了一个整数类型的一个变量,这变量的名字是 number, 它的初始值是十一。 那么在内存当中到底发生了哪些事情呢?来,我们先把内存啊给大家画出来, 接下来呢程序发现哦,你这个 number 啊,是个 inter 型的数据啊,那既然是个 inter 型的数据,你就应该占有四个 bit, 就是四字节的内存。好,我先给你画出四个字节来,好,我们来观察一下系统 给我们分配的这一堆内存。在这一堆内存里面,每一个小零啊,都代表着是一个比特, 那我们放大其中一个来看一看,这一个块里面其实呢是包括着八个小比特的,那我们知道八个比特是一个 bat, 所以呢,这一个小块就是一个 bat, 四个小块加在一起,当然就是四个 bat 喽。接下来为了方便理解下面的步骤,咱们啊给这三十二个小比特啊,给他们都编一编号, 最右边的呢,咱们称为第一个小比特,最左边的咱们称为第三 三十二个小比特。好了,那我们接下来看一看会发生什么呢?计算机首先知道十一这样一个整数类型的四面量,它的二进制表示是什么呀?是幺零幺幺, 这个我们可以通过除二取语法得到。但是我们随即啊也会发现一个问题, 十一的二进制表示呢,我们只能把它写成四个二进制数的表示就是幺零幺幺,对吧?那这样的话呢,我们只决定了三十二个比特里面的其中某四个比特, 那么如何填充完这三十二个比特呀?哎,其实是这样的,我们来瞧一瞧填 填写的过程,我们要填写的呢是幺零幺幺这样一个四个比特啊组成的二进制数,那我们就要从右往左去填写, 我们拿出从右边开始数的第一个比特,就是一放在咱们内存编号为一号的比特上面,哎,放在这里, 然后我们再拿出右边的第二个比特,还是一放在内存编号为二的比特上面, 然后啊我们再继续往左看,哎,找到了零这样一个比特,那放在编号为三号的比特上面就是零。最后啊,我们找到了是一把一放 在编号为四的比特上面啊,那就是从右边开始数一二三四分别放在咱们内存的一二三四号编号的比特上面, 剩下的我们并没有填写数字的比特,全部都把它填写为零即可了, 所以咱们就得到了这样一串比特的表示方法,这个就是十一这样一个十进制数字的三十二位二进制表示方法。 好了,那么我们把数字填写到内存当中,你看啊,就变成了现在这幅样子啊,这就是咱们变量内存的分配方法。接下来呢,我们来看一看字符的表示方 方法。在之前的课程当中,咱们在学习变量啊的类型的时候啊,说变量的类型决定了变量的大小,并且可以决定如何去理解这个变量所占据的内存。 我们之前也说过,比如一个六十五,你可以理解为一个大写的字母 a, 也可以理解为一个简单的数字,叫做六十五。 好,那么在这里呢,咱们详细的讲解一下一个字符啊,可以是普通的英文文,英文字母,一个汉字一个符号,那一个字符类型的变量,他的占有的内存是两个 bit。 来,在这里我们想想,两个 bat 是多少个比特呀?是不是二乘以八十六个比特呀?好,我们接下来看一看字符的 的本质。自然语言当中,如果你写一个 a 啊,你是可以理解的哦,这就是个英文字母 a 喽。 但是我们讲说,如果你把一个字符存储在了咱们的内存当中,那内存首先要给你分配两个 bat 的这样一块内存空间嘛,那这两个 bat 的内存空间里面存着的不还是一堆零一零一吗? 那计算机啊,只能看到两个 bat 的数字啊,他看到的并不是一个哎在纸上写着的 a 啊,而是看到了大小为两个 bat 的一堆零一数字啊。 那么这一堆零一零一的数字,是不是最终仍然会被翻译成一个使禁制的某一个数字啊?好, 那么我们接下来再看,对于任何一个两个 bus 的数字,比如说呢,我们之前讲的啊,这个六十五吧,如果这个变量是差类型 啊,就是 character, 则理解为一个字符,如果你不是差类型,就理解为数字。很简单的一个道理,我现在呢,有这么一大块的内存空间,它大小多大呢?它两个 bise 的大小。 好了,这里面是不是存着一堆零一零一啊之类的各种各样的零一啊?假设啊,这里面存储的这一堆零一啊,是实禁制数字六十五的话,那你得看怎么去理解这个六十五了啊。那接下来我就要把这列 两个 bat 的啊,大小为两个 bat 的这么一个变量打印到屏幕上。打印之前呢,咱们的程序啊,会去看一看 这两个 bat 的变量是不是一个字符类型,就是说他是不是一个差类型,如果是差类型,他就会把这个六六十五啊,认为是一个大写的 a 打印到屏幕上, 如果他发现并不是一个差类型,而是一个普通的数字,那么他就会在屏幕上打印一个六十五。所以呢, 根据变量类型的不一样,同样的一对数据,在打印到屏幕上的时候,他的表现就会完全不一样了。好, 那么我们接下来再看下一句话,建立某一个数字与某一个字符之间的联系的方法是什么呀?叫做编码。 来,我们再看一看,刚才我说了一个六十五,如果你认为他是一个字符的话,那么打印出来到屏幕上就是一个大写的 a, 我们是不是已经建立了六十五,这个数字跟字符 a 之间的某种联系啊? 好,这就是将一个数字与咱们的一个字符联系在一起,就形成了编码。那如果是六十六的话呢,我们想象一下,它其实代表它是谁啊?是不是大写的 b 呀? 好了,这个就是所谓的编码。来,我们再读一遍,建立某一个数字与某一个字符直接联系的方法,就是编码方法。 那么接下来我们想一个问题,编码是不是只有一种方法呀?并不是的哎,可以有很多种方法。举个例子,我现在呢要表示一个 a, 我其实是用六十五哎来表示 a 的, 这个就是我们现在所使用的 u t f 杠十六这样的一个编码规则啊,这就是咱们用的编码规则的名字。 当然你说啊,我非得要用别的编码规则,我让一百六十五哎,来代表 a 啊,可不可以啊,你自己发发明了一种啊编码的规则啊,没有问题啊, 只要你愿意就行了。好,但是呢,我们现在所使用的是什么呀?是 utf 杠十六编码规则啊,就这么个意思,编码规则呢,就是规定了用怎样的数字来代表怎样的字符。好,我们来看一看编码表格, 这个表格是我从啊 utf 码表里面啊去截出来的一段啊,供大家来学习使用。那这个 utf 的码表啊,我们应该怎么去看呢?啊,咱们来一起看看一看啊,一起阅读一下吧。 首先啊,这个 utf 十六码表是一个十六进制的码表哈,这里面的所有的这些啊,这个数,咱们的横行啊,跟他的数列啊,上面的数字都是十六进制的数字。哎,我们解读一下,比如说 我们把这一行拿出来看一看啊,啊,这一行的行行标是零零四零啊,这是一个十六进制的数字,零零四零。 然后呢,呃,比如说啊,我们选择这一行,然后选择啊这个加二的这一列吧,加二这一列 和零零四零这一行,哎,我们就定位到了这个大写的 b 身上啊,那么我们怎么看大写的 b 的编码呢?首先它的基础数字是零零四零啊,这一行啊的基础数字都是零零四零, 然后加上多少呢?加上二,你看这里啊,明显给大家写的加二呢,加上二等于啊零零四二,这就是啊 b 这样一个字符的编码,那这个零零四二啊,如果把它 转化成十进制是多是多少啊?四乘以十六得六十四加二就是六十六嘛,啊,六十六,所以说呢,大写的 b, 他的编码啊,十进制的编码就是六十六,十六进制的编码就是零零四二。 好了,然后咱们再看一看啊,下一个我们再找一个例案例啊,给大家练习一下阅读码表啊, 比如说呢,咱们选择这个亿吧,选择这个亿啊,那韩啊,他的这个行行标啊,还是零零四零没有问题啊,他的基础数字是零零四零,然后他的基础数字上面加多少呢?需要加上五啊,才变成了亿,也就是零零四零, 横向啊加上五等于零零四五啊,这个就是字符 e 啊,他的十六进制表示方法转换成十进制啊,四乘以十六加上五,那么就是六十四,加上五是多少啊?是六十啊,九嘛啊,六十九嘛,代表着是一, 好,那这就是咱们啊这 u t f 杠十六码表的一个阅读的方法哈。呃,如果你想看更多的完整的表格的话,你其实是可以去到我下方啊,给大家打印出来的这样一个网站的啊,重新打开一下, 好在这里啊,这就是咱们啊 u t f 杠十六的码表啊,等它加载一下,嘿,好,加载出来了啊,我们可以看到这个码表里面能够去代表的东西实在是非常非常多啊,各式各样的语言偏旁部首啊,还有些奇怪的小符号啊,都在这里啊,我们看看汉语啊, 汉语在哪里?哎呀,真的好多来看汉语啊,包括各种各样的偏旁部首,哎,是不是发现都在这里啊,哎,好了,那么这就是咱们的 utf 杠十六码表哈, 接下来咱们去到 vs 里面实践一下啊,用这个码表上的数字呢,看能不能打印出来对应的字符来,我们去到 vs 里面 好了,在这里的话呢,先打上一行注释,是 u t f 杠十六码表啊,这个练习 好,咱们在这里呢需要打印的是一个字符变量啊,以前呢咱们说都用的是整数变量, 在这里呢告诉大家字符变量的啊,这个类型是叫做 c h a r 叫做叉,然后咱们在这里写上叫 c 零啊,给这个变量取个名字叫做 c 零,它是一个字符类型的变量, 那他的初始值,咱们一般情况下,比如啊会给到他一个这样的字符变量啊,会给他上这样一个呃,这样一个字面值, 但是呢在这里咱们直接给到他一个十六进制的编码啊,来,我们怎么给他呢? 我们也去查查码表啊,比如说我想打印的是这个 b 吧啊, b 是零零四零啊,加上一个几啊,来我们看竖向啊,加上一个二啊,就是零零四二。好了,那在这里我们要用十六经制表示方法,零叉零零四二,哎,这样的方式, 但是呢啊,这样的副值是不行的,因为之前咱们讲过啊,变量其中有一个很重要的规则,变量的类型跟给他的这样一个字面值必须一一匹配,你既然是一个啊这一个字符类型的变量,那么就要给他一个字符类型的字面值才可以啊 啊,所以说怎么办呢?在这里咱们先用一些啊,以前咱们现在还没有学过的知识啊,就是强制类型转换啊,通过这样的方式呢,就可以将啊,咱们这个零叉零零四二这样一个数字啊,转换成一个 啊,咱们的字符类型啊,关于类型转换,大家不用担心啊,在这里我只是小小的给大家演示一下,后面会有专门的章节讲述咱们的这样一个类型转换啊,不用担心。好,那么现在咱们把它打印出来, ctrl right 叫零叉零零四二代表的字符是来,这样的打印方法大家还记得吗?用个字符串啊,加上一个变亮啊。好了,那大家猜这样会打印出来一个怎样的东西呢? 来,我们运行一下,好,打印出来了啊,零叉零零四二代表的字符是 b 啊,好,那我们再实验一下,零叉零零四三代表的是谁呢?哎,大概率就是大写的 c 嘛,对不对啊,大写的 c 啊, 好,那这个呢,就证明了咱们每一个字符啊,其实它背后都是有编码的,而编码呢,就是一个啊,实油性质的数字啊。好,咱们回来一下,来总结一下这节课所学到 的内容。第一个问题,内存中可见的最小单位是什么呀?大家注意,这里是可见的最小单位啊,可见最小单位是一个比特。第二个问题,内存中存储数据的最小单位是什么呀?哎,肯定是一个 but 吗? 啊,至少是 bat 的整数倍啊,每一个数据的大小三字符是如何存储且表达的呀?在内存当中,字符啊会作为数字进行存储, 通过 utf 杠十六编码得到具体的字符,这个咱们刚才已经实验过了。好,咱们这节课的内容就讲到这里。

哈喽,各位同学大家好,咱们这节课来聊一聊 debug 与调试,那这是咱们的翻外篇啊,又迎来了一个额外知识的补充哈。好,首先呢,我们先介绍一下什么叫做 bug 这个概念, 那 bug 呀,在咱们计算机里面代表的是程序出现错误的时候的那个错误,为什么呢?因为在之前啊,哎,计算机都是长得这幅样子的啊。然后呢,一位女工程师有一天在调试程序的时候,哎,发现不对啊,这个程序运行出现了问题, 于是乎呢,打开了里面的机器啊,他们那个时候检查错误还得把机器打开,打开之后就发现里面躺着一只虫子啊,当然这个虫子已经被压扁了啊,所以说呢,从那开始,大家都把计算机里面的错误啊称作哎, bug。 好,那我们知道这点之后呢, 接下来我们就说一说 debug, 那检查故障,排除错误的过程叫做 d bug, 在英文里面的话呢,加一个 d e, 它的代表词意思是啊,针对你,或者说除掉你的意思,所以 debug 就是检查错误啊,针对这个错误的意思啊。好了, 接下来啊,我们就要看一看,在咱们的 vivos 九九里面,我们应该如何逮到这只虫子。 咱们在 vs 里面啊,使用的技术就是断点调试的技术。那什么是断点呢?现代的 i d e 啊,那么都会提供断点的功能, 我们只要打上断点之后啊,就可以用于控制程序执行到哪一行代码时就停住了,那只要他停在那行代码那里,我们就可以观察当时程序的现场情况了。哎,看一下各个变量都 变成了怎样的值啊?咱们今天要介绍的内容呢,分为三个步骤,首先呢我们介绍如何给程序打断点,然后打完断点之后又如何让程序继续执行,或者是一条一条语句过程执行。 第二个的话呢,就是当咱们的程序啊停在断点的地方之后,我们如何观察程序的现场,如何看一下每个变量都是什么值?接下来呢,最后一点就是我们如何使用条件断点。好,咱们呢先看一下啊, f 一把它截下图, ok, 把它放在某个地方就好了啊,变小一点来,咱们接下来去到 vs 里面, 在这里呢给大家已经准备好了一些代码了,我们大概溜一眼,然后呢咱们看一看应该如何 给程序来打断点啊,首先我们声明了一个 int a 等于十,然后在这边啊做了一个 a 的自增运算, 制作完之后呢又做了一个 interb 的变量,他等于 a 加上加加 a 这样一个啊表达式。随后呢咱们把这个 b 打印输出啊,非常简单的代码啊,咱们在在用这个代码的时候呢,主要是来练习一下如何使用断点。好,咱们首先介绍断点, 比如说呢,程序肯定是要从 a 等于十这个代码开始运行,然后啊我希望让他停在 int b 等于 a 加上加加 a 这一句话,那应该如何让他停在这里呢?大家注意看啊, 我在这个地方点击一下鼠标就可以打上断点了,来啊,看一看啊,左键到这里你会发现,哎,是不是给我们自动显示出来了一些黑的点啊。随后呢,咱们 对齐 b 等于什么什么这一句代码,然后打上断点,点击鼠标左键,那打上断点之后,你就会发现,是不是啊,这一句代码就变红了呀?啊,意思就是说呢,程序运行到这一句的时候就会停在这里啊,来,咱们实验一下,点击咱们的运行 哎,你就会发现,是不是在这个地方程序就停下来了呀?然后呢,你看就停到了这一句代码。好,那停到了这一句代码之后,咱们接下来要讲的是继续执行与逐过程执行。 首先咱们讲解一下继续执行,什么叫代码的继续执行呢?他指的是我们如果在这里啊,已经看完了当时的现场数据,我们呢想让程序直接开始向下执行啊,不用一句一句的执行了,直接往下走吧。那么我们只需要点击哎上面的这个继续就 可以了,或者说呢,咱们也可以点击快捷建设 f 五,在这里呢,大家只需要记住 f 五,然后自己去使用就可以了。 那我呢,由于正在进行录屏,然后我的 f 五应该是啊这个快捷键有冲突,所以就不给大家去演示 f 五了。但大家知道在此时呢,点击 f 五这个程序啊,就直接越过这个断点呼呼的向下跑了啊,给大家演示一下点击继续, 你看这样的话,程序直接就进行完毕了哈。好,那接下来呢,再给大家演示一下一句一句执行代码,比如说啊,咱们直接把断点打在最开始的这句代码上,随后咱们直接点击启动程序。 到这里之后呢,我们应该如何一句一句向下执行呢?你看如果我点击继续执行的话,他是不是直接你看 直接就执行完毕了呀?啊?他不会说一句一句走,对吧?所以说呢,咱们肯定得要用别的方法啊,他断在这里之后呢,哎,咱们在这里有一些执行的办法,这些小按钮 其中有一个叫做逐过程,来,我把鼠标放上去啊,你看这个叫做逐过程,它的快捷键是 f 十 啊,在这里呢, f 十。我这边有一些热键的冲突啊,就不给大家去演示了,我直接用鼠标点击这个按钮向下一句一句执行,那大家呢,可以使用 f 十这个快捷键,一句一句向下执行。好了,你看我点击逐过程,你看他就跑到了 a 加加这一句上来了啊,然后我再点击逐过程,那他又跑到下一句来了, 那他没往下走一下,是不是就是执行一句代码的意思啊?那如果说他停在了这一句代码上,是不是表明这句代码还没有执行啊?是不是我们要 再点击下 f 十,或者点击逐过程往下之后,哎,这一代码才能够执行完毕啊?好了,那这就是关于咱们的继续执行与逐过程执行,当然还有一个叫做逐语句执行啊,就是说那他和咱们的 f 十比较相似, 那只有讲到咱们方法啊,这样一个模块的知识的时候,才会用到那种调试办法,到时候呢咱们再讲啊。好了, 那到了最后一句的话,我们是不是可以继续点击 f 十呢?或者点击上面的按钮走,哎,他就跑到了这个口号这边,然后预备要结束程序,那此时呢,你想说啊,我不想一句一句走了,我想直接你往下走吧,啊,就直接放开你了。好,那点击继续即可,或者点击 f 五。 接下来呢,我们来给大家介绍一下如何呢?在断点啊,停住之后,我们来观察观察程序的 现场。好,我们先把程序运行起来啊,运行起来之后呢,你会发现,哎,是不是代码先停在了这一句啊?好,那请问停在这一句的时候, a 等于十,这句代码执行了吗?哎,并没有执行,对吗?既然没有执行的话, a 现在的值请问等于多少呢? 咱们想一想,是不是他应该等于默认值啊,而默认值是不是零啊?好了,那咱们应该如何在断点停住的时候去查看 a 变量的值呢?有两种方法,第一种方法,咱们把鼠标啊移到 a 变量上,你会发现,哎,给大家弄清晰一点啊, 在这里会有一个 a, 然后零,你会发现 a 就等于零,对吧?好,在这里啊,可能不太清晰啊,因为我一放大呢,他就变得呃虚无了。好吧,那大家呢,可以在 自己的程序里面这样去试一试啊,就是说第一种把鼠标放在 a 这个变量上面,你看他就会出现 a 和零啊。 ok, 接下来呢,我们还有一种方法是这样的,我们去到下方,下面啊,有一些观察的窗口,比如说呢,有局部变量窗口,有自动窗口,还有监视窗口, 咱们啊,默认情况下,在自动窗口这边,所谓自动窗口就是程序执行到这一句的时候啊,那我乘着咱这个 vs, 他认为你会关心哪些变量?好,你可以看到这边有个 a 变量,对吗?然后他的值是零啊,因为现在十并没有复制给他。好,接下来我们往下走一句, 点击 f 十逐过程执行啊,然后呢,这一句代码是不是已经执行完了呀?接下来 a 加加这句代码还并没有执行,此时我们再把鼠标放到 a 上,你会发现此时 a 变成了十,然后呢,我们再去到自动窗口这边,看一看, aa 是不是已经变成了十啊?而且这个十是红色的十,说明刚刚,哎,上一句代码的时候,对这个 a 变量进行了更改的意思啊。好, 那接下来呢,我们再往下继续逐过程执行。好,此时 a 加加执行了 a 加加执行完毕之后, a 是不是应该是十一啊?来,我们把把这个鼠标啊放到 a 上面去看一下,哎,果然是十一啊,你看这边有一个十一哈, 那接下来呢,我们再往下走,看一看自动窗口这边,哎,是不是 a 已经变成了什么呀?十一,好, 那此时呢,我们的光标啊已经运行到这个地方了,运到这里的话呢,我们是不是产生了一个变量 b 啊?但是 b 等于后面这个表达式,那是必须是要这一句代码执行完毕之后,那 b 才能等, 等于后面的结果,而此时这一代码还并没有执行,对吗?他停在了这一代码上,所以说 b 现在应该是默认值为零。好,把鼠标放上去看 b 是不是为零啊?好,那接下来我们去到下面看自动窗口这边,哎,这个 b 这个变量已经有了,对吗? 那是因为咱们的程序已经执行到了,哎,把这个 int be 它声明的地方。好,那这里 be 它的值是零。那经过这句话之后,来我们往下再走一句啊, f 十 走完之后呢, b 是不是应该有值了呀?哎, b 应该等于多少啊? a 加上加加 a, 那是不是应该先计算这边一个操作数啊?这边的操作数是几啊?是不是刚才的十一啊?十一加上一个什么呢?前加加 a, 前加加一,是将 a 先加一,再参与到运算当中,所以说这个加号左边是什么?左边是不是十一啊?而右边呢?应该是什么?十 二加起来应该是二十三,所以 b 应该变成了二十三,你看没有问题啊, b 变成了二十三。好,我们接下来接下来看这个自动窗口这边啊, b 是二十三,没有问题哈。 好,那接下来呢,我们不想去看这些数据了,我们想直接放行怎么办呢?点击继续或者点击 f 五啊,直接就走开了啊。好了,咱们把这个断点先拿掉 好了,那咱们接下来看一看,一个程序能不能打多个断点呀?哎,其实是可以打多个断点的,比如说咱们在第一句这边打一个断点,然后呢,咱们在哎 b 声明的这个地方,咱们也打个断点好了。那此时我们运行程序啊, 运行程序之后呢,我们停在了硬台 a 等于十这一行,假设我们现在观察完了现场,想直接放行,说你继续往下走吧,我们是不是应该点击上面的这个继续啊,或者直接点击快捷键 f 五啊?好,我们直接点击继续看一下 发生了什么啊?走,哎,你会发现他是不是直接停到了下一个断点啊?所以说呢,我们刚才所谓的继续执行以及这个 f 五,他的意思是说从当前这个断点开始,直接把把程序放行, 但是如果说下面还有断点的时候,他还会停在下面的断点上啊,就说他不会越过下一个断点,好,你再点击继续的时候,是不是程序,哎,你看,就置行完毕了呀,因为在咱们第二句断点代码上面啊,他的下面的话是并没有其他断点的,所以说可以直接往下走。 好,那这就是有两个断点的情况,那有同学会不禁发问啊,说,学了这些东西之后,我们应该怎样在 debug 的时候去使用呢?啊?再给大家说一个简单的场景啊,比如说呢,我们当前这个 b 啊,最终经过计算,你 想象当中啊,或者说你的预期应该是输出二十二,但是呢,刚才说了啊,结果却输出了二十三,那此时的话是不是产生了疑问啊? 哎,产生了疑问,那为什么会输出二十三呢?你不知道啊,你觉得啊,比假设说,你觉得上面这个过程,哎,他应该输出二十二啊,那怎么就输出了个二十三呢?于是乎啊,你一句一句的去 debug 啊,你就在这打个断点,我说我看一看到底发生了什么吧, 好,开始运行,你发现此时 a 等于零,没问题啊,然后你跑到下一句上,发现 a 等于十,哎,如你所料,没有问题啊,那此时 a 加加了,然后再往下走一句,再往下走一句呢, a 等于十一,假设到这里,一切都如你所料,哎,确实啊, a 就应该等于十一,然后呢,你在进行最后一句代码的时候,你就觉得,哦,可能就在这句话上出错了,为什么呢?因为你看啊,刚才 a 等于十一,假设这一切都是和你想象中一样的,那只有在这句话上可能就会不一样了。 好,那这时候你就发现哦,你看这个地方,我可能写错了,我本来呢是应该写成 a 加加的, 这样的话不就变成了二十二了,结果我写成加加 a 了,你看,这就不对了啊,你看我现在把它停掉,停掉之后呢,我把这个加加放在这个 a 的后面啊,让它成为后置加加,然后我再运行,你看二十二就出来了。 所以说啊,咱们这个查 bug 的过程,就可以一句一句代码执行,看一下每一句代码是否呢,跟咱们预期 是一样的,一旦发生了跟咱们预期不一样的情况,就大概知道了啊,缩小这个范围啊,你看上面都是对的啊,然后这边只是个简单的输出,所以说问题一定集中在这一句上了。好, 那咱们的程序啊,现在都是比较简单的啊,那随着咱们后面代码的深入,可以带着大家做更多的这种 debug 的练习哈。 接下来呢,咱们来讲最后一个知识点,就是条件断点。那什么叫条件断点呢?你看咱们如果在这里啊,打上一个断点, 那此时无论如何,只要程序经过这句话的时候,是不是都会在这里啊,被被迫停止啊?好,那有没有一种情况说,嗯,我想说,这个断点啊,在某些变量满足某些条件的时候才会停下来。我举个简单的例子,比如说咱们仍然在这里打上一个断点, 我说啊,此时如果 a 来,我写在这里啊,条件,条件是什么呢?咱们的当前的这个 a 必须是大于十五的情况下才会啊,挺下来。 好,那现在是不是不管 a 是怎样的值,他都会在 b 声明的这句代码上停下来呀?好了,接下来啊,我们在这个断点上,呃,点击咱们的鼠标右键,点击鼠标右键之后,你会发现这边有一个条件,然后点击这个条件。 好,点击条件之后呢,你会发现他出现了一系列的选项啊,咱们来讲一讲,说啊,你在这里这个框框里可以输入一个条件,哎,这个条件是不是就是最简单的那种啊?关系表达式或者逻辑表达式,哎,那这个表达式是不是最后的结果要么是个处, 要么是个 boss 呀?好,那他为处的时候,我们才让这个断点停下来啊,就是这么个意思啊。好,咱们先在这里啊,给大家示范一下, a 大于十五的时候才会停下来,咱们输入 a 大于十五,然后呢点击关闭。 此时呢,你会发现这样一个断点上面有个小的加号,代表着当前断点已经是一个条件断点了。来,我们直接运行,看一下,会不会在这里停下来呢?理论上讲的话,此时 a 加加之后才是十一呢,所以说他应该不会停下来, 你看程序直接最终输出二十二啊,并没有停下来。好,现在咱们把条件断点的条件给他改变一下,然而是右键断点,然后点击条件,这个地方呢,咱们不用 a 大于十五了,咱们用 a 啊,啊,只需要大于十就可以了,来,咱们看一看啊, a 大于十就 能够在这个断点上停下来,点击关闭,那我们看此时 a 等于十,然后 a 加加之后是什么呀? a 就是十一了,那他运行到这句代码的时候,会首先进行条件的判断,看一下是不是 a 要大于十啊, a 大于十的时候是不是断点就在这里停下来了呢?来咱们实验一下, 是不是应该,哎挺在这里啊,因为呢,当前的 a 的值是十一,所以说是满足啊, a 大于咱们十, a 大于十啊这个条件呢,所以他就停下来了。好了,那我们点击继续啊,放行程序 好取消掉断点。 ok, 在这里呢,咱们关于调试的三个技巧都给大家讲完了啊, 这些调试的技巧呢,都是属于比较简单的技巧,那在程序稍微复杂的时候呢,希望大家能够灵活运用,咱们在后面也会看到一些关于调试的用法啊。行,那关于调试咱们就给大家讲到这里。

啊,接下来说这个 scribble object, scribble, scribble object, 哎呀,这个好难念啊,英语不好。这个东西呢,经常是用来做配置用的,就是项目的配置和。 嗯,场景的配置,因为他本身是像一个,他本身是变成一个特殊的资源,可以用于存储数据。嗯,先看一下吧。首先新建一个场景, 阿伯杰克, 嗯,先剪一个这个康初来 script script object control, 一般呢场景配置是可以通过直接就通过脚本,比方说就在这个脚本上,嗯,给 mast, 给 mast, 比方说就直接在这个脚本上进行进行这个 设置些。帕布里克印特雪亮布拉的。嗯,是这么写吗?帕布里克斯吹 i'm his name, 类似于这样的, 这个时候是可以在这看见,那么这样的做法呢,是有一个麻烦的事,就是当这个场景和项目需要多个相同的多个配置,比方说 这个场景配置是这样,那个场景是那样的时候,这样的做法就比较麻烦,这个时候呢,用 screep the object 会比较方便,那么包括上市很多都在用。嗯,看一下 sque the oppojitt 来新建, 就这个吧。 os quebec, 首先 skrid option 他是继承了,不能继承这个莫诺比黑不了,继承的是斯科瑞,就是继承这个 sque 他, 然后本身的话就是 publica string s name, public inter number, 或者是 public 卡了, 扛了货, 那么还可以用数组或者是其他。嗯,比方说 make two three point, 他 float 数,这是数主,数主和那个列表是显示是一样的, 那么这个这个时候还不能用,这个时候还不能用呢,要怎么使用呢?必须添加一个注解,先看一下,这个时候我点这个 crete, 这里是原模原样的哈,没变过的。好,现在添加一个注解, creator ss menu, 我们添加完这个注解以后,在这里就会多一下,嗯, 这个而不见他这里也是一样的。那比方说想要在这里添加就是新添加一个,然后可以自己起个名字, 然后这里就可以。嗯,选中这个就可以开始来配置他了, 戴帽戴帽,换一个颜色, 包括这个各个点啊。那么数组和列表呢?都是需要先设置他有多少他的 size, 设置了 size 以后,然后可以设置他的 具体每一个元素的值,设置完就可以了,不用点保存。那么 screep the object 这个,嗯,好,先先讲使用,使用是这样的,使用像是和普通的类使用是完全一模一样的,就直接在这 定一个巴布雷克,奥布杰克特,奥巴杰克特直接在这使用就行了。迪拜他使用就是一个类, 他的就是一个普通的泪, 看一下运行,哦,对,现在把它透复制进来,透进来复制就是它是一个特殊的, 嗯,资源用法,就在脚本里面就是一个类,那么这就是他的这个卡了,就是这个 这个,那么在这个 script object 在 unit 编辑器编辑的时候是可以被程序修改的。比,就是我如果在这修改它, 那么这个修改是会固定,会影响到这他原本的这个值的,但是一旦发布为应用或者是程序以后,这里面的值就不不可以被修改,所以不可以把它拿来,像, 嗯,是上面那一截的 player press 那样拿来做存储,嗯,那个动态存储,但是可以把它拿来做配置,而且上很多地方都用它,用这个来做配置,各种,嗯,就 各种插件里面都用它来做配置。那么接着再说一个,嗯,现在是把它添加到这个里面来, ss 的这个里面来,想要还可以把它添加到这个,嗯, 添加到这个主菜单用的是,嗯,用的是这个,这个叫什么?嗯,编辑器脚本,编辑器脚本就这样,直接就,我就偷个懒,直接复制粘贴看一下对不对? 添加一个营养 好,嗯,把这个缩小, 这样的话会看得清。 这个就是编辑器的脚本,就只只在 untida 下面,那么就是塞到菜菜,让菜单显示,就是这个注解,这个手有没有保存看一下。保存 啊,那这里,这里出来了,就会多这么一个菜单,这个是这个注解的作用。接下来呢?这个是保存 设置路径,设置路径,他的路径是这个地方,然后点击后会是这样,这样, 这样在这里保存,点击一下看一下就知道了。点击后会哈,还会就是在这个路径,而且他会有一个默认的名称。 嗯,这个是 unit 脚本, idita 脚本, 不过我觉得初学者上学会这个注解就行了。后面这个只是看上去更方便,就如果,嗯,如果有很多个,如,如果有很多个全部排在这会比较麻烦,那用这样的方法呢?会更清晰一些。 好,接着还有一个就是,嗯,自定,自定义的类,自定义的类默认是显示不出来的,比方说这个 not so damn, 比方说制定一个新的类, public cost train name public int number, 这个时候,嗯,像在哪个里面都是一样的。在这,比方说 带毛的, 或者是 这个, 这个时候无论是在这里看不见那个新建的类吧,应该都保存过了,保存一下都都保存过了, 在这里也是看不见的。那么这个时候呢?自定义的类需要添加一个注集来序列画一下, 添加完这个柱子就可以了。哎,这个时候就能看到他了, 在这里也是一样的,就如果自定 你的雷要在这个 inspect 窗口里面显示,并且设置就必须须绿化。 呃,这里要说一个经常还有个东西,就经常用的,有个东西是这个数据字典啊, string, int 是是这么写的吗?啊,对,这个 数据字典默认在 unit 里面是不可以在这个 inspector 里面显示的, 就不,不管你是有没有把它序列化,那么有专门的插件可以做这件事情,因为 这个数据字典还是经常会用到,所以这里提一下, ok, scribble object 就说到这里,嗯, ok。