哈喽,大家好,欢迎来到阿空的游戏部,我是阿空,那么这一次要介绍的是 unit 的存档与独档。 好,那么在介绍存档与独档之前呢,我们要先来介绍一下资料的形式以及储存的方式, 那我们可以储存资料的形式有非常多种,第一种是直接储存数值,就是把我的等级,或者把我的攻击力,防御力依序储存在我们的档案里面。 那第二种的话,就是透过序列化的方式,那我们可以把我们的资料序列化成 binary 的形式,或是变成是叉 m l 的格式,或是序列化成 jason 的格式,那当然 我们也可以自定义我们想要的格式,然后那么序列化就是只说呢,我们可以把一个物件变成是一串资料,那么接着是储存的方式,最常看到的当然就是使用 preppress 的方式去做储存。那第二种就是透过外部档案, 那接着呢当然是通过连线的方式去做储存,也就是把我们的数值还有资料储存在 sever 端。 那么准备好了资料,然后我们也决定了要储存在哪边,那中间呢,我们就可以加上加密, 通过加密呢,我们就可以提升我们资料的安全性,减少被修改的可能性。然后那么接着我们来介绍直接储存数值,像是我们有两个变数, 他们分别是阿空,然后等级是一,那直接储存,当然就是把名字跟等级,然后一序存下来,那我们可以去规划自己的储存顺序以及他的样式,然后依次去读取跟写入。 好,那么接着呢,我们要来介绍序列化,什么是序列化呢?就是我们可以把我们所需要的资料变成是一个物件,或者是把物件当做是一个资料,那像这个范例,我们就是把名字跟等级包装在 一个叫做 player data 的资料上面,那么序列化就是把这个物件变成是一串文字的资料。那我们在使用序列化的时候,必须要注意,我们的物件上面必须要写上 see reliable 才能 能够去使用,而且并不是所有的资料都能够被序列化保存下来。那么准备好了物件之后呢,我们就可以决定我们要序列化成什么样的格式,那像是 binary, 那我们把物件序列化成 binary, 就会得到这样子的一个数列。好,那因为它是二进位的格式,所以打开来就会是一个乱码的形式,那么使用 binary 形式的序列化 优点就是他不容易被篡改,那缺点就是他不容易被维护,因为他是属于二进制的档案。那么接着是叉按 l, 那就会像是上面这样子,他就会是一行一行条列下来的一个格式,那他的优点就 就是比较容易去维护,那么缺点就是它的体积会比较大,因为它还多了一些叙述的资料。好,那么接着是 dressen, 那么序列化成绝省,就会得到这样子的一个格式,那绝省的优点就是它的体积比较小,使用起来也是最方便的一种。 那我们序列化成这些文字之后呢,我们就必须要反序列化,就是 descent 来,那么透过反序列化呢,我们就可以把这些文字变成是我们原来的物件, 也就是把这些文字再转换回去我们一开始所使用的这个物件。好,那么接着我们来谈一下储存的方式。那么第一种是 player price, 那么 player price 是什么意思呢?它就是 player preference, 也就是玩家的偏号设定好,那么他所资源的资料形态呢?有以下几种,那一个是 i n t, 就是整数,一个是 float, 就是浮点数,那么一个是 stream, 就是自创。 那么我们来看一下这个 prayer proof 会储存在哪里吧。好,那么我们到 unit 的网站上面就可以查到 prayer proof 的一些资讯。好,那么既然它是 preference, 就代表说它也是可以去做修改的,所以说在储存的时候呢,我们最好还是做一些加密的动作 好,那么在下面呢,我们就可以看到很多的资讯,就是在各个平台上面,他所储存的位置都是不一样的,那么在 windows 呢,是透过注册表来去储存 我们的数值,那各位有兴趣可以看一下里面的路径,那么接着我们就实际的来试试看 prior price 的功能吧。那我这边已经先做好了一个小型的储存脚本, 就是设定了一个文字,那这个文字是用来显示我们的资料用的,然后我们创建了一个 player data, 然后在编辑器里面去做编辑,然后有两个功能,一个是储存,一个是载入 好,然后底下是我们的物件资料。好,那我们就开始吧。那如果我们要使用 player pref 去做储存的话呢,我们就直接打上 player pref, 点 set integer 就可以去储存它的 数值,那当然我们也可以储存自串好,那么需要两个参数,那一个是 key, 一个是 value, 也就是一个 key 会对应到一个 value, 那我们就可以给他一个名称,像是 name, 那 value 的话就可以给他数值,那我们要储存的是 data 的这个数值,那他的名称就是 name 好,那么透过这一行呢,我们就可以把我们的名称储存下来,那载入的话就是使用 player press 点 get dream, 然后我们可以拿 name, 就是把我们的这个 key 的数值给拿回来,那我们这边使用文字去做显示,那我们来看一下效果吧。 然后呢,当我们按下 s 的时候储存完成,然后按下 l 的时候,我们就可以成功的把阿空这个数值给拿回来,那当然这个 level 也是一样的,我们可以使用 i n t 去做存取。 好,那么这边我们就可以使用 player brief 点 set integer, 我们要储存的是 level, 然后使用 data 点 level 好,那么这边我们也可以把 data 的物件给换回来,就是 data 点 name 等于 play pref 点 get stream, 然后是 name, 那后面呢是 data 点 level 等于 player please 点 get integer, 然后 level 好,那透过这个方式我们就可以返回原本的物件,那假设我们把等级变到九十九, 然后当我储存,然后我们把等级改成一,然后当我载入的时候呢,就会发现等级变成了九十九,那这就是 player price 的使用方式。 好,那么接着我们要来介绍透过外部档案来去做存取,那么是使用 c sharp 的 file string 跟 file 的这个 原件呢,来做档案的创建跟读取。提到外部档案,当然就要提到我们的路径,那在我们的应用城市里面呢,有两个路径是比较常使用的,那一个是 application 点 data pat, 那第二个 路径是 application 点 presistent data pass, 那我们可以来看一下。好,那么回到 unity 的文件,那我们就可以看到这个 data pass, 那他们在不同的平台当然会有不同的路径, 但是这个路径呢,都是指向这个应用城市。好,那么第二个是 application 点 好,那么这个 persistent data pass 呢?在 windows 里面会存在 user, 然后 user name, 然后 apple data, 然后 local low, 然后这个公司名称,然后 app 的名称的这个资料夹底下,那它的用意就是说呢,当我如果把整个专案删掉的时候,它的资料还是会存在这个 地方,他不会去被覆盖或者是被删除,那这就是 presistent data pass 的一个好处。好,那么 company 呢?跟 applen 呢?可以在我们的 project satin 去做设定, 然后那我们就实际的来试试看吧,那我们先把这个 prayer price 先删掉。 好,那么首先呢,我们要使用 file stream 来去创建我们的档案,然后 f s 等于 new file stream, 那里面呢,我们要放置的是路径,所以我们就使用 application 点 data pass, 那这边我们先使用 data pass 来做一个测试,那当然我们也可以使用 presistent data pass。 好,那么后面 呢,我们要加上这个档案的位置,就是斜线,然后 saf 点 txt, 那这边我们使用的是文字档,方便我们去做浏览。那后面呢,我们要填上 file mode 点 preact, 因为我们要创建一个新的档案,那这样子我们就制作好了一个档案流。好,那么接着我们要有一个 stream writer 来去撰写我们的文字,然后那就是 s w 等于 new string writer, 那里面呢,我们要放置的是这个档案流,好,那么接着我们就可以使用这个 string writer 来去写一些文字,那就是用 s w 点 right line, 然后 我们要写上 data 点 name, 先写上我们的文字,然后呢我们再去写上我们的等级, 那写完之后呢,别忘记把它关上,就是 s w 点 pro, 然后 f s 点 pro, 然后呢我们先来看一下是不是能够正确的创建我们的档案,好呢?当我们按下开启,然后按下 s, 当储存完之后呢,我们来目录看一下, 我们就可以找到这个 saf 点 p x p 的档案,那打开来就会发现它是阿空,然后一那通过这个方式呢,我们就可以把文字储存到档案里面,那接着 是窄路的部分,那一样是需要一个 file stream, 那这边我们就是使用 open, 因为我们要把档案做开启的这个动作,那么接着我们需要有一个 stream reader, 然后它是这个 file string。 好,那我们就可以使用 s r 点 read line 去做读取的这个动作。那第一个呢是什么?第一个是我们的名字,所以就可以使用 data 点 name 等于 好,那第二个是我们的 level 等于好,那因为它读取出来呢是一个字串,所以我们要把它变成是一个整数,我们就可以使用 i n t 点 past, 然后去把它变成整数。好,那我们来看一下吧,那当我把这个物件呢变成是等级九十九,然后叫做阿空一二三, 那当我开启的时候,我就可以用读取去把我的文字读进来,然后修改成我们的物件,然后呢透过这个方式呢,我们就可以成功的把资料储存在文件里面,然后再从文件里面去取得资料。 好,那么接着我们要介绍的是透过连线储存的方式去储存资料,因为储存在本地的资料很容易受到修改,所以我们就把资料储存在四伏器端, 来提升我们资料的安全性。但是呢,城市还是在玩家的手上,这意味着他还是不安全的,因为 玩家可能去修改里面的城市逻辑,然后导致这个游戏发送错误的资讯到事故器端,所以眼镜到后面呢,我们会把一些敏感的城市逻辑放在事故器上面去做执行, 玩家端的部分我们也会适时的做验证,这样子才能提升整个资料的安全性。好,那么接着呢,我们要来介绍如何透过序列化的方式来去做档案的存取,那这边我们要先来介绍的是 finally。 好,那么首先我们需要有一个 binary formator, 那么我们要引用的就是 system 点 run time, 点 civilization, 点 formator, 然后这边是用 binary 的方式去做饮用。 好,那接着我们还需要有一个文件流,那这边我们使用的是 file 点 open 啊,因为我们不需要一个一个去做撰写,所以我们使用 file 点 open 就可以了,那里面要加的是地址, 然后它的方式 file mod, 点 create。 那么在 binary 的文件里面呢,我们可以自己去修改里面的这个副档名,像是 sav 啊,或是 d a t 都可以啊,或者是你想要取自己的副档名也可以。 好,那接着呢,我们要来使用这个 binary formatter, 然后点 serialize, 那里面呢我们要放置的是 stream, 那这边我们就可以使用 stream 把这个文件流呢给接起来,那我们把 dream 给放进去,那接着呢?我后面要放的是物件,那物件就是 data。 好,那么透过这个方式,他就会直接写到这个文件流里面,那就用 s 点 close, 这样就可以完成我们的剧烈化物件。那在读取的部分呢,我们一样是需要一个 binary formator, 然后一个 dream, 那这边一样改成 open。 好,那这边我们就可以使用 data 等于 b f 点 the serialize, 我们要反序列化,那反序列化里面放的就是文字流,就是 s, 那因为它读取出来之后呢,它没有被定义它的形态,所以这边呢,我们就要强制转型,就是 player data, 那这样子我们就可以把文件里面的资料流呢,变成是我们的 player data 的物件,然后再传回去给原本的这个 data, 那我们来看一下是不是可以正常的读取吧。好,那这边我们先使用阿空,然后等级九十九,那当我们按 s 的时候呢,输出完成,那这边我们把它改成一,然后变成是空,然后再进行游戏,那当我们读取的 之后,就会发现他变成阿空,然后等级是九十九,我们就成功的把资料写进我们的 finally 文件里面了。那我们就来看一下档案啊,就会发现有一个 saf 点 epp 的这个档案, 那我们把它开起来,就会发现他长得就跟我们介绍的是一样的,就会是二进制的档案。 好,那么这样子我们就完成了透过搬运序列化去存取资料的功能了。好,那么接着呢,我们要来介绍的是透过 timel 的方式去做序列化,那首先我们需要引用 system 点 timel, 点 civilization, 那其实大部分的东西都是一样的,那我们把这边变成是叉 m l, 然后 see realize 等于 new c realize, 那这边呢?我们就改成使用 time l 去做序列化,然后那么里面要放置的是 type, 也就是我们物件的形态,所以这边我们就使用 data 点 get type 去拿取 data 的 type。 好,那这边我们可以改成 timel, 方便我们去做观看。 好,那么下面一样,我们把这个 binary formatter 呢改成我们的 timel c realizer, 那么文件也是一样的,那这边改成 timel, 那最底下呢?一样我们使用叉 m l 点 desiri 来去做返去列化,然后把这个文件流串进来,然后返回我 我们的 data。 好,那我们来试一下吧。好,那我们把它变成阿空,然后等级是九十九,那当我们储存的时候 储存完成,那这边我们再做修改,把等级改成一,然后去做读取,那我们就会发现他的等级又变回九十九, 那现在来看一下我们的档案,那找到叉按钮就会长得像这样子, 那当然我们可以去修改里面的引扣顶,因为现在我们会发现这边是问号,问号,但是读取来说他是正常的,那么在名字的部分的话,假设我把阿空变成是空白的,那当我去读取的时候,数值也是可以正常的去做 拿取。好,那么这样子我们就成功的透过叉 m l 的方式去做数值的存取。 好,那么接下来呢,我们要来介绍第三种,也是最好用的一种,就是使用 jason 的方式去做序列化,那我们先把上面的给删掉。 好,那要怎么做呢?我们就使用 jason utility, 然后点 two jason, 那里面就是放我们的物件,就是 data, 这样子我们就完成了,有没有非常的快速呢?好,那透过这个方式,我们会得到一个字串,那我们就印出来看一下吧。 好,那当我们按下 s 的时候呢,它就会是后面这一串的数值,那读 去也是一样的,然后那么这边呢,我们就可以使用这个 player price, 或者是透过 seashot 的文件去储存我们的这一串数列,那我们就使用 player price 吧, set string, 然后去储存里面的字,那我们要给他一个 key, 就是 jason data, 这样子我们就可以存到我们的 preference 里面了, 那后面呢,我们就可以把它反去列化,就是使用 data 等于,然后 player press, 点 get dream, 我们把这个 jason data 给拿出来,然后呢,我们要写上这个 jason 有题的题,然后点 from jason, 就是从 绝省去做读取,然后我们的形态是 playo data, 那后面呢,我们要接的是这个字串,也就是我们把字串拿出来,然后传进去,让他去做返回,返回出来的就是我们原本的物件。哦,是绝省 data, 那我们来看一下吧。好,那么现在我是阿空九十九,等那当我去做执行的时候,我就会把这些资料存进去我们的自创腿托软鼠里面。 好,那当我们按下读取的时候,就会发现阿空跟九十九就跑回来了,那这也是最常用的一个方式,那如果你要比较安全的形式的话呢,那我们也可以直接在这边去加上一些像是 a, e, s 啊,或是其他 的对称式加密,然后把我们加密后的这个资料存进去 player proof 或者是使用嗯 seeshop 的档案进行存取,那就可以得到一个比较安全的资料存档。 好,那么一次介绍了这么多种方式去做档案存取,那就看各位喜欢使用哪一种的资料格式,然后使用哪一种方式去做存取。 好,那么我们这一次关于存档跟独档的介绍就到这里结束啦,感谢各位的收看。我是阿空,我们下次见喽,拜拜。
粉丝654获赞3163

