[請益] Unity 2D 遊戲偵測問題請益

看板GameDesign (遊戲設計)作者 (八卦蟑螂)時間6年前 (2018/07/10 21:33), 6年前編輯推噓11(11041)
留言52則, 4人參與, 6年前最新討論串1/1
不好意思又來打擾大家了~ 小弟Unity新手>< 最近在做一個2D接水管的遊戲 遊戲畫面大概是這樣子 https://imgur.com/jj9xHwo
25個方塊是固定位置的 點擊任一方塊後會方塊會旋轉90度 我目前大概就做到這邊~ 遇到瓶頸了想了好幾天上來發問QQ 卡在"要怎麼讓水流通到終點" (偵測是否連接成功) 並偵測到路徑上有經過的所有水管 (算分數用)。 我是想做成"水有通的管子"會變成"藍色"的 目前我的想法是在每個管子的"通口"加上一個圓形碰撞器,然後用is trigger配合腳本判斷 是否"該通" , 概念如下 : https://imgur.com/a/roO3lGk 如果要偵測是否在通的狀態,有辦法偵測到碰撞到的物件的腳本 再取得他的bool變數嗎 ? 我覺得這樣好像搞太複雜了~會不會耗太多資源在偵測,還是不知道各位大大有沒有推薦比 較有系統的方法呢 PS : 因為是新手,前面做的都比較偏向硬幹的做法,有想過或許用array的概念實現游戲方 塊架構,這樣是不是會牽扯到一些演算技巧呢 -- Sent from my Windows -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.220.56 ※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1531229595.A.EE3.html ※ 編輯: Neverfor (180.217.220.56), 07/10/2018 21:37:53 ※ 編輯: Neverfor (180.217.220.56), 07/10/2018 21:46:01

07/10 23:15, 6年前 , 1F
要做的話應該幫每一格都寫一個通用的script,有四個bool
07/10 23:15, 1F

07/10 23:15, 6年前 , 2F
保存他的四個方向的狀態,另外一個bool去保存水是不是有
07/10 23:15, 2F

07/10 23:15, 6年前 , 3F
流過來的狀態,旋轉時則把四個方向的bool跟著旋轉。
07/10 23:15, 3F

07/10 23:17, 6年前 , 4F
有否連通就檢查每個move後四周的格子跟對應方位的狀態就
07/10 23:17, 4F

07/10 23:17, 6年前 , 5F
07/10 23:17, 5F

07/10 23:19, 6年前 , 6F
比起用array,把每一個格子需要有的特性寫成script比較好
07/10 23:19, 6F

07/10 23:19, 6年前 , 7F
,另外做一段gamemanager的script去管理你全部的物件
07/10 23:19, 7F

07/11 03:33, 6年前 , 8F
推樓上,這種定義明確的系統自己寫結構,清楚又有效率
07/11 03:33, 8F

07/11 03:34, 6年前 , 9F
用碰撞偵測是引入不必要的複雜性
07/11 03:34, 9F

07/11 09:41, 6年前 , 10F
同 這不需要用碰撞去檢查 他只是單純的flag
07/11 09:41, 10F
謝謝各位回覆,我有點不太懂,我回去畫圖思考一下,大概的概念是不用用碰撞器去偵測, 改用25個block的腳本設四個旋轉的state,再用一個主script去算這25個block的對應關係 嗎~還有四種形狀的水管要用四種不同的寫法 我在思考變成流通狀態先後順序的問題,但是每幀很快,是不是主script需要有一個延遲時 間延遲給他算@@ 我再想一下怎麼寫 謝謝各位回覆~ ※ 編輯: Neverfor (180.217.193.219), 07/11/2018 13:49:31

07/11 14:52, 6年前 , 11F
檢查狀態不要給update去做,雖然update很方便但25格每格
07/11 14:52, 11F

07/11 14:52, 6年前 , 12F
一次負擔也不小,每次旋轉後觸發event叫gamemanager去檢
07/11 14:52, 12F

07/11 14:52, 6年前 , 13F
查就好
07/11 14:52, 13F

07/11 15:38, 6年前 , 14F
先把資料模型設計好吧,不要管互動、旋轉、視覺等花邊
07/11 15:38, 14F

07/11 15:38, 6年前 , 15F
先想想寫程式的話,資料要用什麼方式呈現
07/11 15:38, 15F

07/11 15:38, 6年前 , 16F
例如使用代表方塊類型和方向的struct的5x5矩陣
07/11 15:38, 16F

07/11 15:38, 6年前 , 17F
要怎麼從一端出發,看看能不能走到另外一端(DFS? BFS?)
07/11 15:38, 17F

07/11 15:38, 6年前 , 18F
如果連這個基本問題都不能解決,那成品就做不出來
07/11 15:38, 18F

07/11 15:39, 6年前 , 19F
更正,DFS & BFS不只可看是否能連通,也可找出所有接觸
07/11 15:39, 19F
@@ 小弟是EE背景的 我下個學期才要修DS跟演算 如果我現在鑽研這個會看不懂嗎QQ 有修 過C 基本C的pointer跟struct 記憶體位址概念都還OK 現在暑假比較有空慢慢鑽研

07/11 23:39, 6年前 , 20F
從視覺化編輯器設計下手,要注意別忽略基本資料模型設
07/11 23:39, 20F

07/11 23:39, 6年前 , 21F
計的重要性
07/11 23:39, 21F

