コード例 #1
0
ファイル: Rope_tube2.cs プロジェクト: aaakkkaaa/miscellaneous
    private void BuildRope()
    {
        // segments - количество сегментов: [resolution of 1.0 = 1 joint per unit of distance]
        _segments = Mathf.FloorToInt(Vector3.Distance(transform.position, targetTransform.position) * resolution);

        if (material != null)
        {
            material.SetTextureScale("_MainTex", new Vector2(1, _segments + 2));
            if (material.GetTexture("_BumpMap"))
            {
                material.SetTextureScale("_BumpMap", new Vector2(1, _segments + 2));
            }
        }

        _segmentPos                = new Vector3[_segments];
        _parts                     = new GameObject[_segments];
        _segmentPos[0]             = transform.position;
        _segmentPos[_segments - 1] = targetTransform.position;

        int     segs       = _segments - 1; // количество интервалов
        Vector3 seperation = ((targetTransform.position - transform.position) / segs);

        _jointAxis = seperation;         // направление соединений
        // for (int s = 0; s < _segments; s++)
        for (int s = 0; s < _segments - 1; s++)
        {
            Vector3 vector = (seperation * s) + transform.position; // позиции сегментов
            _segmentPos[s] = vector;
            _parts[s]      = new GameObject("Joint_" + s);
            AddJointPhysics(s);             // добавление к каждому сегменту физики и соединений
        }

        _segmentPos[_segments - 1] = targetTransform.position;
        _parts[_segments - 1]      = targetTransform.gameObject;
        AddJointPhysics(_segments - 1);

        if (endRestrained)
        {
            targetTransform.GetComponent <Rigidbody>().isKinematic = true;
        }
        if (startRestrained)
        {
            transform.GetComponent <Rigidbody> ().isKinematic = true;
        }

        // запретить коллизию объектов, идущих через одного
        for (int i = 0; i < _parts.Length - 2; ++i)
        {
            Collider col1 = _parts[i].GetComponent <Collider>();
            Collider col2 = _parts[i + 2].GetComponent <Collider>();
            Physics.IgnoreCollision(col1, col2);
        }

        _tubeRendererObject = new GameObject("TubeRenderer_" + gameObject.name);
        // присоединяем к GameObject класс, получаем ссылку на объект этого класса
        _tube = _tubeRendererObject.AddComponent <TubeRenderer2>();  // теперь _tube - экземпляр TubeRenderer2
        _tube.useMeshCollision = useMeshCollision;
        _tube.vertices         = new TubeVertex[_segments];
        _tube.crossSegments    = radialSegments;
        _tube.material         = material;

        _isTube = true;        // Rope = true, The rope now exists in the scene!
    }