嗯,好了,那么接下来我们就要考虑这个,呃材质的一些一些特殊性啊,比如说反射,然后包括像灯光,还有就渲染,我们要考虑这些东西了啊,那么怎么样让这个 游戏的画面啊,或者说我们这个程序交互程序的这个画面能够提高一个档次,那么需要去给他添加一些东西,比如说,嗯, 灯光啊,那首先我们也需要添加一些灯光,是吧?那这边呢,其实我们还没有去设计过这个灯光啊,那我们可以简单的去设计一下,比如说,嗯,我们可以在这个 电视柜啊,电视,电视机这里啊,电视机这里我们可以放一些,可以放一些那个 呃射灯,电视机的这个上面可以放一些一些画,是吧?下面这边可以放一个电视机,然后呢?呃 床头我们可以有,比如说床头柜啊,上面有比如说台灯啊这些东西,但是我们现在呃还没有,还没有啊,那我们先在没有家具的情况下,我们先看看这个灯光,室内灯光怎么去做? 那么我们现在呢先加一些室内的灯光啊,在室外大家知道就是有一个天光,这个天光呢是呃模拟太阳的,他只要一个就可以了,那他是室外,但室外打到室内之后,室内没东西了啊,所以我们需要室内的灯光。那么在这边呢,我们需要去添加一个, 我们可以加一些三 d 的对象啊,比如说我们加一些,呃 圆柱,我们可以拿这个圆柱来模拟什么呢?模拟这个灯, 我们可以拿这个圆柱呢去缩小啊,那这个不需要网格啊,不需要那个胶囊碰撞体,所以在这边组件这边呢,选择齿轮,然后移除组件就可以。 我们放个小的筒灯,小的那个顶灯, 但是这个就是做作样子啊,这个东西其实你真的要发光还是要靠这个 灯光来做的,放在这个位置, 然后呢在这边呢,我们就放一盏真的灯光,是吧?当然我们在顶上,我们还需要有一盏灯啊,在顶上呢,一般来说有很多这个灯是那是掉灯,是掉下来的是吧?然后或者有一些是吸顶灯,我们简单一点,我们做个吸顶灯好了, 我们把这个刚刚那个圆柱体复制一下, ctrl d 复制一下,然后把它移动出来。 哎,我们做个这样子的灯,太大了啊,小一点 好,然后我们就考虑把这些灯打开,嗯,我们顶上这边电视机这边我前前面讲了可以放一些射灯,是吧?我们可以放三个,放三个圆柱啊,把这圆柱复制一下, ctrl d 然后复制出来,然后我们做这种 筒型的射灯, 还有一些旋转, 一般都是这个样子,是吧?然后有一根那个呃轴,把它撑住,把它再复制一下, 而且标准做法的应该应该是把这个三 d max 里面的这个模型啊,或者三或者玛雅里面做好的模型啊导进来啊,这标准做法,这边的这边建模其实是不是特别规范啊?只是说能够先简单的做一些效果 好,这个是一个灯,那么呃,我们做了这么多啊,现在就是有一点乱,大家可以看一下。呃,我们这个地方你看这些都是叫 cube 啊, sellinger 这些模型都没有去归类 啊,是什么是墙啊,什么地板啊?或者说我们这个就是,呃,房子啊,对吧?我们应该应该归归类,不然的话他越来越多,我们放那个,后面再要放一些细节家具啊,什么就越来越多乱了啊,所以我们这边要归下类了,因为这个灯,我,我做到这个灯,我想起来啊,我们这个灯 它有两个部件,这两个部件呢,它应该是连在一起的,应该是有一个副物体的,对不对?所以我们应该就是先整理好,先整理好啊,所以呢,我们建一个,我们现在建一个空物体啊,在这个场景中我们建一个空物体, 游戏对象创建空对象,创建一个空对象 game object 啊,然后呃,随便把它放在哪个位置,放在房房子中间好了,它就是一个什么,就是这个 里面的这些墙面啊、地板啊这些东西啊,我们就叫 building, 起个名字叫 building。 然后呢我们把这个这些,我们前面做的这些乱七八糟的这些 cube, 这些房子的这些东西啊,全都丢到 building 里面,全部丢进去, 全部丢进去。好,然后我们刚刚建的这些是什么呢?是灯光,是灯光,所以我们再建一个,再建一个空物体,创建空对象。好,然后这个呢,这个就叫做 light model, 为什么不叫直接叫 light? 因为我们这个 light 的时候,我们准备放真的灯光在里面,是吧? 这些都是 light 的模型啊,灯光的模型,所以你就把这些模型就拖进去。那么像这种啊,有几个部件的模型,我们还需要给他建一个服务器,或者呢?我们可以啊,把其中一个作为服务器,也就是说比如说这个桶 把它拖到这个,哦,不行,出问题啊,因为发生过旋转了啊,发生过旋转了, 如果我把这个投进去也不行,那我再建一个空对象,在这边游戏对象创建空对象,然后把这个空对象放到 放到它上面啊,作为一个副武器,这样子好,然后这个呢,把它拖到 light model 里面,作为整个 light model 的子物体,那这样子就整理好干净,是吧?那我们把这个 get mobile 的起名叫 sport light 是错了, sport light model 聚光灯的模型啊,丢进去好,那么这样子,这个复制的话,我只要复制它的附体就好了,主要就是放了,就是为了这个,然后你就 呃我看看啊,往这个方向打,它可以旋转,可以往下往下打一点,这样子 好,然后我们用 control d 再去复制复制它的负物体就可以了,对吧? control d, 那这个是打什么呢?就我们可以把这个地方放一些画啊,这个反正是挑高的,是吧?那个下面放个电视机,上面放一些画,那用那个灯光打一下,那么这个灯光呢?我就可以去见真的灯光了啊,我们接下来我们见真的灯光,我们看室内的灯光,你可以用 呃游戏对象,然后灯光你可以看一下,上面有这个。 呃,定向光,定向光,其实就是这个 sport light 啊,就是太阳,就是太阳。那么还其实我们是平时叫平行光的啊,他这个叫翻译过来的定向光。那么室内呢?我建议用这这种普通的灯呢?用点光源, 大家用过 max 的应应该会知道,这个就是像那个 max 里面的 almy 一样,就是一个点光源 啊。如果说其实我打光的时候应该不应该把这个打进去,是吧?这个我们回头我们呃要改一些东西啊,要改一些东西,就是说让这个灯光啊,不要去照 这个灯啊,因为我这样一打它有可能会把这个灯的影子给投上去,那其实是应该是这个东西本身法, 对吧?那这个我们回头改,那我们先把这些这个地方啊,我们再复制一个点框 ct 这样子好,然后这个地方呢有聚光灯啊,所以我们在这个上面 啊,我是按 f 居中的啊,然后我们在这个地方我们创建一个聚光灯,第三个啊聚光灯, 然后呢我们把这个聚光灯呢稍微转一下, 按住 ctrl 键我们旋转一下 啊,那么这这个聚光灯啊,他是有一些有一些参数的啊,现在他这样打下去呢,可能这个范围啊,就感觉会比较 比较这个,呃,光圈会比较小啊,我们调一下,调它的这个范围,把它从十调大一点 啊,不是范围范围,是他这个打的距离啊,不是范围,是看一下,是他的角度啊,角度,第二个,第三个参数角度啊,打成这样子是吧? 这样差不多挺好看的。好,然后我们把它 ctrl d 复制一下, 在 ctrl d 复制一下啊,这里出问题了啊,有同学会问,哎,为什么第三个灯就不亮了,哎,也许有的同学电脑上会亮啊,这个是根据电脑,呃,就是根据你这个里面引擎的设置里面来的啊,他是这样子,他的现在默认设置是他的实时灯光啊,就是 聚光灯他不让你多,他比如说你开车,你开车你放两个聚光灯实实的,是吧?那但是你这个舌头灯 如果说你要再多的话,他现不给你显示,但是你也可以把它调多。但是对我们来说呢,我们是看最后渲染的效果,因为这些东西都是不动的,不动,所以我们渲染一下,那渲染的话或者说烘培啊,烘培的话 这个所有的灯光它都是会最后会显示出来,所以这个地方其实没关系,没有关系的,那大家就,呃把这些灯光呢给它复制出来,复制出来,然后把位置呢都摆放好啊,我们然后我们再去调这些后面的这些细节 啊,大家记得要存一下啊,这个我们做了这么久啊,都没有保存过啊?这个尽量大家习惯性的按一下 ctrl s, 虽然说 unity 不太容易崩掉,但是呃,也说不准,是吧?万一有一个什么程序开启很大的,然后内存不够了,一下崩了, 所以大家存一下。好,现在把灯光摆放一下。

