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); }
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); } }
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; }
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); }
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); }
// 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)); } }
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); } } }
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(); } } }