[请益] Unity 2D 游戏侦测问题请益

楼主: Neverfor (八卦蟑螂)   2018-07-10 21:33:11
不好意思又来打扰大家了~ 小弟Unity新手><
最近在做一个2D接水管的游戏
游戏画面大概是这样子
https://imgur.com/jj9xHwo
25个方块是固定位置的
点击任一方块后会方块会旋转90度
我目前大概就做到这边~
遇到瓶颈了想了好几天上来发问QQ
卡在"要怎么让水流通到终点"
(侦测是否连接成功)
并侦测到路径上有经过的所有水管
(算分数用)。
我是想做成"水有通的管子"会变成"蓝色"的
目前我的想法是在每个管子的"通口"加上一个圆形碰撞器,然后用is trigger配合脚本判断
是否"该通" , 概念如下 :
https://imgur.com/a/roO3lGk
如果要侦测是否在通的状态,有办法侦测到碰撞到的物件的脚本 再取得他的bool变量吗 ?
我觉得这样好像搞太复杂了~会不会耗太多资源在侦测,还是不知道各位大大有没有推荐比
较有系统的方法呢
PS : 因为是新手,前面做的都比较偏向硬干的做法,有想过或许用array的概念实现游戏方
块架构,这样是不是会牵扯到一些演算技巧呢
作者: kingroy (手残总比脑残好)   2018-07-10 23:15:00
要做的话应该帮每一格都写一个通用的script,有四个bool保存他的四个方向的状态,另外一个bool去保存水是不是有流过来的状态,旋转时则把四个方向的bool跟着旋转。有否连通就检查每个move后四周的格子跟对应方位的状态就好比起用array,把每一个格子需要有的特性写成script比较好,另外做一段gamemanager的script去管理你全部的物件
作者: cjcat2266 (CJ Cat)   2018-07-11 03:33:00
推楼上,这种定义明确的系统自己写结构,清楚又有效率用碰撞侦测是引入不必要的复杂性
作者: dreamnook (亚龙)   2018-07-11 09:41:00
同 这不需要用碰撞去检查 他只是单纯的flag
作者: kingroy (手残总比脑残好)   2018-07-11 14:52:00
检查状态不要给update去做,虽然update很方便但25格每格一次负担也不小,每次旋转后触发event叫gamemanager去检查就好
作者: cjcat2266 (CJ Cat)   2018-07-11 15:38:00
先把资料模型设计好吧,不要管互动、旋转、视觉等花边先想想写程式的话,资料要用什么方式呈现例如使用代表方块类型和方向的struct的5x5矩阵要怎么从一端出发,看看能不能走到另外一端(DFS? BFS?)如果连这个基本问题都不能解决,那成品就做不出来更正,DFS & BFS不只可看是否能连通,也可找出所有接触从视觉化编辑器设计下手,要注意别忽略基本资料模型设计的重要性等基本资料和逻辑都建设完善,再想视觉呈现和互动的包装,会比较顺利啊,我现在可以看出之前说的”基本问题”用词上可能会被解读为我斥此问题为”过于简单”,请别误会,我的意思是这个资料模型是埋藏于整个系统下的”基础建设”会用到的东西,不用等学校开始教,直接去找教学资源钻研,比较快也比较深入,学校也只是带入门而已这已经是个比一般学校教材还要实际的应用题了解出来的话,经验会比印出作业要求的printf有意义多了这不用什么特别的资料结构,就是单纯的5x5 struct阵列算法可去研究BFS和DFS(breadth-/depth-first search)从起点开始,可以找出所有碰到的节点
楼主: Neverfor (八卦蟑螂)   2018-07-13 00:54:00
话说要怎么宣告5*5的结构啊XDD只看到这种写法public block[,] = new block[5,] ;C#的array跟 C C++差真多
作者: cjcat2266 (CJ Cat)   2018-07-13 01:25:00
还好吧,只是语言上些微差异,阵列底层的意义是一样的C#和C/C++比较重要的差别之一是managed v.s. unmanaged你在C#不需要管的事情,C/C++不能忘记管那个旋转角度逻辑虽然说看起来没什么问题,不过我不会像你那样用float比较个10度范围,感觉起来不严谨既然只有四种离散旋转角度,我会直接用int存90度倍数为了检查float是否为某个单一特定值,却用范围比较总是让我毛毛的。万一以后不只能以90度作改变,还要重新审视float精准度问题,感觉是不必要的负担
楼主: Neverfor (八卦蟑螂)   2018-07-13 02:10:00
在面板上他显示90.000 -90.000 我写==90抓不到 我改用范围就可以了QQ 他是写90.0000001这样谢谢C大用心回复:) 来慢慢研究怎么让水通了
作者: cjcat2266 (CJ Cat)   2018-07-13 02:29:00
那就是float精准度误差造成的啊,径度角度转一转就会有这种问题出现,比较float范围不是不行,但是这边逻辑上是明确的离散角度值,那就该用离散值(int,enum,etc.)存,逻辑才清楚

Links booklink

Contact Us: admin [ a t ] ucptt.com