嗨,大家好,我是大海,今天给大家分享一个模型切割的功能,我们先来看一下它的效果, 插件里面有很多模型,我们可以通过滑动鼠标,然后把模型不断的做这个分割 好,这样可以任意的去给它切割开。然后这个功能,呃,不是我写的啊,这个功能是在 get hobb 上面,大家可以需要的可以去到这个地址去下载。 我今天只是说根据他这个项目,然后看了一下他里面的算法,然后我想把这个算法就说实现的一个思路给大家分析一下, 然后大家可以去下载他的一个原码来对照,对照着看。好,那我们现在先来看一下他的思路,他的思路呢?呃,总的就分为三步。呃,第一步呢,就说我们要切割一个模型啊,呃,他会有个切面, 然后第一步的话就是说我们要先构建这个切面,构建这个切面怎样构建呢?刚才我们运行起来,我们是这样去切,按下鼠标和松开鼠标的时候,其实有两个点,有两个点, 然后比如说, 就比如说这个,如果我们的一个点在这里,然后我们这样去 去,我,我们不这样看,这样在场景里面走走,不对, 假设我们的是这样切的,然后其实点在这里,结束点在这里,然后我们的里面不是 vacator 三点火 word, 它不是有一条项链是向前的吗?就往屏幕里面的, 然后我们通过这个是开始位置,这里是开始位置,然后这里是结束位置,然后这一条项链,然后再点成, 点成的话,你就能够知道这个切面的一个发现量,这这个就发现了,你知道这个 发销量的话,你就可以构建出这个平面,因为构建这个 plan 它只需要发销量和一个平面类的一个点,这样的话我们通过这两个销量就能够知道这个 plan 的, 他的一个发香料,然后我们也就知道这个面片他是这样去切的,这是第一点。第二点呢就是我们切完以后, 切完以后他的模型啊会变成两部分,就是切面以上是一个部分,切面下面是一个部分, 然后会生成两个网格,生成网格以后由于这有切面,所以我们要 计算出每一个漆面的这个点,计算出漆面的点以后,然后再把它给缝合, 然后这是第二步。第三步呢就是说你只是把,比如说你只是把这里,你把这这里哎这样给他缝上了, 但是还有底部就这个切面中间镂空的。所以第三步的话,他是要把封口,就要把要要把口给封上,口那里都有这些边了,其实你就把这些边,然后 以一个点为基准,然后就每一条这个边你都给,他就说连成一个三角形就能够把底部给封杀。好了,我们第一步就说这个 面片我们已经会算了。第二步呢就是说去分割,分割呢我们就要把整体的这个模型啊,他的一个顶点和他的一个三角形我们是知道的,以及他的顶点 uv, 然后顶点的一个发线, 那么这个时候我们就需要判断判断模型上的足够顶点,每一个顶点我们都要去要去判断判断,如果这个顶点 我们计算顶点到这个平面的距离,如果顶点到平面的距离是大于零的,说明他是在这个切面的上面,所以我们就把它给放到第一个卖鞋的 集合里面去,就说我们会会构成两个麦系,然后这上面是麦系一,这上下面是是麦系二,然后我们的点如果是在平面之上的,我们就先把它放到这里面去,在下面的我们放到第二个麦系里面去。 好,放进去以后我们就要来做做这个切割, 判断这个切,其实我们只需要判断当前的这个切面,当前的切面和哪一个三角形相切就行,就说所以我们只需要判断这个三角形 到底有没有被这个切面所切开。呃,他怎样去 去判断呢?就是第一步我们已经把这个点给给分好了,分好了,所以第二步我们来怎样判断我们每一个三角形?就上面这些三角线你也不知道他不知道他有没有,呃,被 就说被分割,对吧?然后我们都要去遍地所有的三角形,遍地三角形我们可以通过这个三角形啊 去拿到这些他的。比如说我们以这个三角形为例,他的三个顶点其实我们是知道的, 我们知道他的三个点点,并且之前我们已经把这个模型的点点一分为二了,所以我们只需要判断这三个点。比如说如果存在一个 点 s 在上面这个集合,然后有一部分点是在下面这个集合,说明这个三角形肯定是被分割了,被分割了我们就需要 构建新的三角形,比如说这个我们就要构建被分割了,好,我们就要计算这一个点和这一个点,然后我们现在这两个点怎样计算?因为三角形, 呃, unit 里面三角形存的是缩影,所以我们可以通过这个顶点的三角形的这个缩影啊,去找到它的这个顶点坐标。 you 顶点坐标以后,然后一和二,比如说是顶点坐标,两个坐标点, 比如说二减一,就能够得到这一条项量,得到这一条项量以后,我们把一作为原点, 然后呢一二为方向,往这个平面上发一条射线, 半条射线我们就能够算出他和这个平面的焦点,我们就能够知道这个焦点,知道焦点以后我们就能把这一点,这一点就求出来了 啊。我们知道距离不是焦点,我们知道他的距离,知道距离,并且知道一二这条项链,并且知道远点,我们就知道能够求出这一点的坐标以及这一点的坐标 啊,我们通过一三发一条射线打在这里,然后我们就知道,哎,就知道这一这一段的距离,知道一段的距离,并且我们知道这个方向向量,然后圆点加上方向向量 的单位销量,然后再乘上这个长度,我们就知道这两点,那么现在已经知道这两点了,知道这两点 我们就要,就需要呃,需要去勾三角形,所以我们切开以后,我们会发现我们三角形啊,会新增, 就比如说你看,呃,这里会构成,这里会构成一个新的三角形, 这个优点啊,实际上这个 z 点会构成一个三角形, 好,这样的话我们就需要把这个三角形呢两个顶点,这是新增的两个顶点,然后给添加到上面上面这一部分的顶点集合里面去新增两个点,并且呢新增一个 三角形,但三角形原始的三角形的这个点点已经在了,所以我们要增加三角形的 这两个的锁引,这两个的锁引,然后下面一样的下面我们知道这一个点以后,其实他也能,就说也能 go 成这样,这样的话就是说上面会构成一个三角形,然后下面其实他会构成两个三角形, 好,下面构成两个三角形。 呃,这,呃这样的,这样的好,然后这两个三角形呢,你去判断它是属于上一部分还是属于下一部分属于下一部分呢? 你就给他添加进去,这样的话就上面会新增一个三角形,然后下面呢会新增两个三角形, 并且增加两个点点,这样的话我们有点点有三角形 三角形,所以有,然后他的一个 u v, 他的 u v 呢?我们其实就用叉子就可以啊。我们先先把这个三角形,我们只要计算当前的分割的这两点的 u v, 由于我们知道二的这一个顶点的 u v 坐标,然后我们也知道这一的这一点的这个 u v 坐标, 那么它的 u v 呢?我们就直接可以通过,就说通过它两个的在这一条线上的差值,因为它们这一段不一样,所以我们直接做一个 uv 的一个差值,就能够得到这一点的一个呃 uv 坐标, 然后他的发项,呃发项量呢?他的发项量其实和这个三角形啊,你知道三角形的话,你就 知道三个点的坐标,其实你就能够求到他的发销量,因为在这一个三角形里面的这些点, 就说这两个点他的发现量其实就是这个三角形的啊发现量,所以我们就这样的话,发现量也有,因为坐标也有顶点也有三角形,所以也有这样的话,他就能够把这个三角形呢给他给构建出来, 勾建出来,然后最后一步就是封口,封口呢,其实也开始了。呃,开始我也 说了,就说我们已经知道 c 这样的切边,你知道这个切边以后,其实你就可以把 所有的这个三条边给他依次这样勾勾建出来,勾建出来其实你就能够把这个封口给封上 他代码里面,他代码里面我大概带大家来一起看一下, 我看下他这个在哪?这个他这个脚本是 找这个切面的,就是找开始点 stat 和 in 的, 然后找到以后,找到其实就是一个屏幕上的点,这两个点,然后找到以后他会去调这个方法,这个方法呢 他在这里面有监听,你看,呃,监听到这个鼠标松开的时候,其实我们就知道鼠标的按下的时候的点,松开时候的点以及当前的这个深度。 然后你看就刚才我说的点成,然后算出他的一个法项量,有法项量,然后有开始点,结束点,然后他就可以通过法 像量和这个就能够知道它的一个旋转,知道旋转呢,它就能够设置这个平面,然后这个它当然是创建一个可视的平面啊,然后接下来它就开始去分割,分割呢? 开始点以及法线有法线有点,然后他的平面他是在这里去,他是在这里去构建的,你看他定义哪一个平面?呃,平面呢? 他的这个平面啊,他是给他转到这个模型的一个本地坐标的,因为我们后面无论你比较这个点,我们在卖 里面拿到的顶点,他都是本地坐标的,所以我们的这个切面,他的发线以及他的点,他都需要去给他转成当前模型的这个本地坐标, 这个是带切割的模型,转成本地坐标的一个法线点也是一样的。你看它是要把世界坐标,因为刚才我们的那个是 dot 和 normal, 它是世界空间下的,然后它需要转成本地坐标, 转成本地坐标,然后就得到一个切面,得到切面模型,然后这两个就是刚才我说的他会 印记,呃,两个集合,第两个集合好,然后现在来判断。 呃呃,这个不,刚才说两个集合,这个是,这个是切开以后的模型,因为这两个集合里面我先给大家看一下,这 这两个结合里面放的是这个是我们这样切拿以后,这上面一部分和下面一部分,就是我们这样去切拿以后他去分的看, 呃,一边一部分,因为他要拿到这两个结合,然后这样做给他给,比如说我,我这样对切,然后一个 往这边,然后一些往这边来,这样去做,所以它的是两个集合。刚才我说错了,这个还不是定义两个卖一起,这个只是说把当前所有的模型啊,根据当前这个期限做一个。呃,切分 好了,现在就开始来切了,这个是平面,这个是模型, 然后他判断 判断,哎,就说网格,网格已经找到了,就当前的网格,然后去切 七呢,他就要先获取到,你看拿到所有的点,所有的三角形,所有的法线、 u v 全部都先获取到,获取到以后,这个,其实这两个就是是刚才我说 两个脉系,两个好,都先把它给清空掉,然后就开始判断了。这一步就是我刚才说的,如果他的顶点 大于零,那么就归为上一个,你看就把这个顶点加进去, 但如果是小于零呢?好,先给它归为下一个,这样的话,添加的时候点点 normal 就点点发现和 u v 都添加进去了, 然后他是所有的顶点先给拆分,拆分开以后呢,我们判断一下,你看啊,我们的顶点已经放到这两个脉性里面去了,所以 判断如果有其中一个,这个顶点数为零啊,说明呢,我们画的这条线啊,就是没有穿过这个模型,因为你至少 每一个模型,一个,每一个这个脉行里面都要有这个顶点,然后他才会被切分,这样的话就说他没有被切分,没有被切分就直接返回。 好,这一步的话,就刚才说的关键的先分顶点,分完顶点,然后他就开始去编立三角形了, 好便利。三角形,然后三角形呢?呃,还有两个集合啊,还有两个集合,然后我们把原始的 点点、 u v 这些传过去,然后 i i 就是三角形的,呃,当前的这个,呃锁引啊,三角形的一个锁引好,然后我们进去看一下它是怎样呃切的, 然后他先把三角形,你看三角形不是有三个顶点吗?他先把三个顶点都放在里面,然后 u v 也放在里面, 哦,顶点放在里面, uv 放在里面,相当于顶点 uv, 哦,顶点哦。三角形锁引,然后顶点,然后 uv 都放这里面,这是一个三角形的,然后它 就去判断,判断当前的顶点是否都在当前的一个网格上, 这个呢?是呃,三角形这个呢是开始的缩影,所以他用这一个,你看这个就是 tamp max, 然后他进去看他怎样判断呢?如果当前的这个结合 这个集合包含了三角形的一个缩影,如果这个集合包含三角形的缩影,那么也就是说当前的三角形的这个呃顶点是在当前的这个 这一部分网格里面,那么这一个在什么时候呃去实现的呢?其实就这里, 在哪里?在这里,嗯,就是在上面我们去分的时候,你看我们分顶点的时候, 我们就拿到它的一个顶点的数量,其实顶点的这个 conte 啊,就是当前的这么一个缩影, 这个所以好,所以他在这里的时候 他就去判断,因为这个三角形,这是三角形,所以然后取这个三角形啊,这里面的这个就是他的一个顶点的一个,所以所以我们要判断,哎当前 的这个三角形的这一一个顶点是否是在这一部分脉行里面,如果包含就占,如果不包含就不占, 这就又和刚前刚才那个呃说的是一样的,就说你看这个他会从这里面吗?他是一个不二类型的数组,所以就三个,也就是 也就是刚才我说的,哎,比如说你一个三角形是这样, 那么我们,呃,比如说如果他没有,没有,如果他没有被拆分,没有被切割, 那么他的这一个顶点,然后这一个顶点,这一个顶点,哎都在上半部分,说明他们都为一,一一都为为真,对吧?所以这里判断的时候,你看如果第零个和第一个,第零、第一,然后一和二他们都是相等的,都等于一, 说明没有被切割。那如果是这这一种呢?大家会会看到,然后这一个点是在上部分,所以他为一,对吧?然后这一个点呢是在下一部分,没在上一部分,所以针对于上一部分来说他为零, 所以你看他不满足,这一个不满足呢,他肯定就被拆分了。所以当没有在的时候, 如果没有在的时候,我们就直接添加这个三角形,因为他没有被 切分吗?没有被切分的话,我们直接把当前这个呃三角形啊,就给他呃加,加入就加入。比如说上一半部分,他在上一半部分,我们就加上一半部分,在下部分,我们就添加在下部分。 好,然后这里呢是判断有没有相交,然后下面呢?这里肯定相交呢? 相加以后呢?他不是会拆成两个点吗?这两个就是生成,你看两个新的这个新的点,然后在这里 它是怎样生成的?开始点、结束点,就像我刚才说的一样,你看先构建一个这个射线圆点,就等于第一个点方向,就等于第二个点减第一个点,然后呢距离, 距离呢?就是这两个点的距离,这个两个点之间的我还是来个图吧。其实就是 然后它这样被切了,然后这里就是 falst, 然后这里就是 in 的,然后它的距距离呢?是这里,然后这一点怎样求呢?大家会看到这里,因为这里这里是一个平面啊, 这里是一个平面啊,然后你被切拿的,被切拿的话, 哈哈。这一点平面你看发一条射线, 就一条射线打在平面上的一个距离,然后他是这样去发展,你看射线顶点 原点方向发必然会打在这里,所以我们就知道这个距离,呃,知道距离以后, 知道距离以后你不就知道他的点了?你看通过这个射线获取到射线上的一个点,距离呢?就有这个。这样的话点有了 点放在这里。 u v 呢?就刚才说的直接差值,直接差值第一个点的 u v 和第二个点的这个 u v 呢? x 做 x 的差值, y 做 y 的差值, 然后就能够得到了,得到两个点,得到哪两个点呢?这里就说他把点加进去,同样判断当前的这个点呢,是在上面还是下部分,他决定你的三角 是添加到上一部分还是下一部分好添加以后呢?就是这样的话点有了,点有了,然后他回到回到最初的, 呃,如果说没有包含,没有包含呢?呃, 我看啊,如果没有包含,呃,他是,呃这上面这这上面这个,不管这上面这个,他还是算那个距离的好。然后 这样的话我们可以我们已经通过这个把它的这个网格已经拆分了,拆分了以后 这个的话就这个的意思就说没有没有被切啊,被切以后他会走下面,没有被切的话,他就直接把这个模型,直接把这个模型判断一下这个模型是在切面的上部分还是下部分, 然后直接就就就直接把它给分开啊?放到刚才我们说说的这个圈子缝膜结合,因为他后面他为了就是说切开以后往两边去扩散,所以他把算拿一下这个模型到底是在上面还是在下面, 如果被切割,被切割以后,你看这里就开始生成模型啊, 他这个叫替换模型,因为他要把原来的模型替换,然后再生成个新的模型。好, 然后我们把它的这些数据啊设置进去点三角形、法线、 u v 都有,有了以后呢,这个是 这个是有的,然后 然后这个呢就能够把模型生成。哎,这个是最终的等会,等会,刚才的还没有,代码还没有看完,我说为啥不对 哦,他在这里先分分呢,这里呢是新增的三角形,他已经加进去了, 他加减,呃,他加进去呢,但是呢就说我们的这个这个漆面还还没封口,我们只是找到这个漆面上的, 我们只是找到这个切面上的这个,他的一个就说一段一段的这个,呃这个边,但是呢他底部还是镂空的,所以呢他在这里, 他是在这里去风的口,呃风口呢,他就先排序, 排序,排序,因为你通过这个三角形便利的这一堆点,比如说原本他是这些三角面,这样这样这样这样 这样这样这样他是无序的,所以你要判断这一个,呃为头,这个为尾,然后下一个要找到这一个,因为你存在这个集合里面的,他不一定是这个边啊,他可能是这个边,然后就说他要先把所有的这个边先找到, 找到以后呢给他排一下序,排完序以后呢,他在这里 这里就依次把新增的这个点又给加进去,加进去呢才到刚才看的那里他才会去构建网格。 好的,那今天的这个核心的一个实现思路呢?我也带大家看了一下,然后大家有问题呢,可以在评论区我们大家一起去讨论。
粉丝44获赞245

