[請益] 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