# Map Showing 問題紀錄 ###### tags: `gameMaking` ## 問題紀錄1 回收tiles ## 方案1 ### 簡介: 每個tile每隔一段時間檢查一次和player的距離,若超過則回收 ### 優點: 實作相對簡單 ### 缺點: 效率可能不太好 假設一個scene有200x100個格子,假設我們一秒鐘檢查一次,則每秒要多至少200x100x2的計算 ## 方案1-2 ### 簡介: 以一直行與一橫行作為單位,每次計算與其中心點的距離 格子部分為要計算的點 ![](https://i.imgur.com/nIErCs8.png) ### 優點: 每次只要計算200+100-1+大約30、40左右個tile與player的距離,相對省了很多時間 ### 缺點: 要持續尋找中心點,可能會耗費資源,且如果有快速的斜向移動,應該會比方案一更花時間,且實作應該會相對困難很多 ## 方案2 ### 簡介: 在player身上使用collider,每次check是否與tile的collider重疊 ### 優點: 如果之後要做多人遊玩,則這個方法應該可以很簡單的實作show map ### 缺點: 使用重疊絕對會消耗比第一種方法還多的資源 ### 參考後發現速度可行 https://forum.unity.com/threads/overlapsphere-efficiency.6860/ <hr> <hr> ## 問題紀錄2 地圖show過一次無法再show第二次 ### 可能問題點: 回收objectCore的showingOrNot不會改道真正的地圖上 因為當Mapchunk中的objectCore被塞進tile時,其實是複製了一份,而非真正記憶體上的位置 ### 失敗解決方法紀錄: #### 1. 讓tile紀錄Core所在的chunk,回收tile時直接修改chunk的core的屬性 因為是無限生成的地圖,chunk無法用一個有效的方式記錄,基本上都是直接根據player的位置來決定目前的chunk #### 2. 透過reference記憶體位置到變數上 C#和c++不同,無法將記憶體位置記錄到變數上 ### 可能再嘗試之方法: 透過method中ref的方式存取記憶體位置再用來建立物件 https://stackoverflow.com/questions/42425942/c-sharp-how-to-declare-a-reference-variable-to-store-the-address-of-an-object 暫不採用,用了絕對會讓之後code變得更亂更糟 ### 解決想法 #### 建立chunk的時候就給予其對應的編號 - pro 1. 可以透過直接找到chunk解決目前無法存取到記憶體位置的問題 2. 未來指定副本產生的chunk時,應該會相對方便 3. 指定發生事件的chunk也會更加便利 - con 1. 要改不少code 2. 可能稍微增加未來維護難度 ### 解決紀錄 最後發現原因確實是出在value和reference上,但和預想的不同是,問題是出在預先建立的物件instance dictionary上,本來應該要從dictionary copy一份的物件變成直接參照到instance的位置,圖片show不出來是因為tileStructure的位置一直被改到,導致原先設計好的模式亂掉,沒有觸發error也是蠻厲害的...