コード例 #2
0
    private void BuildRope()
    {
        tubeRenderer = new GameObject("TubeRenderer_" + gameObject.name);
        // присоединяем к GameObject класс, получаем ссылку на объект этого класса
        line = tubeRenderer.AddComponent <TubeRenderer2>();  // теперь line - экземпляр TubeRenderer2
        line.useMeshCollision = useMeshCollision;
        // Find the amount of segments based on the distance and resolution
        // Example: [resolution of 1.0 = 1 joint per unit of distance]
        segments = Mathf.FloorToInt(Vector3.Distance(transform.position, target.position) * resolution);

        if (material != null)
        {
            material.SetTextureScale("_MainTex", new Vector2(1, segments + 2));
            if (material.GetTexture("_BumpMap"))
            {
                material.SetTextureScale("_BumpMap", new Vector2(1, segments + 2));
            }
        }
        line.vertices            = new TubeVertex[segments];
        line.crossSegments       = radialSegments;
        line.material            = material;
        segmentPos               = new Vector3[segments];
        joints                   = new GameObject[segments];
        segmentPos[0]            = transform.position;
        segmentPos[segments - 1] = target.position;

        // Find the distance between each segment
        int     segs       = segments - 1;
        Vector3 seperation = ((target.position - transform.position) / segs);

        for (int s = 0; s < segments; s++)
        {
            // Find the each segments position using the slope from above
            Vector3 vector = (seperation * s) + transform.position;
            segmentPos[s] = vector;
            //Add Physics to the segments
            AddJointPhysics(s);
        }
        // Attach the joints to the target object and parent it to this object
        CharacterJoint end = target.gameObject.AddComponent <CharacterJoint> ();

        end.connectedBody = joints[joints.Length - 1].transform.GetComponent <Rigidbody> ();
        end.swingAxis     = swingAxis;
        SoftJointLimit limit1 = end.lowTwistLimit;

        limit1.limit      = lowTwistLimit;
        end.lowTwistLimit = limit1;
        SoftJointLimit limit2 = end.highTwistLimit;

        limit2.limit       = highTwistLimit;
        end.highTwistLimit = limit2;
        SoftJointLimit limit3 = end.swing1Limit;

        limit3.limit    = swing1Limit;
        end.swing1Limit = limit3;

        target.parent = transform;
        if (endRestrained)
        {
            end.GetComponent <Rigidbody> ().isKinematic = true;
        }

        // FEDOR *****************
        end.GetComponent <Rigidbody>().useGravity = gameObject.GetComponent <Rigidbody>().useGravity;
        // ***********************

        if (startRestrained)
        {
            transform.GetComponent <Rigidbody> ().isKinematic = true;
        }
        // Rope = true, The rope now exists in the scene!
        rope = true;
    }
コード例 #3
0
    private void BuildRope()
    {
        // segments - количество сегментов: [resolution of 1.0 = 1 joint per unit of distance]
        _segments = Mathf.FloorToInt(Vector3.Distance(transform.position, targetTransform.position) * resolution);

        if (material != null)
        {
            material.SetTextureScale("_MainTex", new Vector2(1, _segments + 2));
            if (material.GetTexture("_BumpMap"))
            {
                material.SetTextureScale("_BumpMap", new Vector2(1, _segments + 2));
            }
        }

        _segmentPos = new Vector3[_segments];
        _parts      = new GameObject[_segments];

        Vector3 seperation = ((targetTransform.position - transform.position) / (_segments - 1));

        _jointAxis = seperation;         // направление соединений (для пружинного соединения не используется)

        for (int s = 0; s < _segments - 1; s++)
        {
            Vector3 vector = (seperation * s) + transform.position; // позиции объектов
            _segmentPos[s]             = vector;
            _parts[s]                  = new GameObject("Joint_" + s);
            _parts[s].transform.parent = transform;     // сделали созданный объект дочерним данного
            AddJointPhysics(s);                         // добавление к каждому объекту физики и соединений
        }
        targetTransform.transform.parent = transform;
        _segmentPos[_segments - 1]       = targetTransform.position;
        _parts[_segments - 1]            = targetTransform.gameObject;
        AddJointPhysics(_segments - 1);

        if (endRestrained)
        {
            targetTransform.GetComponent <Rigidbody>().isKinematic = true;
        }
        if (startRestrained)
        {
            _parts[0].GetComponent <Rigidbody>().isKinematic = true;
        }

        // запретить коллизию объектов, идущих через одного
        for (int i = 0; i < _parts.Length - 2; ++i)
        {
            Collider col1 = _parts[i].GetComponent <Collider>();
            Collider col2 = _parts[i + 2].GetComponent <Collider>();
            Physics.IgnoreCollision(col1, col2);
        }

        // создание объекта - рисовальщика меша
        _tubeRendererObject = new GameObject("TubeRenderer_" + gameObject.name);
        // присоединяем к GameObject класс, получаем ссылку на объект этого класса
        _tube = _tubeRendererObject.AddComponent <TubeRenderer2>();  // теперь _tube - экземпляр TubeRenderer2
        _tube.useMeshCollision = false;
        _tube.vertices         = new TubeVertex[_segments];
        _tube.crossSegments    = radialSegments;
        _tube.material         = material;

        _isTube = true;        // Труба создана и присутствует на сцене
    }