예제 #1
0
    private void Update()
    {
        switch (m_trapState)
        {
        case TrapState.Open:
        {
            bool closeTrap = m_player.GetButtonDown("CloseTrap");
            if (closeTrap)
            {
                RagdollWolf ragdollWolf;
                Collider2D  ragdollWolfCollider;
                if (TryCatchWolf(out ragdollWolf, out ragdollWolfCollider))
                {
                    if (ragdollWolf.AttachToTrap(this, ragdollWolfCollider))
                    {
                        m_trappedWolf = ragdollWolf;
                        SetTrapState(TrapState.ClosedTrapped);
                    }
                }
                else
                {
                    SetTrapState(TrapState.Closed);
                }
            }
        }
        break;

        case TrapState.Closed:
        {
            m_trapCooldown -= Time.deltaTime;
            if (m_trapCooldown <= float.Epsilon)
            {
                bool holdTrap = m_player.GetButton("CloseTrap");
                if (!holdTrap)
                {
                    SetTrapState(TrapState.Open);
                }
            }
        }
        break;

        case TrapState.ClosedTrapped:
        {
            m_trapCooldown -= Time.deltaTime;
            if (m_trapCooldown <= float.Epsilon)
            {
                bool holdTrap = m_player.GetButton("CloseTrap");
                if (!holdTrap)
                {
                    ReleaseTrappedWolf();
                }
            }
        }
        break;

        default:
            throw new ArgumentOutOfRangeException();
        }
    }
예제 #2
0
    public void ReleaseTrappedWolf()
    {
        if (null != m_trappedWolf)
        {
            m_trappedWolf.ReleaseFromTrap(this);
            m_trappedWolf = null;
        }

        SetTrapState(TrapState.Open);
    }
예제 #3
0
    private bool TryCatchWolf(out RagdollWolf caughtRagdollWolf, out Collider2D hitCollider)
    {
        var contactFilter2D = new ContactFilter2D
        {
            useTriggers  = true,
            useLayerMask = true,
            layerMask    = LayerMask.GetMask("Wolves", "WolvesPart")
        };

        int trapHitCount = trapCollider.OverlapCollider(contactFilter2D, m_trapHitBuffer);

        // Find a hiding wolf

        for (int i = 0; i < trapHitCount; ++i)
        {
            Collider2D hit = m_trapHitBuffer[i];

            Rigidbody2D hitRigidbody = hit.attachedRigidbody;
            if (null != hitRigidbody)
            {
                continue;
            }

            var wolf = hit.gameObject.GetComponent <Wolf>();
            if (null == wolf)
            {
                continue;
            }

            RagdollWolf ragdollWolf = wolf.GetTrapped();

            Collider2D wolfCollider;
            switch (wolf.wolfPart)
            {
            case Wolf.WolfPart.Head:
                wolfCollider = ragdollWolf.headCollider;
                break;

            case Wolf.WolfPart.Leg:
                wolfCollider = ragdollWolf.legCollider;
                break;

            case Wolf.WolfPart.Tail:
                wolfCollider = ragdollWolf.tailCollider;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            caughtRagdollWolf = ragdollWolf;
            hitCollider       = wolfCollider;
            return(true);
        }

        // Find a ragdoll wolf

        RagdollWolf closestHitWolf     = null;
        Collider2D  closestHitCollider = null;
        float       closestHitDistance = float.MaxValue;

        for (int i = 0; i < trapHitCount; ++i)
        {
            Collider2D hit = m_trapHitBuffer[i];

            Rigidbody2D hitRigidbody = hit.attachedRigidbody;
            if (null == hitRigidbody)
            {
                continue;
            }

            var hitWolfPart = hitRigidbody.GetComponent <RagdollWolfPart>();
            if (null == hitWolfPart)
            {
                continue;
            }

            RagdollWolf hitRagdollWolf = hitWolfPart.ragdollWolf;
            if (hitRagdollWolf.isDead)
            {
                continue;
            }

            ColliderDistance2D colliderDistance = hit.Distance(trapCollider);
            if (!colliderDistance.isValid)
            {
                continue;
            }

            float distance = colliderDistance.distance;
            if (distance >= closestHitDistance)
            {
                continue;
            }

            closestHitWolf     = hitRagdollWolf;
            closestHitCollider = hit;
            closestHitDistance = distance;
        }

        if (null != closestHitCollider)
        {
            caughtRagdollWolf = closestHitWolf;
            hitCollider       = closestHitCollider;
            return(true);
        }

        caughtRagdollWolf = null;
        hitCollider       = null;
        return(false);
    }