public void CreateAllBuild(string modelName) { BuildHandler.Instance.manager.LoadBuildBaseRes(BuildTypeEnum.Building, modelName); List <BuildRuleEnum> ruleList = EnumUtil.GetEnumValue <BuildRuleEnum>(); for (int i = 0; i < ruleList.Count; i++) { BuildRuleEnum itemRule = ruleList[i]; GameObject objModel = BuildHandler.Instance.manager.GetBuildBaseModel(null, itemRule, modelName); GameObject objBuild = Instantiate(gameObject, modelBuilding.gameObject); BuildBase buildBase = objBuild.GetComponent <BuildBase>(); BuildBaseBean buildBaseData = new BuildBaseBean(); Vector3 centerPostion = new Vector3(i * 5, 0, 0); buildBaseData.SetBuildPosition(centerPostion); buildBaseData.SetBuildRule(itemRule); buildBaseData.SetBuildType(BuildTypeEnum.Building); buildBase.SetBuilBaseData(buildBaseData); objBuild.transform.position = centerPostion; BuildHandler.Instance.manager.AddBuildBase(buildBase); buildBase.AutoCheckBuildRule(); BuildRuleEnumTool.GetBuildRuleData(itemRule, out int number, out bool up, out bool down, out bool left, out bool right, out bool before, out bool after); if (up) { CreateBuildItem(centerPostion + new Vector3(0, 1, 0)); } if (down) { CreateBuildItem(centerPostion + new Vector3(0, -1, 0)); } if (left) { CreateBuildItem(centerPostion + new Vector3(-1, 0, 0)); } if (right) { CreateBuildItem(centerPostion + new Vector3(1, 0, 0)); } if (before) { CreateBuildItem(centerPostion + new Vector3(0, 0, -1)); } if (after) { CreateBuildItem(centerPostion + new Vector3(0, 0, 1)); } buildBase.AutoCheckBuildRule(); } }
/// <summary> /// 获取建筑模型 /// </summary> /// <param name="buildRule"></param> /// <returns></returns> public GameObject GetBuildBaseModel(List <BuildBase> listAroundBuildBase, BuildBase centerBuildBase, BuildRuleEnum buildRule) { if (dicBuildRule.TryGetValue(buildRule, out BuildBaseModelBean modelData)) { if (modelData != null) { if (!CheckUtil.ListIsNull(listAroundBuildBase)) { //是否有地面方块 bool hasGround = false; BuildRuleEnum centerBuildRule = centerBuildBase.buildBaseData.GetBuildRule(); //检测周围方块 for (int i = 0; i < listAroundBuildBase.Count; i++) { BuildBase itemBuildBase = listAroundBuildBase[i]; //检测是否下面有砖块,并且砖块为地基 if (BuildRuleEnumTool.CheckHasDown(centerBuildRule) && (itemBuildBase.buildBaseData.GetBuildType() == BuildTypeEnum.Foundation || itemBuildBase.buildBaseData.GetBuildType() == BuildTypeEnum.Ground)) { hasGround = true; } } //如果有地面方块,则使用地基层 if (hasGround) { if (!CheckUtil.ListIsNull(modelData.listBaseModel)) { return(RandomUtil.GetRandomDataByList(modelData.listBaseModel)); } } } if (!CheckUtil.ListIsNull(modelData.listObjModel)) { return(RandomUtil.GetRandomDataByList(modelData.listObjModel)); } } } if (dicBuildRule.TryGetValue(BuildRuleEnum.Zero, out BuildBaseModelBean modelDataZero)) { if (!CheckUtil.ListIsNull(modelDataZero.listObjModel)) { return(modelDataZero.listObjModel[0]); } } return(null); }
/// <summary> /// 获取建筑规则 /// </summary> /// <param name="listData"></param> public virtual BuildRuleEnum GetBuildRule(List <BuildBase> listData) { bool upRule = false; bool downRule = false; bool leftRule = false; bool rightRule = false; bool beforeRule = false; bool afterRule = false; for (int i = 0; i < listData.Count; i++) { BuildBase buildBase = listData[i]; Vector3 tempRule = (buildBaseData.buildPosition.GetVector3() - buildBase.buildBaseData.buildPosition.GetVector3()); if (tempRule.y == 1) { downRule = true; } if (tempRule.y == -1) { upRule = true; } if (tempRule.x == 1) { leftRule = true; } if (tempRule.x == -1) { rightRule = true; } if (tempRule.z == 1) { beforeRule = true; } if (tempRule.z == -1) { afterRule = true; } } return(BuildRuleEnumTool.GetBuildRule(listData.Count, upRule, downRule, leftRule, rightRule, beforeRule, afterRule)); }