07/11 23:41, 6年前 , 22F
等基本資料和邏輯都建設完善,再想視覺呈現和互動的包
07/11 23:41, 22F

07/11 23:41, 6年前 , 23F
裝,會比較順利
07/11 23:41, 23F

07/11 23:43, 6年前 , 24F
啊,我現在可以看出之前說的”基本問題”用詞上可能會
07/11 23:43, 24F

07/11 23:43, 6年前 , 25F
被解讀為我斥此問題為”過於簡單”,請別誤會,我的意
07/11 23:43, 25F

07/11 23:43, 6年前 , 26F
思是這個資料模型是埋藏於整個系統下的”基礎建設”
07/11 23:43, 26F
謝謝 大概瞭解C大你的意思了 我現在學Unity比較偏向看到什麼問題 再去學什麼 不知道這 樣好不好呢 現在會的都是基礎那些舉凡碰撞器 觸發 腳本一些物件互動 之前在練習都是2. 3個物件互動為多 現在碰到要一次處理多個物件比較不知道怎麼辦 ※ 編輯: Neverfor (180.217.193.219), 07/12/2018 04:03:10 ※ 編輯: Neverfor (180.217.193.219), 07/12/2018 04:06:59

07/12 05:47, 6年前 , 27F
會用到的東西,不用等學校開始教,直接去找教學資源
07/12 05:47, 27F

07/12 05:48, 6年前 , 28F
鑽研,比較快也比較深入,學校也只是帶入門而已
07/12 05:48, 28F

07/12 05:49, 6年前 , 29F
這已經是個比一般學校教材還要實際的應用題了
07/12 05:49, 29F

07/12 05:50, 6年前 , 30F
解出來的話,經驗會比印出作業要求的printf有意義多了
07/12 05:50, 30F

07/12 05:59, 6年前 , 31F
這不用什麼特別的資料結構,就是單純的5x5 struct陣列
07/12 05:59, 31F

07/12 06:00, 6年前 , 32F
演算法可去研究BFS和DFS(breadth-/depth-first search)
07/12 06:00, 32F

07/12 06:00, 6年前 , 33F
從起點開始,可以找出所有碰到的節點
07/12 06:00, 33F
好 我今天嘗試了一下用結構表示 大概如下 : https://i.imgur.com/lHbzSd9.png
https://i.imgur.com/S01paK5.png
這樣把狀態編碼化 再利用這些碼做我要的演算 這樣子不知道方向對不對@@ 感覺這樣子比 之前用碰撞器的做法淺顯多了 ※ 編輯: Neverfor (180.217.193.130), 07/13/2018 00:52:18

07/13 00:54, 6年前 , 34F
話說要怎麼宣告5*5的結構啊XDD
07/13 00:54, 34F

07/13 00:55, 6年前 , 35F
只看到這種寫法public block[,] = new block[5,] ;
07/13 00:55, 35F

07/13 00:56, 6年前 , 36F
C#的array跟 C C++差真多
07/13 00:56, 36F

07/13 01:25, 6年前 , 37F
還好吧,只是語言上些微差異,陣列底層的意義是一樣的
07/13 01:25, 37F

07/13 01:25, 6年前 , 38F
C#和C/C++比較重要的差別之一是managed v.s. unmanaged
07/13 01:25, 38F

07/13 01:26, 6年前 , 39F
你在C#不需要管的事情,C/C++不能忘記管
07/13 01:26, 39F

07/13 01:26, 6年前 , 40F
那個旋轉角度邏輯雖然說看起來沒什麼問題,不過我不會
07/13 01:26, 40F

07/13 01:27, 6年前 , 41F
像你那樣用float比較個10度範圍,感覺起來不嚴謹
07/13 01:27, 41F

07/13 01:27, 6年前 , 42F
既然只有四種離散旋轉角度,我會直接用int存90度倍數
07/13 01:27, 42F

07/13 01:33, 6年前 , 43F
為了檢查float是否為某個單一特定值,卻用範圍比較
07/13 01:33, 43F

07/13 01:34, 6年前 , 44F
總是讓我毛毛的。萬一以後不只能以90度作改變,還要重
07/13 01:34, 44F

07/13 01:34, 6年前 , 45F
新審視float精準度問題,感覺是不必要的負擔
07/13 01:34, 45F

07/13 02:10, 6年前 , 46F
在面板上他顯示90.000 -90.000 我寫==90抓不到 我改用範
07/13 02:10, 46F

07/13 02:11, 6年前 , 47F
圍就可以了QQ 他是寫90.0000001這樣
07/13 02:11, 47F

07/13 02:13, 6年前 , 48F
謝謝C大用心回覆:) 來慢慢研究怎麼讓水通了
07/13 02:13, 48F

07/13 02:29, 6年前 , 49F
那就是float精準度誤差造成的啊,徑度角度轉一轉就會
07/13 02:29, 49F

07/13 02:30, 6年前 , 50F
有這種問題出現,比較float範圍不是不行,但是這邊邏輯
07/13 02:30, 50F

07/13 02:31, 6年前 , 51F
上是明確的離散角度值,那就該用離散值(int,enum,etc.)
07/13 02:31, 51F

07/13 02:31, 6年前 , 52F
存,邏輯才清楚
07/13 02:31, 52F
文章代碼(AID): #1RHBMRxZ (GameDesign)
文章代碼(AID): #1RHBMRxZ (GameDesign)