今天突然想做个游戏,英雄联盟节奏大师,废话不多说,我们直接开始打开油泥 t, 把我搞来的 ez 直接倒入,瞧这炫酷的姿势。接着搞个地面 放大后直接把贴图贴上 ok 了,然后整个题目来挨打,直接拖进来放大,太大了,搞笑点不止四个,出来弄几条华丽的分割线, 然后再弄个小兵来挨打,还是个远层小兵火箭来复制一下, 既然是节奏打湿,就要对音乐重点奏响,然后就是最激动的鞋带码,缓解 手速,直接拉麻 好了,点击运行先看看效果,小兵正在按音乐节奏生成。 好了,接下来就该控制我们的一贼了,先弄个技能篮去挑头像啥的都搞上 好了,试试技能, ok, 游戏做好了,咱们直接运行, 最精美的界面是我做的无疑了,咱们直接开始娴熟的走位和技能释放, 小兵来了,跟着音乐走, 单管直接快进到最激烈的关节,购买自动小回合大枣, 是时候来依法搭档了!




好,同学们,上节课我们给大家啊介绍了这个最后一步在玛雅里面 啊,这个对模型进行剪面这部分的工作啊,这个流程,然后在这一整套流程啊,我们之前啊把这个模型建好了,然后他们的 uv 呢啊分完了,彩纸啊,贴图都已经附加上了。然后如果这个面 说呢,检查没有什么问题,那在我们这个玛雅的三 d 模型制作部分呢,啊,我们这一部分的流程啊,就已经结束了啊,下一步呢就是怎么能把这个我们在玛雅里面建的这种三 d 资源呢 导出,嗯,然后再导入到这个引擎里面,完成我们后续在引擎之中的呃,这部分那个工作 啊。首先我们介绍一下啊,这个嗯,在玛雅导出的时候,导出到引擎了以后呢,他有每个资源,有自己对应的这个文件夹啊,这个叫这个目录, 我们一般也是有自己的这个,嗯,怎么说有自己的这个规则的,有明明规则的。首先我们进到这个那个 引擎里面啊,默认的话应该是一个这种空的场景,在左侧这个大钢栏里面啊,在这个 ss 这个总目录上面,我们右键啊有一个这个创建,创建我们选择第一个这个文件夹, 这个文件夹建好了以后呢,啊,这个我们就当做是我们这个工程,嗯,总的这个目录也就是我们这个项目的命名,这个命名呢,要假设我们这个项目就是教学,那就是教学 好有一个这个总的这个目录建好了以后,下面应该啊,这个子目录应该怎么分呢?啊,就按照这个资源的种类,我们可以分成 这几种,嗯, ctrl d 是复制加粘贴啊,瞬间粘贴出来一个是文件 f 二呢是改它这个呃名字。 首先我们要有一个放这个静态模型的这个呃文件夹啊,一般我们叫 mass m e s h mass, 你也可以叫他 model 啊,这个只有两种叫法。嗯,这两种呢,一般在引擎里面啊,看见这两个文件夹啊,就是存放模型的这个意思。在这个文件夹啊下面我们用一个文档来说, 在这个啊 mash 或者是 models 的文件夹下面放的全都是模型。 然后这里边的模型呢,我们要是再细分呢,又可以分为两种,呃,一种是静态模型啊,一种是那个呃动态模型。静态模型呢,就是 static mesh, 这个是静态模型。然后动态模型是什么呢?动态模型一般就是有动画的啊,我们一般就是 animation 的, 是这两个嗯,也有的嗯,就是工程呢,是把这个动画是单独 单独立,怎么一个文件夹,这样其实也是可以的,因为嗯,这种的 animation 类的呃模型呢,一般都是动画组最后处理。而 match 类的呢,是这个模 模型师,模型师做完了以后,可以直接导到这个文件夹里边。然后动画类的是那个模型师做完的这个决策动画或者是需要做动画这种静态模型要首先发到这个 动画组,动画组最后绑骨骼啊,蒙皮啊,权重这一类全弄完了以后,包含着他们的动画文件,他们在做导出。所以这个流程呢,是模型给动画动画再导到这个文件夹里边来啊,这样分开也是也是可以的。 然后有了这个呃 max 有了这个文件夹还要有什么?就是存放他这个彩石球的文件夹。 my tear, 这个是存放材质球的。然后有材质球呢,就有这个贴图了。


