예제 #1
0
    public static void SeverTentacle(Tentacle tentacle)
    {
        int severPoint = (int)Mathf.Ceil(tentacle.segments * Random.Range(0.2f, 0.5f));

        Tentacle baseHalf = Ungenerated();

        CopyTentSubSegments(tentacle, baseHalf, 0, severPoint);
        baseHalf.AttachBase(tentacle.connectBody);
        Transform endPoint = baseHalf.transform.Find("EndPoint");

        MakeEndDangling(endPoint);
        SpringJoint2D endSpringJoint = endPoint.GetComponent <SpringJoint2D>();

        endSpringJoint.connectedBody = tentacle.connectBody;
        endSpringJoint.distance      = tentacle.length * ((float)severPoint / (float)tentacle.segments) * 0.5f;

        Tentacle endHalf = Ungenerated();

        CopyTentSubSegments(tentacle, endHalf, severPoint, tentacle.segments - 1);
        MakeEndDangling(endHalf.transform);
        if (tentacle.Grabbing)
        {
            endHalf.AttachEnd(tentacle.endAttachSpring.connectedBody, tentacle.GetEndPosition());
        }
        else
        {
            Transform endHalfEndPoint = endHalf.transform.Find("EndPoint");
            MakeEndDangling(endHalfEndPoint);
            SpringJoint2D endHalfEndSpring = endHalfEndPoint.gameObject.GetComponent <SpringJoint2D>();
            endHalfEndSpring.enabled = false;

            Rigidbody2D endBody = endHalf.gameObject.GetComponent <Rigidbody2D>();
            endBody.gravityScale = 1;
            Rigidbody2D endPointBody = endHalfEndPoint.gameObject.GetComponent <Rigidbody2D>();
            endPointBody.gravityScale = 1;
        }
        SpringJoint2D spring = endHalf.gameObject.GetComponent <SpringJoint2D>();

        spring.connectedBody = endHalf.transform.Find("EndPoint").gameObject.GetComponent <Rigidbody2D>();
        spring.distance      = (tentacle.length - endSpringJoint.distance) * 0.5f;

        ExplosionManager.BloodSplatter(tentacle.tentJoints[severPoint].transform.position, 3, 0);

        tentacle.StopGrabbing();
        GameObject.Destroy(tentacle.gameObject);
    }
예제 #2
0
    private RaycastHit2D UpdateTentTargetPosition()
    {
        //Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector2 mousePosition  = CursorManager.GetCursorWorldPosition();
        Vector2 mouseDirection = CommonUtils.NormalVector(transform.position, mousePosition);
        float   mouseDistance  = CommonUtils.Distance(transform.position, mousePosition);

        mouseObject.transform.position = new Vector3(mousePosition.x, mousePosition.y, 0);
        targetObject.SetActive(false);
        if (gripping)
        {
            if (grippingObject == null || !grippingObject.activeSelf)
            {
                StopGripping();
            }
            //if ( CommonUtils.Distance( grippingObject.transform.position, transform.position ) > m_MaxStretchDistance*2.0f )
            if (CommonUtils.Distance(tentacle.GetEndPosition(), transform.position) > m_MaxStretchDistance * 2.0f)
            {
                StopGripping();
            }
            //targetRenderer.color = Color.white;
            //float d = CommonUtils.Distance(transform.position, mousePosition);
            //if (d < m_MaxStretchDistance) {
            //	mouseObject.transform.position = new Vector3(mousePosition.x, mousePosition.y, 0);
            //} else {
            //	mouseObject.transform.position = new Vector3(transform.position.x + mouseDirection.x * m_MaxStretchDistance, transform.position.y + mouseDirection.y * m_MaxStretchDistance, 0);
            //}
            return(new RaycastHit2D());
        }
        else
        {
            // Cast from cursor position to player position
            Vector2      playerDirection = CommonUtils.NormalVector(mousePosition, transform.position);
            RaycastHit2D hit             = Physics2D.Raycast(mousePosition, playerDirection, mouseDistance, m_WhatIsGrabbable);


            if (hit.collider == null)
            {
                //Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                //Vector2 mouseDirection = CommonUtils.NormalVector(transform.position, mousePosition);
                // cast from cursor position out to max distance
                hit = Physics2D.Raycast(transform.position, mouseDirection, m_MaxStretchDistance, m_WhatIsGrabbable);
            }

            if (hit.collider != null)
            {
                targetObject.SetActive(true);
                targetObject.transform.position = hit.point;
                //targetRenderer.color = Color.green;
            }
            else
            {
                //targetRenderer.color = Color.white;
                //float d = CommonUtils.Distance(transform.position, mousePosition);
                //if (d < m_MaxStretchDistance) {
                //	mouseObject.transform.position = new Vector3(mousePosition.x, mousePosition.y, 0);
                //} else {
                //	mouseObject.transform.position = new Vector3(transform.position.x + mouseDirection.x * m_MaxStretchDistance, transform.position.y + mouseDirection.y * m_MaxStretchDistance, 0);
                //}
            }

            return(hit);
        }
    }