看板 GameDesign 關於我們 聯絡資訊
不好意思又來打擾大家了~ 小弟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
kingroy: 要做的話應該幫每一格都寫一個通用的script,有四個bool07/10 23:15
kingroy: 保存他的四個方向的狀態,另外一個bool去保存水是不是有07/10 23:15
kingroy: 流過來的狀態,旋轉時則把四個方向的bool跟著旋轉。07/10 23:15
kingroy: 有否連通就檢查每個move後四周的格子跟對應方位的狀態就07/10 23:17
kingroy: 好07/10 23:17
kingroy: 比起用array,把每一個格子需要有的特性寫成script比較好07/10 23:19
kingroy: ,另外做一段gamemanager的script去管理你全部的物件07/10 23:19
cjcat2266: 推樓上,這種定義明確的系統自己寫結構,清楚又有效率07/11 03:33
cjcat2266: 用碰撞偵測是引入不必要的複雜性07/11 03:34
dreamnook: 同 這不需要用碰撞去檢查 他只是單純的flag07/11 09:41
謝謝各位回覆,我有點不太懂,我回去畫圖思考一下,大概的概念是不用用碰撞器去偵測, 改用25個block的腳本設四個旋轉的state,再用一個主script去算這25個block的對應關係 嗎~還有四種形狀的水管要用四種不同的寫法 我在思考變成流通狀態先後順序的問題,但是每幀很快,是不是主script需要有一個延遲時 間延遲給他算@@ 我再想一下怎麼寫 謝謝各位回覆~ ※ 編輯: Neverfor (180.217.193.219), 07/11/2018 13:49:31
kingroy: 檢查狀態不要給update去做,雖然update很方便但25格每格07/11 14:52
kingroy: 一次負擔也不小,每次旋轉後觸發event叫gamemanager去檢07/11 14:52
kingroy: 查就好 07/11 14:52
cjcat2266: 先把資料模型設計好吧,不要管互動、旋轉、視覺等花邊 07/11 15:38
cjcat2266: 先想想寫程式的話,資料要用什麼方式呈現 07/11 15:38
cjcat2266: 例如使用代表方塊類型和方向的struct的5x5矩陣 07/11 15:38
cjcat2266: 要怎麼從一端出發,看看能不能走到另外一端(DFS? BFS?) 07/11 15:38
cjcat2266: 如果連這個基本問題都不能解決,那成品就做不出來 07/11 15:38
cjcat2266: 更正,DFS & BFS不只可看是否能連通,也可找出所有接觸 07/11 15:39
@@ 小弟是EE背景的 我下個學期才要修DS跟演算 如果我現在鑽研這個會看不懂嗎QQ 有修 過C 基本C的pointer跟struct 記憶體位址概念都還OK 現在暑假比較有空慢慢鑽研
cjcat2266: 從視覺化編輯器設計下手,要注意別忽略基本資料模型設07/11 23:39
cjcat2266: 計的重要性07/11 23:39
cjcat2266: 等基本資料和邏輯都建設完善,再想視覺呈現和互動的包07/11 23:41
cjcat2266: 裝,會比較順利07/11 23:41
cjcat2266: 啊,我現在可以看出之前說的”基本問題”用詞上可能會07/11 23:43
cjcat2266: 被解讀為我斥此問題為”過於簡單”,請別誤會,我的意07/11 23:43
cjcat2266: 思是這個資料模型是埋藏於整個系統下的”基礎建設”07/11 23:43
謝謝 大概瞭解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
cjcat2266: 會用到的東西,不用等學校開始教,直接去找教學資源 07/12 05:47
cjcat2266: 鑽研,比較快也比較深入,學校也只是帶入門而已 07/12 05:48
cjcat2266: 這已經是個比一般學校教材還要實際的應用題了 07/12 05:49
cjcat2266: 解出來的話,經驗會比印出作業要求的printf有意義多了 07/12 05:50
cjcat2266: 這不用什麼特別的資料結構,就是單純的5x5 struct陣列 07/12 05:59
cjcat2266: 演算法可去研究BFS和DFS(breadth-/depth-first search) 07/12 06:00
cjcat2266: 從起點開始,可以找出所有碰到的節點 07/12 06:00
好 我今天嘗試了一下用結構表示 大概如下 : https://i.imgur.com/lHbzSd9.png
https://i.imgur.com/S01paK5.png
這樣把狀態編碼化 再利用這些碼做我要的演算 這樣子不知道方向對不對@@ 感覺這樣子比 之前用碰撞器的做法淺顯多了 ※ 編輯: Neverfor (180.217.193.130), 07/13/2018 00:52:18
Neverfor: 話說要怎麼宣告5*5的結構啊XDD 07/13 00:54
Neverfor: 只看到這種寫法public block[,] = new block[5,] ; 07/13 00:55
Neverfor: C#的array跟 C C++差真多 07/13 00:56
cjcat2266: 還好吧,只是語言上些微差異,陣列底層的意義是一樣的 07/13 01:25
cjcat2266: C#和C/C++比較重要的差別之一是managed v.s. unmanaged 07/13 01:25
cjcat2266: 你在C#不需要管的事情,C/C++不能忘記管 07/13 01:26
cjcat2266: 那個旋轉角度邏輯雖然說看起來沒什麼問題,不過我不會 07/13 01:26
cjcat2266: 像你那樣用float比較個10度範圍,感覺起來不嚴謹 07/13 01:27
cjcat2266: 既然只有四種離散旋轉角度,我會直接用int存90度倍數 07/13 01:27
cjcat2266: 為了檢查float是否為某個單一特定值,卻用範圍比較 07/13 01:33
cjcat2266: 總是讓我毛毛的。萬一以後不只能以90度作改變,還要重 07/13 01:34
cjcat2266: 新審視float精準度問題,感覺是不必要的負擔 07/13 01:34
Neverfor: 在面板上他顯示90.000 -90.000 我寫==90抓不到 我改用範 07/13 02:10
Neverfor: 圍就可以了QQ 他是寫90.0000001這樣 07/13 02:11
Neverfor: 謝謝C大用心回覆:) 來慢慢研究怎麼讓水通了 07/13 02:13
cjcat2266: 那就是float精準度誤差造成的啊,徑度角度轉一轉就會 07/13 02:29
cjcat2266: 有這種問題出現,比較float範圍不是不行,但是這邊邏輯 07/13 02:30
cjcat2266: 上是明確的離散角度值,那就該用離散值(int,enum,etc.) 07/13 02:31
cjcat2266: 存,邏輯才清楚 07/13 02:31