Final Lab

Project Twinstick was een school project waar we onze eigen twinstick shooter gingen maken. Wij hebben toen Final Lab bedacht een twinstick shooter waar een kantoor is overgenomen door robots. Er zijn 2 verschillende types robots gemaakt. Een robot die over de grond rijdt en en een drone robot die in de kamer vliegt en dash attacks doet op de player, maar ook schiet vanaf een afstand.

Project Info:

Team Project
Project tijd: Jaar 1 Periode 4 (2020)
Engine: Unity
Code Languages: C#
Design Patterns: Singleton & FlyWeight


Enemy Patrol

De enemies volgen een patrol route die van te voren is gemaakt. Enemies hebben 2 statussen ze kunnen Patrol doen of Aanval modes zijn dan volgen ze de player, maar omdat de player overal heen kan gaan moet de Enemy ook checken wat de kortste route is en of hij naar de route toe kan gaan. Verder werkt het enemy script samen met 3 verschillende scripts: z’n Attack script, FOV & een Health Script


private Transform GetNearestPatrolPoint()
    {
        float closedPatrolPointF = 100;
        Transform closedPatrolPointTrans = null;
        for (int i = 0; i < Patrol.Length; i++)
        {
            Vector3 dir = (Patrol[i].position - transform.position).normalized;
            Ray patrolCheckLine = new Ray(transform.position, dir);
            RaycastHit hit;
            float distanceToShoot = Vector3.Distance(transform.position, Patrol[i].position);
            Debug.DrawRay(patrolCheckLine.origin, patrolCheckLine.direction * distanceToShoot, Color.white, 2f);
            if (Physics.Raycast(patrolCheckLine, out hit, distanceToShoot, fov.obstacleMask))
            {
                Debug.DrawRay(transform.position, patrolCheckLine.direction * hit.distance, Color.green, 2f);
                Debug.Log(Patrol[i] + " Raakte iets " + hit.transform.name); 
            }
            else
            {
                if (Vector3.Distance(transform.position, Patrol[i].position) <= closedPatrolPointF)
                {
                    closedPatrolPointF = Vector3.Distance(transform.position, Patrol[i].position);
                    patrolStep = i;
                    closedPatrolPointTrans = Patrol[i];
                }
            }
        }
        if(closedPatrolPointTrans == null) //
        {
            Die();
            return null;
        }
        return closedPatrolPointTrans;
    }

Krijgt dichtbijzijnste patrol point als enemy spawnt


Save System

Natuurlijk wil je niet opnieuw beginnen elke keer dat je de game opstart en daarom hebben wij een save systeem in de game gemaakt. Het save systeem slaat: stage, health, armor, bullets, mainweapon, wapen & score op. Het save systeem is best complex, omdat de wapens als string staan opgeslagen en een script er achter komt welk wapen er was opgeslagen.


public void CheckForWeapon(string weaponName)
    {
        for (int i = 0; i < weapons.Length; i++)
        {
            if(weapons[i].name.ToLower() == weaponName.ToLower())
            {
                GameObject weaponClone = Instantiate(weapons[i]);
                weaponClone.GetComponent().PickUp(Player);
            }
        }
    }

Krijgt het correcte wapen van de save


Granaat

Granaten zijn natuurlijk leuke dingen om mee te spelen (in game). Dat vonden wij ook dus hebben wij ze toegevoegd de ze doen minder damage als je verder van de granaat af staat. We hadden eerst ook het idee om granaat scherven toe te voegen maar we hebben het gehouden bij een Physics.OverlapSphere we hebben wel gecheckt of je wel zichtbaar bent dus dat je niet achter een muur staat, want zou niet goed zijn als je dan damage pakt.


Wapens

Het FireArm script is het script wat alle wapens. Het script leest voornamelijk de wapen data uit het ScriptableObject van het wapen zelf. De basis van het script is gemaakt door Boas-Bas, maar er is zoveel toegevoegd door ons beide dat het meer een script is waar we beiden aan gewerkt hebben. Hij heeft reload, pickup & base Shoot toegevoegd en ik heb wapen checks, swap van wapens, pickup van wapens gefixt, Gun Jam, Bullet Tracer & Shotgun script tegevoegd.


private void CheckGunJam()
    {
        Vector3 dir = ((new Vector3(transform.root.position.x, firepoint.position.y, transform.root.position.z) - firepoint.position + firepoint.forward/2)).normalized;
        Ray shootLine = new Ray(firepoint.position + firepoint.forward/ 2 , dir);
        RaycastHit hit;
        Debug.DrawRay(firepoint.position + firepoint.forward /2, dir * Vector3.Distance(firepoint.position, new Vector3(transform.root.position.x, firepoint.position.y, transform.root.position.z)), Color.white);
        if (Physics.Raycast(shootLine, out hit, Vector3.Distance(firepoint.position, new Vector3(transform.root.position.x, firepoint.position.y, transform.root.position.z)), this.weapon.layerMasks))
        {
            Debug.DrawLine(firepoint.position, hit.point, Color.red);
            if (hit.point == null || hit.transform.CompareTag("Player"))
            {
                jamGun = false;
            }
            else if (hit.transform.gameObject.layer == 8)
            {
                jamGun = true;
            }
        }
        else jamGun = false;
    }

Zorgt er voor dat je niet kan schieten als je wapen loop door de muur heen zit (Dus je kan niet aan de andere kant van de muur schieten)