这是我新研究的角色控制系统,是用 u v s, 也就是 unit 版的蓝图,通过键盘、鼠标、手柄、触屏指挥角色行走, 可自由切换玩家控制以及 ai 控制两种模式。这样在游戏中,比如分支剧情需要操控 npc 的情况时,就可以同一份程序来简单切换了。与绝大部分教程不一样的是,我的控制核心是用 scriptable object 写的, 搭配 u s, 那简直就是 u s 的隐藏外挂,不光我 s o 方面的技术提高了, u s 的技术 也同样累加。接下来你会看到我这一个月是怎么阴差阳错的把 so us 统合,怎么把布鞋代码和鞋代码混搭使用的,这是我朱嬷嬷才有的技巧分享。 我之所以说我阴差阳错的升了级,因为这起源于一个 ar 的问题。 其实我在做完上次视频后,本想只是继续研究升级 ar 的第二篇章图片追踪扫描的, 恰逢 unit 公司向开发者道歉后给出了新的价格,系统可以说是相当不错了,我也放下心可以继续无障碍的使用 unit。 哈哈哈,我的确看了下 good out 的 ai, 一言以毙之。 ai 方面它和 unit 比就是十足的垃圾,至少现在是 连官方主页给的寒酸的例子都没分清楚。 arxr, 这与 unit 已经很成熟的 arvr 相比,只能说继续努力吧。对于我这种二 d 三 d 游戏 air 都做,且可以完全自己一个人全包的情况, unit 就是最好的选择,起码我的 service 跑得动。 unit unreal 连基础场景都无法正常显示。 ar 的图片扫描算是基础功能,但是就像平面扫描一样,你看到的绝大部分教程都是放物体就完事了,我当初也是这样,跟着教程可以把物体放进场景,但是如何让角色飒爽登场,如何加入互动,这显然不是当初的我玩的转的。 现在我当然可以任意的耍,而且是用 u v s 状态机对应 ar 的实现过程。为了让 ar 里面的小伙伴在图片上跑动而不掉下平面,必须得想办法检测地面。关于地面检测方法就很多了, request, 射线、 球体等等。因为 ar 检测出的平面是实时的,不能百分百稳定,导致角色还是偶尔会掉入悬崖。我设置了防掉入功能,大多数情况他们到达边界后会被弹回来,真的掉进无底洞的话会在五秒后自动销毁。 别闹,你们永远会在我的心里。突然我灵光一闪,既然耐我妹是癌症,可以确保人物在指定范围内移动,绝对不会脱离区域掉入悬崖。那么我找一个方法通过 agent 来控制角色呢? 我一查发现我的无知家家,原来这种方案的确是可行的。 name is agent 我之前猪赛跑的视频介绍过,但我当时并没特别在意他,因为主要 还是把它作为 npc 的 ai 玩家,键盘手柄操控的角色还是得用 rage body 或者 c c ctrl 了。 通过方向键操纵 agent 的原理很简单,因为 agent 的移动是用 set destination 方法,只要把方向键的输入转为在这个方向上的微小移动距离,把它作为目标地址,也就是 destination 就可以了。 我还发现了另一个木物的方法是移动偏移量,也尝试了下,但是这种方法无法检测癌症到达终点的距离,所以就略过了。 为了测试,我新建了一个游戏工程文件,只下载了几个必要的功能,这样若出了问题,可以方便排查。哈哈哈,还真出了问题,角色根本就不动。但我直接猜到了问题原因,是因为我之前买的角 角色控制插件,它使用起来很方便,主要是功能多,但是那都是作为动作游戏的操控方法。为了用这个插件,我还以他为基础写了扩展代码。等于为了用掉毛线球,我还得买一只猫让他去玩这个球。这是严重的本末,导致 痛定刺痛,我决定不用这个插件了,结果几条连线就搞定了,移动相当流畅。最重要的是,我不用担心角色会掉进悬崖,不用写检测程序分析前面是不是能走。因为 nip max 上的 a 证的角色只能在可移动区域内活动, 这样我的人物角色既可以通过键盘手柄操控,又能保证在安全区域内了。本来是要将上述的控制方式用在 ar 上的,可因为解决了大问题,经验值增加的我有点得意忘形, 是决定再消耗一下我此时的亢奋,再加入鼠标点击控制功能。没想到这个举动节外生枝, 因为场景很寒酸,我还把小伙伴放进了几只,看着小伙伴在光秃秃的场景玩耍,实在是过意不去。于是我又稍微丰富了一下场景。鼠标操控的语法很简单,只要把点到屏幕上的点转为游戏场景内的坐标就可以, 这是极其常用的语法。 ar 里面点击平面生成物体也是基于这个语法的变体,当然点击地面要有相关的图形提示,于是我又自己做了个点击提示。 此时我的脑海里有个小恶魔开始蛊惑我,偷偷摸摸,要不顺势做个对象词吧,我禁不住诱惑,决定加入 obj 铺。所谓铺及池的概念在游戏开发中很常见,也很重要。 object 铺就是装入 object 及对象的池。这里的对象是中文翻译的问题,和单身狗没有关系啊。比如我这里鼠标点击特效。一般初学者教程的做法是 鼠标点击屏幕,获取屏幕坐标,屏幕坐标转化为游戏场景坐标在游戏场景中生成点击的图形,一般过零点几秒后销毁这个图形物体 像子弹之类的物体也是这种处理方式,当然可以这么用。不过复杂的场景以及复杂的特效就会,特别是资源,因为物体的 instantiate 生成、 destroy 销毁都是重型资源消耗方法,由此便有了 pro 的概念。顾名思义,就是把这种反复使用的物体放在池子里,等到用的时候取出来,用完了再放回池, 这样就避免了反复生成销毁的过程,是提高游戏性能的重要方法。由内侧新版已经有内置的铺,不用像之前那样得自己写了,而且功能强大并稳定,但是用起来相当灰色,尤其是对初学者。于是我找了个适合我的方法,做了个适合我用的铺 manager。 因为池的相关代码已经很成熟,很常用,在官方方法之前就存在很久了,所以基本不用担心有什么问题。这样我就可以反复使用鼠标点击后的特效了,即便点的再快,也不用担心系统资源的过分使用, 把鼠标操作、统合镜、方向镜操作这样一个多用的控制器就做好了。此时的我得意忘形又提升了,于是我又开始想这只是人物角色的控制。本来 nam macedent 就是主打 ai 学 录功能,那我把玩家控制和 ai 控制合并如何? 角色被操控时是完全依赖玩家,当切换到别的角色时,那这个角色就进入 ai 状态,自己决定闲逛、巡逻、追随甚至攻击,等于是从不同角度使用人物角色,每个 npc 都可以转换成 player。 我之前在这个游戏中是把玩家和 ai 完全分开的,当时的确想过分支剧情时,玩家可以操控别的 npc 进行任务,操控那个人物时就把这个人物的 npc 属性去掉,改为玩家属性, 这样显然明显比较麻烦。现在既然主人公也可以用 naomagea 这样的操控的话,那么玩家和 ai 的程序合并根据是否是 ai 切换代码也就顺利成 脏了。这样即便后面人 vi 中延伸使用 gpt 类的生成式 ai, 那也就只是接入 api 的问题了。于是我把玩家 ai 两种操控方式放在两个状态机里,某某以及 ai 某某状态及玩家操控状态下可以自由的交互战斗,战斗方式也是多变的。像这种带冲击式攻击,我就是采用鼠标右键按下或手柄顶部按钮按下时进入 red 状态,按下鼠标左键或手柄攻击键时冲击。 借用 input system 这个新的 unit 输入方式,可以方便的把各种输入方式简单统一起来。我也是参考了同类型 rpg 游戏的操作方式,后面打算加入十字键来快速切换武器。 ai 状态下,为了防 混乱,更细分为普通和战斗两种状态。战斗状态下设定了一个概率,大部分情况是普通攻击,小概率是但是或其他重型武器。尽量模仿玩家的思考方式,同时也要留下足够的漏斗,这样才能让玩家有机可乘。 像这种不停攻击没有喘息的方式肯定不行,要让他适当的假装思考,给玩家缓和的机会。我还把之前触控用的 ui 直接嫁接了过来,好在之前做这个的时候事先就考虑了移植的问题, 只是改了个输入,输出参数就直接可用了。以上只是大体的过程,具体细节方面我还把 pool manager, audio manager 以及场景切换的 load manager 都改为了 scriptable object, 这样就不用每次都在场景上布置上述的 manager 了,因为 so 的物体可以整个程序自由调用,对于 uvs 来说简直太方便了。由此我用了一个月的时间,有一个小想法转成了这么一连串的大问题,而且一步一步解决的过程中得到了升级的快乐。我当初也不知道会收获这么多, 这也是我能自学 unit 做出 app 游戏 ar 的原因吧,那就是学习思考,大胆出错,全力解决,像猪一样不停的拱吃的摸摸,而不是犹豫了多年, 最擅长的还只是空想,说的就是你,要不你收藏家里面的教程全看完的话,你早就开窍了,而不至于平躺着或侧躺着,甚至于挖着鼻孔把我这个视频看到这接下来的内容 我会从细节上分享各个部分的心得内容真的很有启发心,请关注、点赞、转发。

