public override bool Equals(object obj) { if (obj == null) { return(false); } if (obj.GetType().Equals(typeof(WallCornerStruct))) { WallCornerStruct target = (WallCornerStruct)obj; return(pos.Equals(target.pos)); } else { return(false); } }
/// <summary> /// 创建区域墙壁 /// </summary> /// <param name="random">随机对象</param> /// <param name="pixel">没单位的宽度</param> /// <param name="parent">父物体</param> /// <param name="wallPrefabs">墙壁预设体</param> /// <param name="wallCornerStructs">拐弯处结果,函数内部填充</param> /// <param name="labyrinthRangeStructs">区域结构数组</param> private static void CreateRangeWall( System.Random random, int pixel, GameObject parent, GameObject[] wallPrefabs, List <WallCornerStruct> wallCornerStructs, LabyrinthRangeStruct[] labyrinthRangeStructs) { int wallPrefabLength = wallPrefabs.Length; //创建墙壁函数 Action <Vector3, int> CreateWallAction = (pos, angle) => { int r = random.Next(0, wallPrefabLength); GameObject createObj = GameObject.Instantiate <GameObject>(wallPrefabs[r]); createObj.transform.position = pos; createObj.transform.eulerAngles = new Vector3(0, angle, 0); createObj.transform.SetParent(parent.transform); }; //检测是否是门 Func <int, int, LabyrinthRangeStruct, bool> CheckNearDoor = (x, y, labyrinthRangeStruct) => { bool isDoor = false; foreach (Vector2 item in labyrinthRangeStruct.doors) { int near = Math.Abs((int)item.x - x) + Math.Abs((int)item.y - y); if (near == 0) { isDoor = true; break; } } return(isDoor); }; //添加拐角 Action <WallCornerStruct> AddCorner = (wallCornerStruct) => { if (wallCornerStruct.cornerType != WallCornerStruct.CornerEnum.Connect) { int index = wallCornerStructs.IndexOf(wallCornerStruct); if (index < 0 || wallCornerStructs[index].cornerType == WallCornerStruct.CornerEnum.Connect) { if (index >= 0) { wallCornerStructs.RemoveAt(index); } wallCornerStructs.Add(wallCornerStruct); } } else { if (!wallCornerStructs.Contains(wallCornerStruct)) { wallCornerStructs.Add(wallCornerStruct); } } }; foreach (LabyrinthRangeStruct labyrinthRangeStruct in labyrinthRangeStructs) { //上 for (int i = 0; i < labyrinthRangeStruct.range.width; i++) { //如果不是门 if (!CheckNearDoor((int)labyrinthRangeStruct.range.xMin + i, (int)labyrinthRangeStruct.range.yMax, labyrinthRangeStruct)) { WallCornerStruct wallCornerStruct_Left = new WallCornerStruct() { angle = 180, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3((labyrinthRangeStruct.range.xMin + i) * pixel, 0, labyrinthRangeStruct.range.yMax * pixel) }; AddCorner(wallCornerStruct_Left); for (int j = 0; j < pixel - 1; j++) { CreateWallAction( new Vector3( (labyrinthRangeStruct.range.xMin + i) * pixel + j + 1, 0, labyrinthRangeStruct.range.yMax * pixel), 180); } WallCornerStruct wallCornerStruct_Right = new WallCornerStruct() { angle = 180, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3((labyrinthRangeStruct.range.xMin + i + 1) * pixel, 0, labyrinthRangeStruct.range.yMax * pixel) }; AddCorner(wallCornerStruct_Right); } else//如果是门 { if (i > 0) //左上 { WallCornerStruct wallCornerStruct_Left = new WallCornerStruct() { angle = 90, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3((labyrinthRangeStruct.range.xMin + i) * pixel, 0, labyrinthRangeStruct.range.yMax * pixel) }; AddCorner(wallCornerStruct_Left); } if (i < labyrinthRangeStruct.range.width - 1)//右上 { WallCornerStruct wallCornerStruct_Right = new WallCornerStruct() { angle = 180, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3((labyrinthRangeStruct.range.xMin + i + 1) * pixel, 0, labyrinthRangeStruct.range.yMax * pixel) }; AddCorner(wallCornerStruct_Right); } } } //下 for (int i = 0; i < labyrinthRangeStruct.range.width; i++) { //如果不是门 if (!CheckNearDoor((int)labyrinthRangeStruct.range.xMin + i, (int)labyrinthRangeStruct.range.yMin - 1, labyrinthRangeStruct)) { WallCornerStruct wallCornerStruct_Left = new WallCornerStruct() { angle = 0, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3((labyrinthRangeStruct.range.xMin + i) * pixel, 0, labyrinthRangeStruct.range.yMin * pixel) }; AddCorner(wallCornerStruct_Left); for (int j = 0; j < pixel - 1; j++) { CreateWallAction( new Vector3( (labyrinthRangeStruct.range.xMin + i) * pixel + j + 1, 0, labyrinthRangeStruct.range.yMin * pixel), 0); } WallCornerStruct wallCornerStruct_Right = new WallCornerStruct() { angle = 0, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3((labyrinthRangeStruct.range.xMin + i + 1) * pixel, 0, labyrinthRangeStruct.range.yMin * pixel) }; AddCorner(wallCornerStruct_Right); } else//如果是门 { if (i > 0) //左下 { WallCornerStruct wallCornerStruct_Left = new WallCornerStruct() { angle = 0, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3((labyrinthRangeStruct.range.xMin + i) * pixel, 0, labyrinthRangeStruct.range.yMin * pixel) }; AddCorner(wallCornerStruct_Left); } if (i < labyrinthRangeStruct.range.width - 1)//右下 { WallCornerStruct wallCornerStruct_Right = new WallCornerStruct() { angle = -90, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3((labyrinthRangeStruct.range.xMin + i + 1) * pixel, 0, labyrinthRangeStruct.range.yMin * pixel) }; AddCorner(wallCornerStruct_Right); } } } //左 for (int i = 0; i < labyrinthRangeStruct.range.height; i++) { //如果不是门 if (!CheckNearDoor((int)labyrinthRangeStruct.range.xMin - 1, (int)labyrinthRangeStruct.range.yMin + i, labyrinthRangeStruct)) { WallCornerStruct wallCornerStruct_Down = new WallCornerStruct() { angle = 90, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(labyrinthRangeStruct.range.xMin * pixel, 0, (labyrinthRangeStruct.range.yMin + i) * pixel) }; AddCorner(wallCornerStruct_Down); for (int j = 0; j < pixel - 1; j++) { CreateWallAction( new Vector3( labyrinthRangeStruct.range.xMin * pixel, 0, (labyrinthRangeStruct.range.yMin + i) * pixel + j + 1), 90); } WallCornerStruct wallCornerStruct_Up = new WallCornerStruct() { angle = 90, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(labyrinthRangeStruct.range.xMin * pixel, 0, (labyrinthRangeStruct.range.yMin + i + 1) * pixel) }; AddCorner(wallCornerStruct_Up); } else//如果是门 { if (i > 0)//左下 { WallCornerStruct wallCornerStruct_Down = new WallCornerStruct() { angle = 0, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3(labyrinthRangeStruct.range.xMin * pixel, 0, (labyrinthRangeStruct.range.yMin + i) * pixel) }; AddCorner(wallCornerStruct_Down); } if (i < labyrinthRangeStruct.range.height - 1)//左上 { WallCornerStruct wallCornerStruct_Up = new WallCornerStruct() { angle = 90, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3(labyrinthRangeStruct.range.xMin * pixel, 0, (labyrinthRangeStruct.range.yMin + i + 1) * pixel) }; AddCorner(wallCornerStruct_Up); } } } //右 for (int i = 0; i < labyrinthRangeStruct.range.height; i++) { //如果不是门 if (!CheckNearDoor((int)labyrinthRangeStruct.range.xMax, (int)labyrinthRangeStruct.range.yMin + i, labyrinthRangeStruct)) { WallCornerStruct wallCornerStruct_Down = new WallCornerStruct() { angle = -90, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(labyrinthRangeStruct.range.xMax * pixel, 0, (labyrinthRangeStruct.range.yMin + i) * pixel) }; AddCorner(wallCornerStruct_Down); for (int j = 0; j < pixel - 1; j++) { CreateWallAction( new Vector3( labyrinthRangeStruct.range.xMax * pixel, 0, (labyrinthRangeStruct.range.yMin + i) * pixel + j + 1), -90); } WallCornerStruct wallCornerStruct_Up = new WallCornerStruct() { angle = -90, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(labyrinthRangeStruct.range.xMax * pixel, 0, (labyrinthRangeStruct.range.yMin + i + 1) * pixel) }; AddCorner(wallCornerStruct_Up); } else//如果是门 { if (i > 0)//右下 { WallCornerStruct wallCornerStruct_Down = new WallCornerStruct() { angle = -90, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3(labyrinthRangeStruct.range.xMax * pixel, 0, (labyrinthRangeStruct.range.yMin + i) * pixel) }; AddCorner(wallCornerStruct_Down); } if (i < labyrinthRangeStruct.range.height - 1)//右上 { WallCornerStruct wallCornerStruct_Up = new WallCornerStruct() { angle = 180, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3(labyrinthRangeStruct.range.xMax * pixel, 0, (labyrinthRangeStruct.range.yMin + i + 1) * pixel) }; AddCorner(wallCornerStruct_Up); } } } //左上角 bool leftUp_L = CheckNearDoor((int)labyrinthRangeStruct.range.xMin - 1, (int)labyrinthRangeStruct.range.yMax - 1, labyrinthRangeStruct); bool leftUp_U = CheckNearDoor((int)labyrinthRangeStruct.range.xMin, (int)labyrinthRangeStruct.range.yMax, labyrinthRangeStruct); WallCornerStruct.CornerEnum leftUp_Type = WallCornerStruct.CornerEnum.Connect; float leftUp_Angle = 90; if (leftUp_L && leftUp_U) { leftUp_Type = WallCornerStruct.CornerEnum.Out; } else if (!leftUp_L && !leftUp_U) { leftUp_Type = WallCornerStruct.CornerEnum.In; } WallCornerStruct wallCornerStruct_LeftUP = new WallCornerStruct() { angle = leftUp_Angle, cornerType = leftUp_Type, pos = new Vector3(labyrinthRangeStruct.range.xMin * pixel, 0, labyrinthRangeStruct.range.yMax * pixel) }; AddCorner(wallCornerStruct_LeftUP); //左下角 bool leftDown_L = CheckNearDoor((int)labyrinthRangeStruct.range.xMin - 1, (int)labyrinthRangeStruct.range.yMin, labyrinthRangeStruct); bool leftDown_D = CheckNearDoor((int)labyrinthRangeStruct.range.xMin, (int)labyrinthRangeStruct.range.yMin - 1, labyrinthRangeStruct); WallCornerStruct.CornerEnum leftDown_Type = WallCornerStruct.CornerEnum.Connect; float leftDown_Angle = 0; if (leftDown_L && leftDown_D) { leftDown_Type = WallCornerStruct.CornerEnum.Out; } else if (!leftDown_L && !leftDown_D) { leftDown_Type = WallCornerStruct.CornerEnum.In; } WallCornerStruct wallCornerStruct_LeftDown = new WallCornerStruct() { angle = leftDown_Angle, cornerType = leftDown_Type, pos = new Vector3(labyrinthRangeStruct.range.xMin * pixel, 0, labyrinthRangeStruct.range.yMin * pixel) }; AddCorner(wallCornerStruct_LeftDown); //右下角 bool rightDown_R = CheckNearDoor((int)labyrinthRangeStruct.range.xMax, (int)labyrinthRangeStruct.range.yMin, labyrinthRangeStruct); bool rightDown_D = CheckNearDoor((int)labyrinthRangeStruct.range.xMax - 1, (int)labyrinthRangeStruct.range.yMin - 1, labyrinthRangeStruct); WallCornerStruct.CornerEnum rightDown_Type = WallCornerStruct.CornerEnum.Connect; float rightDown_Angle = -90; if (rightDown_R && rightDown_D) { rightDown_Type = WallCornerStruct.CornerEnum.Out; } else if (!rightDown_R && !rightDown_D) { rightDown_Type = WallCornerStruct.CornerEnum.In; } WallCornerStruct wallCornerStruct_RightDown = new WallCornerStruct() { angle = rightDown_Angle, cornerType = rightDown_Type, pos = new Vector3(labyrinthRangeStruct.range.xMax * pixel, 0, labyrinthRangeStruct.range.yMin * pixel) }; AddCorner(wallCornerStruct_RightDown); //右上角 bool rightUp_R = CheckNearDoor((int)labyrinthRangeStruct.range.xMax, (int)labyrinthRangeStruct.range.yMax - 1, labyrinthRangeStruct); bool rightUp_U = CheckNearDoor((int)labyrinthRangeStruct.range.xMax - 1, (int)labyrinthRangeStruct.range.yMax, labyrinthRangeStruct); WallCornerStruct.CornerEnum rightUp_Type = WallCornerStruct.CornerEnum.Connect; float rightUp_Angle = 180; if (rightUp_R && rightUp_U) { rightUp_Type = WallCornerStruct.CornerEnum.Out; } else if (!rightUp_R && !rightUp_U) { rightUp_Type = WallCornerStruct.CornerEnum.In; } WallCornerStruct wallCornerStruct_RightUp = new WallCornerStruct() { angle = rightUp_Angle, cornerType = rightUp_Type, pos = new Vector3(labyrinthRangeStruct.range.xMax * pixel, 0, labyrinthRangeStruct.range.yMax * pixel) }; AddCorner(wallCornerStruct_RightUp); } }
/// <summary> /// 创建道路墙壁 /// </summary> /// <param name="random">随机对象</param> /// <param name="pixel">没单位的宽度</param> /// <param name="parent">父物体</param> /// <param name="wallPrefabs">墙壁预设体</param> /// <param name="wallCornerStructs">拐弯处结果,函数内部填充</param> /// <param name="parentRoadStruct">父道路结构</param> /// <param name="thisRoadStruct">当前道路结构</param> private static void CreateRoadWall( System.Random random, int pixel, GameObject parent, GameObject[] wallPrefabs, List <WallCornerStruct> wallCornerStructs, LabyrinthRoadStruct parentRoadStruct, LabyrinthRoadStruct thisRoadStruct) { //各个方向是否存在墙壁 bool up = true, down = true, left = true, right = true; //使用当前道路结构的位置减去父道路结构的位置,计算通路方向,有通路则改变对应的值为false Action <Vector2> ChangeBool = (v) => { if (v.x > 0.5f) { left = false; return; } if (v.x < -0.5f) { right = false; return; } if (v.y > 0.5f) { down = false; return; } if (v.y < -0.5f) { up = false; return; } }; if (parentRoadStruct != null) { Vector2 v = thisRoadStruct.value - parentRoadStruct.value; ChangeBool(v); if (thisRoadStruct.type == LabyrinthPiecemealType.Door)//如果该点是门 { if (!up) { down = false; } if (!down) { up = false; } if (!left) { right = false; } if (!right) { left = false; } } } foreach (LabyrinthRoadStruct child in thisRoadStruct.nextRoad) { Vector2 v = thisRoadStruct.value - child.value; ChangeBool(v); } int wallLength = wallPrefabs.Length; if (up)//上方存在墙体 { for (int i = 0; i < pixel - 1; i++) { int r = random.Next(0, wallLength); GameObject createObj = GameObject.Instantiate <GameObject>(wallPrefabs[r]); createObj.name = "wall_" + thisRoadStruct.value.x + "_" + thisRoadStruct.value.y + "_up_" + i; createObj.transform.position = new Vector3( thisRoadStruct.value.x * pixel + i + 1f, 0, thisRoadStruct.value.y * pixel + pixel ); createObj.transform.eulerAngles = new Vector3(0, 180, 0); createObj.transform.SetParent(parent.transform); } //设置连接墙 if (!left && thisRoadStruct.type != LabyrinthPiecemealType.Door)//如果左侧不存在墙体,并且该点不是门 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 180, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(thisRoadStruct.value.x * pixel, 0, thisRoadStruct.value.y * pixel + pixel) }; if (!wallCornerStructs.Contains(wallCornerStruct)) { wallCornerStructs.Add(wallCornerStruct); } } if (!right && thisRoadStruct.type != LabyrinthPiecemealType.Door)//如果右测不存在墙体,并且该点不是门 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 180, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(thisRoadStruct.value.x * pixel + pixel, 0, thisRoadStruct.value.y * pixel + pixel) }; if (!wallCornerStructs.Contains(wallCornerStruct)) { wallCornerStructs.Add(wallCornerStruct); } } //设置拐角 if (left)//如果左侧也存在墙体,左上角内角度 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 90, cornerType = WallCornerStruct.CornerEnum.In, pos = new Vector3(thisRoadStruct.value.x * pixel, 0, thisRoadStruct.value.y * pixel + pixel) }; int index = wallCornerStructs.IndexOf(wallCornerStruct); if (index < 0 || wallCornerStructs[index].cornerType == WallCornerStruct.CornerEnum.Connect) { if (index >= 0) { wallCornerStructs.RemoveAt(index); } wallCornerStructs.Add(wallCornerStruct); } } if (right)//如果右侧也存在墙体,右上角内角度 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 180, cornerType = WallCornerStruct.CornerEnum.In, pos = new Vector3(thisRoadStruct.value.x * pixel + pixel, 0, thisRoadStruct.value.y * pixel + pixel) }; int index = wallCornerStructs.IndexOf(wallCornerStruct); if (index < 0 || wallCornerStructs[index].cornerType == WallCornerStruct.CornerEnum.Connect) { if (index >= 0) { wallCornerStructs.RemoveAt(index); } wallCornerStructs.Add(wallCornerStruct); } } } else//上方不存在墙体 { if (!left)//左侧也不存在墙体,左上角外角度 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 90, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3(thisRoadStruct.value.x * pixel, 0, thisRoadStruct.value.y * pixel + pixel) }; int index = wallCornerStructs.IndexOf(wallCornerStruct); if (index < 0 || wallCornerStructs[index].cornerType == WallCornerStruct.CornerEnum.Connect) { if (index >= 0) { wallCornerStructs.RemoveAt(index); } wallCornerStructs.Add(wallCornerStruct); } } if (!right)//右侧也不存在墙体,右上角外角度 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 180, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3(thisRoadStruct.value.x * pixel + pixel, 0, thisRoadStruct.value.y * pixel + pixel) }; int index = wallCornerStructs.IndexOf(wallCornerStruct); if (index < 0 || wallCornerStructs[index].cornerType == WallCornerStruct.CornerEnum.Connect) { if (index >= 0) { wallCornerStructs.RemoveAt(index); } wallCornerStructs.Add(wallCornerStruct); } } } if (down)//下方存在墙体 { for (int i = 0; i < pixel - 1; i++) { int r = random.Next(0, wallLength); GameObject createObj = GameObject.Instantiate <GameObject>(wallPrefabs[r]); createObj.name = "wall_" + thisRoadStruct.value.x + "_" + thisRoadStruct.value.y + "_down_" + i; createObj.transform.position = new Vector3( thisRoadStruct.value.x * pixel + i + 1, 0, thisRoadStruct.value.y * pixel ); createObj.transform.eulerAngles = new Vector3(0, 0, 0); createObj.transform.SetParent(parent.transform); } //设置连接墙 if (!left && thisRoadStruct.type != LabyrinthPiecemealType.Door)//如果左侧不存在墙体,并且该点不是门 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 0, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(thisRoadStruct.value.x * pixel, 0, thisRoadStruct.value.y * pixel) }; if (!wallCornerStructs.Contains(wallCornerStruct)) { wallCornerStructs.Add(wallCornerStruct); } } if (!right && thisRoadStruct.type != LabyrinthPiecemealType.Door)//如果右测不存在墙体,并且该点不是门 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 0, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(thisRoadStruct.value.x * pixel + pixel, 0, thisRoadStruct.value.y * pixel) }; if (!wallCornerStructs.Contains(wallCornerStruct)) { wallCornerStructs.Add(wallCornerStruct); } } //设置拐角 if (left)//如果左侧也存在墙体,左下角内角度 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 0, cornerType = WallCornerStruct.CornerEnum.In, pos = new Vector3(thisRoadStruct.value.x * pixel, 0, thisRoadStruct.value.y * pixel) }; int index = wallCornerStructs.IndexOf(wallCornerStruct); if (index < 0 || wallCornerStructs[index].cornerType == WallCornerStruct.CornerEnum.Connect) { if (index >= 0) { wallCornerStructs.RemoveAt(index); } wallCornerStructs.Add(wallCornerStruct); } } if (right)//如果右侧也存在墙体,右下角内角度 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = -90, cornerType = WallCornerStruct.CornerEnum.In, pos = new Vector3(thisRoadStruct.value.x * pixel + pixel, 0, thisRoadStruct.value.y * pixel) }; int index = wallCornerStructs.IndexOf(wallCornerStruct); if (index < 0 || wallCornerStructs[index].cornerType == WallCornerStruct.CornerEnum.Connect) { if (index >= 0) { wallCornerStructs.RemoveAt(index); } wallCornerStructs.Add(wallCornerStruct); } } } else//下方不存在墙体 { if (!left)//左侧也不存在墙体,左下角内角度 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 0, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3(thisRoadStruct.value.x * pixel, 0, thisRoadStruct.value.y * pixel) }; int index = wallCornerStructs.IndexOf(wallCornerStruct); if (index < 0 || wallCornerStructs[index].cornerType == WallCornerStruct.CornerEnum.Connect) { if (index >= 0) { wallCornerStructs.RemoveAt(index); } wallCornerStructs.Add(wallCornerStruct); } } if (!right)//右侧也不存在墙体,右下角内角度 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = -90, cornerType = WallCornerStruct.CornerEnum.Out, pos = new Vector3(thisRoadStruct.value.x * pixel + pixel, 0, thisRoadStruct.value.y * pixel) }; int index = wallCornerStructs.IndexOf(wallCornerStruct); if (index < 0 || wallCornerStructs[index].cornerType == WallCornerStruct.CornerEnum.Connect) { if (index >= 0) { wallCornerStructs.RemoveAt(index); } wallCornerStructs.Add(wallCornerStruct); } } } if (left)//左侧存在墙体 { for (int i = 0; i < pixel - 1; i++) { int r = random.Next(0, wallLength); GameObject createObj = GameObject.Instantiate <GameObject>(wallPrefabs[r]); createObj.name = "wall_" + thisRoadStruct.value.x + "_" + thisRoadStruct.value.y + "_left_" + i; createObj.transform.position = new Vector3( thisRoadStruct.value.x * pixel, 0, thisRoadStruct.value.y * pixel + i + 1 ); createObj.transform.eulerAngles = new Vector3(0, 90, 0); createObj.transform.SetParent(parent.transform); } //设置连接墙 if (!up && thisRoadStruct.type != LabyrinthPiecemealType.Door)//如果上方不存在墙体,并且该点不是门 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 90, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(thisRoadStruct.value.x * pixel, 0, thisRoadStruct.value.y * pixel + pixel) }; if (!wallCornerStructs.Contains(wallCornerStruct)) { wallCornerStructs.Add(wallCornerStruct); } } if (!down && thisRoadStruct.type != LabyrinthPiecemealType.Door)//如果下方不存在墙体,并且该点不是门 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = 90, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(thisRoadStruct.value.x * pixel, 0, thisRoadStruct.value.y * pixel) }; if (!wallCornerStructs.Contains(wallCornerStruct)) { wallCornerStructs.Add(wallCornerStruct); } } } if (right)//右侧存在墙体 { for (int i = 0; i < pixel - 1; i++) { int r = random.Next(0, wallLength); GameObject createObj = GameObject.Instantiate <GameObject>(wallPrefabs[r]); createObj.name = "wall_" + thisRoadStruct.value.x + "_" + thisRoadStruct.value.y + "_right_" + i; createObj.transform.position = new Vector3( thisRoadStruct.value.x * pixel + pixel, 0, thisRoadStruct.value.y * pixel + i + 1 ); createObj.transform.eulerAngles = new Vector3(0, -90, 0); createObj.transform.SetParent(parent.transform); } //设置连接墙 if (!up && thisRoadStruct.type != LabyrinthPiecemealType.Door)//如果上方不存在墙体,并且该点不是门 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = -90, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(thisRoadStruct.value.x * pixel + pixel, 0, thisRoadStruct.value.y * pixel + pixel) }; if (!wallCornerStructs.Contains(wallCornerStruct)) { wallCornerStructs.Add(wallCornerStruct); } } if (!down && thisRoadStruct.type != LabyrinthPiecemealType.Door)//如果下方不存在墙体,并且该点不是门 { WallCornerStruct wallCornerStruct = new WallCornerStruct() { angle = -90, cornerType = WallCornerStruct.CornerEnum.Connect, pos = new Vector3(thisRoadStruct.value.x * pixel + pixel, 0, thisRoadStruct.value.y * pixel) }; if (!wallCornerStructs.Contains(wallCornerStruct)) { wallCornerStructs.Add(wallCornerStruct); } } } //继续便利子节点 foreach (LabyrinthRoadStruct child in thisRoadStruct.nextRoad) { CreateRoadWall(random, pixel, parent, wallPrefabs, wallCornerStructs, thisRoadStruct, child); } }