{"id":21046264,"url":"https://github.com/alfredo1995/endless-runner","last_synced_at":"2026-02-24T08:11:14.992Z","repository":{"id":125101530,"uuid":"555541744","full_name":"alfredo1995/endless-runner","owner":"alfredo1995","description":"Programming a game in unity style (Infinite Run), where the player needs to jump over approaching obstacles to avoid crashing.","archived":false,"fork":false,"pushed_at":"2025-01-14T16:53:26.000Z","size":148181,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-12T16:13:37.689Z","etag":null,"topics":["csharp","unty"],"latest_commit_sha":null,"homepage":"https://alfredo1995.itch.io/corrida-infinita-endless-runner","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alfredo1995.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-10-21T19:44:00.000Z","updated_at":"2025-02-09T20:00:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"79937abc-b2a1-4bbd-8ab9-382600fc87d3","html_url":"https://github.com/alfredo1995/endless-runner","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/alfredo1995/endless-runner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfredo1995%2Fendless-runner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfredo1995%2Fendless-runner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfredo1995%2Fendless-runner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfredo1995%2Fendless-runner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alfredo1995","download_url":"https://codeload.github.com/alfredo1995/endless-runner/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alfredo1995%2Fendless-runner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29776108,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T04:54:30.205Z","status":"ssl_error","status_checked_at":"2026-02-24T04:53:58.628Z","response_time":75,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","unty"],"created_at":"2024-11-19T14:28:43.692Z","updated_at":"2026-02-24T08:11:14.955Z","avatar_url":"https://github.com/alfredo1995.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Programando um jogo estilo ENDLESS RUNNER (corrida infinita), onde o jogador precisa de saltar sobre obstáculos que se aproximam para evitar bater. \n\n \nPrincipais Conceitos e Habilidades\n \n        GetComponent \n        ForceMode.Impulse \n        Física.Gravidade \n        Variáveis rigidbody \n        Multiplicar/Atribuir (\"*) Operador \n        E (\u0026\u0026) Operador / Igual a (==) operador /  Não (!) operador \n  \n        OnCollisionEnter()\n        Repetir o plano de fundo\n        Obter largura collider\n        Comunicação de script\n        Tags / CompareTag()\n         \n        Controladores de animação\n        Estados de animação, camadas e transições \n        Parâmetros de animação\n        Programação de animação\n        SetTrigger(), SetBool(), SetInt()\n        \n        Sistemas de partículas \n        Clipes de áudio e fontes de áudio \n        Reproduzir e parar os efeitos sonoros\n\u003cbr\u003e\n \nProtótipo\n\n        https://connect-prd-cdn.unity.com/20210507/12fe5762-ea5d-48ce-aff7-71c3dd0ec6a0/Prototype%203%20-%20Starter%20Files.zip\n\nAbrir protótipo e alterar fundo\n\n        1) Abra o Unity Hub e crie um projeto vazio de \"Protótipo 3\" em seu diretório de curso na versão unity correta.\n        \n        2) Clique para baixar o Protótipo 3 Starter Files, extrair a pasta compactada e, em seguida, importar o .unitypackage em seu projeto. \n         \n        3) Abra a cena do Protótipo 3 e exclua a Cena da Amostra sem salvar\n        \n        4) Selecione o objeto De fundo na hierarquia e, em seguida, no  componente Sprite Renderer \u003e Sprite, selecione a imagem _City, _Nature ou _Town\n\nEscolha e configure um personagem do jogador\n\n        1) Da Biblioteca de Curso \u003e Personagens, Arraste um personagem para a hierarquia, renomeie-o  \"Jogador\", \n           em seguida, gire-o no eixo Y para enfrentar à direita\n           \n        2) Adicione um  componente do corpo RigBody     \n        \n        3) Adicione um colisor de caixa e, em seguida, edite os limites do colisor\n        \n        4) Crie uma nova pasta \"Scripts\" em Ativos, crie um script \"PlayerController\" dentro e conecte-o ao jogador\n        \nFaça o jogador saltar no início\n\n        1) No PlayerController.cs, declare um novo playerrb rígido privado;  variável\n        \n        2) Em Start(), inicialize playerRb = GetComponent\u003cRigidbody\u003e();\n        \n        3) Em Start(), use o método AddForce para fazer o jogador saltar no início do jogo\n        \n                public class PlayerController : MonoBehaviour\n                {\n                    private Rigidbody PlayerRb;\n                    void Start()\n                    {\n                        PlayerRb = GetComponent\u003cRigidbody\u003e();\n                        PlayerRb.AddForce(Vector3.up * 500);\n                    }\n\nFaça o jogador saltar se a barra espacial pressionar\n\n        1) Em Atualização() adicione uma instrução if-then verificando se a barra de espaço está pressionada\n        \n        2) Corte e cole o código AddForce do Start() na instrução if\n        \n        3) Adicione o  parâmetro ForceMode.Impulse à  chamada AddForce e, em seguida, reduza  o valor do multiplicador de força\n        \n                    void Update()\n                    {\n                        if (Input.GetKeyUp(KeyCode.Space))\n                        {\n                            PlayerRb.AddForce(Vector3.up * 10, ForceMode.Impulse);\n                        }\n                    }\n                }\n                \nAjuste a força de salto e a gravidade\n\n        1) Substitua o valor codificado por uma nova  variável pública de salto flutuante\n\n        2) Adicione uma nova  variável de gravidade flutuante públicaModifier e em Start(), \n           adicione Física.gravidade *= gravityModifier; \n        \n        3) No inspetor, ajuste os valores de massa gravityModifier, jumpForce e Rigibody \n        \n                public class PlayerController : MonoBehaviour\n                {\n                    public float jumpForce = 10.0f;\n                    public float gravityModifier;\n                    void Start()\n                    {\n                        PlayerRb = GetComponent\u003cRigidbody\u003e();\n                        Physics.gravity *= gravityModifier;\n                    }\n\n                    void Update()\n                    {\n                        if (Input.GetKeyUp(KeyCode.Space))\n                        {\n                            PlayerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);\n                        }\n                    }\n                }\n\nEvite que o jogador pule duas vezes\n\n        1) Adicione uma nova variável  de bool isOnGround público e defina-a igual a verdade\n        \n        2) Na declaração se fazendo o jogador saltar, definir isOnGround = false,\n        \n        3) Adicione uma condição \u0026\u0026 isOnGround à declaração if ( \u0026\u0026 = e , para que haja mais uma afirmação)\n        \n        4) Adicione um novo metodo vazio OnCollisionEnter, definir isOnGround = verdadeiro nesse método\n        \n        5) quando o player estiver no chao = true , quando nao tiver = false\n        \n                public class PlayerController : MonoBehaviour\n                {\n                    public bool isOnGround = true;\n                    \n                    void Update()\n                    {\n                        if (Input.GetKeyUp(KeyCode.Space) \u0026\u0026 isOnGround)\n                        {\n                            PlayerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);\n                            isOnGround = false; \n                        }\n                    }\n\n                    private void OnCollisionEnter(Collision collision)\n                    {\n                        isOnGround = true;\n\n                    }\n                }\n                \nFaça um obstáculo e mova-o para a esquerda\n\n            1) Da Biblioteca de Curso \u003e Obstáculos, adicione um obstáculo, renomeie-o como \"Obstáculo\", e  posicione-o onde deve desovar\n            \n            2) Aplique um  componente rígido do colisor de corpo e caixa e, em seguida, edite os limites do colisor para se encaixar no obstáculo\n            \n            3) Crie uma nova pasta \"Prefabs\" e arraste-a para criar um novo Prefab original\n            \n            4) Crie um novo script \"MoveLeft\",  aplique-o ao obstáculo e  abra-o para dar o efeito \"parallax\"\n            \n            5) Em MoveLeft.cs, escreva o código para traduzi-lo para a esquerda de acordo com a \n               variável de velocidade. Aplique o script MoveLeft ao fundo(background)\n               \n                    public class MoveLeft : MonoBehaviour\n                    {\n                        public float speed = 10.0f;\n                        void Start()\n                        {\n\n                        }\n\n                        void Update()\n                        {\n                            transform.Translate(Vector3.left * Time.deltaTime * speed);  \n                        }\n                    }\n                    \nCrie um gerenciador de desova\n\n        1) Crie um novo objeto vazio \"Spawn Manager\" e aplique um novo  script .cs SpawnManager a ele\n\n        2) Em SpawnManager.cs, declare um novo obstáculo público do GameObjectPrefab; , em seguida, \n           atribua seu pré-fabricado à nova variável no inspetor\n\n        3) Declare um novo vetor3 privado spawnPos em seu local de desova\n        \n        4) In Start(), Instanciar um novo pré-fabricado de obstáculos \n        \n        \n                public class SpawnManager : MonoBehaviour\n                {\n                    public GameObject obstaclePrefabs;\n                    private Vector3 spawnPosition = new Vector3(25, 0, 0);\n                    void Start()\n                    {\n                        Instantiate(obstaclePrefabs, spawnPosition, obstaclePrefabs.transform.rotation);\n                    }\n                    \nGerar obstáculos em intervalos\n\n        1) Crie um novo  método de desobstaculo de vazio e, em seguida, mova a  chamada Instantiate dentro dele\n\n        2) Crie novas variáveis flutuantes para iniciarDelay e repetirRate\n\n        3) Que seus obstáculos desovam em intervalos usando o  método InvokeRepeating()\n\n        4) No componente Do corpo rígido do jogador, expanda as restrições e congele  tudo, menos a posição Y\n        \n                public class SpawnManager : MonoBehaviour\n                {\n                    public GameObject obstaclePrefabs;\n                    private Vector3 spawnPosition = new Vector3(25, 0, 0);\n                    private float startDelay = 2.0f;\n                    private float repeatRate = 2.0f;\n                    void Start()\n                    {\n                        InvokeRepeating(\"spawObstacle\", startDelay, repeatRate);\n                    }\n\n                    void spawObstacle()\n                    {\n                        Instantiate(obstaclePrefabs, spawnPosition, obstaclePrefabs.transform.rotation);\n\n                    }\n                }\n\n\u003cbr\u003e\n\nPrincipais Conceitos e Habilidades modulo 1\n\n        GetComponent\n        ForceMode.Impulse\n        Física.Gravidade\n        Restrições rígidas do corpo\n        Variáveis rigidbody\n        Booleanos\n        Multiplicar/Atribuir (\"*) Operador\n        E (\u0026\u0026) Operador\n        OnCollisionEnter()\n        \n\u003cbr\u003e\n\nCrie um script para repetir o plano de fundo\n    \n        Crie um novo script chamado RepeatBackground.cs e conecte-o ao objeto de fundo\n        \nRedefinir posição de fundo\n\n        1) Declarar uma nova variável private Vector3 startPos;\n\n        2) Em Start(), defina a  variável startPos à sua posição inicial real atribuindo-a  = transform.position;\n\n        3) Em Update(), escreva uma posição if-statement para redefinir se ela mover uma certa distância\n\n                public class RepeatBackground : MonoBehaviour\n                {\n                    private Vector3 startPos;\n                    void Start()\n                    {\n                        startPos = transform.position;\n                    }\n\n                    void Update()\n                    {\n                        if(transform.position.x \u003c startPos.x -50)\n                        {\n                            transform.position = startPos;\n                        }\n                    }\n                }\n\nCorrigir repetição de fundo com colisor\n\n        1) Adicione um  componente collider de  caixa ao fundo\n\n        2) Declare uma nova  variável de repetição de flutuação privada\n\n        3) Em Start(), obtenha a largura do colisor de caixa, dividido por 2\n\n        4) Incorpore a  variável repetiçãoWidth na função repetição\n\n                public class RepeatBackground : MonoBehaviour\n                {\n                    private Vector3 startPos;\n                    private float reapetWidth;\n                    void Start()\n                    {\n                        startPos = transform.position;\n                        reapetWidth = GetComponent\u003cBoxCollider\u003e().size.x / 2;\n                    }\n\n                    void Update()\n                    {\n                        if(transform.position.x \u003c startPos.x - reapetWidth)\n                        {\n                            transform.position = startPos;\n                        }\n                    }\n                }\n\n\nAdicione um novo jogo sobre o gatilho\n\n        1) No inspetor, adicione uma tag \"Ground\" ao chão e uma tag \"Obstáculo\" ao pré-fio de obstáculo\n\n        2) No PlayerController, declare um novo jogo público boolOver;\n\n        3) Em OnCollisionEnter, adicione a instrução if-else para testar se o jogador colidiu com o \"Ground\" ou um \"Obstáculo\"\n\n        4) Se eles colidiram com o \"Ground\", set isOnGround = verdadeiro, e se colidirem com um \"Obstáculo\", definir gameOver = verdadeiro        \n        \n                public class PlayerController : MonoBehaviour\n                {\n                    public bool gameOver = false;\n                    \n                    private void OnCollisionEnter(Collision collision)\n                    {\n                        if (collision.gameObject.CompareTag(\"Ground\"))\n                        {\n                            isOnGround = true;\n                        }\n                        else if (collision.gameObject.CompareTag(\"Obstacle\"))\n                        {\n                            gameOver = true;\n                            Debug.Log(\"Game Over\");\n                        }\n\n                    }\n                }\n                \nStop MoveLeft no gameOver\n\n        1) Em MoveLeft.cs, declare um novo player privado PlayerControllerScript;\n\n        2) In Start(), inicialize-o encontrando o Jogador e recebendo o componente PlayerController\n\n        3) Enrole o método de tradução em uma verificação se o jogo não acabou\n        \n                public class MoveLeft : MonoBehaviour\n                {\n                    private float speed = 10.0f;\n                    private PlayerController playControllerScript;\n                    \n                    void Start()\n                    {\n                        playControllerScript = GameObject.Find(\"Player\").GetComponent\u003cPlayerController\u003e();\n                    }\n\n                    void Update()\n                    {\n                        if(playControllerScript.gameOver == false)\n                        {\n                            transform.Translate(Vector3.left * Time.deltaTime * speed);\n\n                        }\n                    }\n                }\n     \n \u003cbr\u003e    \n \nConceitos desse modulo 2\n \n        Repetir o plano de fundo\n        Obter largura collider\n        Comunicação de script\n        Igual a (==) operador\n        Tags\n        CompareTag()\n        \n \u003cbr\u003e       \n \nExplore as animações do jogador\n\n        Clique duas vezes no Controlador de Animação do Jogador e, em seguida, \n        explore as diferentes camadas, clicando duas vezes em Estados para ver suas animações \n        e transições para ver suas condições\n\n\nFaça o jogador começar em uma corrida\n\n        1) Na guia Parâmetros, altere a  variável Speed_f para 1.0\n\n        2) Clique com o botão direito do mouse no Run_Static \u003e Set como Estado padrão da camada\n\n        3) Clique em um único o estado Run_Static e ajuste o  valor de velocidade no inspetor para corresponder à velocidade do fundo\n\n\nConfigure uma animação de salto\n\n        1) No PlayerController.cs, declare um novo jogador privado de AnimatorAnim; \n        \n        2) In Start(), set playerAnim = GetComponent\u003cAnimator\u003e();\n\n        3) Na declaração if para quando o jogador saltar, acione o salto: playerAnim. SetTrigger (\"Jump_trig\");\n        \n        \n                public class PlayerController : MonoBehaviour\n                {\n                    private Rigidbody PlayerRb;\n                    private Animator PlayerAnim;\n\n                    void Start()\n                    {\n                        PlayerRb = GetComponent\u003cRigidbody\u003e();\n                        PlayerAnim = GetComponent\u003cAnimator\u003e();\n                    }\n\n                    void Update()\n                    {\n                        if (Input.GetKeyUp(KeyCode.Space) \u0026\u0026 isOnGround)\n                        {\n                            PlayerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);\n                            isOnGround = false;\n                            PlayerAnim.SetTrigger(\"Jump_trig\");\n                        }\n                    }\n\n\n\nAjuste a animação de salto\n\n        1) Na janela animador, clique no estado Running_Jump, depois no inspetor e reduza seu valor de velocidade para 0.7\n\n        2) Ajuste a massa do jogador, a força de salto e  o modificador de gravidade para acertar o seu salto\n        \n        3) player \u003e rigbody \u003e mass \u003e 60, jump force 700, Gravity Modified 1.5;\n        \n\nConfigure uma animação em queda PlayerController\n\n        1) Na condição de que o jogador colide com Obstáculo, definir a morte bool para a verdade\n        \n        2) Na mesma declaração se, defina o inteiro DeathType para 1 \n\n                private void OnCollisionEnter(Collision collision)\n                {\n                    else if (collision.gameObject.CompareTag(\"Obstacle\"))\n                    {\n                        gameOver = true;\n                        Debug.Log(\"Game Over\");\n                        PlayerAnim.SetBool(\"Death_b\", true);\n                        PlayerAnim.SetInteger(\"DeathType_int\", 1);\n                    }\n\nImpedir o jogador de pular inconsciente PlayController\n\n        1) Para evitar que o jogador pule inconsciente, adicione \u0026\u0026 !gameOver à condição de salto \n        \n                void Update()\n                {\n                    if (Input.GetKeyUp(KeyCode.Space) \u0026\u0026 isOnGround \u0026\u0026 !gameOver)\n                    {\n                        PlayerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);\n                        isOnGround = false;\n                        PlayerAnim.SetTrigger(\"Jump_trig\");\n                    }\n                    \n\u003cbr\u003e\n\nConceitos de modulo 3\n\n        Controladores de animação\n        Estados de animação, camadas e transições\n        Parâmetros de animação\n        Programação de animação\n        SetTrigger(), SetBool(), SetInt()\n        Não (!) operador\n        \n \u003cbr\u003e\n \nAdicione uma partícula de respingo de sujeira\n\n        1) Da  Biblioteca de curso \u003e Partículas, arraste FX_DirtSplatter para o player\n\n        2) Declarar uma nova sujeira do Sistema de Partículas públicas; , em seguida,  atribuí-lo no Inspetor\n        \n        3) Adicionar dirtParticle.Stop();  quando o jogador pula ou colide com um obstáculo\n        \n        4) Adicionar dirtParticle.Play();  quando o jogador pousa no chão\n        \n                public ParticleSystem dirParticle\n\n                void Update () {\n                        if (Input.GetKeyUp(KeyCode.Space) \u0026\u0026 isOnGround \u0026\u0026 !gameOver){\n                                dirtParticle.Stop();  }}\n\n                private void OnCollisionEnter(collision collision other){\n                        if (collision.gameObject.CompareTag(\"Ground\")){\n\n                         dirParticle.Play();\n\n                        else if (collision.gameObject.CompareTag(\"Obstacle\"))\n                                            dirtParticle.Stop();  }}\n\n    \nAdicione música ao objeto da câmera\n  \n        1) Selecione o  objeto da câmera principal  e, em seguida, adicione componente \u003e áudio source\n        \n        2) Na Biblioteca de Curso \u003e Sound, arraste um clipe de música para a  variável AudioClip no inspetor\n        \n        3) Reduza o volume para que seja mais fácil ouvir efeitos sonoros\n        \nDeclare variáveis para clipes de áudio\n\n        1) No PlayerController.cs, declare um novo vídeo público do AudioClip;  e um novo áudioclip público crashSound;\n\n        2) Na Biblioteca de Curso \u003e Som, arraste um clipe para cada nova  variável de som no inspetor\n        \nReproduzir clipes de áudio no salto e acidente\n\n        1) Adicione um  componente de fonte de áudio ao player\n        \n        2) Declare um novo player audiosource privadoAudio;  e inicializá-lo como playerAudio = GetComponent\u003cAudioSource\u003e();\n\n        3) Ligue para o playerAudio.PlayOneShot(jumpSound, 1.0f);  quando o personagem pula\n\n        4) Ligue para o playerAudio.PlayOneShot(crashSound, 1.0f);  quando o personagem trava\n        \n        \n                public class PlayerController : MonoBehaviour\n                {\n                    private AudioSource PlayerAudio;\n                    public AudioClip jumpSound;\n                    public AudioClip crashSound;\n\n                    void Start()\n                    {\n                        PlayerAudio = GetComponent\u003cAudioSource\u003e();\n                    }\n\n                    void Update()\n                    {\n                        if (Input.GetKeyUp(KeyCode.Space) \u0026\u0026 isOnGround \u0026\u0026 !gameOver)\n                        {\n                            PlayerAudio.PlayOneShot(jumpSound, 1.0f);\n                        }\n                    }\n\n                    private void OnCollisionEnter(Collision collision)\n                    {\n                        else if (collision.gameObject.CompareTag(\"Obstacle\"))\n                        {\n                            gameOver = true;\n                            PlayerAudio.PlayOneShot(crashSound, 1.0f);\n                        }\n\n\nNovos Conceitos e Habilidades modulo 4\n\n        Sistemas de partículas \n        Posicionamento do objeto infantil\n        Clipes de áudio e fontes de áudio \n        Reproduzir e parar os efeitos sonoros\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falfredo1995%2Fendless-runner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falfredo1995%2Fendless-runner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falfredo1995%2Fendless-runner/lists"}