Skip to content

Commit

Permalink
feat: 新增遍历并返回有序数组的接口
Browse files Browse the repository at this point in the history
  • Loading branch information
LovelyCatHyt committed May 18, 2024
1 parent 31f45dc commit 2b99600
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 39 deletions.
4 changes: 4 additions & 0 deletions Assets/Scenes/MainScene.unity
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,10 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
map: {fileID: 669617720}
fileNameNoExtend: Test
iterateMap: 0
saveMap: 0
loadMap: 0
--- !u!1 &1004082004
GameObject:
m_ObjectHideFlags: 0
Expand Down
32 changes: 15 additions & 17 deletions Assets/Scripts/Experiment/Test.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using HexFlow.Map;
using Unitilities.PropAttr;
using Unitilities.Serialization;
using Unitilities.DebugUtil;
using System.IO;

public class Test : MonoBehaviour
{
Expand Down Expand Up @@ -41,42 +43,38 @@ private void Update()
data.enabled = false;
map.SetData(hitPos, data);
}

if (Input.GetMouseButtonUp(2))
{
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
map.RaycastToCell(ray, out var cellPos, out var hitPos);
Debug.Log($"mouseup at cellPos: {cellPos}");
}
}

[ButtonInvoke(nameof(IterateMap))]
public bool iterateMap;

public void IterateMap()
{
var count = 0;
foreach (var keyValue in map.Map)
{
Debug.Log($"position:{keyValue.Key}");
count++;
}
Debug.Log($"Iterate count({count}) == Map.ChunkCount({map.Map.ChunkCount}): {count == map.Map.ChunkCount}");
Vector2Int[] chkPosArr = map.MapData.GetKeys(true);
Debug.Log($"Iterate count({chkPosArr.Length}) == Map.ChunkCount({map.MapData.ChunkCount}): {chkPosArr.Length == map.MapData.ChunkCount}");
Debug.Log(ListPrinter.PrintLines(chkPosArr));
}

[ButtonInvoke(nameof(SaveMap))]
public bool saveMap;
public void SaveMap()
{
map.Map.SaveTo(fileNameNoExtend, DataScope.Save);
map.MapData.SaveTo(fileNameNoExtend, DataScope.Save);
Debug.Log("Saved");
}

[ButtonInvoke(nameof(LoadMap))]
public bool loadMap;
public void LoadMap()
{
map.Map.LoadFrom(fileNameNoExtend, DataScope.Save);
Debug.Log("Loaded");
try
{
map.MapData.LoadFrom(fileNameNoExtend, DataScope.Save);
Debug.Log("Loaded");
}
catch (FileNotFoundException)
{
Debug.Log("File not found!");
}
}
}
42 changes: 21 additions & 21 deletions Assets/Scripts/Map/HexMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class HexMap : MonoBehaviour

[SerializeField] protected ChunkRenderer chunkRendererPrefab;

public Chunked2DContainer<MapCellData> Map { get; protected set; }
public Chunked2DContainer<MapCellData> MapData { get; protected set; }
public Dictionary<Vector2Int, ChunkRenderer> Renderers { get; protected set; }

protected HashSet<Vector2Int> pendingUpdateUVChunks = new HashSet<Vector2Int>();
Expand Down Expand Up @@ -43,10 +43,10 @@ public void Awake()
Debug.LogError("Chunk renderer prefab missing! Will throw NRE when creating chunks.");
}

Map = new Chunked2DContainer<MapCellData>(default, (int)(Time.time * 1000), ChunkSize);
Map.onBeforeChunkRemoved += OnChunkRemoved;
Map.onChunkCreated += OnChunkCreated;
Map.chunkGenerator = new CopyDefaultGenerator<MapCellData>(Map.defaultValue);
MapData = new Chunked2DContainer<MapCellData>(default, (int)(Time.time * 1000), ChunkSize);
MapData.onBeforeChunkRemoved += OnChunkRemoved;
MapData.onChunkCreated += OnChunkCreated;
MapData.chunkGenerator = new CopyDefaultGenerator<MapCellData>(MapData.defaultValue);

Renderers = new Dictionary<Vector2Int, ChunkRenderer>();
}
Expand All @@ -62,7 +62,7 @@ private void LateUpdate()

private void OnDestroy()
{
Map.Dispose();
MapData.Dispose();
}

#endregion
Expand All @@ -72,9 +72,9 @@ private void OnDestroy()

public bool GenerateIfNotExist(Vector2Int chunkPos)
{
if (Map.ExistChunk(chunkPos)) return false;
if (MapData.ExistChunk(chunkPos)) return false;

Map.Generate(chunkPos);
MapData.Generate(chunkPos);
return true;
}
public bool GenerateIfNotExist(Vector3 positionInWorld, out Vector2Int chunkPos)
Expand All @@ -93,33 +93,33 @@ public Vector2Int GetCellPos(Vector3 positionInWorld)

public Vector2Int GetChunkPos(Vector3 positionInWorld)
{
return Map.ToChunkPos(GetCellPos(positionInWorld));
return MapData.ToChunkPos(GetCellPos(positionInWorld));
}

public Vector2Int GetChunkPos(Vector2Int cellPos)
{
return Map.ToChunkPos(cellPos);
return MapData.ToChunkPos(cellPos);
}

