/// <summary> /// 自动检测建筑的朝向规则 /// </summary> public virtual void AutoCheckBuildRule() { List <BuildBase> listData = BuildHandler.Instance.manager.GetAroundBuildBase(this); BuildRuleEnum buildRule = GetBuildRule(listData); ChangeBuildRule(buildRule); }
/// <summary> /// 设置建筑模型 /// </summary> /// <param name="buildRule"></param> public virtual void SetBuildModel(BuildRuleEnum buildRule) { GameObject objModel = BuildHandler.Instance.manager.GetBuildBaseModel(this, buildRule, "def"); if (objModel == null) { return; } if (objBuildModel) { DestroyImmediate(objBuildModel); objBuildModel = null; } objBuildModel = Instantiate(gameObject, objModel); //Renderer[] listRenderer = objBuildModel.GetComponentsInChildren<Renderer>(); //if (listRenderer != null) //{ // foreach (Renderer itemRenderer in listRenderer) // { // Shader shader= Shader.Find("Color/MasterShaderLocalSpace"); // itemRenderer.material.shader = shader; // } //} objBuildModel.transform.localPosition = Vector3.zero; objBuildModel.transform.eulerAngles = Vector3.zero; objBuildModel.transform.localScale = Vector3.one; }
/// <summary> /// 获取建筑模型 /// </summary> /// <param name="buildTypeEnum"></param> /// <param name="name"></param> /// <param name="buildRule"></param> public GameObject GetBuildBaseModel(BuildBase centerBuildBase, BuildRuleEnum buildRule, string name) { if (dicBuildBaseForBuilding.TryGetValue(name, out BuildBaseManager buildBaseManager)) { List <BuildBase> listAroundBuildBase = GetAroundBuildBase(centerBuildBase); return(buildBaseManager.GetBuildBaseModel(listAroundBuildBase, centerBuildBase, buildRule)); } return(null); }
/// <summary> /// 修改建造规则 /// </summary> public virtual void ChangeBuildRule(BuildRuleEnum buildRule) { //方向不同时才修改模型 if (buildRule == buildBaseData.GetBuildRule()) { return; } buildBaseData.SetBuildRule(buildRule); SetBuildModel(buildRule); AnimForChangeRule(); }
/// <summary> /// 添加所有规则 /// </summary> public void AddAllRule() { List <BuildRuleEnum> listData = EnumUtil.GetEnumValue <BuildRuleEnum>(); for (int i = 0; i < listData.Count; i++) { BuildRuleEnum itemRule = listData[i]; BuildBaseModelBean buildBaseModel = new BuildBaseModelBean(); buildBaseModel.buildRule = itemRule; listBuildRuleModel.Add(buildBaseModel); } }
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(); } }
public static void GetBuildRuleData(BuildRuleEnum buildRule, out int number, out bool up, out bool down, out bool left, out bool right, out bool before, out bool after) { int ruleTemp = (int)buildRule; number = (ruleTemp % 10000000) / 1000000; up = (ruleTemp % 1000000) / 100000 == 1 ? true : false; down = (ruleTemp % 100000) / 10000 == 1 ? true : false; left = (ruleTemp % 10000) / 1000 == 1 ? true : false; right = (ruleTemp % 1000) / 100 == 1 ? true : false; before = (ruleTemp % 100) / 10 == 1 ? true : false; after = (ruleTemp % 10) == 1 ? true : false; }
/// <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); }
public void SetBuildRule(BuildRuleEnum buildRule) { this.buildRule = (int)buildRule; }
/// <summary> /// 检测是否有下面 /// </summary> /// <param name="buildRule"></param> /// <returns></returns> public static bool CheckHasDown(BuildRuleEnum buildRule) { int ruleTemp = (int)buildRule; return((ruleTemp % 100000) / 10000 == 1 ? true : false); }