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();
        }
Exemple #2
0
    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);
            }
        }
    }
Exemple #3
0
    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]);
        }
    }
Exemple #4
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);
            }
        }
    }
Exemple #5
0
 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);
         }
     }
 }
Exemple #6
0
    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);
        }
    }
Exemple #7
0
    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);
    }
Exemple #8
0
    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);
            }
        }
    }
Exemple #9
0
 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>();
     }
 }
Exemple #10
0
 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);
 }
Exemple #11
0
    //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);
        }
    }
Exemple #12
0
    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);
                }
            }
        }
Exemple #14
0
    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);
        }
    }
Exemple #15
0
    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);
        }
    }
Exemple #16
0
    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]));
             }
         }
     }
 }
Exemple #20
0
    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";
                }
            }
        }
    }
Exemple #21
0
    // 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;
        }
    }
Exemple #22
0
    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);
 }
Exemple #25
0
    // 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);
        }
Exemple #26
0
    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;
        }
    }
Exemple #27
0
    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++;
    }
Exemple #28
0
 public void Cut()
 {
     MeshCut.Cut(victim, some.position, victim.transform.right, null);
 }
Exemple #29
0
    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);
        }
    }