public void GetChunkAndCellPos(Vector3 positionInWorld, out Vector2Int chunkPos, out Vector2Int cellPos)
{
cellPos = GetCellPos(positionInWorld);
chunkPos = Map.ToChunkPos(cellPos);
chunkPos = MapData.ToChunkPos(cellPos);
}

public Vector3 GetChunkOrigin(Vector2Int chunkPos)
{
var axial = Map.ToCellPos(chunkPos).ToAxial();
var axial = MapData.ToCellPos(chunkPos).ToAxial();
var pos2D = HexMath.Axial2Position(axial) * Radius;
return transform.TransformPoint(new Vector3(pos2D.x, 0, pos2D.y));
}

public MapCellData GetData(Vector2Int cellPos)
{
var chunkPos = Map.ToChunkPos(cellPos);
if (!Map.ExistChunk(chunkPos)) return Map.defaultValue;
var chunkPos = MapData.ToChunkPos(cellPos);
if (!MapData.ExistChunk(chunkPos)) return MapData.defaultValue;

var chunkArray = Map.GetChunkAsArray(chunkPos);
var chunkArray = MapData.GetChunkAsArray(chunkPos);
cellPos = TransformMapToChunk(chunkPos, cellPos);
return chunkArray[cellPos];
}
Expand All @@ -134,9 +134,9 @@ public MapCellData GetData(Vector3 positionInWorld)
/// </summary>
public void SetData(Vector2Int cellPos, MapCellData data, bool updateNeighborChunk = true)
{
var chunkPos = Map.ToChunkPos(cellPos);
var chunkPos = MapData.ToChunkPos(cellPos);
GenerateIfNotExist(chunkPos);
var chunkArr = Map.GetChunkAsArray(chunkPos);
var chunkArr = MapData.GetChunkAsArray(chunkPos);
var cellInChunk = TransformMapToChunk(chunkPos, cellPos);
chunkArr[cellInChunk] = data;
pendingUpdateUVChunks.Add(chunkPos);
Expand All @@ -148,7 +148,7 @@ public void SetData(Vector2Int cellPos, MapCellData data, bool updateNeighborChu
// 六个邻居都要考虑
var nbrAxial = HexMath.AxialDirs[i] + axialPos;
var nbrOffset = nbrAxial.ToOffset();
var nbrChunk = Map.ToChunkPos(nbrOffset);
var nbrChunk = MapData.ToChunkPos(nbrOffset);
pendingUpdateUVChunks.Add(nbrChunk);
}
}
Expand All @@ -164,7 +164,7 @@ public void SetData(Vector3 positionInWorld, MapCellData data, bool updateNeighb

public Vector2Int TransformMapToChunk(Vector2Int chunkPos, Vector2Int cellPos)
{
var origin = Map.ChunkSize * chunkPos;
var origin = MapData.ChunkSize * chunkPos;
return cellPos - origin;
}

Expand All @@ -186,7 +186,7 @@ public bool RaycastToCell(Ray ray, out Vector2Int cellPos, out Vector3 hitPos)

protected void OnChunkCreated(Vector2Int chunkPos, IntPtr chunkData)
{
CreateChunkGO(chunkPos, new ChunkDataProxy<MapCellData>(chunkData, Map.ChunkSize));
CreateChunkGO(chunkPos, new ChunkDataProxy<MapCellData>(chunkData, MapData.ChunkSize));
}

protected void OnChunkRemoved(Vector2Int chunkPos, IntPtr chunkData)
Expand Down Expand Up @@ -222,7 +222,7 @@ protected void UpdateChunkUV(Vector2Int chunkPos)
r = Renderers[chunkPos];
}

UVGenerator.GenerateUVForMap(r.Generator.GeneratedMesh, Map, chunkPos, r.meshType, r.textureType);
UVGenerator.GenerateUVForMap(r.Generator.GeneratedMesh, MapData, chunkPos, r.meshType, r.textureType);
}
}
}
30 changes: 29 additions & 1 deletion Assets/Scripts/NativeCore/Structures/Chunked2DContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,15 @@ public void Deserialize(BinaryReader reader)
{
reader.BaseStream.Read(new Span<byte>(chunkPtr.ToPointer(), ChunkDataLengthNoHead));
}
onChunkCreated?.Invoke(chunkPos, chunkPtr);
}

// 读取完再进行事件回调, 这样监听者读取到的任意区块的邻居信息都是完整的. 当然, 这里假设监听者对读取顺序不敏感.
if (onChunkCreated != null)
{
foreach (var keyValue in this)
{
onChunkCreated.Invoke(keyValue.Key, keyValue.Value);
}
}
}
#endregion
Expand Down Expand Up @@ -373,6 +381,26 @@ public INative2DArray<T> GetChunkAsArray(Vector2Int chunkPos)
return new ChunkDataProxy<T>(GetChunk(chunkPos), ChunkSize);
}

public Vector2Int[] GetKeys(bool sorted = false)
{
var result = new Vector2Int[ChunkCount];
var id = 0;
foreach (var kv in this)
{
result[id] = kv.Key;
id++;
}
if (sorted)
{
Array.Sort(result, (a, b) =>
{
if (a.y != b.y) return a.y - b.y;
return a.x - b.x;
});
}
return result;
}

~Chunked2DContainer()
{
Dispose();
Expand Down

0 comments on commit 2b99600

Please sign in to comment.