private void Awake()
{
for (int i = 0; i < TileBitMaskIndex.Length; i++)
TileBitMaskSet.Add(TileBitMaskIndex[i], i);
}
int[] TileBitMaskIndex =
{
9,1,3,16,32,210,
8,0,2,64,128,200,
12,4,6,132,160,33,
13,5,7,68,80,17
};
void SetSprite()
{
int Bit_UL = 0;
int Bit_UR = 0;
int Bit_DL = 0;
int Bit_DR = 0;
if (isGround)
{
Bit_UL = 200;
Bit_UR = 200;
Bit_DL = 200;
Bit_DR = 200;
}
else
{
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(1)) && GameManager.Data.Tiles[Pos.GetAroundPos(1)].isGround)
{
Bit_UL += 1;
Bit_UR += 1;
}
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(2)) && GameManager.Data.Tiles[Pos.GetAroundPos(2)].isGround)
{
Bit_UR += 2;
Bit_DR += 2;
}
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(4)) && GameManager.Data.Tiles[Pos.GetAroundPos(4)].isGround)
{
Bit_UL += 8;
Bit_DL += 8;
}
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(7)) && GameManager.Data.Tiles[Pos.GetAroundPos(7)].isGround)
{
Bit_DR = 2;
}
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(8)) && GameManager.Data.Tiles[Pos.GetAroundPos(8)].isGround)
{
Bit_DL = 8;
}
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(3)) && GameManager.Data.Tiles[Pos.GetAroundPos(3)].isGround)
{
Bit_UL += 4;
Bit_UR += 4;
Bit_DL = 210;
Bit_DR = 210;
}
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(5)) &&
GameManager.Data.Tiles[Pos.GetAroundPos(5)].isGround && (Bit_UL == 0 || Bit_UL == 4 || Bit_UL == 32))
{
Bit_UL += 128;
}
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(6)) &&
GameManager.Data.Tiles[Pos.GetAroundPos(6)].isGround && (Bit_UR == 0 || Bit_UR == 4 || Bit_UR == 16))
{
Bit_UR += 64;
}
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(7)) &&
GameManager.Data.Tiles[Pos.GetAroundPos(7)].isGround && (Bit_UR == 0 || Bit_UR == 1 || Bit_UR == 64))
{
Bit_UR += 16;
}
if (GameManager.Data.Tiles.ContainsKey(Pos.GetAroundPos(8)) &&
GameManager.Data.Tiles[Pos.GetAroundPos(8)].isGround && (Bit_UL == 0 || Bit_UL == 1 || Bit_UL == 128))
{
Bit_UL += 32;
}
}
UL.sprite = AssetManager.TileBitMaskSet.ContainsKey(Bit_UL) ? AssetManager.SpriteSet[SPRITE.TileChip][AssetManager.TileBitMaskSet[Bit_UL]] : null;
UR.sprite = AssetManager.TileBitMaskSet.ContainsKey(Bit_UR) ? AssetManager.SpriteSet[SPRITE.TileChip][AssetManager.TileBitMaskSet[Bit_UR]] : null;
DL.sprite = AssetManager.TileBitMaskSet.ContainsKey(Bit_DL) ? AssetManager.SpriteSet[SPRITE.TileChip][AssetManager.TileBitMaskSet[Bit_DL]] : null;
DR.sprite = AssetManager.TileBitMaskSet.ContainsKey(Bit_DR) ? AssetManager.SpriteSet[SPRITE.TileChip][AssetManager.TileBitMaskSet[Bit_DR]] : null;
}
<비트마스킹 참고
<결과물
내가만든 비트마스킹 사용한 타일맵 알고리즘인데 존나쉽게 만든거니까 응용해서 쓰든 공부해서쓰든 맘대로 하셈
RPG만들기처럼 스프라이트 4개 합쳐서 타일1개 방식임
GameManager.Data.Tiles 는 <Pos,Tile>딕셔너리고 Pos 는 int x,int y 스트럭트임
공유는 추천하겠읍니다...