void CreateUnitPrefab(UnitData unitData) { var unitGameObject = new GameObject("Unit" + unitData.textId); unitGameObject.layer = LayerMask.NameToLayer("Unit"); var unitModule = unitGameObject.AddComponent <Unit>(); unitModule.SetUnitData(unitData); var model = new GameObject("Model"); model.transform.SetParent(unitGameObject.transform); model.transform.localPosition = Vector3.zero; var realModel = Instantiate(unitData.unitModel, model.transform); realModel.transform.localPosition = Vector3.zero; if (unitData.addsElectricity > 0 || unitData.usesElectricity > 0) { unitGameObject.AddComponent <ElectricityModule>(); } if (!unitGameObject.GetComponent <BoxCollider>()) { unitGameObject.AddComponent <BoxCollider>(); } if (unitData.canBeDestroyed) { unitGameObject.AddComponent <Damageable>(); } if (unitData.hasMoveModule) { unitGameObject.AddComponent <Movable>(); } if (unitData.hasAttackModule) { var attackable = unitGameObject.AddComponent <Attackable>(); var shootPoints = model.transform.GetAllChilds(true).FindAll(ch => ch.name.ToLower().StartsWith("shootpoint")); attackable.SetShootPoints(shootPoints); } if (unitData.hasTurret) { var turret = unitGameObject.AddComponent <Tower>(); var turretTransform = model.transform.GetAllChilds(true).Find(ch => ch.name.ToLower().StartsWith("turretbone")); turret.SetTurretTransform(turretTransform); } if (unitData.isHarvester) { unitGameObject.AddComponent <Harvester>(); } if (unitData.isRefinery) { unitGameObject.AddComponent <Refinery>(); } if (unitData.isProduction) { for (var i = 0; i < unitData.productionCategories.Count; i++) { var production = unitGameObject.AddComponent <Production>(); production.SetCategoryId(i); // todo find spawnpoint and waypoint bones and set it to prod } } if (unitData.isInfantry) { unitGameObject.AddComponent <Infantry>(); var animator = unitGameObject.AddComponent <Animator>(); if (unitData.animatorController) { animator.runtimeAnimatorController = unitData.animatorController; } } unitGameObject.AddComponent <FogOfWarModule>(); if (unitData.canCarryUnitsCount > 0) { unitGameObject.AddComponent <CarryModule>(); } var wheelsBones = model.transform.GetAllChilds(true).FindAll(ch => ch.name.ToLower().StartsWith("wheelbone")); if (wheelsBones.Count > 0) { var wheelsComponent = unitGameObject.AddComponent <Wheels>(); wheelsComponent.SetupWheels(wheelsBones); } unitGameObject.AddComponent <AudioSource>(); if (!AssetDatabase.IsValidFolder("Assets/Prefabs")) { AssetDatabase.CreateFolder("Assets", "Prefabs"); } if (!AssetDatabase.IsValidFolder("Assets/Prefabs/Units")) { AssetDatabase.CreateFolder("Assets/Prefabs", "Units"); } // todo add support of 2019 etc - SaveAsAsset or what var prefab = PrefabUtility.CreatePrefab("Assets/Prefabs/Units/Unit" + unitData.textId + ".prefab", unitGameObject); PrefabUtility.ConnectGameObjectToPrefab(unitGameObject, prefab); //AssetDatabase.Refresh(); unitData.selfPrefab = prefab; // PrefabUtility.GetCorrespondingObjectFromSource(unitGameObject) as GameObject; EditorUtility.SetDirty(unitData); }