{"id":566,"date":"2022-09-06T22:15:35","date_gmt":"2022-09-06T20:15:35","guid":{"rendered":"https:\/\/wesleydegraaf.com\/?page_id=566"},"modified":"2024-10-03T23:01:41","modified_gmt":"2024-10-03T21:01:41","slug":"final-lab","status":"publish","type":"page","link":"https:\/\/wesleydegraaf.com\/en\/final-lab\/","title":{"rendered":"Final Lab"},"content":{"rendered":"\n<div class=\"wp-block-cover\" style=\"min-height:280px;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-palette-color-1-background-color has-background-dim-100 has-background-dim\"><\/span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<p class=\"has-text-align-center has-x-large-font-size wp-block-paragraph\"><strong>Final Lab<\/strong><\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-1-color\">Project Info:<\/mark><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Team Project<br>Project tijd: Jaar 1 Periode 4 (2020)<br>Engine: Unity<br>Code Languages: C#<br>Design Patterns: Singleton &amp; FlyWeight<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-1-color\">Enemy Patrol<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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\u2019n Attack script, FOV &amp; een Health Script<\/p>\n\n\n<div class=\"dm-code-snippet light no-background  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"400px\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Get the Code!<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">You have it!<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"line-numbers\"><code id=\"dm-code-raw\" class=\"wrap language-typescript\">\n<pre>private Transform GetNearestPatrolPoint()\n    {\n        float closedPatrolPointF = 100;\n        Transform closedPatrolPointTrans = null;\n        for (int i = 0; i < Patrol.Length; i++)\n        {\n            Vector3 dir = (Patrol[i].position - transform.position).normalized;\n            Ray patrolCheckLine = new Ray(transform.position, dir);\n            RaycastHit hit;\n            float distanceToShoot = Vector3.Distance(transform.position, Patrol[i].position);\n            Debug.DrawRay(patrolCheckLine.origin, patrolCheckLine.direction * distanceToShoot, Color.white, 2f);\n            if (Physics.Raycast(patrolCheckLine, out hit, distanceToShoot, fov.obstacleMask))\n            {\n                Debug.DrawRay(transform.position, patrolCheckLine.direction * hit.distance, Color.green, 2f);\n                Debug.Log(Patrol[i] + \" Raakte iets \" + hit.transform.name); \n            }\n            else\n            {\n                if (Vector3.Distance(transform.position, Patrol[i].position) <= closedPatrolPointF)\n                {\n                    closedPatrolPointF = Vector3.Distance(transform.position, Patrol[i].position);\n                    patrolStep = i;\n                    closedPatrolPointTrans = Patrol[i];\n                }\n            }\n        }\n        if(closedPatrolPointTrans == null) \/\/\n        {\n            Die();\n            return null;\n        }\n        return closedPatrolPointTrans;\n    }<\/pre>\n<\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Krijgt dichtbijzijnste patrol point als enemy spawnt<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-1-color\">Save System<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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 &amp; 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.<\/p>\n\n\n<div class=\"dm-code-snippet light no-background  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"400px\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Get the Code!<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">You have it!<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"line-numbers\"><code id=\"dm-code-raw\" class=\"wrap language-typescript\">\n<pre>public void CheckForWeapon(string weaponName)\n    {\n        for (int i = 0; i < weapons.Length; i++)\n        {\n            if(weapons[i].name.ToLower() == weaponName.ToLower())\n            {\n                GameObject weaponClone = Instantiate(weapons[i]);\n                weaponClone.GetComponent<Firearm>().PickUp(Player);\n            }\n        }\n    }<\/pre>\n<\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Krijgt het correcte wapen van de save<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-1-color\">Granaat<\/mark><\/h2>\n\n\n\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile\"><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\">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.<\/p>\n<\/div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"306\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2021\/04\/ezgif.com-video-to-gif_1-1.gif\" alt=\"\" class=\"wp-image-143 size-full\"\/><\/figure><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-1-color\">Wapens<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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 &amp; base Shoot toegevoegd en ik heb wapen checks, swap van wapens, pickup van wapens gefixt, Gun Jam, Bullet Tracer &amp; Shotgun script tegevoegd.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"184\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2021\/04\/Weapons-1-1024x184.jpg\" alt=\"\" class=\"wp-image-144\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2021\/04\/Weapons-1-1024x184.jpg 1024w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2021\/04\/Weapons-1-300x54.jpg 300w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2021\/04\/Weapons-1-768x138.jpg 768w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2021\/04\/Weapons-1.jpg 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n<div class=\"dm-code-snippet light no-background  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"400px\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Get the Code!<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">You have it!<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"line-numbers\"><code id=\"dm-code-raw\" class=\"wrap language-typescript\">\n<pre>private void CheckGunJam()\n    {\n        Vector3 dir = ((new Vector3(transform.root.position.x, firepoint.position.y, transform.root.position.z) - firepoint.position + firepoint.forward\/2)).normalized;\n        Ray shootLine = new Ray(firepoint.position + firepoint.forward\/ 2 , dir);\n        RaycastHit hit;\n        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);\n        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))\n        {\n            Debug.DrawLine(firepoint.position, hit.point, Color.red);\n            if (hit.point == null || hit.transform.CompareTag(\"Player\"))\n            {\n                jamGun = false;\n            }\n            else if (hit.transform.gameObject.layer == 8)\n            {\n                jamGun = true;\n            }\n        }\n        else jamGun = false;\n    }<\/pre>\n<\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">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)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<p><iframe loading=\"lazy\" frameborder=\"0\" src=\"https:\/\/itch.io\/embed\/995479?bg_color=ffffff&amp;fg_color=222222&amp;link_color=1916fe&amp;border_color=848484\" width=\"552\" height=\"167\"><a href=\"https:\/\/double-gezicht.itch.io\/final-lab\">Final Lab by Double_Gezicht<\/a><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-566","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages\/566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/comments?post=566"}],"version-history":[{"count":15,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages\/566\/revisions"}],"predecessor-version":[{"id":924,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages\/566\/revisions\/924"}],"wp:attachment":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/media?parent=566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}