public override void OnInspectorGUI() { MeshCut t = target as MeshCut; if (!t) { return; } EditorGUI.BeginChangeCheck(); t.target = (MeshFilter)EditorGUILayout.ObjectField("Select", t.target, typeof(MeshFilter), true); if (EditorGUI.EndChangeCheck()) { Mesh m = t.target ? t.target.sharedMesh ?? t.target.mesh : null; if (m) { MeshCutCenter.Start(t.transform, m); } else { MeshCutCenter.Stop(); } } GUILayout.BeginHorizontal(); { GUILayout.FlexibleSpace(); if (GUILayout.Button("Cut", GUILayout.MaxWidth(100))) { MeshCutCenter.Cut(); } GUILayout.FlexibleSpace(); } GUILayout.EndHorizontal(); }
void Update() { if (Input.GetMouseButtonDown(0)) { //Create an empty raycast hit to assign later on RaycastHit hit; //If you hit an object in front of you (transform.forward) //Only returns 1 object. if (Physics.Raycast(transform.position, transform.forward, out hit)) { //Create a victim object for any hit. GameObject victim = hit.collider.gameObject; //Create pieces that it will get cut into GameObject[] pieces = MeshCut.Cut(victim, transform.position, transform.right, capMaterial); //pieces[0] = left side //pieces[1] = right side //If Rigidbody does not exist on pieces[1] then Add a RIGIDBODY if (!pieces[1].GetComponent <Rigidbody>()) { pieces[1].AddComponent <Rigidbody>(); } Destroy(pieces[1], 1); } } }
void m_cut() { RaycastHit hit; if (Physics.Raycast(transform.position, transform.forward, out hit, 2f, layer[0])) { GameObject[] gameObjects = MeshCut.Cut(hit.collider.gameObject, transform.position, Vector3.Cross(transform.forward, prevPos - crx), capMaterial); if (!gameObjects[1].GetComponent <Rigidbody>()) { gameObjects[1].AddComponent <BoxCollider>(); gameObjects[1].AddComponent <Rigidbody>().AddForce(60f, 0f, 3f); Destroy(gameObjects[1], 1f); } hit.transform.gameObject.layer = LayerMask.NameToLayer("Default"); hit.collider.isTrigger = false; hit.rigidbody.useGravity = true; hit.rigidbody.AddForce(-60f, 0f, 3f); Destroy(hit.transform.gameObject, 1f); Destroy(hit.transform.GetChild(0).transform.gameObject); GameManager.instance.AddScore(1); Instantiate(slash, hit.point, Quaternion.LookRotation(hit.normal)); audioSource.PlayOneShot(audioClips[0]); } }
// Update is called once per frame void Update() { float newZ = Mathf.LerpUnclamped(0, 50, (info.time - asSong.time) * 0.1f); var newpos = transform.position; newpos.z = newZ; transform.position = newpos; if (false)//newZ < 0) { var pos = transform.position; var Vrand = new Vector3(Random.Range(10, -10), Random.Range(10, -10), Random.Range(10, -10)); GameObject[] gameObjects = MeshCut.Cut(gameObject, pos, Vrand, GetComponent <MeshRenderer>().material); print("잘림갯수 : " + gameObjects.Length); foreach (var go in gameObjects) { var rigi = go.AddComponent <Rigidbody>(); Destroy(go.GetComponent <note>()); go.AddComponent <MeshCollider>().convex = true; rigi.AddExplosionForce(100, pos, 0, 0, ForceMode.Impulse); Debug.DrawLine(pos, pos + Vrand, Color.red, 5); } } }
private void OnTriggerEnter(Collider other) { print("트리거엔터"); { var pos = other.transform.position; var p = new Plane( a: other.transform.InverseTransformPoint(trSaberStart.position), b: vSaberCenterLog.Dequeue(), c: other.transform.InverseTransformPoint(trSaberEnd.position) ); GameObject[] gameObjects = MeshCut.Cut(other.gameObject, p, other.gameObject.GetComponent <MeshRenderer>().material); print("잘림갯수 : " + gameObjects.Length); foreach (var go in gameObjects) { Destroy(go.GetComponent <note>()); go.AddComponent <MeshCollider>().convex = true; var rigi = go.GetComponent <Rigidbody>(); if (rigi == null) { rigi = go.AddComponent <Rigidbody>(); } rigi.useGravity = true; rigi.AddExplosionForce(50, pos, 0, 0, ForceMode.Impulse); //Debug.DrawLine(pos, pos + Vrand, Color.red, 5); } } }
private void OnTriggerEnter(Collider collision) { if (Time.time < timeCreated + 0.5f) { return; } var sword = collision.attachedRigidbody.GetComponent <CuttingSword>(); if (sword == null) { return; } var mat = cutMaterial == null ? sword.cutMaterial : cutMaterial; var objs = MeshCut.Cut(gameObject, sword.transform.position, sword.transform.right, mat); PreparePart(objs[0]).AddForce(-transform.right * sword.splitStrenght); PreparePart(objs[1]).AddForce(transform.right * sword.splitStrenght); if (collider != null) { Destroy(gameObject); } }
public void Spawnfrectures() { int RandIndex = Random.Range(0, 4); GameObject[] gameObjects = MeshCut.Cut(gameObject, transform.position, VectorDirection[RandIndex], GetComponent <MeshRenderer>().material); for (int i = 0; i < gameObjects.Length; i++) { if (gameObjects[i].GetComponent <Rigidbody>() == null) { Rigidbody rb = gameObjects[i].AddComponent <Rigidbody>(); BoxCollider bc = gameObjects[i].AddComponent <BoxCollider>(); rb.mass = 10; Destroy(gameObjects[i], 8f); } } GetComponent <Rigidbody>().mass = 10; BoxCollider CurrentBC = GetComponent <BoxCollider>(); Destroy(CurrentBC); BoxCollider newwBC = gameObject.AddComponent <BoxCollider>(); Destroy(gameObject, 8f); }
void Cut() { RaycastHit hit; Physics.Raycast(playerCamera.transform.position, playerCamera.transform.forward, out hit, range, layer); if (hit.collider != null) { anchorCut = hit.point; nearSliceable = Physics.OverlapSphere(anchorCut, radius, layer); } // découpe les objets //Vector3 realCut = new Vector3(cut.y, -cut.x, 0); Vector3 realCut = new Vector3(-cut.y, cut.x, 0); if (nearSliceable != null && nearSliceable.Length != 0) { for (int i = 0; i < nearSliceable.Length; i++) { GameObject cutObject = nearSliceable[i].gameObject; GameObject[] newObjects = MeshCut.Cut(cutObject, anchorCut, realCut, capMaterial); for (int j = 0; j < 2; j++) { newObjects[j].AddComponent <SliceableObject>(); } Destroy(cutObject); } } }
private void OnCollisionEnter(Collision collision) { GameObject[] meshCut = MeshCut.Cut(collision.gameObject, transform.position, Vector3.Cross(transform.position, collision.transform.position).normalized, collision.transform.GetComponent <MeshRenderer>().material); for (int i = 0; i < meshCut.Length; i++) { meshCut[i].AddComponent <Rigidbody>(); } }
void OnTriggerEnter(Collider collider) { GameObject[] pieces = MeshCut.Cut(collider.gameObject, transform.position, transform.right, capMaterial); if (!pieces[1].GetComponent <Rigidbody>()) { pieces[1].AddComponent <Rigidbody>(); } Destroy(pieces[1], 1); }
//Slicer void HandleInput5() { RaycastHit hit; if (Physics.Raycast(transform.position, transform.forward, out hit)) { victim = hit.collider.gameObject; GameObject[] pieces = MeshCut.Cut(victim, transform.position, transform.right, capMaterial); } }
void m_Cut() { GameObject[] gameObjects = MeshCut.Cut(gameObject, transform.position + Vector3.up * 1.5f, Vector3.down, capMaterial); if (!gameObjects[1].GetComponent <Rigidbody>()) { gameObjects[1].AddComponent <BoxCollider>(); gameObjects[1].AddComponent <Rigidbody>().AddForce(0f, 0f, 3f); Destroy(gameObjects[1], 1f); } gameObject.layer = LayerMask.NameToLayer("Default"); }
protected void OnEnable() { MeshCut t = target as MeshCut; if (t && t.target) { Mesh m = t.target.sharedMesh ?? t.target.mesh; if (m) { MeshCutCenter.Start(t.transform, m); } } }
private void OnTriggerEnter(Collider other) { if (!isCut) { isCut = true; GameObject[] pieces = MeshCut.Cut(other.gameObject, transform.position, transform.up, capMaterial); if (!pieces[1].GetComponent <Rigidbody>()) { pieces[1].AddComponent <Rigidbody>(); } Destroy(pieces[1], 1); } }
public void Cut(Vector3 contact, Sliceable victim, float velocity) { if (velocity > cutVelocityThreshold && previousCuts.Contains(victim)) { previousCuts.Remove(victim); var cutNormal = transform.right; var cuts = MeshCut .Cut(victim.gameObject, contact, cutNormal, victim.CutMaterial) .OrderByDescending(c => c.GetComponent <MeshFilter>().mesh.Volume()) .ToList(); FixChunk(cuts[0], victim, cutNormal); FixChunk(cuts[1], victim, -cutNormal); } }
void Cut() { //Vector3 realCut = cut; Vector3 realCut = new Vector3(cut.y, -cut.x, 0); GameObject[] newObjects = MeshCut.Cut(gameObject, transform.position, realCut, capMaterial); canCut = false; for (int i = 0; i < 2; i++) { newObjects[i].AddComponent <BoxCollider>(); newObjects[i].AddComponent <Rigidbody>(); newObjects[i].GetComponent <Rigidbody>().mass = 10; } }
void Cut(Vector3 src, Vector3 src2) { // always keep the leftmost cut on the left. if (src2.x < src.x) { Vector2 temp = src2; src2 = src; src = temp; } Debug.Log("src:" + src + " " + src2); Debug.Log("anchor: " + anchor + " " + (src2 - src)); src.z = 0; src2.z = 0; GameObject[] objs = MeshCut.Cut(target, src, Quaternion.Euler(0, 0, 90) * (src2 - src) , mat, gameManager); //objs[1].transform.position = new Vector3(3, 0, 0); target = objs[0]; }
// Update is called once per frame public void InitiateCut(LineScript lineScript) // Called From LineScript on LineComplete { if (!cutComplete) // Checking if Already cut in this session { Transform cutplane; Vector3 pointA, pointB, pointC; Plane myplane; pointA = lineScript.lineRenderer.GetPosition(0); pointB = lineScript.lineRenderer.GetPosition(1); pointC = pointA + (Camera.main.transform.forward * -10); // Third point to get plane from line drawn myplane = new Plane(pointA, pointB, pointC); // Creating plane from lin points plus 3rd point Vector3 dir = (pointB - pointA).normalized; Vector3 point = pointA + (0.5f * dir); cutComplete = MeshCut.Cut(gameObject, point, myplane.normal); // Calling MeshCut , will return true if line/plane intersects mesh } }
private void OnCollisionEnter(Collision collision) { if (collision.collider.CompareTag("Player") && !_bDestroy) { if (CharacterData.hp <= 0) { _bDestroy = true; GameObject[] meshList = MeshCut.Cut(gameObject, collision.transform.position, Vector3.Cross(collision.transform.position, transform.position).normalized, GetComponent <MeshRenderer>().material); meshList[1].transform.localScale = meshList[0].transform.localScale; meshList[1].AddComponent <MeshCollider>().convex = true; for (int i = 0; i < meshList.Length; i++) { meshList[i].AddComponent <Rigidbody>(); meshList[i].GetComponent <MeshCollider>().sharedMesh = meshList[i].GetComponent <MeshFilter>().mesh; StartCoroutine(DestroyObject(meshList[i])); } } } }
void Cut() { Vector3 realCut = new Vector3(cut.y, -cut.x, 0); { for (int i = 0; i < detectObjectInFront.listNearSliceable.Count; i++) { GameObject[] newObjects = MeshCut.Cut(detectObjectInFront.listNearSliceable[i], transform.position, realCut, capMaterial); for (int j = 0; j < 2; j++) { newObjects[j].AddComponent <BoxCollider>(); newObjects[j].AddComponent <Rigidbody>(); newObjects[j].GetComponent <Rigidbody>().mass = 10; newObjects[j].gameObject.tag = "Sliceable"; } } } }
// Update is called once per frame void Update() { // draw debug: show vertices which are used to make plane Debug.DrawLine(p1, p2, Color.red); Debug.DrawLine(p1, p3, Color.red); Debug.DrawLine(p2, p3, Color.red); // controls if (Input.GetKeyDown("space")) // slice { //SliceIt(); Mesh cutplanemesh = cutplane.GetComponent <MeshFilter>().mesh; Vector3[] cutplanevertices = cutplanemesh.vertices; MeshCut.Cut(gameObject, cutplane.TransformPoint(cutplanevertices[40]), cutplane.up, gameObject.GetComponent <Renderer>().material); } if (Input.GetKey("s")) // move object { //cutplane.position.y -= 0.01; } if (Input.GetKey("w")) // move object { //cutplane.position.y += 0.01; } if (Input.GetKey("a")) // move object { //cutplane.position.x -= 0.01; } if (Input.GetKey("d")) // move object { //cutplane.position.x += 0.01; } if (Input.GetKey("q")) // move object { //cutplane.rotation.z -= 0.01; } if (Input.GetKey("e")) // move object { //cutplane.rotation.z += 0.01; } }
private void OnTriggerEnter(Collider other) { Debug.Log(other.gameObject.name); if (other.CompareTag("Enemy")) { // MeshCut으로 자른 녀석들 담아두기 GameObject[] CutMesh = MeshCut.Cut(other.gameObject, transform.position, transform.right, capMat); // MESHCUT 적용한 녀석들에게 컴포넌트 붙이기 for (int i = 0; i < CutMesh.Length; i++) { CutMesh[i].tag = ("Enemy"); // Rigidbody 붙이기 if (!CutMesh[i].GetComponent <Rigidbody>()) { CutMesh[i].AddComponent <Rigidbody>(); } // Collider 붙이기 if (!CutMesh[i].GetComponent <Collider>()) { CutMesh[i].AddComponent <BoxCollider>(); } // SlicedMeshManager 붙이기 if (!CutMesh[i].GetComponent <SlicedMeshManager>()) { CutMesh[i].AddComponent <SlicedMeshManager>(); CutMesh[i].GetComponent <SlicedMeshManager>().givenSpeed = speed / 10f; } } // 총알 되돌리기 destroy = true; } }
private void OnTriggerEnter(UnityEngine.Collider other) { if (other.gameObject.tag == "Bullet" && isActivation == 0) //총알의 태그 = "Bullet", 활성화 되지 않았을 경우 { switch (kind) { case Kinds.Fall: //transform.GetChild(0).gameObject.AddComponent<Rigidbody>(); //쓰러지는 물체 = (0)번쨰 자식 오브젝트 rb = transform.GetChild(0).gameObject.GetComponent <Rigidbody>(); rb.velocity = new Vector3(FallDirection, 0, 0); isActivation = 1; //상호작용 후 물체는 활성화 break; case Kinds.Break: Transform[] BreakObjectList = gameObject.GetComponentsInChildren <Transform>(); foreach (Transform obj in BreakObjectList) { obj.gameObject.AddComponent <Rigidbody>(); } isActivation = 1; //상호작용 후 물체는 활성화 break; case Kinds.Exp: Instantiate(particle, this.gameObject.transform); //Transform[] ExpObjectList = gameObject.GetComponentsInChildren<Transform>(); UnityEngine.Collider[] ExpObjectLists = Physics.OverlapSphere(transform.position, 10.0f); //원점을 중심으로 반경 안에 있는 오브젝트 객체 추출, 폭발을 다른 오브젝트나 적들에게도 영향이 가게 하려면 이것을 사용 foreach (UnityEngine.Collider obj in ExpObjectLists) { if (obj.GetComponent <Rigidbody>() == null) { obj.gameObject.AddComponent <Rigidbody>(); } rb = obj.GetComponent <Rigidbody>(); rb.AddExplosionForce(700, transform.position, 3, 1); //힘, 위치, 반경, 위로 튀는 힘 } isActivation = 1; //상호작용 후 물체는 활성화 break; case Kinds.Effect: //other.SendMessage("함수 이름"); //투사체에서 일어나는 효과는 투사체 안에 함수로 설정 //isActivation = 1; //상호작용 후 물체는 활성화(일회용이라면) break; case Kinds.Cut: GameObject[] gameObjects = MeshCut.Cut(other.gameObject, other.gameObject.transform.position, Vector3.right, capMaterial); gameObjects[1].AddComponent <BoxCollider>(); gameObjects[1].AddComponent <Rigidbody>(); rb = gameObjects[1].gameObject.GetComponent <Rigidbody>(); rb.velocity = gameObjects[0].gameObject.GetComponent <Rigidbody>().velocity; rb.mass = gameObjects[0].gameObject.GetComponent <Rigidbody>().mass; gameObject.tag = "Bullet"; // EditorUtility.CopySerialized(gameObjects[0], gameObjects[1]); //isActivation = 1; //상호작용 후 물체는 활성화(일회용이라면) break; } } }
public void SetCut(Vector3 pos, Vector3 Radian, Material Setmaterial) { gameObjects = MeshCut.Cut(gameObject, pos, Radian, Setmaterial); }
// Update is called once per frame void Update() { // 左クリックを押している間true(実行) if (Input.GetMouseButton(0)) { // マウスがクリックした座標を入れておく変数 // 画面左下を(0,0,0)とした、xy座標が代入される(zは0) Vector3 clickPos = Input.mousePosition; mousePos = clickPos; // z座標に数値を代入することでカメラより前に表示される clickPos.z = 2; // 画面左下を(0,0,0)とした座標をワールド座標(Transformの絶対座標)に返還して、剣のポジションに設定 blade.transform.position = Camera.main.ScreenToWorldPoint(clickPos); //blade.transform.position.z += 2; // カメラからマウスクリックの場所までRayを設定 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // rayを剣の長さ分照射して当たったらhitに保存する if (Physics.Raycast(ray, out RaycastHit hit, bladeLength)) { // もし、前まで当たってなかったら if (touch == 0) { // Debug.Log("今当たった!"); // 当たったに状態を変更 touch = 1; // 切り始めポイントをセット cutStartPos = hit.point; // 切る対象のオブジェクトを保存 target = hit.collider.gameObject; } // Debug.Log(hit.transform.name); lastHit = hit; } // もし今回rayが当たらなくて、今まで当たっていたなら(切り終わった状況) else if (touch == 1) { // Debug.Log("今当たり終わった"); // 当たってないに状態を変更 touch = 0; // 切り終わりポイントをセット cutEndPos = lastHit.point; if (cutStartPos == cutEndPos) { cutEndPos = mousePos; Debug.Log("一緒やった"); } // 剣を切った方向に傾かせる(本番切る用) Vector3 range = cutEndPos - cutStartPos; float angle = Mathf.Atan2(range.y, range.x) * Mathf.Rad2Deg + 90; blade.transform.rotation = startQuat * Quaternion.AngleAxis(angle, Vector3.forward); // 二つに切り分け、leftObjectとrightObjectで受け取る MeshCut.Cut(target, blade.transform.position, blade.transform.right, capMaterial, out GameObject leftObject, out GameObject rightObject); Debug.Log("cut"); //元のオブジェクトを削除 Destroy(target); if (rightObject == null || leftObject == null) { return; } rightObject.AddComponent <MeshCollider>(); rightObject.GetComponent <MeshCollider>().convex = true; Destroy(leftObject.GetComponent <BoxCollider>()); Destroy(leftObject.GetComponent <MeshCollider>()); leftObject.AddComponent <MeshCollider>().convex = true; //leftObject.GetComponent<MeshCollider>().convex = true; // プレイヤーを過ぎる直前にオブジェクトをデストロイする float distance = rightObject.transform.position.z - transform.position.z - 1f; Destroy(rightObject, distance / GetComponent <PlayerController>().speed); Destroy(leftObject, distance / GetComponent <PlayerController>().speed); } // マウスポジションを最新に更新 lastMousePos = mousePos; // ブレードの位置によって角度を変える処理 float Pos = blade.transform.position.x + 1; float angleDef = 80 * Pos / 2 - 40; blade.transform.rotation = startQuat * Quaternion.AngleAxis(angleDef, Vector3.up); Pos = blade.transform.position.y + 0.2f; angleDef = -90 * Pos / 1.5f + 90; blade.transform.rotation *= Quaternion.AngleAxis(angleDef, Vector3.right); }
public void Execute(string input, ref CGAContext context) { string ax = ParsingHelper.QSString(input); SplitAxis sa = (SplitAxis)Enum.Parse(typeof(SplitAxis), ax);; string target = ParsingHelper.GetTarget(input); string[] destinations = ParsingHelper.GetDest(input); CSF csfVals = ParsingHelper.CSFValues(input); List <GameObject> t = null; if (!string.IsNullOrEmpty(target) && context.namedObjects.ContainsKey(target)) { t = context.namedObjects[target]; List <GameObject> newNamedObjectContent = new List <GameObject>(); Vector3 a = new Vector3(1, 0, 0); foreach (GameObject g in t) { GameObject newg = GameObject.Instantiate(g); newg.name = g.name; GameObject.Destroy(newg.GetComponent <MeshRenderer>()); GameObject.Destroy(newg.GetComponent <MeshFilter>()); newNamedObjectContent.Add(newg); newg.transform.SetParent(g.transform.parent); newg.transform.localScale = g.transform.localScale; newg.transform.localPosition = g.transform.localPosition; newg.transform.localRotation = g.transform.localRotation; Transform[] trans = g.GetComponentsInChildren <Transform>(); foreach (Transform tra in trans) { if (tra.gameObject != g) { GameObject.Destroy(tra.gameObject); } } GameObject tar = g; Vector3 start = g.transform.position + g.transform.lossyScale / 2; int s = csfVals.orderedCSF.Count; float size = 0; switch (sa) { case SplitAxis.X: a = -g.transform.right; size = g.transform.lossyScale.x; break; case SplitAxis.Y: a = -g.transform.up; size = g.transform.lossyScale.y; break; case SplitAxis.Z: a = -g.transform.forward; size = g.transform.lossyScale.z; break; } List <float> sizes = new List <float>(); float sizeOfDynamic = size; float perc = 0; foreach (float v in csfVals.fixedValues) { sizeOfDynamic -= (size * v); perc += v; } if (perc > 1) { Debug.LogWarning("You messed up something with percentages..."); } int relativeCount = 0; foreach (int v in csfVals.relativeValues) { relativeCount += v; } float acumulatedPosition = 0; List <GameObject> splits = new List <GameObject>(); for (int i = 1; i < s; i++) { if (csfVals.orderedCSF[i - 1].isRelative) { acumulatedPosition += (csfVals.relativeValues[csfVals.orderedCSF[i - 1].index] / (relativeCount * 1.0f)) * sizeOfDynamic; } else { acumulatedPosition += csfVals.fixedValues[csfVals.orderedCSF[i - 1].index] * size; } GameObject[] splited = MeshCut.Cut(tar, start + a * acumulatedPosition, a, tar.GetComponent <Renderer>().material); //((size/s) * i) tar = splited[1]; if (destinations != null && destinations.Length > i) { string name = destinations[i - 1]; splited[0].name = name; if (context.namedObjects.ContainsKey(name)) { context.namedObjects[name].Add(splited[0]); } else { context.namedObjects.Add(name, new List <GameObject>() { splited[0] }); } } splited[0].transform.SetParent(newg.transform); splited[0].transform.localScale = Vector3.one; splited[1].transform.SetParent(newg.transform); splited[1].transform.localScale = Vector3.one; if (destinations != null && destinations.Length > i && i == s - 1) { string name = destinations[i]; splited[1].name = name; if (context.namedObjects.ContainsKey(name)) { context.namedObjects[name].Add(splited[1]); } else { context.namedObjects.Add(name, new List <GameObject>() { splited[1] }); } } if (i != s - 1) { splits.Add(splited[0]); } else { splits.Add(splited[0]); splits.Add(splited[1]); } } foreach (GameObject sgo in splits) { MeshCut.UpdatePivot(sgo); } //Rebuild dict! context.namedObjects[target] = newNamedObjectContent; } } else { Debug.LogWarning("Cannot split without any target"); return; } }
public static void fold(Vector3 from, Vector3 to, Vector3 dest, float angle) { bool foldCase = true, foldNowCase = true; if (now != 0) { List <GameObject> lg = new List <GameObject>(); steps.Add(lg); for (int i = 0; i < frameObjs.Count; i++) { steps[now].Add(frameObjs[i]); } } Debug.Log(steps[now].Count); if (frameObjs.Count > 0) { frameObjs.Clear(); } Vector3 mid = new Vector3(from.x + to.x, from.y + to.y, from.z + to.z) / 2; Material mat = steps[now][0].GetComponent <MeshRenderer>().material; for (int i = 0; i < steps[now].Count; i++) { Debug.Log("i : " + i); Vector3 toto = mid; Vector3 line = Vector3.zero; if (from.x == to.x) { toto.x = 1; } if (from.y == to.y) { toto.y = 1; } if (from.x != to.x && from.y != to.y) { float a = (to.y - from.y) / (to.x - from.x); float b = to.y - a * to.x; float m = -1 / a; if (a * dest.x - dest.y - a * from.x + from.y > 0) { foldCase = true; } else { foldCase = false; } Vector3 pt = steps[now][i].GetComponent <Rigidbody>().centerOfMass; if (a * pt.x - pt.y - a * from.x + from.y > 0) { foldNowCase = true; } else { foldNowCase = false; } line = new Vector3(a, -1, -a * from.x + from.y); if (foldCase) { if (a > 0) { toto.x = mid.x - 1; toto.y = m * toto.x + mid.y - m * mid.x; } else { toto.x = mid.x + 1; toto.y = m * toto.x + mid.y - m * mid.x; } } else { if (a > 0) { toto.x = mid.x + 1; toto.y = m * toto.x + mid.y - m * mid.x; } else { toto.x = mid.x - 1; toto.y = m * toto.x + mid.y - m * mid.x; } } } Debug.Log("foldCase : " + foldCase); Debug.Log("from : (" + from.x + ", " + from.y + ", " + from.z + " to : (" + to.x + ", " + to.y + ", " + to.z + ")"); Debug.Log("mid : (" + mid.x + "," + mid.y + "," + mid.z + ")" + " toto : " + toto); bool isCut = false; Vector3 startv = from; startv.z = startv.z - 5; /* * * Ray ray1 = new Ray(new Vector3(from.x-5, from.y-5, -0.001f), new Vector3(to.x, to.y, -0.001f)); * Ray ray2 = new Ray(new Vector3(from.x +5, from.y +5, -0.001f), new Vector3(to.x, to.y, -0.001f)); * RaycastHit hit; * if (Physics.Raycast(ray1, out hit, 20)) * { * Debug.Log(hit.transform.name); * if (hit.transform.gameObject.name == steps[now][i].name) * { * isCut = true; * } * } * if (Physics.Raycast(ray2, out hit, 20)) * { * Debug.Log(hit.transform.name); * if (hit.transform.gameObject.name == steps[now][i].name) * { * isCut = true; * } * } */ Debug.Log("It has to hit with " + steps[now][i].name); steps[now][i].transform.position -= new Vector3(0, 0, 0.001f); for (int j = 0; j <= 30; j++) { startv.x += (to.x - from.x) / 30; startv.y += (to.y - from.y) / 30; Ray ray = new Ray(startv, new Vector3(0, 0, 1)); RaycastHit hit; if (Physics.Raycast(ray, out hit, 20)) { Debug.Log(hit.transform.name); if (hit.transform.gameObject.name == steps[now][i].name) { isCut = true; break; } } } Debug.Log(isCut); steps[now][i].transform.position += new Vector3(0, 0, 0.001f); if (isCut) { GameObject[] temp = MeshCut.Cut(steps[now][i], mid, toto, mat, foldCase, line, to - from, angle); temp[0].GetComponent <RectTransform>().pivot = mid; temp[1].GetComponent <RectTransform>().pivot = mid; if (temp[0].transform.rotation == Quaternion.identity) { temp[0].transform.position += (temp[0].transform.rotation * temp[0].GetComponent <RectTransform>().pivot); temp[0].transform.rotation *= Quaternion.AngleAxis(angle, to - from); temp[0].transform.position -= (temp[0].transform.rotation * temp[0].GetComponent <RectTransform>().pivot); } if (temp[0].transform.name != "emptyCut") { temp[0].transform.name += now + 1; temp[0].transform.name += '_'; temp[0].transform.name += i; frameObjs.Add(temp[0]); } if (temp[1].transform.name != "emptyCut") { temp[1].transform.name += now + 1; temp[1].transform.name += '_'; temp[1].transform.name += i; frameObjs.Add(temp[1]); } } // 자르는 부분에 없을 때 else if (foldCase == foldNowCase) { steps[now][i].name = now + "foldEqualblock" + (now + 1) + '_' + i; steps[now][i].GetComponent <RectTransform>().pivot = mid; frameObjs.Add(steps[now][i]); } else { steps[now][i].name = now + "block" + (now + 1) + '_' + i; steps[now][i].GetComponent <RectTransform>().pivot = mid; steps[now][i].transform.position += (steps[now][i].transform.rotation * steps[now][i].GetComponent <RectTransform>().pivot); steps[now][i].transform.rotation = Quaternion.AngleAxis(angle, to - from); steps[now][i].transform.position -= (steps[now][i].transform.rotation * steps[now][i].GetComponent <RectTransform>().pivot); frameObjs.Add(steps[now][i]); } } now++; }
public void Cut() { MeshCut.Cut(victim, some.position, victim.transform.right, null); }
private IEnumerator CutMesh(Transform bladeTransform) { var maxDistance = MaxDistanceRayCast; if (!UseShuriken) { maxDistance = MaxDistanceLightSaber * 2; } var hits = Physics.RaycastAll(transform.position, transform.forward, maxDistance); hits.Reverse(); foreach (var hit in hits) { // object to slice if (hit.collider == null) { continue; } var victim = hit.collider.gameObject; //conditions if (UseShuriken) { if (hit.distance > MaxDistanceShuriken) { continue; } if (hit.distance > WaitingTimeThreshold) { yield return(new WaitForSeconds(hit.distance / WaitingTimeShuriken)); } } else if (!UseShuriken) { if (hit.distance > MaxDistanceLightSaber) { continue; } } if (victim.tag != "Highlightable") { continue; } var victimName = victim.name; // -- MESH CUT -- GameObject[] pieces = null; yield return(MeshCut.Cut(victim, bladeTransform.position, bladeTransform.right, _capMaterial, (obj) => { pieces = obj; })); // translate? pieces[1].transform.Translate(forceRightObj * 0.01f); // scale correctly pieces[0].transform.localScale = victim.transform.localScale; pieces[1].transform.localScale = victim.transform.localScale; // change name ( convenient ) pieces[0].name = victimName + " - L-Side"; pieces[1].name = victimName + " - R-Side"; // delete components if (pieces[0].GetComponent <DestroySelf>()) { pieces[0].GetComponent <DestroySelf>().DontDestroy(); Destroy(pieces[0].GetComponent <DestroySelf>()); } // Add rigidbodies and colliders if (pieces[0].GetComponent <Rigidbody>()) { pieces[0].GetComponent <Rigidbody>().isKinematic = false; pieces[0].GetComponent <Rigidbody>().useGravity = true; } if (!pieces[1].GetComponent <Rigidbody>()) { pieces[1].AddComponent <Rigidbody>(); } // move right piece if (forceRightObj != Vector3.zero) { pieces[1].GetComponent <Rigidbody>().AddForce(forceRightObj); } // Delete collider from original ( modified ) left side if (pieces[0].GetComponent <BoxCollider>()) { Destroy(pieces[0].GetComponent <BoxCollider>()); } if (pieces[0].GetComponent <MeshCollider>()) { Destroy(pieces[0].GetComponent <MeshCollider>()); } // Add Colliders if (AddMeshCollider) { pieces[0].AddComponent <MeshCollider>().convex = true; pieces[1].AddComponent <MeshCollider>().convex = true; var rightMc = pieces[1].GetComponent <MeshCollider>(); rightMc.inflateMesh = true; rightMc.skinWidth = SkinWidth; } else { pieces[0].AddComponent <BoxCollider>(); pieces[1].AddComponent <BoxCollider>(); } // Set as highlightable object pieces[1].AddComponent <HightLightedObject>(); pieces[1].AddComponent <DestroySelf>().Timer = 10.0f; yield return(null); } }