哈喽,大家好,我是唐老师,欢迎收看我给大家带来的视频教程,这个教程的名字叫做 unity 的程序基础框架。开设这个教程的原因呢,是我发现很多同学都存在这样一个问题, 就是虽然学了很多虽下午和优年级相关的知识点,但是就是不知道怎么结合在一起来做项目, 说直白点就是啥都懂,但是啥都做不好的一种状态。所以我整理了如何从零制作一个 uni 的面相对象小项目的思路,而程序框架就是其中最重要的一部分, 这里面的内容主要是针对有一定英语和 c 下部基础的同学,如果你是小白,就先去学学基础知识,别把时间 浪费在这。这个思路呢主要分为三点,第一点,完成所有项目都有的公共模块。 为什么第一步要做公共模块呢?第一,公共模块可以简单的理解为整个程序的框架,它可以提升我们的开发效率。 第二,这些模块在游戏中各个地方都能够用到。第三,框架是通用的,写完一次过后之后,百分之九十五的项目都可以通用。我们的小框架包含以下内容,一, 一、单立模式积累。二、缓存池模块。三、事件中心模块。四、公共摩洛模块以及你所看到的等等的模块。 我们的教学内容呢,主要是编写这些模块的代码,有了这些,大家要做单机游戏将事半功倍,如果要做网络游戏的话,只需要往里面加入 网络模块就可以了。当我们完成了这一步,大家就可以效率快捷的进行游戏项目的开发了。第二点,当完成了小框架的内容,大家只需要对具体的项目和制作游戏的想法进行需求分析,整理面向对象的逻辑关系,理清制作思路。 接着就是第三点开始实现功能了,这里面的内容呢,都是我们所学的优内特的具体知识点, 每个知识点都是用来实现某一个需求的,我们通过第二点的需求分析,然后来选择我们到底要使用哪些知识点,最后结合我们的小框架来实现我们最终的游戏逻辑就可以了。 那么最后我用一张图来总结了一下刚才讲解的内容。做一个游戏项目,其实就像在建一个房子一样,我们的 小框架就是地基,不管房子要建成什么样子,地基基本上都是大同小异的,我们只需要分析游戏的需求,往地基上加功能就行了。 而我们这个系列饰品就是教大家如何来搭建我们的地基,只要搭地基的原理你学会了,以后工作学习都会如鱼得水,事半功倍。用一套地基可以创造各种各样的房子, 也就是说学好了框架的基本制作原理,可以一声二,二声三,三声万物,你就可以做各种各样的游戏了。 最后希望大家好好学习,天天向上,把这套教程学懂了,对你来说会有极大的收获,那么接着往下学吧。

