{"componentChunkName":"component---src-templates-blog-post-js","path":"/fr/blog/unity-step-by-step-ball-game/","result":{"data":{"site":{"siteMetadata":{"title":"A Game Studio","author":"Lythom"}},"markdownRemark":{"id":"2b493a03-023b-5059-9d36-801a0185c33a","html":"<p>Aperçu: <br>\n→ <a href=\"#installer-unity\">Installer Unity</a> <br>\n→ <a href=\"#afficher-un-sprite\">Afficher un sprite</a> <br>\n→ <a href=\"#animer-un-sprite\">Animer un sprite</a> <br>\n→ <a href=\"#les-r%C3%A8gles-du-jeu\">Les règles du jeu</a> <br>\n→ <a href=\"#le-moteur-physique\">Le moteur physique</a> <br>\n→ <a href=\"#trucs-et-astuces\">Trucs et astuces</a> <br></p>\n<p>[Note: Article en cours d’écriture, il n’est pas encore finalisé. Merci de votre compréhension]</p>\n<p>Cet article a vocation de tutorial et de support de cours pour apprendre les bases de Unity en 2D.\nAucun pré-requis n’est nécessaire, mais il se peut que vous deviez explorer certaines fonctionnalités de Unity par vous même pour réussir certaines étapes.</p>\n<p>Il s’agira de développer avec Unity un jeu de ballon, prétexte pour apprendre des notions clés tel que :</p>\n<ul>\n<li>L’initialisation d’un projet</li>\n<li>La configuration d’un environnement de développement</li>\n<li>l’importation de sprites</li>\n<li>les scripts pour manipuler les entités (camera, personnage)</li>\n<li>le rendu de sprites animés (via script et via Animator)</li>\n<li>le moteur physique 2D</li>\n<li>les règles du jeu via scripting</li>\n</ul>\n<h2 id=\"installer-unity\" style=\"position:relative;\"><a href=\"#installer-unity\" aria-label=\"installer unity permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Installer Unity</h2>\n<ol>\n<li>Télécharger et installer <a href=\"https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup.exe\">Unity Hub</a></li>\n<li>Depuis le hub, installer la dernière version stable de Unity (Installs > Add > Latest Official Release)</li>\n<li>Dans les modules,</li>\n<li>installer Visual Studio Community 2019 si vous souhaitez l’utiliser comme environnement de développement (IDE). Nous utiliserons plutôt Visual Studio Code (VSCode) pour la suite de ce tutorial.</li>\n<li>installer les platformes pour lesquelles vous souhaiter compiler votre projet, au moins une, par exemple “Windows build support” si vous êtes sous windows.</li>\n<li>Télécharger et installer <a href=\"https://code.visualstudio.com/\">Visual Studio Code</a></li>\n<li>Dans VSCode, installer les extensions “C#” et “Debugger for Unity”</li>\n<li>Créer un nouveau projet depuis Unity HUB (Projects > New > 2D), choisir un nom et un dossier de destination</li>\n<li>Dans Unity, configurer votre éditeur de script externe pour être VSCode en installant le paquet “Visual Code Extension depuis le package manager”.\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/876f79ba8fada11b915cd5e3a7258d60/91b29/package_manager.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 41.21621621621622%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAA7DAAAOwwHHb6hkAAABnUlEQVQY00WQW08TURCA9+e0D03TC+7lXPacnu52Wy5RUX+A0Qd+lolvEtkAofSSkG3UlC2aKKBGHiS2od1u2+wC6i4h0ekC4XuYTGbmO3My0vuDw+Mfp2PP+xtFl5e/Pc/rdDqO47RarUaj0Ww2IanX6zt3QL6b0G63JXvjbTCdjM4GF8Fs5nvdD++EENVqtVgsZjKZhYRcLlcoFPL5POTZbDaVSqXTaehKr9c3j07HX3/5J6Pzn9Oo7nTL5bkMT2iaRilFCFmWZZqmrjPOOSEE6qqq6kyXXr3Z6n7r7x18/9IPTiZX244rSiXDMKAtyzKMgl8xy0zHhGA5QVEUiFCXdra3xmcD+PCfi+Dfdfyp53IOsgkWjEHEoItHWKxqiIKlJNzKG7Y9HI58fxKEYRRf7bv7OsUlzjDSFHkBIxUWispjwpcQwqpyz1y2bXs0HPq+H4ZhHMdur8eNRcNaIcxUUAnpFcrEYq2yvFRjjN3sBB4kzOXgFpAj9+Nn8fBl9ela7dkaX3lOl18w6wklGK6lzs+kYowpITpjmOD/CCXhD5KbTXEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"package manager\"\n        title=\"package manager\"\n        src=\"/static/876f79ba8fada11b915cd5e3a7258d60/fcda8/package_manager.png\"\n        srcset=\"/static/876f79ba8fada11b915cd5e3a7258d60/12f09/package_manager.png 148w,\n/static/876f79ba8fada11b915cd5e3a7258d60/e4a3f/package_manager.png 295w,\n/static/876f79ba8fada11b915cd5e3a7258d60/fcda8/package_manager.png 590w,\n/static/876f79ba8fada11b915cd5e3a7258d60/efc66/package_manager.png 885w,\n/static/876f79ba8fada11b915cd5e3a7258d60/91b29/package_manager.png 983w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></li>\n<li>Suivre la manipulation suivante pour configurer l’éditeur externe dans “edit > Preferences > External Tools”.</li>\n</ol>\n<div style=\"text-align:center\">\n<video controls width=\"720\" height=\"405\">\n    <source src=\"/c16734a2ca61751b0dad79d60c1d4993/configure_vcode.mp4\" type=\"video/mp4\" />\n</video>\n</div>\n<h2 id=\"linterface\" style=\"position:relative;\"><a href=\"#linterface\" aria-label=\"linterface permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>L’interface</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/a81a2870a2a69f9527e81e74b8ab317a/2093e/unity_interface.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 58.10810810810811%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACEElEQVQoz42Sa28SQRSG9zcYW41QYS/sssvusldm792l5RZ2WraFINqmMbGYELVGf4MRFhELCfWL/9WzYE0/+MEnk8nJzLznvDNniG/T2Zev03SWrm9v734s18vl4vtiPp8vtqRp+ieYz6ez9NdP4G61Wq3X681mQ0Qibwi8JIlGhTELT0QqlyvmHj/bKwmMWlOf0wf7ub08dZDP7zNPH7Vqqm4YsiwriqJpGuG57qHrAOUqx0gMK7OWKxx1w5NhLxn18DCxW01WYvgqx4m0F/nNZvNwi+/7hG3byLKQhViJZSp0kadxrAxf4biP8QDjftweDiuOT/HFQrnoRR6IXdf1tmRi669YpPMcfXGujS7i08Hp2egMn7UHb95WjxOSy5MChRzU6XTq9TpUDoKAQLvKCJXEEl2hSZ62fTl5AWVPuuddcH45fi2YGsWTJE+atolj3Gq3wjAEPRFa6AiZHkKszJFCkRJIUqCrltLAjbgfh+2wrHLgGfIWygXkoqSXgLjRaERRRGDXObaQYztgSdbk3RBkQTEU27NFRSyLvCBXBClbcf3stu49xMury3efbq4n48n7yeTD5Gp8ffPxM1jSNWiKUTNrJmBko7YFPYAA957vZSkDHwLH8/wgABm0UdchQzbvgBXIYz2AgLfKOq5qqqpqWyAw/gXooTL8CPseQjf03YbyH8CxnanMl2H+BiMXsZdoHQssAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"unity interface\"\n        title=\"unity interface\"\n        src=\"/static/a81a2870a2a69f9527e81e74b8ab317a/fcda8/unity_interface.png\"\n        srcset=\"/static/a81a2870a2a69f9527e81e74b8ab317a/12f09/unity_interface.png 148w,\n/static/a81a2870a2a69f9527e81e74b8ab317a/e4a3f/unity_interface.png 295w,\n/static/a81a2870a2a69f9527e81e74b8ab317a/fcda8/unity_interface.png 590w,\n/static/a81a2870a2a69f9527e81e74b8ab317a/efc66/unity_interface.png 885w,\n/static/a81a2870a2a69f9527e81e74b8ab317a/c83ae/unity_interface.png 1180w,\n/static/a81a2870a2a69f9527e81e74b8ab317a/2093e/unity_interface.png 1858w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>Les onglets manipulés fréquement sont :</p>\n<ul>\n<li><strong>La hiérarchie</strong> : va de paire avec la scène. Dans Unity on manipule des objets <code class=\"language-text\">GameObject</code> qu’on peut hierarchiser dans la scène. un objet peut avoir des enfants et être situé dans un parent. Lorsqu’un parent est déplacé, redimensionné ou tourné, alors les objets enfants subissent la transformation relative à leur parent.</li>\n<li><strong>La scène</strong> : Les objets ayant des composants visuels sont affichés sur la scène. Ils peuvent être manipulés (déplacements, etc.) via les outils de la barre d’outils. Les objets n’ayant pas de composants visuels sont également manipulés mais ne peuvent être sélectionnés que via l’onglet hiérarchie.\nIl est fréquent d’avoir des scènes différentes pour différentes étapes du jeu et de basculer d’une scène à l’autre via des scripts.</li>\n<li><strong>Le jeu</strong> : Lorsqu’on clique sur le triangle “lecture” en haut de la scène, Unity démarre le jeu et bascule directement sur l’onglet “jet” qui affiche le rendu final du jeu. Ce rendu est celui de la (ou des) caméra(s) configurée(s) dans la scène.</li>\n<li><strong>L’inspecteur</strong> : c’est là qu’on peut modifier les propriétés de l’objet sélectionné (qui peut être sur la scène/hierarchie ou dans la vue projet) et de ces composants. C’est également là qu’on peut ajouter à l’objet des nouveaux composants. Un composant est un script qui hérite de <code class=\"language-text\">MonoBehaviour</code> et qui enrichit l’objet de nouveaux comportements. Certains sont fournis par défaut avec Unity (par exemple <code class=\"language-text\">SpriteRenderer</code> pour afficher une image) et il est souvent nécessaire de créer des composants personnalités (via le bouton “Add Component > New Script” de l’inspecteur).</li>\n<li><strong>Le projet</strong> : Rattaché au système de fichiers du système d’exploitation, c’est à dire au dossier du projet, c’est là qu’on ajoutera toutes les assets (images, sons, scripts, etc.) qui serviront au fonctionnement du projet.</li>\n<li><strong>La console</strong> : C’est là qu’apparaitront les erreurs de compilations et les Exceptions non capturées lors de l’exécution (runtime). A consulter lorsque tout ne se passe pas comme prévu.</li>\n</ul>\n<h2 id=\"afficher-un-sprite\" style=\"position:relative;\"><a href=\"#afficher-un-sprite\" aria-label=\"afficher un sprite permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Afficher un sprite</h2>\n<ol>\n<li>Ajouter une image (glisser déposer) depuis votre exlorateur de fichier vers la vue projet OU créer le fichier image dans le dossier <code class=\"language-text\">Assets/</code> de votre projet.</li>\n<li>Dans la vue projet, sélectionner l’image puis regarder l’inspecteur: il affiche les informations d’importation de texture.\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 375px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/bb3b3698ec16d912bf01eacbe7244de2/5ff7e/sprite_importer.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 149.32432432432435%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAIAAACjcKk8AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAC7klEQVQ4y42U2XLaQBBF9TNxloKwIwwYLIFAQuxgE7Y4FMX//4LP6EpTwrzkPkzN0rf3HieI14u3c7zeh8tdx49+/Pz1LcHT05NW8P0e3FSr1UKh4Lz6vXgRheFoGk/G42Aw8AeDQRAEnuexDodD3/fb7fZzBtd1uZlMJlEUOd7Im/+Zv/recIBkKg1Nq7kKgl6v95Kh0+lwczgc1uu103pudV+6LeCaBd2yg4VGo9FsNlnZ6wmw6Xa77+/v8/ncqdfr6LO6RYODzTiOwzCMEoxGo9cM/X4fAwg7KOZBz4hyJfJmszkej28JsIOTkxzQO5vNjGXCgIMzsm8icF0scNPJwP7lHginlgVcxabIi8Xi4+ODFadkLcqB43Q6NZbRgcOcx+MxfEJCBZZRXywWfz+gVCppY8iYQhl8yBSZZChhu92OgnkP4BIxPDVkpEXGEzZESCw4QjHw4pGMAB2GTErGJprwH628cUk+t9stKjAyzEH9Q0TEZcjUFia32IHPygMWKAbuyE+BfV4gtax+RoXtSjTKt2YG9kgSGk6xpjGrE/NywPapBXnF2/1+T2PTPwTlcGurp/ZqJUAXetHi5sCxmqFWqzmccZUYWGkjkTV3Crh/D9vhJmZVRb1KqNDwBY209O12Y1WEX0AVV6uVIStV2EGftUxjau54HSewXcyN6mfIZL+bgAorYMi6Yc+lNLYzEHC5XK5UKulUEaG6Gp/VsGoVVJMY7GCAjbLIEbG0w/CWMJhYEq6pYLXxI0TYHNmglFdioS5sHPSpjeEr7SiGzPF6vfIlqOE1gwLZISNmJEWm4pwRxT5vOMnxcrnQDFThMduac0NGGhoHNamCh/M3AXo1cBZEARmThkwZqMpyucR55YaQ2FPnfwnO53PePmSEWQ0Zm6jnjH04aGWPcbwIE2DE/uHaaIRMtpGzP4ZqhoQmwdZW36AmhKPawdGf/mWk7DeYHwk4p9OJLOA5sRBp+hm0/gOIySk81Vf5CRP0yBaVIHsvAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"sprite importer\"\n        title=\"sprite importer\"\n        src=\"/static/bb3b3698ec16d912bf01eacbe7244de2/5ff7e/sprite_importer.png\"\n        srcset=\"/static/bb3b3698ec16d912bf01eacbe7244de2/12f09/sprite_importer.png 148w,\n/static/bb3b3698ec16d912bf01eacbe7244de2/e4a3f/sprite_importer.png 295w,\n/static/bb3b3698ec16d912bf01eacbe7244de2/5ff7e/sprite_importer.png 375w\"\n        sizes=\"(max-width: 375px) 100vw, 375px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></li>\n<li>En projet 2D la texture est automatiquement configurée de type “sprite (2D and UI)“. Pour texturer un objet 3D on utiliserait “default”. Les autres modes sont pour des usages avancés (vous le saurez quand vous en aurez besoin).</li>\n<li>“PixelsPerUnit” Indique à Unity quelle sera la densité de pixels à utiliser par rapport au système d’unité du moteur. Unity est un moteur 3D, et comme la notion de “pixel” n’existe pas dans un espace 3D Unity propose un système d’unité de référence. Ces unités sont totalement arbitraire (on dira “une taille de une unité” ou “une taille de un”) mais permettent de garantir la cohérence des proportions entre les assets quelle que soit la position de la caméra et la résolution finale. Nous n’apprendrons pas à afficher un sprite en rendu pixel perfect (1px du sprite rendu sur 1px dans le rendu final), si vous souhaitez le faire voici un tutorial : <a href=\"https://blogs.unity3d.com/2019/03/13/2d-pixel-perfect-how-to-set-up-your-unity-project-for-retro-8-bits-games/\">https://blogs.unity3d.com/2019/03/13/2d-pixel-perfect-how-to-set-up-your-unity-project-for-retro-8-bits-games/</a></li>\n<li>Si vous utilisez du pixel art, passer le “filter mode” en “Point (no filter)” pour un meilleur rendu.</li>\n<li>Depuis la vue projet, glisser déposer l’image vers la scène. Celà créera automatiquement un <code class=\"language-text\">GameObject</code> avec un composant <code class=\"language-text\">SpriteRenderer</code> configurer pour afficher votre image.</li>\n</ol>\n<h3 id=\"autres-exemples-courants\" style=\"position:relative;\"><a href=\"#autres-exemples-courants\" aria-label=\"autres exemples courants permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Autres exemples courants</h3>\n<h4 id=\"sprite-de-fond-avec-répétition\" style=\"position:relative;\"><a href=\"#sprite-de-fond-avec-r%C3%A9p%C3%A9tition\" aria-label=\"sprite de fond avec répétition permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Sprite de fond avec répétition</h4>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/479f4eecea674823972c896d6716f693/4b446/sprite_tiledbackground.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACf0lEQVQoz3VS227aQBD150RpAja+4tv6buxdeykYTGkSIGlFI1FVitTfTH8ihTRKXtKnhDz02Eh9qXq0Hs/CXM4cj/Dj9na33T08PGy3u1/39z/v7u53sNunp6ffz89v+7cD9vv96+srLHw4Ly8vj4+Pwreb76tP67Ozs/l8fnGxWC2Xl5eXq8VitVpdXV1VVbVogYD1er1cLuGcn59ftBDCKHaJ1+2Kx8fHqqZGSWRYhk2cKI4sxzJt0yGu3tf7Zj8IAtuxNU07OjqSJIkQIuiqMizZaFi6tuWHhE0KPi7KccEqxuthWfPhpBzWPOMZcV1KaVEUSINTlqUg20k0XhTzz0YyspKcVcWiLqfTIh+zzc3XouYfquG4fh/ROPD9IPBVVdVaWJYl9BRj8PFLxD+qJnHjuJgwNmG0onRMi0nBxpRWZTHlCUuiKAZz0zRFUex0Oo7jCGK3M8jzOI41RXY9G2yRlo9wcjgUdgQ6LKFJGEaui/oxFIV4nHNBFCVd1w3D0DSd+ITXvDlTXk5LPmssSpR1GdPY932rxfX19WazaWYepKlt25bVyChKoqqrOLIqK5qCA9/1XddzHQKaDiL7LTA5fCFLA8byIAz9wDctE3/gUWRZUWAa69gO5gQ1iBxFEUqMRiPGGPgLjuOCQJZlSZEMaEqIlxDCg1DXNeRgol6vd6jSxCRYCpLlFJlpmgp4DQYDz/PCJHQJ1sJCF6uRQEPmoT+AEohBPib3fB8sIJ6AOzYOJeSejL3ptZDaboec5ipJGBKbizZBK5vR74dhKKA7thq//v36/wIUoMVsNkOPrEXYQuh2u+B2enr67v9ADOzJyQkaHMQDHVz/AILcExTZIHMyAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"sprite tiledbackground\"\n        title=\"sprite tiledbackground\"\n        src=\"/static/479f4eecea674823972c896d6716f693/fcda8/sprite_tiledbackground.png\"\n        srcset=\"/static/479f4eecea674823972c896d6716f693/12f09/sprite_tiledbackground.png 148w,\n/static/479f4eecea674823972c896d6716f693/e4a3f/sprite_tiledbackground.png 295w,\n/static/479f4eecea674823972c896d6716f693/fcda8/sprite_tiledbackground.png 590w,\n/static/479f4eecea674823972c896d6716f693/4b446/sprite_tiledbackground.png 877w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>Particularités :</p>\n<ul>\n<li>Draw Mode: Tiled (préciser le nombre de répétitions dans Width et Height)</li>\n<li>(Configuration d’importation de l’image) Mesh Type: FullRect</li>\n</ul>\n<h4 id=\"forme-géométrique-de-base-ex-hexagone\" style=\"position:relative;\"><a href=\"#forme-g%C3%A9om%C3%A9trique-de-base-ex-hexagone\" aria-label=\"forme géométrique de base ex hexagone permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Forme géométrique de base (ex. hexagone)</h4>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/d6eaf6f2f13ff113dd859966bd8a8901/4b446/sprite_hexa.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsSAAALEgHS3X78AAACyUlEQVQoz2VSyU7bYBD2syQOiR3HS7zbsX873pfYcTZaEpI4pVCVQ4XU10AqZ8Qj8Cr0JSABBBd6Yjl0Auqpn+zRzK+Z+WbDfl9dbdab+/v79Xpzd3t3c319u7m9uV4/Pj7+eXp6e33b4nWLl5cXkGCB8vz8/PDwgP04+VkeHM1ms729vcVisVwuVquyXC7LZbn6shqNRot3gMPR4deyLEHZ39+HF5CY47gIWQzDkCTJ84LneaqqdnTddVyjY4BuGIYsiaqBukne0VRZUQiCYFkW3jFJlvI8K4oCjCAK3NBxI7+YjONe5IXeYHeYjQa9LA1CMKPxeDydTqMomkwmw+EQY2g6iJIsL4BHN/UaXSM4QutqZJvEKVxGcm+cxb3Y6XZtC/meDxy6rpumaVkWxjJ0tLtw4kJVoFyt1sLxZrVCVKpNHKd2IEU6SuM0sh03jCLHcXieVxRFEAToCGNblJ8NvN4Y0gkSX2niO3RDMsQ6U6+SFYIl/CxI89Rxfd8PYSK+HyCEgBwSYbTi+bsH/dWJ3V9SEC03ZlN/VJbxp8+UxOJUDafruqm5jmPbNnDCjAzLhAa3wUGSIS/uhj2jG1I02+ZITeN5SRQ1lWS5emOH4zlB5KFV8HZdF5R+vx+GYZqkWOijNApshDRV0TXNNJAgiAJ01m5DBqAyzO2EdF0LggDKNhGKkxSyJEmCdSBTUYC8uLg4+3XG8ayqq+Xq4NvRd1bjGIPJetl8vt9iuSCI0iTpvgNGvS3b9704jmF0x8fHcEAK8He0PO8X/YGoirIhW5YdhaGi67aLoOA03cabJgKJwQ8bh71dXl6en5/DnYmCyLxD4AX4OI5rtVpAtjqcZ1nWz/MPWtAxKH0+n0MzEHl6ekrTtCzLEuBD/gOsZzFfABN0C0sDEyQGicEbYqrVKg53QVHN/wBVNEmSIBptmKIkwYV8lPYXHYsSjOaKK1oAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"sprite hexa\"\n        title=\"sprite hexa\"\n        src=\"/static/d6eaf6f2f13ff113dd859966bd8a8901/fcda8/sprite_hexa.png\"\n        srcset=\"/static/d6eaf6f2f13ff113dd859966bd8a8901/12f09/sprite_hexa.png 148w,\n/static/d6eaf6f2f13ff113dd859966bd8a8901/e4a3f/sprite_hexa.png 295w,\n/static/d6eaf6f2f13ff113dd859966bd8a8901/fcda8/sprite_hexa.png 590w,\n/static/d6eaf6f2f13ff113dd859966bd8a8901/4b446/sprite_hexa.png 877w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>Particularité :</p>\n<ul>\n<li>Créé depuis la vue Project via “clic droit > Create > Sprite > Hexagon”</li>\n</ul>\n<h2 id=\"animer-un-sprite\" style=\"position:relative;\"><a href=\"#animer-un-sprite\" aria-label=\"animer un sprite permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Animer un sprite</h2>\n<p>Deux méthodes seront présentées ci-dessous pour animer des sprites: avec un script ou avec l’outil Animator de Unity.</p>\n<p>Pour toutes les méthodes : créer un sprite multiple à partir d’une image spritesheet, extraire les séquences en sélectionnant les images voulues dans l’onglet projet et en les déplaçant vers la scène.</p>\n<div style=\"text-align:center\">\n<video controls width=\"720\" height=\"405\">\n    <source src=\"/ab3bf2e1d156653c30504525dcbc0ab6/Unity_create_animated_b2viup.mp4\" type=\"video/mp4\" />\n</video>\n</div>\n<p>Image de référence pour le sprite :</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/cb0eedb1e27ff1f5cbb5083da1926ef4/5fd3e/girl.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 87.16216216216216%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZUlEQVQ4y42TW1AbVRjHD6UUOwMMtgjVtCqUMiiCQOSSCwESkk12c9tcNySbzeYKhAANICaFUGgCbaQC5RIqBcKtKFPBS51O1fHNl8744IMz8uBl+q4zztQ3xzXnWJzO+OL3sr9v/2fP+b7/fgdYJa0X0gbP53cwGgOZWCFdNzcJNg75us6m3tJ61nw8fp5DLS/e0Hu2Uu22NqilSGZmE3ddgRxXU/4dnfdezxuSEkCWtlSuB5zcar+NhOKsjfppPeT4DPJV3DC9FXRxMkfJKcOrkvLdHi+30mOjoHaTsj7eCNGfQI5iutvpXvo3wetVBaCXwc8k9ObZmEBdAcWExRydkhu9kK84tbXXtGQf4jEyP04ab1wV6S7BfMpiGZmWmxnIk4xBksDN17vOCnOAsxr3H/qD3F0f4wAg94VFo/PJvS7vQ7gwJjdt77N+zi9uOquvaGl60N3PpV10D9QWjfY/9rzub1HLuGnm01A356gT8ICEdzE/yhCxsVG6BIphs8wR67NIIUf0hG2qS7sKWVlacyHm1m2Px7SlMB+wSKMTAwbUfkAuFk/2m3ohA7pZWbVh8nyfUlNWmC8ZXB+mjS60ybSadt/F/NssKH+OacVb1zH3wVqjXQSywcll3LW6LWFHkNcaa11a7DWOVHcUAFeVUrDip7k7I/YOKCYpy+O1y3Qa8phKn9zLtGKX8fOtFZLqvWA3t9bFIt/m7I4fd/r995E1mPn+vsfHGWveOo+qNHdTBeBpUEFVHngmXqOlxcdsZBUXgYafjflfPjlDOoIxghKgURvqLH5vWKvJYDbAM40OSdtkAyI1D5WvJBoSBnk9qhajWvY9nlHI7ma1Pk16j3YIRiUq5Vce+gLcstWMfKsr5vMmpdQ3H7PuX8HABDgxJlcu6WsU5VAcV2uuXSaFTvRTFHLTLcr8JWT9pbb6dR99tOyxEDCfcOsiySCjeFr8qTGDduODkD2Bsi4hiaU17rcX6vC8wnNlRStqNjLVqG2YtFrWD4ZGjlwKQV5QIXN+NDjEpcNBMiJSvfm+nl0f9Kuep2SiM6s6ZvUW889BKMJS3YPMTHEbfWSltRZjd1kft2A3JyMaZSI96P75dmrpNM0XYishxw+Hs+80UWXChgWG+n1+hA1nPs9NksZHi/3MF0qD4TTacIKV88YDeBXkBvX5E6MM1nx8GCHAi4451m6QOBXSQuS1UFszYbIKIetAWV6kjeCjRXPazs2Umz5E91NGiVbs9q/jYT/yM0VQYlv+i7no6rUqi95tt/4Vadd2oh8mM3830WpEY5Nst3huyKx/VlS+lA8CAjweNeloKHSL1UxUpV87WA0X2njEuSVz58OEx+JAJ3MAhJT4XEiuqEa+Y/KeXqXKDblHo6jqw1Tz/3o4L6F24zgpeXb+esXdJ+DzyaOvcue6hrPA/w2GaM6JyvS/DKuUqJVZuyUnzrr/s8FowAA8vMassLADcByH3skKX0HrXLX1oL+yLctBtIC/AWyRdNFMoZK9AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"girl\"\n        title=\"girl\"\n        src=\"/static/cb0eedb1e27ff1f5cbb5083da1926ef4/fcda8/girl.png\"\n        srcset=\"/static/cb0eedb1e27ff1f5cbb5083da1926ef4/12f09/girl.png 148w,\n/static/cb0eedb1e27ff1f5cbb5083da1926ef4/e4a3f/girl.png 295w,\n/static/cb0eedb1e27ff1f5cbb5083da1926ef4/fcda8/girl.png 590w,\n/static/cb0eedb1e27ff1f5cbb5083da1926ef4/5fd3e/girl.png 594w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<h3 id=\"option-1-animer-à-la-unity\" style=\"position:relative;\"><a href=\"#option-1-animer-%C3%A0-la-unity\" aria-label=\"option 1 animer à la unity permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Option 1: Animer à la Unity</h3>\n<ul>\n<li>Configurer le Controller au niveau de l’Animator qui a été ajouté automatiquement sur un des game object créés, ajouter des transitions basées sur des propriétés pour basculer d’une animation à l’autre.</li>\n</ul>\n<div style=\"text-align:center\">\n<video controls width=\"720\" height=\"405\">\n    <source src=\"/1ebe51d17d8be9209ef7426d0601d923/Unity_controller.mp4\" type=\"video/mp4\" />\n</video>\n</div>\n<ul>\n<li>Utiliser un script pour modifier la propriété du controller.</li>\n</ul>\n<div style=\"text-align:center\">\n<video controls width=\"720\" height=\"405\">\n    <source src=\"/c79d3e415e77445ffe30f0d6b9cf6929/Unity_animate_script_zwunac.mp4\" type=\"video/mp4\" />\n</video>\n</div>\n<h4 id=\"animategirlcs\" style=\"position:relative;\"><a href=\"#animategirlcs\" aria-label=\"animategirlcs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>AnimateGirl.cs</h4>\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre class=\"language-cs\"><code class=\"language-cs\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">UnityEngine</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">RequireComponent</span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span><span class=\"token punctuation\">(</span><span class=\"token type-expression class-name\">Animator</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span></span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AnimateGirl</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">MonoBehaviour</span></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token class-name\">Animator</span> animator<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        animator <span class=\"token operator\">=</span> <span class=\"token generic-method\"><span class=\"token function\">GetComponent</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>Animator<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Input<span class=\"token punctuation\">.</span><span class=\"token function\">GetKey</span><span class=\"token punctuation\">(</span>KeyCode<span class=\"token punctuation\">.</span>RightArrow<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            animator<span class=\"token punctuation\">.</span><span class=\"token function\">SetFloat</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Speed\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            animator<span class=\"token punctuation\">.</span><span class=\"token function\">SetFloat</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Speed\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"option-2-animer-un-sprite-via-script\" style=\"position:relative;\"><a href=\"#option-2-animer-un-sprite-via-script\" aria-label=\"option 2 animer un sprite via script permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Option 2: Animer un sprite via script</h3>\n<p>Personnellement, j’évite le plus possible d’utiliser les Controller et Animator de Unity pour la 2D: ils apportent énormément de complexité pour simplement faire défiler des sprites. Aussi je préfère écrire moi-même un script qui va venir modifier les images du SpriteRenderer à fréquence régulière pour créer l’animation.</p>\n<p>Je crée un script “SpritesheetAnimator” qui s’occupe d’accepter une configuration de séquences pour un gameObject et de modifier l’image du SpriteRenderer Associé, et un deuxième script comme précédemment pour piloter l’animation en fonction du gameplay.</p>\n<div style=\"text-align:center\">\n<video controls width=\"720\" height=\"405\">\n    <source src=\"/e2e3e0b09e6226a5b9537c47a4aff8a6/Unity_animate_spritesheetscript_qexv4u.mp4\" type=\"video/mp4\" />\n</video>\n</div>\n<h4 id=\"spritesheetanimatorcs\" style=\"position:relative;\"><a href=\"#spritesheetanimatorcs\" aria-label=\"spritesheetanimatorcs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SpritesheetAnimator.cs</h4>\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre class=\"language-cs\"><code class=\"language-cs\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">System</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">System<span class=\"token punctuation\">.</span>Linq</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">UnityEngine</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Lister toutes les animations possibles ici</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">enum</span> <span class=\"token class-name\">Anims</span> <span class=\"token punctuation\">{</span>\n    Iddle<span class=\"token punctuation\">,</span>\n    Run<span class=\"token punctuation\">,</span>\n    Roll\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Structure de données pour définir une animation</span>\n<span class=\"token punctuation\">[</span>Serializable<span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">AnimDefinition</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Anims</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Sprite<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span> frames<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// L'animator va changer le sprite du SpriteRenderer à une certaine fréquence (par défaut 25 fois par secondes)</span>\n<span class=\"token punctuation\">[</span><span class=\"token function\">RequireComponent</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span><span class=\"token punctuation\">(</span><span class=\"token type-expression class-name\">SpriteRenderer</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SpritesheetAnimator</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">MonoBehaviour</span></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">Tooltip</span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(</span><span class=\"token string\">\"animation speed in images per seconds\"</span><span class=\"token punctuation\">)</span></span></span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\"><span class=\"token keyword\">float</span></span> animationSpeed <span class=\"token operator\">=</span> <span class=\"token number\">25</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">AnimDefinition<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span> animations<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// accessors (getters)</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\">AnimDefinition</span> CurrentAnimation <span class=\"token operator\">=></span> currentAnimation<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">int</span></span> LoopCount <span class=\"token operator\">=></span> loopCount<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">float</span></span> animationFrameDuration <span class=\"token operator\">=></span> <span class=\"token number\">1f</span> <span class=\"token operator\">/</span> animationSpeed<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// private properties</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">SpriteRenderer</span> spriteRenderer<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">AnimDefinition</span> currentAnimation<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\"><span class=\"token keyword\">int</span></span> currentFrameIndex <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// durée en seconde avant l'affichage de la prochaine image</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\"><span class=\"token keyword\">float</span></span> nextFrameCoolDown<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// nombre de fois que l'animation est jouée complètement</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\"><span class=\"token keyword\">int</span></span> loopCount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        spriteRenderer <span class=\"token operator\">=</span> <span class=\"token generic-method\"><span class=\"token function\">GetComponent</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>SpriteRenderer<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        nextFrameCoolDown <span class=\"token operator\">=</span> animationFrameDuration<span class=\"token punctuation\">;</span>\n        currentAnimation <span class=\"token operator\">=</span> animations<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>currentAnimation<span class=\"token punctuation\">.</span>frames<span class=\"token punctuation\">.</span>Length <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// déclenche la frame suivante si le temps est écoulé</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>nextFrameCoolDown <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">AnimateNextFrame</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// si on change la vitesse de l'animation, raccourci le temps d'attente si nécessaire</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>animationFrameDuration <span class=\"token operator\">&lt;</span> nextFrameCoolDown<span class=\"token punctuation\">)</span> nextFrameCoolDown <span class=\"token operator\">=</span> animationFrameDuration<span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// écoule le temps avant la prochaine image</span>\n        nextFrameCoolDown <span class=\"token operator\">-=</span> Time<span class=\"token punctuation\">.</span>deltaTime<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">AnimateNextFrame</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// calcule l'indice de l'image suivante</span>\n        currentFrameIndex <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>currentFrameIndex <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> currentAnimation<span class=\"token punctuation\">.</span>frames<span class=\"token punctuation\">.</span>Length<span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// affiche l'image suivante</span>\n        spriteRenderer<span class=\"token punctuation\">.</span>sprite <span class=\"token operator\">=</span> currentAnimation<span class=\"token punctuation\">.</span>frames<span class=\"token punctuation\">[</span>currentFrameIndex<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// Ajoute un temps d'attente calculé à partir de la fréquence de l'animation</span>\n        nextFrameCoolDown <span class=\"token operator\">+=</span> animationFrameDuration<span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// compte le nombre de fois que l'animation a été jouée</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>currentFrameIndex <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> loopCount<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Play</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Anims</span> nextAnimation<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// Si l'animation est déjà jouée, on ne fait rien</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>currentAnimation<span class=\"token punctuation\">.</span>name <span class=\"token operator\">==</span> nextAnimation<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// trouve l'animation correspondante dans la liste</span>\n        currentAnimation <span class=\"token operator\">=</span> animations<span class=\"token punctuation\">.</span><span class=\"token function\">First</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">=></span> a<span class=\"token punctuation\">.</span>name <span class=\"token operator\">==</span> nextAnimation<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// réinitialise à la première image de la séquence</span>\n        currentFrameIndex <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n        loopCount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4 id=\"animategirlspritesheetcs\" style=\"position:relative;\"><a href=\"#animategirlspritesheetcs\" aria-label=\"animategirlspritesheetcs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>AnimateGirlSpritesheet.cs</h4>\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre class=\"language-cs\"><code class=\"language-cs\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">UnityEngine</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">RequireComponent</span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span><span class=\"token punctuation\">(</span><span class=\"token type-expression class-name\">SpritesheetAnimator</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span></span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AnimateGirlSpritesheet</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">MonoBehaviour</span></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">SpritesheetAnimator</span> animator<span class=\"token punctuation\">;</span>\n\n    <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        animator <span class=\"token operator\">=</span> <span class=\"token generic-method\"><span class=\"token function\">GetComponent</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>SpritesheetAnimator<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Update</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Input<span class=\"token punctuation\">.</span><span class=\"token function\">GetKey</span><span class=\"token punctuation\">(</span>KeyCode<span class=\"token punctuation\">.</span>RightArrow<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            animator<span class=\"token punctuation\">.</span><span class=\"token function\">Play</span><span class=\"token punctuation\">(</span>Anims<span class=\"token punctuation\">.</span>Run<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Input<span class=\"token punctuation\">.</span><span class=\"token function\">GetKey</span><span class=\"token punctuation\">(</span>KeyCode<span class=\"token punctuation\">.</span>DownArrow<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            animator<span class=\"token punctuation\">.</span><span class=\"token function\">Play</span><span class=\"token punctuation\">(</span>Anims<span class=\"token punctuation\">.</span>Roll<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            animator<span class=\"token punctuation\">.</span><span class=\"token function\">Play</span><span class=\"token punctuation\">(</span>Anims<span class=\"token punctuation\">.</span>Iddle<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"le-debugger\" style=\"position:relative;\"><a href=\"#le-debugger\" aria-label=\"le debugger permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Le debugger</h2>\n<p>Debugger (déboguer en français, peu utilisé), permet d’inspecter le code alors qu’il est en train d’être exécuté par le programmes. Avec Unity, votre outillage VSCode (avec les plugins installés précédemment) vous permettent d’utiliser directement cette fonctionnalité.</p>\n<h3 id=\"1er-cas-le-fichier-launchjson-nexiste-ppas-dans-le-projet\" style=\"position:relative;\"><a href=\"#1er-cas-le-fichier-launchjson-nexiste-ppas-dans-le-projet\" aria-label=\"1er cas le fichier launchjson nexiste ppas dans le projet permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1er cas: le fichier launch.json n’existe ppas dans le projet</h3>\n<p>Pour le configurer (première utilisation uniquement), accéde à l’onglet debug (1) puis créez un fichier launch.json si proosé (2).</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 307px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/994f865233ba43cb07394b6b90fea4fd/4651d/vscode_enable_debug.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 114.1891891891892%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAIAAACEf/j0AAAACXBIWXMAAAsSAAALEgHS3X78AAAEJklEQVQ4y3VU22scZRTfP0IRBJOuZnOdjTWXbZobNEIIGh+E2sSWpO0mUSr40tI+CeKLDz6JGFSKVNQHUREfFKuooblgbaLNttnL3O8zOzu7c7/tZpPxzGyCoPRw5nDOfN/v+853vt/5Erv50td3i3kUf/ggVygUSJLM5/PgUBQFFvxisVgqlQiCQFEUQgzDwG/NTGzj4jt3JEHVCvm9jc1NGFtfX9/Y2IAZW1tba2trrRCWyOVyEO7s7MAc+AMLJa5fu3rj2tUrV95YXV21bVtV1VqtVlXVSqUCfrUKbiT/CUE0TUskk89khk91dnZcOH8+DEMOhOUsy3YeIbCBrutgG41G4rmhzOwLs8NDA8srKwCGbXVNt2wb8I9QSzcM07R8P0gg6fT42Hgq1ZnNXj5sNmkSJwlSr9U8F3axXMf+v7aG6nUAI0gfgrS1PbVwKavY9Z09dOt+gZSqoubwVUsArdnH+q/PVS3NCRK9vb0jI6dP9qfnFrPOfgiLBkEAJzYsy7Bs03ZADcsxHTf23Ti0YVS24p2npp4fOPns/GI2aIY4p/xFyLhQZcraNiqzgoShaFRDhmZZhiQwRVFc13UsSwFwf3//wMBAsr1tfnEpOAhphtstEDQnkiyH0zzLgUbSuir4oFpWdGSrDOA+EARJJpMA9pthWeAElmIpHCvmFZGvSGJNLUs867tOw/fqvlv3HPDhNiJwOt0/dnqk+8ST8wuXAcxVdKxs4mWjJBmoHNmSpGOyURS1gqCVRA2VdFzWraO0kb6ZVxa6z904e+n1xkH47d/Cu78y79/hPrsn3vxD+PSueOueeOtP8fNtCfSDDf69NfbDTV43zIoN4N7ukRfn21/76OzSm/XmwSZe+ea+/P2D8u2CcrtQ+bkY6U8F5Zdi5XdU/WFP+S4n/7inGGa8czqd7u2BrJ+4sJj19kNL11o0iIhgt0pjgXfsHNHm6MxdXV0TkxOpNDJ7cTk4DAUObkeGfoSuokiCoXCWoSEQJBHFcV2r1X0vrlcMHhocuv72WzcnJ3+bnjG9QBR4AscpkqR5EeWUHCFQolriFBJjCJzFBBXnK6KqAz4Cj42Ovbqy/NXjj9XHJ3TTxBmBoBiWYVhBpmUN5VVO0eiybmRGjZdexnQPY8py1TgC9/T0PN3R0Q4kubjkHYYPCRETq74fJee5dgAWShD4jU8+rn/5hXew70dnPiYJMCyTyaQ6U+eAJMBt24RVo4rEctzFrn1waDeb8AO4GY/E4MHB4Znp6fGx0bmY23m6vEsphKBSFBmRmSQZhoHXC/qUxDB4jHCcAIbC6rLpRww7c2bq1PDg3EIWGCZIEkYyJZzieY6Ihef51gMUPU9VVZIkeAqOwEhEbeREfOaI25LAc0xUcIqiaegkVhCEKG/opNi6rhdnHaX9D2YjNwDr1XmlAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"1. ouvrir sur l&#39;onglet debugger, 2. ouvrir sur &quot;create  launch.json file\"\n        title=\"1. ouvrir sur l&#39;onglet debugger, 2. ouvrir sur &quot;create  launch.json file\"\n        src=\"/static/994f865233ba43cb07394b6b90fea4fd/4651d/vscode_enable_debug.png\"\n        srcset=\"/static/994f865233ba43cb07394b6b90fea4fd/12f09/vscode_enable_debug.png 148w,\n/static/994f865233ba43cb07394b6b90fea4fd/e4a3f/vscode_enable_debug.png 295w,\n/static/994f865233ba43cb07394b6b90fea4fd/4651d/vscode_enable_debug.png 307w\"\n        sizes=\"(max-width: 307px) 100vw, 307px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<h3 id=\"2eme-cas-le-fichier-existe-déjà-et-unity-debugger-ne-fait-pas-partie-des-environnements-proposés\" style=\"position:relative;\"><a href=\"#2eme-cas-le-fichier-existe-d%C3%A9j%C3%A0-et-unity-debugger-ne-fait-pas-partie-des-environnements-propos%C3%A9s\" aria-label=\"2eme cas le fichier existe déjà et unity debugger ne fait pas partie des environnements proposés permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2eme cas: le fichier existe déjà et “Unity debugger” ne fait pas partie des environnements proposés</h3>\n<p>Dans ce cas ajouter l’environnement comme indiqué dans l’image ci-dessous.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 394px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/0680bf89fe4b3703fb429eb029dea666/cc097/vscode_debug_add_env.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 99.32432432432432%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsSAAALEgHS3X78AAADYklEQVQ4y3WTS2/cVBTH/UnaSgihqQokbRJ7HiSTZEIFbQQbwmOHEJ8AiRUbNt3wAVixZBPEF6gqgYQAtZmZKhnPeGzPw47fb/v6MbavPebMtF0UGOvKurLP7/zP+d9zCZoXntDifD4fDoeTyWQwGIzHY9hfXV3RNA1f2PF4NBjAZjQawftFGMQwDEM8/qv34+PnvV6v2+1O+Em/1+N5bkjT3YuL/vM+kEOeuxiNptPp5eUlvPv9PmCQAuKJBx9+cL9zeHp6OplMwwiprjuTLVGzrg1nLht6lBoj3n3ym6zIfhDIsowQ8jzPsizDMIh6s9VqvddqNVmWW2TRzPEvWLXPil32+ukVL1VV8PMvi0/OppLiOI4gCAD7a1jTNKLeaGxtbTUaDSjmWhBobi7qlqyZqmkLkhplRYGLRZRYaBFHYRRFYRjGcZznue/7xL2dnVqtBjB44Dq2oJqqpuua6tgWKKiKksRRXlaGi+IwRAgWSpKkqipIRJAU2Ww02+02y7JlgZ0wlTXdMHRFVaG3siyrZZnmhemF8Up1BYMywBhjgiTJO2/fqdfrHMflWWr6sW7ajmNDS2APxgXEpbj8L5wXBcDUW2++Qe3tchwPsOGFmgl2mLpuQFy1flK8fA1el12UJVGnyNb7p83OQ3bM5FlmeJGqm1C2JEmQIwgQlJ0Vyw3K2+/c+/ybxpffjelL8NDwI0UzoGzXdQEWRBEM2wiDVTdv3qJIil/3DMqSolmmads2BPl+kMRxugk+Ozt7+PFHeyed4ZjFa8MU3YC653MB+OXLnjcY9sVXX3/72afPbt82aDrJM9OPTNuFEwbSNM00TTfBGOCD46O7N278VKvJDJNhbAeJ5Xie6/rrBzovMP5fOMMFQZHk9s7Ou+02zTCgNZU1SVGvRQHOWZFlRVF0VUHRAiYMBXA1AsgIs7UqG+B6s3l8dHS/czykh8AwUxHOEQUIrApgGiMQWSbF0kjyfyk7YUzs7e7CbNcpCoakKrHkLn6ntWdT5+nE+ZPR/h5pf8iJ+P0P2aNHqCzDVcKXsB0ggPe2727v7+/DbGdparnBTPdEMxCMYKo6M8Weocw7/zU7P0d5vtJ9BQdxQhwcHJycdA4PD+FWZVkGv+HuJXEICzarBTexwCtZ6OL1sv8BlHjgEVrzZXIAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"1. ouvrir sur l&#39;onglet debugger, 2. ouvrir la liste des environnements, 3. choisir &quot;Add configuration&quot;\"\n        title=\"1. ouvrir sur l&#39;onglet debugger, 2. ouvrir la liste des environnements, 3. choisir &quot;Add configuration&quot;\"\n        src=\"/static/0680bf89fe4b3703fb429eb029dea666/cc097/vscode_debug_add_env.png\"\n        srcset=\"/static/0680bf89fe4b3703fb429eb029dea666/12f09/vscode_debug_add_env.png 148w,\n/static/0680bf89fe4b3703fb429eb029dea666/e4a3f/vscode_debug_add_env.png 295w,\n/static/0680bf89fe4b3703fb429eb029dea666/cc097/vscode_debug_add_env.png 394w\"\n        sizes=\"(max-width: 394px) 100vw, 394px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>Choisissez l’environnement “Unity debugger”.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/0893fed130224feba43906d1977a01fb/ef3e1/vscode_debug_env.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 43.91891891891892%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsSAAALEgHS3X78AAAAsUlEQVQoz5WPSQ6DMAxFc/8DlW25ADdoAsQZCBlNglRWDay6qRqe/sry07cJaKtc0i4pGx3usRyxvP9nPxaPxDgPagGpudQBt5RLYyJmsiHyedZae++3O2BKpOse1jnvQ8653azL0zSRvn/WWg58XW1uppRyyoj4otSd5TcIIVBKiZSSUgYAUopwTVuIMTLGThlAVHVh4z4MhUMOseXscRyJUkoIUR++shpj1i/sb6r4AS9p90M2zM4bAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"sélectionner &quot;Unity debugger&quot; dans la liste des envrionnement\"\n        title=\"sélectionner &quot;Unity debugger&quot; dans la liste des envrionnement\"\n        src=\"/static/0893fed130224feba43906d1977a01fb/fcda8/vscode_debug_env.png\"\n        srcset=\"/static/0893fed130224feba43906d1977a01fb/12f09/vscode_debug_env.png 148w,\n/static/0893fed130224feba43906d1977a01fb/e4a3f/vscode_debug_env.png 295w,\n/static/0893fed130224feba43906d1977a01fb/fcda8/vscode_debug_env.png 590w,\n/static/0893fed130224feba43906d1977a01fb/ef3e1/vscode_debug_env.png 759w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<h3 id=\"utiliser-le-debugger\" style=\"position:relative;\"><a href=\"#utiliser-le-debugger\" aria-label=\"utiliser le debugger permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Utiliser le debugger</h3>\n<p>Une fois l’environnement d’exécution “Unity Debugger” sélectionner, lancer “l’attache” en cliquant sur le triangle vert à côté de l’environnement.</p>\n<p>L’outil de debugging de VSCode va alors s’attacher au debugger intégré à Unity, et vous pourrez alors commencer à mettre des points d’arrêts (<em>breakpoint</em> en anglais).</p>\n<p>Pour mettre un point d’arrêt cliquer sur la marge gauche d’un ligne de code que vous souhaitez inspecter.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/2f8985a82460a04a312c268818f56b50/90712/vscode_debug_ex_breakpoint.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 68.24324324324324%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsSAAALEgHS3X78AAABa0lEQVQoz52Si27bMAxF/f/fuCDbPLQO0sjiW5Rke5SBDUO7LsCuBVg2eEnpkBMAZAAzQ0TCjBg/AOOBTIT0N83zfL/fb7fbxKIkKsLMwrA+EhAJZgZg97bv20f1X5rM63HsW9vauXoL9RqbfmzbfvxTk5Ry7Hv3DqBIzAhp5Qy63PLbA0RMrXxqLrXuYW69WFV1ERctzDrPy7fvy/Xry+vr/VOzjcrNyLv2MBOrabBTGEuQ1KtH9gjdT/25iTtbdzYvLDZqiiONoy7L2+UyX68/vlzmOEhEtzheO5H8BsZmkat5D7a1tlZL8ebnZ4Q9AXbHNV7NWwBLKzGtoUfCwBbuJ+YkOMx9lBUdpWvVUiwqH880zctLGLxE5bi4FiUgo8E84LMKRduILGcZaN+ZYwgDn2pLKYJICFLCMACWR+I1C8TkqY129v6xzzGD3WzL2UeHYBiYC3FPq645stjJ3039vdlrjXE9/ks/AVBLMHpJ+NBrAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"vscode debug ex breakpoint\"\n        title=\"vscode debug ex breakpoint\"\n        src=\"/static/2f8985a82460a04a312c268818f56b50/fcda8/vscode_debug_ex_breakpoint.png\"\n        srcset=\"/static/2f8985a82460a04a312c268818f56b50/12f09/vscode_debug_ex_breakpoint.png 148w,\n/static/2f8985a82460a04a312c268818f56b50/e4a3f/vscode_debug_ex_breakpoint.png 295w,\n/static/2f8985a82460a04a312c268818f56b50/fcda8/vscode_debug_ex_breakpoint.png 590w,\n/static/2f8985a82460a04a312c268818f56b50/90712/vscode_debug_ex_breakpoint.png 882w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>Démarrer le jeu et faites en sorte que la ligne qui contient le point d’arrêt soit atteinte. Le jeu va alors se mettre en pause et la fenêtre se transformer de la façon suivante :</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/1650944678b667ef26fe7ca2304c3cdd/afa26/vscode_debug_stopped2.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 58.10810810810811%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsSAAALEgHS3X78AAAB/klEQVQoz41S2W7UQBD0//8LErwkihBIEIIQEBIWpI13fa7t9TWe+/B4Zmx6E3inVOqWWmp1Vc1EyfEAPMRxWVwQP+3zPG+apjqdyrLIs+yFJUyLIru/T/bxMS/TNDnGT1FRVfQQ864TWiutGWNaazPP2hiljBRcCsa5okzARA8DnzAVCmHKKY2a+jw2I0KYECqeoZUSZnYhzMZKqTkXXGhClRDzvISwboBukMbYqO8nVKFxIJQSgvGEMezLefEhWL3M2kkJEhTjhlAzYja33eYcZqBjifKkRN9+jU1PMCWYTBOWQhBlrfNKwpYREm4axjXlhorZDGhdLJx33kd929ORTogwxsEwpRRkU22tD84GKRdzMW+lWsL6rHjboANDCBGaJg23wBmofYbRipl5ocgtVBtqLTYaGUPXILwXDujEugbnfJSdTt3uN2laJlXXdWUJAYzMKF8fBKsJrRjLJgz1TEgx4YKwSqpmXV1Vn6Mkhcdq23YcRtx2Y5adkjTX9hKr1puQXqlFSqfUyrmXyps5LMtFdpoX0bmu2q7t+749N5xRyBu+xAqyvNu2AAb/Mbz4vVheAxSExigumjrNZZII64SCSAWa8PZ/iB6uX+9uXu3fvWl/fBgeb/ufd8Puszg+nL68TT5eZXc36e1V+um6/vpexPf8L78DRfL4By5xnmttTSFVAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"vscode debug stopped2\"\n        title=\"vscode debug stopped2\"\n        src=\"/static/1650944678b667ef26fe7ca2304c3cdd/fcda8/vscode_debug_stopped2.png\"\n        srcset=\"/static/1650944678b667ef26fe7ca2304c3cdd/12f09/vscode_debug_stopped2.png 148w,\n/static/1650944678b667ef26fe7ca2304c3cdd/e4a3f/vscode_debug_stopped2.png 295w,\n/static/1650944678b667ef26fe7ca2304c3cdd/fcda8/vscode_debug_stopped2.png 590w,\n/static/1650944678b667ef26fe7ca2304c3cdd/efc66/vscode_debug_stopped2.png 885w,\n/static/1650944678b667ef26fe7ca2304c3cdd/c83ae/vscode_debug_stopped2.png 1180w,\n/static/1650944678b667ef26fe7ca2304c3cdd/afa26/vscode_debug_stopped2.png 1258w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<ul>\n<li>(1) La ligne où le debugger est arrêté est surlignée en jaune</li>\n<li>(2) Une barre de navigation en haut à droite permet de controler l’exécution du programme: reprendre, avancer de une ligne, debugger l’intérieur de la fonction, terminer la fonction et debugger à la sortie, relancer le debugger (interrompt la session en cours), arrête de debugger.</li>\n<li>(3) en haut à gauche l’encart “variables” permet d’inspecter les variables du contexte en cours</li>\n<li>(4) à gauche milieu “watch” permet de saisir des expressions à évaluer et d’afficher le résultat par rapport au contexte en cours</li>\n<li>(5) à gauche en bas “call stack” permet de remonter dans la pile d’appel du programme (trouver les contextes des fonctions appelantes)</li>\n<li>(6) à gauche en bas “breakpoints” permet de gérer la liste des breakpoints actuellement acquis</li>\n<li>(7) il est possible de survoler les variables avec le souris pour connaitre leur valeur (ex: maxDistancePerFrame dans cette image)</li>\n</ul>\n<h2 id=\"le-moteur-physique\" style=\"position:relative;\"><a href=\"#le-moteur-physique\" aria-label=\"le moteur physique permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Le moteur physique</h2>\n<p>Pour le vocabulaire et les notions clés :</p>\n<ul>\n<li><a href=\"https://teachings.samuel-bouchet.fr/jeu-video/essentiel_physique#/\">https://teachings.samuel-bouchet.fr/jeu-video/essentiel_physique#/</a></li>\n</ul>\n<h3 id=\"déplacement-dun-personnage-dans-un-univers-physique\" style=\"position:relative;\"><a href=\"#d%C3%A9placement-dun-personnage-dans-un-univers-physique\" aria-label=\"déplacement dun personnage dans un univers physique permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Déplacement d’un personnage dans un univers physique</h3>\n<ol>\n<li>Ajouter un Rigidbody2D configuré en dynamique. Cocher la case “Contraints: Freeze rotation Z” pour que le sprite ne tourne pas sur lui même.</li>\n<li>Ajouter un CircleCollider2D. Il est possible d’ajouter plusieurs collider2D sur un même gameObject pour créer une forme composée, il en faut au moins un. Ici le circle collider eut être édité en cliquant sur le bouton “edit collider” et en modifiant la taille et la position du cercle qui apparait sur le personnage.</li>\n</ol>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/cc41e737da1419fac3cbc5a33e256b4a/9a1cf/physics.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 83.78378378378379%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsSAAALEgHS3X78AAADC0lEQVQ4y01Ty27bVhDlj6ReeGHYsBxREh9XlEheXr7Ee0nqwYdEPeA0sYsU3RVBFoH7EymC/IU/Ie2m2aQr/0AMy4DhnWE4dnY9ooAiB4OLucOZOTNzh9K/X75cfv16c3NzvV5fX19fXl6ur9ZXV+vb29v7+/unp6fHx8fvwEb5hmutPj08PNzd3Um/v3lbzhZ5Ua6Wy6IoFtW8qqppWc5mMyhxHE8mk2pWjYpiuVzBOB6PYcF5fHwsVfOFTR1F1RqNI0VTgygwqUmZDcVmNnWpHwV9q7doy6FvU8Z0Xe/UYIxJPBq4jI5Had8gltWLc7GRIo7zjSRlInKRlul44PqeSynt9/tRFLmum6apNEhLFo1Hsxc6i4nj80zwScwnPBpHOPlkcyKLwz2nhqZprVar2WwikRSlhS2yIH/ZsQaE+UWVlVXG8/j0t9M4E7NiBGaecTdy/w9uNBq7u7uEdKUo9BhPgkionVbf7MZFkuQJnwhEigz1D8NhWL2owiR0mMM5N03T9/1utxsEgYS7pqqWaWqa3jN7COB12FZQc1qk7z++/+XXU9AOBgMEY9qIGo1Gm+BWu60Toqqq0TfSaYrxbGU4HSZFki2y6ueKF0PLssFmGIaiKO12GzOTVqsVaoBpOwm5LUOasnzUfN543pA7st7VO2on0RXXMR3GPM/DwAkhYJUW80KICCm388DrIYthKy5zORddndiWLbiYExIwSh2HUtt1GZi54FKe54i0LOvs7KwsS+yPG9riZfPDhz8//fV3RGnouv98/vzq9WuUB1pVUzVdk2UZ/UvL5VIIgcrBiRS+55u0Z3kkCPztbuJrGIboC9XatqVvQBSls+l5Op3CA5EqUSlz3r37w4u8PWMfw8Sni4uL8/PzZz89w5Dg3ev10C1OMOPBJOw3fgBUTroE/J7nQ9ENXasxn8+HwyG2Am9xcnICDszFtm14Zlkm4TNMSIbc8MDGqz8AawgSsCER3MAhaiBFkiQSTDs7O3t7e/s1Dg4O9n/AQY3Dw8PtFSUc1YCO1v8DOsU/znt9HUUAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"physics\"\n        title=\"physics\"\n        src=\"/static/cc41e737da1419fac3cbc5a33e256b4a/fcda8/physics.png\"\n        srcset=\"/static/cc41e737da1419fac3cbc5a33e256b4a/12f09/physics.png 148w,\n/static/cc41e737da1419fac3cbc5a33e256b4a/e4a3f/physics.png 295w,\n/static/cc41e737da1419fac3cbc5a33e256b4a/fcda8/physics.png 590w,\n/static/cc41e737da1419fac3cbc5a33e256b4a/efc66/physics.png 885w,\n/static/cc41e737da1419fac3cbc5a33e256b4a/9a1cf/physics.png 924w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>Ensuite, il faudra utiliser un script pour déplacer le personnage. Lorsqu’on travaille avec le moteur physique de Unity :</p>\n<ul>\n<li>on doit toujours déplacer l’objet en modifiant le RigidBody2D. On par exemple le déplacer en utilisant dans un script <code class=\"language-text\">rigidbody2D.velocity = new Vector2(1, 0)</code> pour donner une vitesse de 1 unité par seconde vers la droite, le moteur physique se chargera de mettre à jour la position.</li>\n<li>il est préférable de faire cette action dans une fonction <code class=\"language-text\">void FixedUpdate() {</code> plutôt que dans l’habituel <code class=\"language-text\">void Update() {</code> car FixedUpdate est appelé à chaque étape du moteur physique alors que Update est appelé à chaque rendu de frame du moteur, les 2 n’étant pas forcément synchronisés en fonction de la configuration du moteur de jeu et des performances de la machine.</li>\n</ul>\n<h2 id=\"les-règles-du-jeu\" style=\"position:relative;\"><a href=\"#les-r%C3%A8gles-du-jeu\" aria-label=\"les règles du jeu permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Les règles du jeu</h2>\n<ul>\n<li>Créer des buts sur les côtés</li>\n<li>\n<p>Lorsque la balle entre dans un but, </p>\n<ul>\n<li>+1 point pour l’équipe de la couleur opposée</li>\n<li>la balle est remise au milieu</li>\n<li>les joueurs sont repositionnés de chaque côté</li>\n</ul>\n</li>\n<li>\n<p>lorsqu’une équipe à 3 points</p>\n<ul>\n<li>l’équipe est indiquée vainqueur</li>\n<li>les points sont remis à 0</li>\n</ul>\n</li>\n<li>les joueurs sont bloqués par la balle et ne la font pas bouger</li>\n<li>les joueurs sont attaché à un marteau par un lien de longueur fixe, en bougeant ils peuvent donner de l’inertie et faire tourner le marteau</li>\n</ul>\n<h2 id=\"trucs-et-astuces\" style=\"position:relative;\"><a href=\"#trucs-et-astuces\" aria-label=\"trucs et astuces permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Trucs et astuces</h2>\n<p>Source : <a href=\"https://teachings.samuel-bouchet.fr/jeu-video/4_fichespratiques#/4/1\">https://teachings.samuel-bouchet.fr/jeu-video/4_fichespratiques#/4/1</a></p>\n<h3 id=\"prefabs\" style=\"position:relative;\"><a href=\"#prefabs\" aria-label=\"prefabs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Prefabs</h3>\n<p>Les prefabs permettent de créer un gameObject “modèle” qui pourra ensuite être instancié sur la scène autant de fois qu’on le souhaite à l’identique. Il est aussi possible d’instancier des prefabs dynamiquement via des scripts.</p>\n<ul>\n<li>Glisser/Déposer un objet d’une scène dans le projet pour faire un prefab</li>\n<li>Glisser/Déposer un prefab sur la scène pour créer une instance liée</li>\n<li>Mettre à jour prefab = update sur toutes les instances liés</li>\n<li>Mettre à jour instance liée = possibilité d’apply</li>\n<li>Seules les valeurs par défauts sont mises à jours, les valeurs spécifiques instance sont indiquées en gras dans l’interface</li>\n</ul>\n<p>Pour instancier dynamiquement un prefab, il faudra créé une propriété <code class=\"language-text\">public GameObject myPrefab;</code> dans le script qui doit l’utiliser. Ensuite, il est possible de faire à tout moment <code class=\"language-text\">var instance = Instantiate(myPrefab)</code> pour ajouter l’élément sur la scène dynamiquement. La variable “instance” pourra être modifiée directement pour changer certaines propriétés du gameObject (par exemple sa position).</p>\n<h3 id=\"conseils-de-collaboration\" style=\"position:relative;\"><a href=\"#conseils-de-collaboration\" aria-label=\"conseils de collaboration permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conseils de collaboration</h3>\n<p><a href=\"https://teachings.samuel-bouchet.fr/jeu-video/4_fichespratiques#/4/2\">https://teachings.samuel-bouchet.fr/jeu-video/4_fichespratiques#/4/2</a></p>\n<ul>\n<li>Une scène par collaborateur (Très difficile à fusionner à la main)</li>\n<li>Chacun développe ses prefabs, scripts et sa scène de façon indépendante</li>\n<li>1 personne fait l’intégration dans la scène générale du jeu</li>\n</ul>\n<h3 id=\"interactions-entre-scripts\" style=\"position:relative;\"><a href=\"#interactions-entre-scripts\" aria-label=\"interactions entre scripts permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Interactions entre scripts</h3>\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre class=\"language-cs\"><code class=\"language-cs\"><span class=\"token keyword\">private</span> <span class=\"token class-name\">ScriptName</span> scripteRef<span class=\"token punctuation\">;</span>\n\n<span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> Start <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Récupère une référence au script ScriptName attaché au même GameObject</span>\n    scripteRef <span class=\"token operator\">=</span> <span class=\"token generic-method\"><span class=\"token function\">GetComponent</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>scriptname<span class=\"token punctuation\">></span></span></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    scripteRef<span class=\"token punctuation\">.</span><span class=\"token function\">someMethodOfScriptName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"hiérarchie---références-et-parents\" style=\"position:relative;\"><a href=\"#hi%C3%A9rarchie---r%C3%A9f%C3%A9rences-et-parents\" aria-label=\"hiérarchie   références et parents permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hiérarchie - références et parents</h3>\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre class=\"language-cs\"><code class=\"language-cs\"><span class=\"token comment\">// un gameObject de la scène, on réfère ici son Transform</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">Transform</span> otherGameObjectTransform<span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// on affectera dans scripteRef le ScriptName de ce gameObject</span>\n<span class=\"token keyword\">private</span> <span class=\"token class-name\">ScriptName</span> scripteRef<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// un 2eme game object de la scène, on réfère ici le GameObject</span>\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">GameObject</span> otherGameObject2<span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// on affectera dans scripteRef2 le ScriptName de ce 2eme gameObject</span>\n<span class=\"token keyword\">private</span> <span class=\"token class-name\">ScriptName</span> scripteRef2<span class=\"token punctuation\">;</span>\n\n<span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> Start <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// scripteRef attaché à otherGameObjectTransform</span>\n    scripteRef <span class=\"token operator\">=</span> otherGameObjectTransform<span class=\"token punctuation\">.</span>gameObject<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">GetComponent</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>scriptname<span class=\"token punctuation\">></span></span></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">Transform</span> parent <span class=\"token operator\">=</span> otherGameObjectTransform<span class=\"token punctuation\">.</span>parent<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// scripteRef2 attaché à otherGameObject2</span>\n    scripteRef2 <span class=\"token operator\">=</span> otherGameObject2<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">GetComponent</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>scriptname<span class=\"token punctuation\">></span></span></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">Transform</span> parent2 <span class=\"token operator\">=</span> otherGameObject2<span class=\"token punctuation\">.</span>transform<span class=\"token punctuation\">.</span>parent<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"hiérarchie---parcourir-les-enfants\" style=\"position:relative;\"><a href=\"#hi%C3%A9rarchie---parcourir-les-enfants\" aria-label=\"hiérarchie   parcourir les enfants permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hiérarchie - Parcourir les enfants</h3>\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre class=\"language-cs\"><code class=\"language-cs\"><span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> Start <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// on cherche à trouver les ScriptName dans les enfants, mais le parcours d'enfant</span>\n    <span class=\"token comment\">// peut servir à plein de choses.</span>\n    <span class=\"token comment\">// méthode 1, si on souhaite utiliser LinQ sur la collection d'enfants</span>\n    <span class=\"token class-name\">IEnumerable<span class=\"token punctuation\">&lt;</span>Transform<span class=\"token punctuation\">></span></span> children <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>IEnumerable<span class=\"token operator\">&lt;</span>Transform<span class=\"token operator\">></span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>transform<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">foreach</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Transform</span> child <span class=\"token keyword\">in</span> children<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        child<span class=\"token punctuation\">.</span>gameObject<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">GetComponent</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>ScriptName<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// peut être null !</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// méthode 2, plus courte si on veut juste itérer</span>\n    <span class=\"token keyword\">foreach</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Transform</span> child <span class=\"token keyword\">in</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>transform<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        child<span class=\"token punctuation\">.</span>gameObject<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">GetComponent</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>ScriptName<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// peut être null !</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// méthode 3, si on cherche spécifiquement un script</span>\n    <span class=\"token keyword\">foreach</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">ScriptName</span> script <span class=\"token keyword\">in</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">GetComponentsInChildren</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>ScriptName<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// script n'est pas null</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"audio\" style=\"position:relative;\"><a href=\"#audio\" aria-label=\"audio permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Audio</h3>\n<ul>\n<li>AudioSource = Haut parleur qui peut lire un son à la fois.</li>\n<li>C’est un composant à attacher à un game objet, il sera spacialisé à l’endroit de l’objet.</li>\n<li>AudioClip = Clip audio qui peut être lu par un Audio source.</li>\n<li>On peut changer le AudioClip d’un AudioSource par script.</li>\n<li>Le son est capturé par l’AudioListener, positionné par défaut sur la caméra.</li>\n</ul>\n<h3 id=\"executeineditmode\" style=\"position:relative;\"><a href=\"#executeineditmode\" aria-label=\"executeineditmode permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>[ExecuteInEditMode]</h3>\n<p>L’annotation [ExecuteInEditMode] permet d’exécuter un script en mode édition. Ex:</p>\n<ul>\n<li><a href=\"https://github.com/Lythom/JeuVideo/blob/26841377c41347fc4d5d0049fa09b2d775a866ff/Assets/BallGameNetworked/Scripts/DepthSortByY.cs\">DepthSortByY</a></li>\n<li><a href=\"https://github.com/Lythom/JeuVideo/blob/26841377c41347fc4d5d0049fa09b2d775a866ff/Assets/samuelb/Scripts/SnapToGrid.cs\">SnapToGrid</a></li>\n<li><a href=\"https://github.com/Lythom/JeuVideo/blob/26841377c41347fc4d5d0049fa09b2d775a866ff/Assets/samuelb/Scripts/LifebarController.cs\">LiffebarController</a></li>\n<li><a href=\"https://github.com/Lythom/JeuVideo/blob/26841377c41347fc4d5d0049fa09b2d775a866ff/Assets/samuelb/Scripts/Track.cs\">Track</a></li>\n</ul>\n<h3 id=\"barre-de-vie\" style=\"position:relative;\"><a href=\"#barre-de-vie\" aria-label=\"barre de vie permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Barre de vie</h3>\n<ul>\n<li>\n<p>GameObject parent pour positionner le tout</p>\n<ul>\n<li>GameObject BackgroundScaler pour étendre la barre vide</li>\n<li>SpriteRenderer BackgroundSprite avec décalage de 0.5 vers la droite pour décaler le point d’origine du scaling</li>\n<li>GameObject ForegroundScaler pour étendre la barre pleine</li>\n<li>SpriteRenderer ForegroundSprite avec décalage de 0.5 vers la droite pour décaler le point d’origine du scaling</li>\n</ul>\n</li>\n<li>Ajouter un script pour piloter la taille des éléments visuels (Ex: <a href=\"https://github.com/Lythom/JeuVideo/blob/26841377c41347fc4d5d0049fa09b2d775a866ff/Assets/samuelb/Scripts/LifebarController.cs\">LifebarController</a>)</li>\n</ul>\n<div style=\"text-align:center\">\n<video controls width=\"720\" height=\"405\">\n    <source src=\"/163e265984630602c5472c2689f5996b/LifebarController_h1n8jl.mp4\" type=\"video/mp4\" />\n</video>\n</div>\n<h3 id=\"exécuter-une-action-étendue-sur-plusieurs-frames--durées\" style=\"position:relative;\"><a href=\"#ex%C3%A9cuter-une-action-%C3%A9tendue-sur-plusieurs-frames--dur%C3%A9es\" aria-label=\"exécuter une action étendue sur plusieurs frames  durées permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Exécuter une action étendue sur plusieurs frames / durées</h3>\n<p>Appeler une fois :</p>\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre class=\"language-cs\"><code class=\"language-cs\">StartCoroutine <span class=\"token punctuation\">(</span>DoRotateByStep <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Effet avec boucle :</p>\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre class=\"language-cs\"><code class=\"language-cs\"><span class=\"token return-type class-name\">IEnumerator</span> DoRotateByStep <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Quaternion</span> originalRotation <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>transform<span class=\"token punctuation\">.</span>rotation<span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\"><span class=\"token keyword\">int</span></span> durationInFrames <span class=\"token operator\">=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">int</span></span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> durationInFrames<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>transform<span class=\"token punctuation\">.</span>rotation <span class=\"token operator\">=</span> Quaternion<span class=\"token punctuation\">.</span>Euler <span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">*</span> <span class=\"token number\">360f</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> durationInFrames<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">yield</span> <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// attends la prochaine frame pour continuer</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>transform<span class=\"token punctuation\">.</span>rotation <span class=\"token operator\">=</span> originalRotation<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Exemple plus complexe: <a href=\"https://github.com/Lythom/JeuVideo/blob/26841377c41347fc4d5d0049fa09b2d775a866ff/Assets/BallGameNetworked/Scripts/Shake.cs\">Shake</a></p>\n<hr>\n<p>Envie de réagir ? Mentionnez <a href=\"https://twitter.com/lythom\">@Lythom</a> dans votre tweet ou envoyer un mail à <a href=\"mailto:samuel@a-game-studio.com\">samuel@a-game-studio.com</a>.</p>","frontmatter":{"title":"Unity étape par étape - jeu de ballon","date":"2020-05-21","description":"Cet article tutorial explique étape par étape comment réaliser un jeu de ballon avec Unity."}}},"pageContext":{"lang":"fr","slug":"/fr/blog/unity-step-by-step-ball-game/","previous":{"fields":{"slug":"/fr/blog/2020-a-year-of-temporal-paradoxes/"},"frontmatter":{"title":"2020, une année de paradoxes temporels ?"}},"next":null}}}