コード例 #1
0
    IEnumerator DestroyHouse(Vector3 hitpoint)
    {
        Object.Destroy(GetComponent <MeshCollider>());
        List <Vector3>     upvertice = new List <Vector3>();
        int                ind;
        HouseActivityParam p = new HouseActivityParam();

        for (int i = 0; i < thicktriangles.Length / 6; i += 3)
        {
            ind = i * 3;
            if (thickvertice[thicktriangles[ind]].y > hitpoint.y)
            {
                if (thickvertice[thicktriangles[ind + 1]].y > hitpoint.y)
                {
                    if (thickvertice[thicktriangles[ind + 2]].y > hitpoint.y)
                    {
                        upvertice.Add(thickvertice[thicktriangles[ind]]);
                    }
                }
            }
        }
        int   n        = upvertice.Count;
        float tmpspeed = transform.localScale.y / n;

        if (upvertice.Count != 0)
        {
            for (int i = 0; i < n; i += 12)
            {
                p.hitpoint = upvertice[i];
                p.radius   = destroyradius;
                p.colflag  = false;
                p.destroy  = true;
                //			StartCoroutine("ReBuildHouse",p);
                ReBuildHouse(p);
                if (i % 4 == 0)
                {
                    yield return(new WaitForSeconds(0f));
                }
            }
        }

        Vector3 piecevert;

        for (int i = 0; i < piececount; i++)
        {
            int index = (Random.Range(0, thicktriangles.Length / 6 - 1)) * 3;
            piecevert = thickvertice[thicktriangles[index]];
            if ((!upvertice.Contains(piecevert)) && (thicktriangles[index] != 0))
            {
                p.hitpoint = piecevert;
                p.radius   = destroyradius;
                p.colflag  = false;
                p.destroy  = true;
                ReBuildHouse(p);
                yield return(new WaitForSeconds(0.01f));
            }
        }
        Object.Destroy(GetComponent <MeshRenderer>());
        Destroy(gameObject, 10.0f);
    }
    void OnHit(HouseActivityParam param)
    {
        float   ang = 0.0f;
        Vector3 tmp;

        if (!animFlag && !hitFlag)
        {
            networkView.RPC("OnHitRPC", RPCMode.Others, param.origin);
            hitFlag = true;

            Object.Destroy(GetComponent <MeshCollider>());
            tmp = param.origin - transform.position;
            tmp = Vector3.Cross(Vector3.up, tmp);
            ang = Vector3.Angle(transform.right, tmp);
            if (ang <= 90.0f)
            {
                rotWay = -1.0f;
                if (ang <= 45.0f)
                {
                    subRotFlag = false;
                }
                else
                {
                    subRotFlag = true;
                    ang        = Vector3.Angle(transform.forward, tmp);
                    if (ang > 90.0f)
                    {
                        subRotWay = 1.0f;
                    }
                    else
                    {
                        subRotWay = -1.0f;
                    }
                }
            }
            else
            {
                rotWay = 1.0f;
                if (ang >= 135.0f)
                {
                    subRotFlag = false;
                }
                else
                {
                    subRotFlag = true;
                    ang        = Vector3.Angle(transform.forward, tmp);
                    if (ang > 90.0f)
                    {
                        subRotWay = -1.0f;
                    }
                    else
                    {
                        subRotWay = +1.0f;
                    }
                }
            }
            animFlag = true;
        }
    }
    void OnShellAttacked(ShellAttackedSendMsgParam param)
    {
        Vector3            tmp = param.attackedPoint - param.direction;
        HouseActivityParam p   = new HouseActivityParam();

        p.origin = tmp;
        OnHit(p);
    }
コード例 #4
0
    IEnumerator AttackedBehaviour(ShellAttackedSendMsgParam param)
    {
        yield return(new WaitForSeconds(0.0f));

        destructedAmount += GlobalInfo.shellProperty[(int)param.attackedShellKind].destructionPower;
        GameObject.Instantiate(explosion, param.attackedPoint, Quaternion.identity);
        if (destructedAmount >= defensivePower)
        {
            destructedAmount = 0.0f;
            Vector3            hitpoint = transform.InverseTransformPoint(param.attackedPoint);
            HouseActivityParam p        = new HouseActivityParam();
            p.hitpoint = hitpoint;
            p.radius   = shotradius;
            StartCoroutine("houseactivity", p);
        }
    }
コード例 #5
0
    void OnHitRPC(Vector3 globalHitPoint, Vector3 origin)
    {
        if (!splitted)
        {
            return;
        }
        Vector3            hitPoint = transform.InverseTransformPoint(globalHitPoint);
        HouseActivityParam p        = new HouseActivityParam();

        p.hitpoint       = hitPoint;
        p.globalHitPoint = globalHitPoint;
        p.radius         = collisionscale;
        p.colflag        = true;
        p.destroy        = false;
        p.origin         = origin;
        StartCoroutine("houseactivity", p);
    }
    void OnHit(HouseActivityParam param)
    {
        if (falldowned)
        {
            return;
        }
        falldowned = true;
        psangle    = 0;
        if (thinTreeFlag)
        {
            collider.enabled = false;
        }
        Vector3 contactpoint = param.origin;
        Vector3 vectora      = contactpoint - myPos.position;

        rotationaxis = Vector3.up;
        resultvector = Vector3.Cross(rotationaxis, -vectora);
        emitter      = true;
    }