这种刀剑割开效果怎么做?进入唯一创建合成,导入素材,把素材放大到合成大小,用钢笔抠出下半部分,复制一层门板,选择反转,给下面一层的位置做一个往下的运动, 对准位置,调整速度曲线, 新建一个全色层,添加 os 灯光效果模式改成第二个,选择一个合适的灯光预设,把不需要的图层隐藏掉, 调整一下角度,灯光亮度,拉出屏幕外给灯光位置 k 一针,做一个从左往右的运动,选中关键针,按一下 f 球一个返入返出, 给它加一点细节,做个小雪花,给唇色层一个 ccpo 即可。吾尔效果,换一下粒子的形状,调整一下发射器的位置,给发射器位置推针,跟着灯光运动 f 九一下, 调整一下粒子发射的数量和生命。给粒子层一个红色的填充, 把所有图层打一个愈合成给位置推针,用摇摆机做抖功效果, 把背景拖进来,把鱼合成模式改成屏幕,给背景做一个,出现动画,添加团留置换效果。缅甸给一个他们表达式,再做一个慢慢放大的动画,效果做好了。

哈喽,大家好,昨天做了那个陨石效果,今天做一个雪球的效果,我们来看一眼,就是这样一个雪球,他不停的滚过来,如果你转到的话,他就会破碎,哎,找一个,对喽,会受到伤害。 同时我也把昨天那个陨石按照网友的建议改成了斜着掉下来,然后掉下来,我加了一个冒烟的尾迹的一个效果。我们先看下怎么做这个雪球的效果。 雪球主要是做动画吗?其他都挺简单的。这个画的雪球的一个真动画, 对吧?你滚过去,哎,碎掉,就这样一个。 其实滚的很简单,滚的话,嗯,就是一个 等下高光阴影,就是一个随机的一个变化,又本来想做成有东西在上面滚,但是那个可能水平不够,我画不出来,因为这个雪球画正常不规则形状的,这不规则形状他如果说你按照那个真实的那个 阴影去画,画完之后滚起来之后的样子我是想象不到的,然后上网找一些雪球滚动的视频,也没找到合适的,所以说我就画成这样,然后转到之后他就是,呃,凭想象想象他的一个破碎的这样一个状态, 对,然后就碎掉。这个是一个雪球的动画,呃,有这东西之后它分两部分吧,一个是雪球的滚动,一个是雪球的破碎,然后你就去做这个,诶,做雪球那个动画嘛,对吧?在 i 没选里面。嗯,我这个雪球雪球纹体,就这个球啊,就这个球他会带有两个动画,一个是那个滚动的动画,就这一个, 一个是那个破碎的动画,就这一个,对吧?只有两个动画了,有两个动画之后这个是雪球下面这个阴影,对吧?这血斗,然后这个雪球的一个,呃,总的一个把我们两个包起来,然后这里面还有一个控制的脚本 和他的碰撞体,碰撞体只有雪球下半部分,这样的话如果人站在上面的话,他就会雪球遮挡住人,就给你一种那种立体感吗?对吧? 不然的话你会觉得是一个平面的一个图了,然后给他一个那个伤害脚本,然后看那个雪球的这个脚本怎么写的。 那主要就是这个是给别人调的函数,就是你要投这个雪球的时候就调这个 low 的函数,然后给一个初始位置,然后你会从初始位置一直往右滚动,然后这就是控制他运动的一个携程。首先先播放 这个雪球滚动的动画,对吧?然后把那个碰撞器打开,把位置给到他这个位置,然后就呃给他还有个生命周期 left time, 在 left time 到之前就他一直滚,就一直通过这个 register body, 就 r b 嘛,绿绿的包里,然后一直往右滚就行了,就 x 不停地往右走,对吧? x 一直一直加就行了, y 不变,然后 当它生命周期到了的时候,就直接 block 让它破碎,那 block 的时候就为了防止同一针里面就是它撞到东西的话,它也要破碎,然后生命周期到了,它也要破碎, 所以防止同一针的时候掉两次的 block。 所以判断了一下,如果它这个呃 collider 被打开了, 就说明他没有破碎过,因为破碎里面会掉,这个等于 fos 嘛,对吧?然后破碎里面就把这个携程停掉啊,因为你不知道哪进来的嘛?你看从这进去的,所以要停掉的,携程停了之后同时执行一个破碎的一个周期, 或者的话就执行一个破碎动画,然后延时一个零点五秒,基本上就已播放完了,然后让他回到我那个对象池就可以了,这就是一个雪球的控制脚本,是不是很简单? 所以我们最后再来看一眼, 然后和呃昨天那个找个地方找个掩体挡一下我昨天那个陨石一样,他只会在相机范围内滚雪球,就比如我的相机的框,哎?在哪?相机的框应该在这 看的不是很明显,就这个白框,他只会在这个呃白框的 y 的附近,就会在相机视野之外出现雪球,然后滚过来,然后用我这个世界是循环的 追滚雪球,滚到头之后就会循环回来,然后他到生命周期之后他就会破碎掉,对吧?比如看这个他没有装到东西,他也破碎了, 然后转东西的话,比如说这木砖,对吧?转木砖他也会破碎掉,就这样这样一个效果, 然后你进入到沙漠的话就会落陨石,进入到雪地就会滚雪球,大概就这样一个设计。好的,本期视频到这里了,谢谢大家。

快速对模型进行切割 su 切割插件对于切割功能十分强大,例如我们可以对苹果进行切割,会自动进行封面成组,对地形进行切割,对屋顶进行切割,也会自动封面。 通过切割,我们可以对模型进行修剪,对混凝土模型进行切割,提取出分组洁面,再通过推拉还原出一样的三维模型结构。关注优项,带你了解更多 sketchup。