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(); } }
public void ReleaseTrappedWolf() { if (null != m_trappedWolf) { m_trappedWolf.ReleaseFromTrap(this); m_trappedWolf = null; } SetTrapState(TrapState.Open); }
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); }