private void Start()
    {
        Debug.Log("操作说明:鼠标左键拖动来拉动绳子,tab键切换拉动绳子哪一端,1键切换绳首是否挂物体,2键切换绳尾是否挂物体");
        var mat = new Material(Shader.Find("Particles/Alpha Blended"));

        mat.SetColor("_TintColor", new Color32(0xFF, 0x00, 0x00, 0x22));
        _cam = Camera.main;
        _cam.nearClipPlane              = 0.0001f;
        _cam.fieldOfView                = 30;
        _cam.transform.position         = new Vector3(0, 0.223f, -0.35f) * RopeLength * 10;
        _cam.transform.localEulerAngles = new Vector3(30.2f, 0, 0);
        Destroy(GameObject.Find("Directional Light").GetComponent <Light>());
        // 设置
        var rope = new GameObject("TestRope");

        rope.transform.position = Vector3.up * RopeLength * 1.2f;
        var ctrl = rope.AddComponent <ControllableRope>();

        ctrl.Width       = 0.05f * RopeLength;
        ctrl.Length      = RopeLength;
        ctrl.Segment     = 12;
        ctrl.GenAxis     = Vector3.up * -1; // 竖直向下创建
        ctrl.Mass        = RopeMass;
        ctrl.AngularDrag = 10;
        ctrl.IterCount   = 255;
        ctrl.RenderScale = 0.5f;
        ctrl.Mat         = mat;
        ctrl.Recalc();
        ctrl.Auto();
        _rope = ctrl;
        // 创建地面
        var floor = GameObject.CreatePrimitive(PrimitiveType.Plane);

        floor.transform.position         = Vector3.zero;
        floor.transform.localEulerAngles = Vector3.zero;
        _floorLayerMask = 1 << 6;
        floor.layer     = 6;
        // 创建挂接物
        _obj1 = GameObject.CreatePrimitive(PrimitiveType.Cube);
        var rig1 = _obj1.AddComponent <Rigidbody>();

        rig1.freezeRotation = true;
        _obj1.GetComponent <Renderer>().material.color = Color.red;
        _obj1.transform.position   = Vector3.zero;
        _obj1.transform.localScale = Vector3.one * 0.01f;

        _obj2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
        var rig2 = _obj2.AddComponent <Rigidbody>();

        rig2.freezeRotation = true;
        _obj2.GetComponent <Renderer>().material.color = Color.blue;
        _obj2.transform.position   = Vector3.left * 0.05f;
        _obj2.transform.localScale = Vector3.one * 0.01f;

        _rope.HangHead(_obj1.GetComponent <Rigidbody>());
        _rope.HangTail(_obj2.GetComponent <Rigidbody>());
    }
    void Update()
    {
        if (Input.GetKeyUp(KeyCode.Tab))
        {
            CType = (CtrlType)(((int)CType + 1) % 2);
            Debug.Log("当前控制:" + CType);
        }

        if (Input.GetKeyUp(KeyCode.Alpha1))
        {
            if (_rope.GetHeadHang() == null)
            {
                _rope.HangHead(_obj1.GetComponent <Rigidbody>());
            }
            else
            {
                _rope.HangHead(null);
                _rope.ManualHead(false);
            }
        }
        else if (Input.GetKeyUp(KeyCode.Alpha2))
        {
            if (_rope.GetTailHang() == null)
            {
                _rope.HangTail(_obj2.GetComponent <Rigidbody>());
            }
            else
            {
                _rope.HangTail(null);
                _rope.ManualTail(false);
            }
        }

        switch (CType)
        {
        case CtrlType.CtrlHead:
            _handler = _rope.GetHeadHang();
            if (_handler == null)
            {
                _handler = _rope.GetHeadHandler().GetComponent <Rigidbody>();
                _rope.ManualHead(true, _rope.GetTailHang() == null);
            }
            break;

        case CtrlType.CtrlTail:
            _handler = _rope.GetTailHang();
            if (_handler == null)
            {
                _handler = _rope.GetTailHandler().GetComponent <Rigidbody>();
                _rope.ManualTail(true, _rope.GetHeadHang() == null);
            }
            break;
        }

        if (_handler != null)
        {
            if (Input.GetMouseButton(0))
            {
                var        ray = _cam.ScreenPointToRay(Input.mousePosition);
                RaycastHit info;
                if (Physics.Raycast(ray, out info, 1000, _floorLayerMask))
                {
                    _handler.position = info.point + new Vector3(0, 0.011f / 2, 0);
                }
            }
        }
    }