unity3d 用户手册这门课程,我是你们的讲师魏志祥, 在这节课里面我们来讲关于在 unity 里面去写代码的一个调试的环境, 以及他的一个定义器的一个支持。其实这个东西还其实很简单,因为我们大家在默认安装了我们的 unit 之后,我定任何一个代码,我把它短,我把它打开, 都会怎样,都会弹开这样一个默默认的 model developer 点这样的一个编辑器,他看上去很像我们的维多斯丢丢啊,也他其实就是一个继承的一个 id, 一个开发的一个工啊,一个 id, 对吧?开发环境, 那这个开发环境我认为是比较好的,他不像威瑞斯丢丢那么复杂,但是他啊打开比较快啊,但是他有自己的一些 bug, 经常会卡卡掉啊,你要及时保存,但是他打开的比较快,而且他相对来说比较简洁, 就是应该是为优内帖,也可以说是量身打造的,所以说我们通常来说是使用这个 ide 去编写你的代码就足够了。那这个 ide 的话主要就是这样几个大的一个 功能,我们可以看到我们只要在 u 内厅里面创建了我们的代码,他就会自动的,我们打开这个这个编辑器啊,他就会自动的为我们生成这样几个相关的工程,有没有看到, 对吧?自动的有这样几个工程,为什么会有这样的几个工程?为什么会在这样几个子工 里面?这就是我们上节课讲的我哪部分代码会被编辑到,哪个会编辑,他是以会编辑为单位的 啊,他的一个工程就会编译成这个工程名字的一个会编辑,那我们可以看到在 c c 差吧里面就是我们最主要的我们代码存在的地方,那在这个 c shop 艾迪特里面就是我们艾迪特代码存在的地方,那 c shap 艾特是 first pass, 就下面这个 c shop first pass, 我们上节课了就讲了 first pass 是怎么回事? 他为什么会有一个叫 facepass 的这样一个会编辑?那这里面应该存在哪些代码?应该就是那些 stand 掉的色子下面的那些代码, 那这边就可以就是他的一个工程的一个情况,这工程不需要大家自己去维护,不需要说我会创建一个四 s, 我在上面去双击去添加是不需要的。我在编辑器里面任意去创建一个代码,你在西安的文件夹创建,大家讲讲代码,他就会 自动的打开之后啊实时的反馈到这里来,你在这里面去删除文件,他也会实时的反馈到你的优三 d 里面去, 那这个就是他的一个这边的一个栏,那下面这边就是对他的一个编辑。其实我们做的最主要的工作就是我们想动态去调试他,比如说我挂了一个脚本,我想动态调试他,基本上我们做的操作就是在这左键这里去打一个断点, 然后呢我们看到这有个三角,我们可以点这个三角,他就会提示我们当前存在的 unit 和工程,就代表我们可以挂载到这个工程上,我们选这个 unitie, 他挂在这工程上了,然后我们只要一启动这个工程,这个工程如果他能跑到你这个代码,他就会停在你这个断点里面, 然后我们就可以看到下面跟 viose 丢丢是类似的一个什么这样的调对战你当前的一个局部变量的值,你可以去 wow 是一个值,你可以看到你的当前的帅的,然后你可以把鼠标放在上面看他的, 看他的值啊,他有的时候这个值表现的不是很准,但下面大家可以看到这样的一些值, 那这个就是他的一个挂载的调试,然后我们可以通过这里面的一个单步直行让他往下走,然后这里暂停停止啊,以及怎么样走到下一步, 就是跟威若斯丢丢是基本一样的,我们把这个,我们把这个,当我们把这个东西再按一下,他 回到小三角的时候,他就脱离了挂载,他就不挂在这上面了。这挂载我们可以在启动之后挂载,也可以在启动之前挂载,都是一样的,这是为我们提供了一个非常方便的一个 在 uni 天里面去调试脚本的一个方法。我们一个调试器啊,他还是相对来说比较啊,比较强大的,但是有些同学他会习惯于说,我想用威瑞斯丢丢去 做我的脚本的一个 ide, 也想用 vivo studio 去调试,其实是可以的,要怎么做呢?你需要改一下他默认的配置,在这里面有个叫做 pref unit, 像麦克版本是在于这个下面叫个 profess pref preferences, 那在云山二塔,应该是在艾利特下面,我们在普瑞芬这里面一会有一个 eastern or two it's not too 里面他默认这个 easternal scooby editor, 他就是 monet developer。 如果你装了 virus 丢丢的话,你可以把它定位到你的 virus 丢丢的一个边啊,安装文件加下那它,打开它,它默认就是用 virus 丢丢打开了,那 只是这样你是没有办法用威瑞斯丢丢去挂在这个进程去调试他的。为了去调试他,我们需要大家去下载一个叫做 unit 三 d virus 丢丢的一个 plug in 啊,这应该是一个在冰三二线,应该是一个安装文件,大家随便去网上百度,百度之之就可以了。 大家去下载那个名字应该就叫 unstu uncd, 威瑞斯丢丢,大家把那个下载下来安装一下,然后你的 ununt 里面就 会有类似于我们这样的一个操作了,我们就可以有一个类似于叫 tech to 什么 unit 的一个按钮, 你就可以把它在威瑞斯丢丢里面去挂载到你的优内田的变异器上,大家可以习惯于威瑞斯丢丢开发同学可以回去啊下载一下。但是我觉得这个 model 就比较轻便简单了,就是已经足够大家使用了,所以我基本上是使用啊 model diy love 去开发的。 那这就是我们在 uni 天里面使用 monopy 去开发以及调试脚本的一个基本的简介啊,谢谢大家。


