GameObject CreateObject(SpaceShipPart part) { GameObject obj = Instantiate(part.obj); obj.SetActive(true); return(obj); }
SpaceShipPart LoadPart(GameObject mesh) { SpaceShipPart part = new SpaceShipPart(); part.name = mesh.name; part.mesh = mesh.GetComponentInChildren <MeshFilter>().sharedMesh; part.connectors = new List <SpaceShipConnector>(); // Extract connectors from vertex colors Color[] colors = part.mesh.colors; int[] tris = part.mesh.triangles; Vector3[] verts = part.mesh.vertices; Vector3[] normals = part.mesh.normals; Vector3 connectorPosition = new Vector3(); Vector3 connectorNormal = new Vector3(); //Debug.Log(colors); for (int i = 0; i < tris.Length;) { if (colors[tris[i]] != Color.green) { i += 3; continue; } connectorNormal.Set(0, 0, 0); connectorPosition.Set(0, 0, 0); for (int v = i + 6; i < v; ++i) { int vIndex = tris[i]; connectorPosition += verts[vIndex]; connectorNormal += normals[vIndex]; } connectorPosition /= 6; connectorNormal /= 6; SpaceShipConnector c = new SpaceShipConnector(); c.position = connectorPosition; c.normal = connectorNormal.normalized; part.connectors.Add(c); } part.obj = Instantiate(mesh); part.obj.SetActive(false); MeshRenderer renderer = part.obj.GetComponentInChildren <MeshRenderer>(); renderer.receiveShadows = false; renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; part.obj.transform.parent = generatedParts.transform; return(part); }
public void PopUp(SpaceShipPart part) { if (part == SpaceShipPart.End) { return; } m_partImg.sprite = m_sprites[(int)part]; gameObject.SetActive(true); }
void AppendChildObjectConnectors(GameObject childObj, SpaceShipPart childPart, SpaceShipConnector usedChildConnector) { foreach (SpaceShipConnector cnt in childPart.connectors) { if (cnt == usedChildConnector) { continue; } SpaceShipConnector worldCnt = new SpaceShipConnector(); worldCnt.normal = childObj.transform.TransformDirection(cnt.normal).normalized; worldCnt.position = childObj.transform.TransformPoint(cnt.position); addOpenConnector(worldCnt); } }
void DebugConnectors(GameObject obj, SpaceShipPart part, int selected) { for (int i = 0; i < part.connectors.Count; ++i) { SpaceShipConnector c = part.connectors[i]; float angle = Vector3.Angle(Vector3.up, c.normal); Vector3 axe = Vector3.Cross(Vector3.up, c.normal); Quaternion q = Quaternion.AngleAxis(angle, axe); if (debug) { GameObject dgo = (GameObject)Instantiate(debugConnectorObject, c.position, q); dgo.transform.SetParent(obj.transform); foreach (MeshRenderer r in dgo.GetComponentsInChildren <MeshRenderer>()) { r.material.color = i == selected ? Color.yellow : Color.gray; } } } }
SpaceShipConnector pickChildConnector(SpaceShipPart childPart) { List <SpaceShipConnector> prefCnt = new List <SpaceShipConnector>(); foreach (SpaceShipConnector cnt in childPart.connectors) { if (cnt.position.x < Mathf.Epsilon && cnt.normal.x < Mathf.Epsilon) { prefCnt.Add(cnt); } } if (prefCnt.Count > 0) { return(prefCnt[(int)(UnityEngine.Random.value * (prefCnt.Count - 1))]); } else { return(childPart.connectors[(int)(UnityEngine.Random.value * (childPart.connectors.Count - 1))]); } }
public void PopUpSpaceShipDropInfo(SpaceShipPart part) { m_spcDropPopUpCtrl.PopUp(part); }
public bool CheckUnLock(SpaceShipPart spcPart) { return(!m_spcPartInfos[(int)spcPart]._lock); }
public void UnLock(SpaceShipPart part) { AudioManager.Inst.playUnlockSFX(AudioManager.eUnlockSFX.BluePrintSFX); m_spcPartInfos[(int)part]._lock = false; }
public void PickUpSpaceShipBlueprint(float dropProbability, SpaceShipBlueprintDropInfo[] dropInfos) { if (dropInfos == null || dropInfos.Length <= 0) { return; } if (dropProbability == 0) { return; } if (dropProbability < Random.Range(0, 1f)) // 드랍되지 않음 { return; } List <SpaceShipBlueprintDropInfo> _dropInfos = new List <SpaceShipBlueprintDropInfo>(); float _probabilityAcc = 0; // 확률 계산을 위한 누적치 foreach (SpaceShipBlueprintDropInfo dropInfo in dropInfos) { if (CheckUnLock(dropInfo.spaceShip) == false) { _probabilityAcc += dropInfo.probability; if (_probabilityAcc > 1f) { Debug.LogError("The _probabilityAcc for picking up turret blueprint is more than 1"); return; } SpaceShipBlueprintDropInfo _dropInfo = new SpaceShipBlueprintDropInfo(); _dropInfo.spaceShip = dropInfo.spaceShip; _dropInfo.probability = _probabilityAcc; _dropInfos.Add(_dropInfo); } } if (_dropInfos.Count <= 0) { return; } int randNum = Random.Range(0, 1); SpaceShipPart dropSpaceShip = SpaceShipPart.End; for (int i = 0; i < _dropInfos.Count; ++i) { if (randNum <= _dropInfos[i].probability) { dropSpaceShip = _dropInfos[i].spaceShip; break; } } UnLock(dropSpaceShip); BattleGameObjectMgr.Inst.PopUpSpaceShipDropInfo(dropSpaceShip); }
GameObject CreateMirrorObject(SpaceShipConnector parentConnector, GameObject childObj, SpaceShipPart childPart, SpaceShipConnector childConnector) { // Check if a mirror connector exists int mirrorConnectorIndex = getMirrorConnectorIndex(parentConnector); if (mirrorConnectorIndex == -1) { return(null); } // Instanciate the same object and mirror its matrix GameObject mirrorObj = Instantiate(childObj); mirrorObj.transform.position = Vector3.Scale(mirrorObj.transform.position, mirrorVector); mirrorObj.transform.localScale = Vector3.Scale(mirrorObj.transform.localScale, mirrorVector); mirrorObj.transform.rotation = Quaternion.Euler(Vector3.Scale(mirrorObj.transform.rotation.eulerAngles, new Vector3(1, -1, -1))); ParticleSystem[] psList = mirrorObj.GetComponentsInChildren <ParticleSystem>(); foreach (ParticleSystem ps in psList) { ps.transform.localScale = Vector3.Scale(ps.transform.localScale, mirrorVector); } // removeOpenConnector(mirrorConnectorIndex); // Add mirrored child part connectors to open connectors list AppendChildObjectConnectors(mirrorObj, childPart, childConnector); return(mirrorObj); }
GameObject CreateChildObject(GameObject parentObj, SpaceShipConnector parentConnector, SpaceShipPart childPart, SpaceShipConnector childConnector, bool addChildConnectors, bool zRotOnly) { GameObject childObj = CreateObject(childPart); //DebugConnectors(childObj, childPart, cc); AssembleParts(parentObj, parentConnector, childObj, childConnector, zRotOnly); // Add child part connectors to open connectors list if (addChildConnectors) { AppendChildObjectConnectors(childObj, childPart, childConnector); } removeOpenConnector(parentConnector); return(childObj); }
/** * Generator */ public SpaceShip GenerateShip(char[] dna) { string dnaString = new string(dna); SpaceShip se = new SpaceShip(); int previousSeed = UnityEngine.Random.seed; UnityEngine.Random.seed = dnaString.GetHashCode(); // population, population density, GINI index (equity), nuclear, CO2, weapons and manufacture. float shipNormalizedLength = Mathf.Max((float)((int)dna[0] - 65) / 26.0f, 0); float scale = scaleRange.x + (shipNormalizedLength * (scaleRange.y - scaleRange.x)); int seed = dnaString.GetHashCode(); float normalizedDisp = Mathf.Max((float)((int)dna[5] - 65) / 26.0f, 0); int iterations = (int)(iterationsRange.x + (normalizedDisp * (iterationsRange.y - iterationsRange.x))); float uniformity = Mathf.Max((float)((int)dna[1] - 65) / 26.0f, 0); float arsenal = Mathf.Max((float)((int)dna[4] - 65) / 26.0f, 0); int rockets = Mathf.Max((int)dna[2] - 65, 0); float co2 = Mathf.Max((float)((int)dna[3] - 65) / 26.0f, 0); Mathf.Max((int)dna[3] - 65, 0); co2 = debrisRange.x + (co2 * (debrisRange.y - debrisRange.x)); print("dna: " + dnaString + " seed " + seed + ", " + "scale " + scale + ", " + "iterations " + iterations + ", " + "uniformity " + uniformity + ", " + "arsenal " + arsenal + ", " + "rockets " + rockets); int f = (int)(UnityEngine.Random.value * (hulls.Count - 1)); SpaceShipPart parentPart = hulls[f]; if (debug) { Debug.Log("parent hulls: " + f); } GameObject mainObj = new GameObject(); mainObj.name = "Generated Ship"; GameObject parentObj = CreateObject(parentPart); parentObj.transform.SetParent(mainObj.transform); GameObject partsGo = new GameObject(); partsGo.transform.parent = mainObj.transform; partsGo.name = "Arsenal"; se.renderer = parentObj.GetComponent <Renderer>(); mainObj.transform.parent = rootObject.transform; openConnectors = new List <SpaceShipConnector>(); openConnectorsWeight = 0; foreach (SpaceShipConnector cnt in parentPart.connectors) { addOpenConnector(cnt); } if (addRockets) { se.rockets = generateRockets(mainObj, rockets); } int depth = 0; while (depth++ < iterations) { // Pick a random parent connector if (openConnectors.Count == 0) { break; } SpaceShipConnector parentConnector = pickConnector(); // Pick a random child part SpaceShipPart childPart = null; int p = (int)(UnityEngine.Random.value * (parts.Count - 1)); if (debug) { Debug.Log("child part: " + p); } childPart = parts[p]; // Pick a random child connector SpaceShipConnector childConnector = pickChildConnector(childPart); if (parentConnector == null) { print("bob"); } // Create a child object and assemble the 2 parts GameObject childObj = CreateChildObject(parentObj, parentConnector, childPart, childConnector, true, false); childObj.transform.SetParent(partsGo.transform); //addedParts.Add(childObj); GameObject mirrorObj = CreateMirrorObject(parentConnector, childObj, childPart, childConnector); if (mirrorObj) { mirrorObj.transform.SetParent(partsGo.transform); //addedParts.Add(mirrorObj); } parentObj = childObj; parentPart = childPart; } generateArsenal(mainObj, arsenal, partsGo); openConnectors = null; if (combine) { Combine(mainObj); } if (computeObjectBounds) { BoxCollider collider = ComputeObjectBounds(mainObj); // Rescale Vector3 s = collider.bounds.size; print("scale " + scale); print("bounds " + s); float objectLength = Mathf.Max(s.x, Mathf.Max(s.y, s.z)); print("objectLength " + objectLength); float localScale = scale / objectLength; print("localScale " + localScale); mainObj.transform.localScale = new Vector3(localScale, localScale, localScale); } // Debug.Log("collider.bounds.size "+collider.bounds.size); mainObj.transform.Rotate(new Vector3(0, 180, 0)); currentMaterial = materials[UnityEngine.Random.Range(0, materials.Length)]; MeshRenderer mainObjRenderer = mainObj.GetComponentInChildren <MeshRenderer>(); if (mainObjRenderer != null) { if (debug) { mainObjRenderer.sharedMaterial = this.debugMaterial; } else { mainObjRenderer.sharedMaterial = currentMaterial; } } GameObject rocketsGo = se.rockets; if (rocketsGo) { for (int i = 0; i < rocketsGo.transform.childCount; i++) { GameObject go = rocketsGo.transform.GetChild(i).gameObject; MeshRenderer r = go.GetComponentInChildren <MeshRenderer>(); if (r != null) { if (debug) { r.sharedMaterial = this.debugMaterial; } else { r.sharedMaterial = currentMaterial; // r.material.color = UnityEngine.Random.ColorHSV(0, 1, 0, 1,0,1); } } } } if (partsGo) { for (int i = 0; i < partsGo.transform.childCount; i++) { GameObject go = partsGo.transform.GetChild(i).gameObject; MeshRenderer r = go.GetComponentInChildren <MeshRenderer>(); if (r != null) { if (debug) { r.sharedMaterial = this.debugMaterial; } else { r.sharedMaterial = currentMaterial; } } } } se.main = mainObj; se.parts = partsGo; if (debrisParticleSystem != null) { ParticleSystem.EmissionModule pe = debrisParticleSystem.emission; pe.rateOverTime = co2; debrisParticleSystem.Clear(); debrisParticleSystem.Simulate(debrisParticleSystem.main.duration); debrisParticleSystem.Play(); ParticleSystem.ShapeModule ps = debrisParticleSystem.shape; Bounds b = se.main.GetComponent <Collider>().bounds; ps.angle = 27; ps.length = b.size.z; Vector3 tp = debrisParticleSystem.transform.localPosition; tp.z = b.size.z * 0.25f; debrisParticleSystem.transform.localPosition = tp; } return(se); }