コード例 #7
0
    void OnHit(HouseActivityParam param)
    {
        if (!splitted)
        {
            return;
        }
        GetComponent <MeshCollider> ().enabled = false;
        networkView.RPC("OnHitRPC", RPCMode.Others, param.globalHitPoint, param.origin);
        Vector3            hitPoint = transform.InverseTransformPoint(param.globalHitPoint);
        HouseActivityParam p        = new HouseActivityParam();

        p.hitpoint       = hitPoint;
        p.globalHitPoint = param.globalHitPoint;
        p.radius         = collisionscale;
        p.colflag        = true;
        p.destroy        = false;
        p.origin         = param.origin;
        StartCoroutine("houseactivity", p);
    }
コード例 #8
0
    void OnCollisionEnter(Collision col)
    {
        float ang = 0.0f;

        for (int i = 0; i < col.contacts.Length; i++)
        {
            if (col.collider.gameObject.layer == 12 || col.collider.gameObject.layer == 14)
            {
                ang = Vector3.Angle(transform.right, col.contacts[i].point - transform.position);
                if (ang < 60)
                {
                    ang = Vector3.Angle(transform.forward, col.contacts[i].point - transform.position);
                    if (ang < 90)
                    {
                        forwardRightHitFlag = true;
                    }
                    else
                    {
                        backwardRightHitFlag = true;
                    }
                }
                else if (ang > 120)
                {
                    ang = Vector3.Angle(transform.forward, col.contacts[i].point - transform.position);
                    if (ang < 90)
                    {
                        forwardLeftHitFlag = true;
                    }
                    else
                    {
                        backwardLeftHitFlag = true;
                    }
                }
            }
        }
        HouseActivityParam param = new HouseActivityParam();

        param.hitpoint       = col.contacts[0].point;
        param.globalHitPoint = param.hitpoint;
        param.origin         = myPos.position;
        col.collider.gameObject.SendMessage("OnHit", param, SendMessageOptions.DontRequireReceiver);
    }
コード例 #9
0
    // Update is called once per frame

    IEnumerator houseactivity(HouseActivityParam param)
    {
        ReBuildHouse(param);
        GetComponent <MeshCollider> ().enabled = true;
        yield return(new WaitForSeconds(0.01f));

        shotcount--;
        if (shotcount <= 0)
        {
            StartCoroutine("DestroyHouse", param.hitpoint);
        }
        else
        {
            if (myMeshCollider != null)
            {
                myMeshCollider.sharedMesh = myMesh;
                yield return(new WaitForSeconds(0.01f));
            }
            myMeshCollider.convex = false;
            yield return(new WaitForSeconds(0.01f));
        }
    }
