---
# System prepended metadata

title: Map Showing 問題紀錄
tags: [gameMaking]

---

# 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也是蠻厲害的...