コード例 #1
0
    GameObject CreateObject(SpaceShipPart part)
    {
        GameObject obj = Instantiate(part.obj);

        obj.SetActive(true);

        return(obj);
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    public void PopUp(SpaceShipPart part)
    {
        if (part == SpaceShipPart.End)
        {
            return;
        }

        m_partImg.sprite = m_sprites[(int)part];

        gameObject.SetActive(true);
    }
コード例 #4
0
    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);
        }
    }
コード例 #5
0
    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;
                }
            }
        }
    }
コード例 #6
0
    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))]);
        }
    }
コード例 #7
0
 public void PopUpSpaceShipDropInfo(SpaceShipPart part)
 {
     m_spcDropPopUpCtrl.PopUp(part);
 }
コード例 #8
0
 public bool CheckUnLock(SpaceShipPart spcPart)
 {
     return(!m_spcPartInfos[(int)spcPart]._lock);
 }
コード例 #9
0
    public void UnLock(SpaceShipPart part)
    {
        AudioManager.Inst.playUnlockSFX(AudioManager.eUnlockSFX.BluePrintSFX);

        m_spcPartInfos[(int)part]._lock = false;
    }
コード例 #10
0
    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);
    }
コード例 #11
0
    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);
    }
コード例 #12
0
    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);
    }
コード例 #13
0
    /**
     * 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);
    }