游戏达人
  
- 贡献度
- 420
- 金元
- 16225
- 积分
- 3333
- 精华
- 3
- 注册时间
- 2014-11-13

|
本帖最后由 qweytr_1 于 2018-1-21 18:53 编辑
找到了或许相关的代码位置,有兴趣的可以分析一下,或者照着这条路继续走下去
首先这个应该说是最有用的
// MazeGenerator
public void SetFloorData()
{
this.ReleaseAllMineral();
this.m_upRadder.gameObject.SetActive(true);
this.m_downRadder.gameObject.SetActive(false);
MazeData levelData = this.m_mineData.GetLevelData();
levelData.GenerateChip();
MapCellData cell = MapManager.GetInstance().GetCell(levelData.m_upLevPos);
cell.m_eventID = 2;
this.m_upRadder.SetPos(levelData.m_upLevPos);
this.m_downLevelPos = levelData.m_downLevPos.Clone();
if (levelData.m_isAppearLadder)
{
this.SetDownLevel();
}
MineralManager.GetInstance().Apply(levelData.m_mineralList, true);
}
// MazeData
public void LevelGenerate(IVec2 entrancePos, MineLevel mineLevel, bool isEnableDownLevel)
{
IVec2 vec = mineLevel.size.Clone();
int num = (vec.x + vec.y) / 2;
int max;
if (num < 15)
{
max = 3;
}
else if (num < 20)
{
max = 4;
}
else
{
max = 5;
}
int num2 = UnityEngine.Random.Range(3, max);
int num3 = UnityEngine.Random.Range(mineLevel.mineralMin, mineLevel.mineralMax);
int breakWallCount = mineLevel.breakWallCount;
entrancePos = this.GenerateMaze(entrancePos, vec, num2, breakWallCount);
this.SetupRoof(MazeData.k_wallHeight);
this.m_upLevPos = entrancePos;
if (isEnableDownLevel)
{
this.m_downLevPos = this.GetEntryPoint();
if (this.m_downLevPos != null)
{
this.m_downLevPos *= num2;
this.m_downLevPos.x += UnityEngine.Random.Range(0, num2 - 1);
this.m_downLevPos.y += UnityEngine.Random.Range(2, num2);
}
else
{
this.m_downLevPos = this.m_upLevPos.Clone();
this.m_downLevPos.x += num2 - 1;
}
}
else
{
this.m_downLevPos = new IVec2(0, 0);
}
Assert.Message(this.m_downLevPos != null, "迷路作成で下り梯子を作成できませんでした");
IVec2 vec2 = new IVec2();
int num4 = 0;
for (int i = 0; i < num3; i++)
{
vec2 = this.GetEntryPoint();
if (vec2 != null)
{
vec2 *= num2;
vec2.x += UnityEngine.Random.Range(0, num2);
vec2.y += UnityEngine.Random.Range(1, num2);
int mineralID = 6 + mineLevel.mineLevel;
this.m_mineralList.AddStatus(mineralID, vec2);
num4++;
}
}
if (num4 == 0)
{
vec2 = entrancePos.Clone();
vec2.x = vec2.x / num2 * num2;
vec2.y = vec2.y / num2 * num2;
IVec2 vec3 = new IVec2();
IVec2 vec4 = entrancePos.Clone();
vec4.y--;
int num5 = 20;
do
{
vec3.x = vec2.x + UnityEngine.Random.Range(0, num2);
vec3.y = vec2.y + UnityEngine.Random.Range(1, num2);
}
while ((vec3 == entrancePos || vec3 == this.m_downLevPos || vec3 == vec4) && --num5 >= 0);
if (num5 < 0)
{
vec3 = entrancePos;
vec3.x++;
}
int mineralID2 = 6 + mineLevel.mineLevel;
this.m_mineralList.AddStatus(mineralID2, vec3);
}
Debug.Log(string.Concat(new object[]
{
"坑道サイズ(",
this.m_genMazeSize.x,
",",
this.m_genMazeSize.y,
")\n上り座標(",
entrancePos.x,
",",
entrancePos.y,
")\n下り座標(",
this.m_downLevPos.x,
",",
this.m_downLevPos.y,
")\n"
}));
}
// MazeData
private void GenerateMaze(IVec2 bPos)
{
this.m_createChip[bPos.x, bPos.y] = 0;
int[] array = new int[]
{
0,
1,
2,
3
};
for (int i = 0; i < 4; i++)
{
int num = UnityEngine.Random.Range(0, 4);
int num2 = array;
array = array[num];
array[num] = num2;
}
for (int j = 0; j < 4; j++)
{
IVec2 vec = bPos + this.m_mzGrid[array[j]];
IVec2 vec2 = vec + this.m_mzGrid[array[j]];
if (vec2.x >= 0 && vec2.x < this.m_genMazeSize.x && vec2.y >= 0 && vec2.y < this.m_genMazeSize.y && this.m_createChip[vec.x, vec.y] == 1 && this.m_createChip[vec2.x, vec2.y] == 1)
{
this.m_createChip[vec.x, vec.y] = 0;
this.GenerateMaze(vec2);
}
}
}
// MazeData
private IVec2 GenerateMaze(IVec2 entrancePos, IVec2 size, int grid, int breakCount)
{
IVec2 vec = entrancePos.Clone();
this.m_createChip = null;
this.m_genMazeSize = size.Clone();
if (this.m_genMazeSize.x > this.m_size.x)
{
this.m_genMazeSize.x = this.m_size.x;
}
if (this.m_genMazeSize.y > this.m_size.y)
{
this.m_genMazeSize.y = this.m_size.y;
}
vec /= grid;
this.m_genMazeSize /= grid;
if (vec.x >= this.m_genMazeSize.x - 1)
{
vec.x = this.m_genMazeSize.x - 2;
}
if (vec.y >= this.m_genMazeSize.y - 1)
{
vec.y = this.m_genMazeSize.y - 2;
}
vec.x |= 1;
vec.y |= 1;
this.m_createChip = new int[this.m_genMazeSize.x, this.m_genMazeSize.y];
MazeData.ccc++;
Debug.Log(string.Concat(new object[]
{
MazeData.ccc,
" MazeSize = (",
this.m_genMazeSize.x,
",",
this.m_genMazeSize.y,
") grid=",
grid,
" start pos =",
vec.x,
",",
vec.y,
" / ",
entrancePos.x,
",",
entrancePos.y
}));
for (int i = 0; i < this.m_genMazeSize.y; i++)
{
for (int j = 0; j < this.m_genMazeSize.x; j++)
{
this.m_createChip[j, i] = 1;
}
}
this.GenerateMaze(vec);
this.m_createChip[vec.x, vec.y] = 0;
this.m_entryPoint.Clear();
IVec2 vec2 = new IVec2();
for (int k = 0; k < this.m_genMazeSize.y; k++)
{
for (int l = 0; l < this.m_genMazeSize.x; l++)
{
vec2.x = l;
vec2.y = k;
if (vec != vec2 && this.m_createChip[l, k] == 0)
{
this.m_entryPoint.Add(vec2.Clone());
}
}
}
int num = breakCount * 4;
for (int m = 0; m < breakCount; m++)
{
vec2.x = UnityEngine.Random.Range(1, this.m_genMazeSize.x - 1);
vec2.y = UnityEngine.Random.Range(1, this.m_genMazeSize.y - 1);
bool flag = false;
for (int n = 0; n < 4; n++)
{
int num2 = Mathf.Clamp(vec2.x + this.m_sideVec[n].x, 0, this.m_genMazeSize.x - 1);
int num3 = Mathf.Clamp(vec2.y + this.m_sideVec[n].y, 0, this.m_genMazeSize.y - 1);
if (this.m_createChip[num2, num3] == 0)
{
flag = true;
}
}
if (flag)
{
this.m_createChip[vec2.x, vec2.y] = 0;
}
else if (--num >= 0)
{
m--;
}
}
this.ResetChip(1);
for (int num4 = 0; num4 < this.m_size.y; num4++)
{
for (int num5 = 0; num5 < this.m_size.x; num5++)
{
int num6 = num5 / grid;
int num7 = num4 / grid;
if (num6 >= 0 && num6 < this.m_genMazeSize.x && num7 >= 0 && num7 < this.m_genMazeSize.y && this.m_createChip[num6, num7] == 0)
{
this.m_chip[num5, num4] = 0;
}
}
}
vec *= grid;
vec.y += grid - 1;
return vec;
} |
|