这个视频我们一起来制作暂停的菜单和我们的主菜单。首先我们去到我们的 h u d 的这个场景,在 h u d 里中我们可以打开,在这里看到我们有一个 pose menu, 我们可以启用这个 pose menu。 我们希望通过键盘上的按键来启动和关闭它,并且通过点按这里面每一个按钮来实现不同的功能。那么我们来选中我们的 hud 的这个 game update。 我们在 hud 上面来创建一个 state 模式来有两个不同的状态切换,我们选择内嵌的方式。在这里我们有一个 start, 我们把它改名叫做 playing。 然后我们也创建另外一个状态,我们按住键盘上的 ctrl 键,麦克系统按住 ctrl 键拖拽。我们选择另外一个状态,把它改名叫做 pose。 同样我们也为他添加一个转换。我们现在有两个不同的状态,当我们暂停游戏的时候,我希望整个游戏都停, 停止。所以我们先来设置一下这个状态,我们不需要 update 和退出,我们将它删除。当进入这个状态的时候,我希望这个时间可以被暂停。所以我们在这里添加一个 set time skill。 我们将 timeskill 设置为零,那么整个游戏就会被停止了。同时当游戏被停止的时候,我希望 pose manu 的这个 game object 可以 set active 处,这样他就可以显示出来了。所以我们在这里添加一个节点,找到 game object set active。 然后我们将流程连接上这里边。你想设置哪一个物体呢?我们将 pose menu to drive, 然后将它的值设置为处。 这样暂停的方式我们已经设置好了。我们再来看看我们在 play 的时候,同样我们不需要下面两个方法。其实回到 play 的时候刚好跟我们暂停的时候是相反的,我们可以去到暂停当中,将这些所有的流程复制过来,在我们的 play in 这里边 将它粘贴过来。反向的我们要将时间设置为一,这样游戏就会恢复原来的速度,如果你输零点五,就代表他以一半的速度来运行。同时我们要将这个 menu 设置为 force, 将它关闭好。我们来看一下这个两个状态的切换,我们从正在游戏的过程当中如何切换到暂停呢?我希望按下键盘上的 esc 键, 我进入到这个状态里边,我来判断键盘上是否按下某个按键。请大家留意,我们在获得按键的时候有几种方法。我们之前使用的就是 get button input, 这里边的 button 我们要使用我们的 input manager 里边的那些名字。如果我想使用键盘上具体的每一个名字的话,我要使用 on keyboard, 这时候我们可以看到 on keyboard input。 然后我们就可以在 key 的这个变量里边去获得你想要按下的按键。这里我们直接找到 escape, 这就是 esc 一键。然后当这个键被按下的时候,我们进入到这个状态,我们可以看到当我按下 esc, 我启动 pose menu。 但是当我从暂停的这个菜单如何返回到游戏呢?我当然同样可以按下 esc, 同时我希望按一下我们的 resume 这个按钮,所以我们来写一下这个方法如何从 pos 转换成 play。 首先我们还是获得刚才的 keyboard, 另外一种方法就是获得我的按钮的按键,可以留意到我们打开我们的 pose menu, 在这里边我们有 buttons, 里边有 resume button, menu button 和 quid button。 我们找到 resume button。 其实在这个 button 里边,我们是有一个 invent 的, 每次当我们点按的时候会触发这个事件,所以我们可以用这样的方法来把这个事件添加到我这个流程当中。所以我可以在这里添加一个节点,我们就用 on button clicked, 这就是一个 g u i 的事件。那你想按下的按键是什么呢? 我们将 region button 拖拽过来,当你按下这个按键之后,这个 button 按钮触发,我同样可以返回到我之前的 playing 的状态。这样的话我们这个流程就做好了。我们保存我们的 hud, 我们返回到 level 一,我们点击 play 来试一试。为了看得清楚,我将人物跳跃在空中,然后我们点击一下 ese, 这是我看见我的场景被暂停了,然后我弹出了这个菜单,我再次按下 ese 就可以返回游戏了。同样我在跳跃过程中按 ese 之后,在这里点按 regim, 同样可以返回游戏。那么接下来我们来制作 hud 当中另外两个按键的方法。 我返回到 hud 当中,我们来看一下在我的 pose menu 当中,我除了有 rejoin 吧台以外,还有 menu 和 quit。 点击 menu, 我希望返回到我的主菜单,点击 quit, 我希望退出我的游戏。我们同样为他们两个来添加 flow 模式,这里我选择 内嵌的方式,那么 menu button 就是。当这个按钮被按下,我们同样使用 on button click, 这里我们就不用更改了,就选择 self, 因为它就是这个按钮。然后我们要添加一个场景,就是 menu 的场景,然后我们进行跳转。 这里面我们添加 load scene, 它的名字就是 menu。 为了要使用这样的方式进行跳转,你要确保在你的 bill settings 当中已经添加好了你所有的场景,这样他才能在这里边找到 menu 来进行跳转。好,这样的话,这个按钮我们已经做好了。另外在 quit 这个按钮上,我们也同样添加一个 flow machine。 同样是内嵌的方法一样,当这个按钮被按下的时候,我们直接选择退出游戏。这里边我们直接找到 applications, 在 application 当中我们找到 quit。 其实这个方法呢,在 unity 的 editor 里边是没有办 办法测试的。这个只有当你的游戏打包出来,生成一个真实的可执行文件时候,他才会退出那个软件,退出那个游戏,所以我们把它放在这就可以了,保存你的 hud。 接下来我们来制作一下我们的 menu 的菜单, 找到我们的 menu 的场景。它的场景当中有一二三四这四个关卡。我们可以看到在我的 comments 里边包含我们的 panel。 在 panel 里边我们有这个 buttons, 里面有四个 button, 可以看到它们都是 prefab, 所以我们找到 prefabs。 在这里边我们可以找到我们的 menu level button。 我们希望这四个按钮可以检测他当前这一个关卡是否被激活了。还记得吗?我们之前在 save 的 virubles 里面,我们会保存哪一个关卡已经被解锁了,我希望只有被解锁的那个关卡是亮着的,其他的没有被解锁的呢,是灰色的,也就是说它是不可被点按的。如何实现不可被点按呢?我们选 选择 level 四,然后这里边我找到 button 的这个组件 button, 这里边有一个选项叫做 interactable, 在这里边我们把它取消勾选它就是不可被点按的, 勾选上它就可以被点按,所以我们就利用更改这个组件里边的这个变量,配合我们的这个 saved variables 来实现这个方法。那我们怎么做呢?我们首先找到 menu level button, 我希望所有的更改都是应用在所有的 prefive 上,所以我直接选择这个 prefive, 选出我们的 prefive, 我们来为他添加这个 flow machine, 然后我们为他创建一个新的红命名,就叫做 menu level button。 我希望在我每次按一下某一个按键的时候,他可以加载对应的关卡,所以加载场景的时候,我们会调用场景的名字,我要为他添加一个 object variables, 起名字就叫做 scene, 他是一个字符串的类 类型。这样的话我这个 prefib 的更改会应用在所有的场景当中的物体,我可以将 level 一的这个按钮,把它的这个变量改成 level 一,第二个按钮我们就改成 level 二,以此类推,我们更改所有的按钮。 然后接下来我们来调整一下这个流程。首先我先用这两个方法先删除,我们最基本的就是按下按键加载场景,我们先实现这个功能,我们同样使用 on button click, 然后在这里面我们就是点按自己,然后我要加载场景,我们输入 low the thing, 直接使用加载场景的名字,你的名字呢?就是你之前要使用的这个变量,我们直接将这个变量拖拽出来,然后将这个值给到这个名字,这样我们就完成了场景的加载,我将它重组, 然后接下来我要测试检测一下当前这个关卡是否被解锁。我们要调用的就是 save the variable, 但是我希望在默认 的情况下,第一关是始终可以点按的,这样我们始终可以进入到第一关,那么我们在 save the variable 这里边,我们添加一个您一手的 variable, 也就是它的初始的默认的值。我们之前设置的统一的命名方式就是 level 的数字加上下横线 unlocked, 所以在这里面我们直接输入 level e unlocked, 同样它是一个布尔值,我们默认将它设置为处好,这是一个默认的初始的变量。然后我们要实现的方法就是设置一下这个 button 的组件的 interactable, 然后它是否可以被激活。那么我们添加一个 update 的方法,每一针来检测一下它是否可以被激活。我们添加另外一个节点 来设置一下这个 button, 所以我们选择这个 button, 然后在 button 当中我们可以找到这个选项 set interactable, 然后我们将这个流程连上。至于怎样判断这个按钮是否可以被点按, 我们要判断在他的 save 的 variable 里边对应的这个数值下边是否是处。如果第一关是处,那么第一关是可以亮起,第二关不是处,那么第二关是不可以被进行点按的。 我们来获得哪一关被启用了呢?我们要在这个 saved viables 里边去找是否有这个变量,所以我们先来添加这个节点,找到 viables, 然后选择 saved。 这里边我们看到一个选项叫做 save has variable, 看看你的保存里边是否有某一个变量值,我们可以用它来进行判断。 你是否有哪一个名字的变量呢?我们的名字的构成刚好是场景加数字,加上下横线 unlock, 所以我可以设置一个字符串的类型,将两个部分合成在一起。之前我们也做过,所以我先获得这个 object variable, 它刚好里面包含我当前的这个名字,我们选择 object get, 然后这里边我们选择 sing, 我们有了场景的名字,接下来我们需要一个下横线,将他们两个连接在一起,所以在这里边我添加一个 concate, 可以找到这里边有两个参数的连接的字符串的方法。第二个部分,我们直接添加一个 string 类型,在这里面输入下横线 unlocked, 然后我们将这个输出的值给到我们的 has variable, 这样的话我们就可以判断他是否有这个变量了。光判断有这个变量还不行,如果有这个变量,比如说我已经有了一个 level to unlock, 可是它里边的值是 false, 那么我们同样不应该启用他的可点开方式,所以我同样先判断有这个变量,而且要获得这个变量里边的这个值来确定他们两个都是处的时候,我们才可以启用他。那我们同样再添加一个节点,选择 variables saved, 这个时候我们来获得它的这个值, 要获得对应的这个名字的里面的变量的值,这两个变量的值同为处的时候,我才可以将它设置为处,那么我们将他们两个做一个同时的判断,所以我们选择和的方式。这里面我们直接输入 and 按的是同时判断两个条件是否成立,所以两个条件有一个不成立,那么他得到的值都是 false, 所以我们可以将这个值直接输出过来。如果两个值都是处,那么直接他就是可以被点按的,如果两个值有任何一个值是 false, 他都不会被启用。点按的方式,我们保存一下当前的场景,然后点击 play 来看一下, 可以看到我的第一关第二关是被启用的,可是第三第四关是没有被启用的。同时如果我们修改一下第二关的参数,比如说在 level two 这里面,我们取消这个勾选,可以看到他的可点按方式就会被取消了,再次勾选又会被启动了,现在我们就实现了这个方, 不过我们还需要实现另外一个方法,就是当我点击这个 new game, 所有你已经启动的关卡都变成 force, 只保留第一个,那么我们一起来实现一下这个效果。我们选中我们的 new game 的这个按钮,然后为他添加一个 follow machine, 选择内嵌的方式,我们同样用按键的试键来判断。 当我们按下新游戏的时候,要确保第一关是被 set true 的,所以我们要获得这个 saved variable。 第一关将它设置为处,那么拖拽出来选择 variable, saved variable, 选择 set, 这里面直接可以看到 set level 一 unlocked, 然后我们将这个值直接设置为处,添加布尔值, 这是一个默认的情况,然后我们也要将其他的上面的这些按钮都设置为不可被点按的。这里我用一个负循环来执行重复的操作,我添加 一个 folo, 在 folo 当中我们可以看一下你要设置循环从第几个数字开始,到第几个之前要结束。巴迪这个部分就是每一次循环我们要执行的内容, index 就是它的编号,所以我们留意看 它的名字,它的变量的名字都是通过我的关卡后边加上一个数字,这个数字我们就可以用这个编号来替代了,加上下横线 unlock, 然后每一次循环将所有的第二到第四个关卡都设置为 false 就可以了,所以我们一起来做一下,那么我们至少要执行的这个八点的流程就是将这个变量值设置为 false, 所以我们先将这个最终的目标设置好, 我们要将对应的变量,我们会循环每一次一会改变这个变量的名字,最终他们都会设置为 force 的状态,然后我们来更改一下这里的名字,所以名字的话是从 level 二开始的,那么 第一个循环的量我们要用到 index, 我们就将它设置为二,那么第二关,第三关,第四关我们会循环三次,那么最后一个数字就是五,在这个执行的过程当中,我们会由他这个序号来加上我们的 level, 以 以及后边加上我们的 unlock, 所以我们直接用字符串将三个部分组合在一起,所以在这里边我们直接搜索 concate, 然后这次我们选择三个变量值, 那么第一个变量值我们直接输入 level, 第二个变量值就是我们的 index, 最后一个变量值就是我们的 unlock, 别忘记还有下横线, 然后我们将这个值输出给到我们最终的变量的名字。现在我们就通过循环的方式,将第一关以外的所有的关卡对应的这个变量值都设置为 false 了,这样的话同时在 update 里检测的时候,他就是不可被点按的。好,我们点击 类来运行一下试一试。先保存你当前的关卡,我们点击 new game, 可以看到全都熄灭了,然后我们进入到第一关,通过到第二关的之后,我选择返回到我们的 main menu, 这时候你会发现第二关已经被激活了,这时候我们就实现了我们的跳转关卡以及关卡激活的方法了。好,最后我们还是需要有一个 quit button, 在这 quit button 我们同样可以添加一个 follow machine, 这样的话它可以退出这个游戏。刚才的设置方法是完全一样的,我们直接选择内嵌,然后用按键激活的方式来激活它, 直接 application quit。 好的,这样的话我们就完成好了这个整个的游戏了,大家可以花一点时间来理清这个头绪,希望你已经通过这个游戏的制作初步了解了 bot 的使用方式,其实 bot 还有很多特别有意思的方法,例如,可能很多小伙伴们很想知道如何 使用我们的 boat, 配合我们的 csap 代码的脚本,它的使用方法呢?是找到你屏幕最上面的菜单里有一个 tools, 在里边找到 boat, boat 当中有一个选项叫做 update unit options, 通过这个可以把你挂载在同一个物体上面的代码脚本升级到我们的 boat 可视化节点的模块。 比如我当前的 player 身上挂载了一个 test 的一个脚本,所以当我升级了之后,我可以在我的福乐模式当中直接按鼠标右键找到 player。 现在我就可以在这里边直接看到我的代码了,并且在这里可以找到我自己写的函数的方法,比如说 michael 的方法,现在我就可以使用它了。 更多的使用方法请大家查看 bot 的使用手册好了,希望你喜欢这个系列的教程,我是麦口。那我们下个系列教程再见吧,拜拜。


书接上回一宁神殿如何回挡?其实特别简单,就是这串文件夹路径。不管你的一宁神殿是安装在哪,回挡的数据文件夹就在 c 盘,首先是 c 盘,然后找到 us。 有些人这个文件夹是中文,那么就是用户这个文件夹。下一集 angelastchat, 这个文件夹就是你自己电脑的用户名,有的人是默认,有的人改过了,找一下就行。下一集 fdat, 下一集 logle, 最后一集 anget, 就是把此文件夹整个复制出去,做一个拷贝,想要回档,直接粘贴回去替换就 ok, 本人亲测有用。这里有两个注意事项,第一个,有些人可能找不到文件夹路径,那是因为你的系统被 隐藏文件夹了,如何找到你的隐藏文件夹,请搜索某度,这里不再拘束。第二个注意事项,复制存档和 粘贴回文件夹必须是退出游戏。同样的原理,只要你拿到别人这个文件夹,粘贴回你自己的 c 盘,就可以完美复制出他的整个服务器建筑。我是贾微笑,点赞、收藏、关注,下期将跟你分享怎么样开启全部地图。
