CROW

Project Type

Software

Role

University/Group

Unity

All Design, All Programming

Iterative Design: Parry

Players didn’t understand MVP version of Parry

First Attempt: Throwing it in their Face

They Dodged

Failure:

  • Boring

  • Didn't work

  • Even when players parried, they weren't having much fun.

NPC Trainer

Satisfying!

Enemy Design/Encounters now demand Parrying

Programming: Hit Detection

    /// <summary>
    /// Performs a box sweep each frame. Each sweep creates a permanent line segment if distance > threshold.
    /// If the distance is below the threshold, all previously created lines revert to green.
    /// </summary>
    private void CheckMeleeCollisions()
    {
        Vector3 currentPosition = transform.position;
        Quaternion currentRotation = transform.rotation;
        Vector3 movement = currentPosition - previousPosition;
        float distance = movement.magnitude;
        
        Quaternion midpointRotation = Quaternion.Slerp(previousRotation, currentRotation, 0.5f);

        for (int i = 0; i < weaponColliders.Count; i++)
        {
            var boxCol = weaponColliders[i];
            if (boxCol == null) continue;

            Vector3 halfExtents = Vector3.Scale(boxCol.size * 0.5f, transform.lossyScale);
            Vector3 worldCenterPrev = previousPosition + previousRotation * boxCol.center;
            Vector3 worldCenterNow = currentPosition + currentRotation * boxCol.center;
            Vector3 castDirection = (worldCenterNow - worldCenterPrev).normalized;

            bool hitOccurred = false;
            Vector3 firstHitPoint = Vector3.zero;

            RaycastHit[] hits = Physics.BoxCastAll(
                worldCenterPrev,
                halfExtents,
                castDirection,
                midpointRotation,
                distance,
                hitMask,
                QueryTriggerInteraction.Ignore
            );

            if (hits.Length > 0)
            {
                hitOccurred = true;
                System.Array.Sort(hits, (h1, h2) => h1.distance.CompareTo(h2.distance));
                firstHitPoint = hits[0].point;

                foreach (var hit in hits)
                {
                    if (hit.collider && hit.collider.gameObject != boxCol.gameObject)
                    {
                        Debug.Log("Hit: " + hit.collider.name);
                    }
                }
            }
        }
    }
}

 

(ESC) to exit

Next
Next

Codebreaker