コード例 #10
0
    void getoutpieceatcollision(List <int> indice, HouseActivityParam param)
    {
        lock (myMesh){
            int n = indice.Count;
            int ind;
            for (int i = 0; i < n; i += 2)
            {
                Vector3[]  removedVertice   = new Vector3[6];
                Vector2 [] removedUvs       = new Vector2[6];
                int []     removedtriangles = new int[24];
                Vector3 [] removednormals   = new Vector3[6];
                int        tmpcn            = 0;
                ind = indice[i] * 3;
                for (int j = 0; j < 3; j++)
                {
                    removedVertice[tmpcn + j]   = thickvertice[thicktriangles[ind + j]];
                    removedUvs[tmpcn + j]       = thickuvs[thicktriangles[ind + j]];
                    removedtriangles[tmpcn + j] = tmpcn + j;
                    removednormals[tmpcn + j]   = thicknormals[thicktriangles[ind + j]];
                }
                tmpcn += 3;
                Vector3 particlepos = transform.TransformPoint((removedVertice[0] + removedVertice[1] + removedVertice[2]) / 3f);
                ind = indice[i + 1] * 3;
                for (int j = 0; j < 3; j++)
                {
                    removedVertice[tmpcn + j]   = thickvertice[thicktriangles[ind + j]];
                    removedUvs[tmpcn + j]       = thickuvs[thicktriangles[ind + j]];
                    removedtriangles[tmpcn + j] = tmpcn + j;
                    removednormals[tmpcn + j]   = thicknormals[thicktriangles[ind + j]];
                }
                tmpcn += 3;
                int pos = tmpcn - 6;
                //0,3,4
                removedtriangles[tmpcn]     = pos;
                removedtriangles[tmpcn + 1] = pos + 3;
                removedtriangles[tmpcn + 2] = pos + 1;
                tmpcn += 3;
                //0,4,1
                removedtriangles[tmpcn]     = pos + 3;
                removedtriangles[tmpcn + 1] = pos + 5;
                removedtriangles[tmpcn + 2] = pos + 1;
                tmpcn += 3;
                //2,4,5
                removedtriangles[tmpcn]     = pos + 2;
                removedtriangles[tmpcn + 1] = pos + 1;
                removedtriangles[tmpcn + 2] = pos + 4;
                tmpcn += 3;
                //2,1,4
                removedtriangles[tmpcn]     = pos + 1;
                removedtriangles[tmpcn + 1] = pos + 5;
                removedtriangles[tmpcn + 2] = pos + 4;
                tmpcn += 3;
                //2,5,3
                removedtriangles[tmpcn]     = pos + 2;
                removedtriangles[tmpcn + 1] = pos + 4;
                removedtriangles[tmpcn + 2] = pos;
                tmpcn += 3;
                //0,2,3
                removedtriangles[tmpcn]     = pos + 4;
                removedtriangles[tmpcn + 1] = pos + 3;
                removedtriangles[tmpcn + 2] = pos;
                tmpcn += 3;
                Mesh newMesh = new Mesh();
                newMesh.vertices  = removedVertice;
                newMesh.uv        = removedUvs;
                newMesh.triangles = removedtriangles;
                newMesh.normals   = removednormals;
                newMesh.RecalculateBounds();
                GameObject newGameObject = new GameObject("DebriPiece");
                newGameObject.transform.rotation   = transform.rotation;
                newGameObject.transform.position   = transform.position;
                newGameObject.transform.localScale = gameObject.transform.localScale;
                newGameObject.AddComponent <Rigidbody>();
                newGameObject.AddComponent <MeshFilter>();
                newGameObject.AddComponent <MeshRenderer>();
                //newGameObject.AddComponent<MeshCollider>();
                MeshFilter newMeshFilter = newGameObject.GetComponent <MeshFilter>();

                if (newMeshFilter != null)
                {
                    newMeshFilter.mesh = newMesh;
                }
//				MeshCollider newMeshcolider=newGameObject.GetComponent<MeshCollider>();
//				newMeshcolider.sharedMesh=newMesh;
//				newMeshcolider.convex=false;
                MeshRenderer newMeshRenderer = newGameObject.GetComponent <MeshRenderer>();
                newMeshRenderer.material     = renderer.material;
                newGameObject.rigidbody.mass = tmpcn / 300f + 0.001f;
                Vector3 tmp = param.globalHitPoint - param.origin;
                tmp.Normalize();
                newGameObject.rigidbody.AddForce(tmp * tmpcn * Random.Range(0.01f, 0.05f), ForceMode.Impulse);
                GameObject go = (GameObject)Instantiate(colpart, particlepos, Quaternion.identity);
                go.transform.parent = newGameObject.transform;
                Destroy(go, 3.0f);
//				Object.Destroy(newGameObject.GetComponent<MeshCollider>(),3.0f);
                Object.Destroy(newGameObject.GetComponent <Rigidbody>(), 3.0f);
                Destroy(newGameObject, 10.0f);
            }
        }
    }
コード例 #11
0
    void ReBuildHouse(HouseActivityParam param)
    {
        lock (myMesh){
            Vector3    hitpoint = param.hitpoint;
            float      radius   = param.radius / transform.localScale.x;
            bool       destroy  = param.destroy;
            bool       colflag  = param.colflag;
            List <int> indice   = new List <int>();
            List <int> splitindice;
            int        p;
            indice.Clear();
            if (startflag)
            {
                for (int i = 0; i < unsplitcount; i++)
                {
                    p = i * 3;
                    thicktriangles[p] = 0; thicktriangles[p + 1] = 0; thicktriangles[p + 2] = 0;
                }
                startflag = false;
            }
            int diff = operatingtriangles.Length - unsplitcount * 3;
            DetectTriangle(hitpoint, radius, out splitindice);
            foreach (int ind in splitindice)
            {
                int tmpi = splitlist.IndexOf(ind);
                for (int i = tmpi * cnpertri + unsplitcount; i < tmpi * cnpertri + cnpertri + unsplitcount; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        p = i * 3;
                        if (Mathf.Abs(thickvertice[thicktriangles[p + j]].x - hitpoint.x) < radius)
                        {
                            if (Mathf.Abs(thickvertice[thicktriangles[p + j]].y - hitpoint.y) < radius)
                            {
                                if (Mathf.Abs(thickvertice[thicktriangles[p + j]].z - hitpoint.z) < radius)
                                {
                                    indice.Add(i);
                                    indice.Add(i + diff / 3);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            if (indice.Count != 0)
            {
                if (colflag)
                {
                    getoutpieceatcollision(indice, param);
                }
                else if (destroy)
                {
                    getoutpiece(indice);
                }
                removetriangle(indice);

                SetMesh();
            }
        }
    }