{"id":871,"date":"2020-04-26T01:04:13","date_gmt":"2020-04-26T01:04:13","guid":{"rendered":"http:\/\/visiorob.com.br\/?p=871"},"modified":"2020-04-26T02:19:40","modified_gmt":"2020-04-26T02:19:40","slug":"programacao-orientada-a-objeto-fazendo-um-simulador-de-contaminacao","status":"publish","type":"post","link":"https:\/\/visiorob.com.br\/index.php\/2020\/04\/26\/programacao-orientada-a-objeto-fazendo-um-simulador-de-contaminacao\/","title":{"rendered":"Programa\u00e7\u00e3o orientada a objeto fazendo um simulador de contamina\u00e7\u00e3o"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>O objetivo aqui \u00e9 apresentar programa\u00e7\u00e3o orientada a objeto com uma vis\u00e3o mais material, reduzindo a abistra\u00e7\u00e3o. Para isso ser\u00e1 demonstrado como construir o modelo de propaga\u00e7\u00e3o do COVID-19 apresentado pelo <a href=\"https:\/\/www.washingtonpost.com\/graphics\/2020\/health\/corona-simulation-portuguese\/\" target=\"_blank\" rel=\"noreferrer noopener\">The Washington Post (Por que surtos como o coronav\u00edrus se espalham exponencialmente e como &#8220;achatar a curva&#8221;)<\/a>. Os resultados neste projeto n\u00e3o devem ser utilizados como prova cient\u00edfica para o controle da dormia de COVID-19.<\/p><\/blockquote>\n\n\n\n<p>O grupo VisioRob est\u00e1 testando uma ferramenta a <a rel=\"noreferrer noopener\" href=\"https:\/\/unity.com\/\" target=\"_blank\">Unity 3D<\/a> para simula\u00e7\u00e3o e controle de rob\u00f4s. Como primeiro passo, para entendermos o funcionamento da ferramenta e aproveitando o momento da pandemia de COVID-19, foi criado o simulador de contamina\u00e7\u00e3o apresentado a seguir.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<style>\n.canvas-container {\n    position: relative;\n    padding-bottom: 70%; \/\/ (720 \u00f7 1680 = 0.4286 = 43%)\n    height: 0;\n    overflow: hidden;\n}\n\n.canvas-container iframe {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n}\n<\/style>\n<div class=\"canvas-container\">\n    <iframe src=\"\/custonScript\/simuladorDeContamina\u00e7\u00e3o\/index6.html\"><\/iframe>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Para esse simulador foi criado 2 cenas. A que aparece primeiro possui 4 sliders que permitem definir: O n\u00famero de pessoas; o tempo, em segundos que cada pessoa permanece doente; A porcentagem de pessoas que ir\u00e3o se isolar, ficarem paradas; e a chance de se contaminar ao entrar em contato com algum doente.<\/p>\n\n\n\n<p>J\u00e1 na segunda cena \u00e9 apresentado um conjunto de c\u00edrculos, colocados de forma aleat\u00f3rio. Estes c\u00edrculos representam as pessoas e a quantidade deles  dependem do que foi informado na cena anterior. Na parte inferior \u00e9 apresentado a quantidade de pessoas sald\u00e1veis, pessoas doentes e pessoas que se recuperaram da doen\u00e7a. Junto com a quantidade \u00e9 apresentado um gr\u00e1fico que permite a visualiza\u00e7\u00e3o dos dados ao longo do tempo.<\/p>\n\n\n\n<p>Para descrever a programa\u00e7\u00e3o orientada a objeto vou explicar o funcionamento que dei aos elementos que chamei de pessoas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O que \u00e9 Programa\u00e7\u00e3o Orientada a Objetos (POO)<\/h2>\n\n\n\n<p>Programa\u00e7\u00e3o orientada a objetos (POO) \u00e9 um paradigma de programa\u00e7\u00e3o, ou seja, \u00e9 uma forma de visualizar a constru\u00e7\u00e3o do software. Neste caso o software \u00e9 visto como um conjunto de blocos (objetos) independentes que juntos fazem o programa funcionar.<\/p>\n\n\n\n<p>Estes blocos s\u00e3o chamados de objetos ou classes. Eles recebem este nome porque h\u00e1 uma tentativa de abstrair o funcionamento destes blocos relacionando eles com objetos do mundo f\u00edsico (fora do computador). Entretanto, nem todos os objetos criados por programadores existem no mundo f\u00edsico como, por exemplo, um <em><a href=\"https:\/\/pt.wikipedia.org\/wiki\/Soquete_de_rede\" target=\"_blank\" rel=\"noreferrer noopener\">socket<\/a><\/em>. Entendo o que \u00e9 um <em><a href=\"https:\/\/pt.wikipedia.org\/wiki\/Soquete_de_rede\" target=\"_blank\" rel=\"noreferrer noopener\">socket<\/a><\/em>, sei para qu\u00ea serve, j\u00e1 usei um, mas se algu\u00e9m pedir para que eu desenhe um <em><a href=\"https:\/\/pt.wikipedia.org\/wiki\/Soquete_de_rede\" target=\"_blank\" rel=\"noreferrer noopener\">socket<\/a><\/em> eu n\u00e3o saberei fazer j\u00e1 que a idealiza\u00e7\u00e3o dele \u00e9 muito abstrata.<\/p>\n\n\n\n<p>Uma outra forma muito comum de visualizar a constru\u00e7\u00e3o de um software \u00e9 atrav\u00e9s da programa\u00e7\u00e3o estruturada, nesta os programadores abstraem o programa como uma sequ\u00eancia de fun\u00e7\u00f5es a serem executadas. Ou seja,  cada linha de c\u00f3digo \u00e9 uma ordem que o programador est\u00e1 dando para o software realizar, o que torna a vis\u00e3o do software algo mais concreto.<\/p>\n\n\n\n<p>Dentre as vantagens da POO \u00e9 a divis\u00e3o do software em objetos, partes, com comportamento distintos. Isso permite um maior controle do software, no que diz respeito ao desenvolvimento e manuten\u00e7\u00e3o.<\/p>\n\n\n\n<p>Ou seja, na simula\u00e7\u00e3o acima, enquanto era desenvolvido o c\u00f3digo do comportamento do objeto <em>Person<\/em> preocupava-se apenas descrever como este objeto deveria se comportar sem se importar de como objeto <em>GraphicBar<\/em> deve se comportar. A \u00fanica rela\u00e7\u00e3o entre estes dois objetos \u00e9 que o objeto <em>Person<\/em> deve informar ao objeto <em>Settings<\/em> quando ele muda alguma caracter\u00edstica (se est\u00e1 saud\u00e1vel, doente ou curado) e o objeto <em>GraphicBar<\/em> consulta o objeto <em>Settings<\/em> para descrever o tamanho das barras do gr\u00e1fico.<\/p>\n\n\n\n<p>Caso seja necess\u00e1rio alterar o algum comportamento do objeto <em>Person<\/em>, seja por colocar alguma nova funcionalidade ou corrigir um comportamento inadequado n\u00e3o compromete o comportamento do objeto <em>GraphicBar<\/em>. Isso facilita que desenvolvedores distintos possam trabalhar no mesmo projeto, cada um sendo respons\u00e1vel por um objeto.<\/p>\n\n\n\n<p>Outra vantagem \u00e9 a facilidade de substituir\/trocar os objetos. Por exemplo, se quisermos representar uma pessoa com outro formato, que n\u00e3o o circulo, ou usar um carro, que tem limite de dist\u00e2ncia que pode percorrer, basta substituir o objeto <em>Person<\/em>, sem preju\u00edzo ao restante do software.<\/p>\n\n\n\n<p>Por fim, temos a possibilidade de utilizar um determinado objeto diversas vezes. No caso desse simulador o comportamento do objeto <em>Person<\/em> foi descrito apenas uma vez e o software cria diversas c\u00f3pia (inst\u00e2ncias) deste objeto e os coloca em posi\u00e7\u00f5es aleat\u00f3ria dentro da \u00e1rea de simula\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Descrevendo o objeto <em>Person<\/em><\/h2>\n\n\n\n<p>O c\u00f3digo que descreve o objeto <em>Person<\/em> \u00e9 apresentado na sequ\u00eancia. Ap\u00f3s a apresenta\u00e7\u00e3o do c\u00f3digo ser\u00e1 apresentado uma explica\u00e7\u00e3o de cada parte dele, justificando os usos. A linguagem de programa\u00e7\u00e3o usada na Unity3D \u00e9 <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/csharp\/\" target=\"_blank\">C#<\/a>, mais todos os conceitos utilizados que ser\u00e3o apresentados est\u00e3o presentes em todas as linguagens de programa\u00e7\u00e3o orientada a objetos como <a href=\"https:\/\/www.java.com\" target=\"_blank\" rel=\"noreferrer noopener\">Java<\/a>, <a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python<\/a> e outras.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\npublic class Person : MonoBehaviour\n{\n    private CircleCollider2D playerCollider;\n    private GameObject otherPerson;\n    [SerializeField]\n    private GameObject settings;\n    [SerializeField]\n    private Settings settingsScript;\n    private Rigidbody2D rb2d;\n    private Vector2 movement;\n    private float movmentNorm;\n    [SerializeField]\n    private float sickTime;\n    [SerializeField]\n    private float isolationPorcet;\n    [SerializeField]\n    private float chanceToMove;\n    public bool isHeath = true;\n    public bool isSick;\n    public bool wasSick;\n    [SerializeField]\n    private bool fist;\n    [SerializeField]\n    private bool movable;\n    \n    \/\/ Start is called before the first frame update\n    void Start()\n    {\n        settings = GameObject.Find(\"Settings\");\n        settingsScript = settings.GetComponent&lt;Settings>();\n        rb2d = GetComponent&lt;Rigidbody2D>();\n        movement = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f));\n        if (Mathf.Abs(movement.x) &lt; 0.2f)\n        {\n            movement.x = 1f * Mathf.Sign(movement.x);\n        }\n        if (Mathf.Abs(movement.y) &lt; 0.2f)\n        {\n            movement.y = 1f * Mathf.Sign(movement.y);\n        }\n        movmentNorm = Mathf.Sqrt(Mathf.Pow(movement.x, 2) + Mathf.Pow(movement.y, 2));\n        sickTime = settingsScript.sickTime;\n        isolationPorcet = settingsScript.isolationPorcet;\n        chanceToMove = Random.Range(0f, 1f);\n        if (fist)\n        {\n            chanceToMove = 2;\n            GetSick();\n        }\n        if (isolationPorcet > chanceToMove)\n        {\n            movable = false;\n            settingsScript.stoppedPeople++;\n        }\n        else\n        {\n            movable = true;\n            settingsScript.movingPeople++;\n        }\n        if (movable)\n        {\n            rb2d.AddForce(new Vector2(movement.x * 100, movement.y * 100));\n            rb2d.constraints = RigidbodyConstraints2D.None;\n            rb2d.constraints = RigidbodyConstraints2D.FreezeRotation;\n        }\n        gameObject.GetComponent&lt;CircleCollider2D>().enabled = true;\n    }\n    \n    \/\/ Update is called once per frame\n    void Update()\n    {\n        if (rb2d.velocity.magnitude &lt; 2f)\n        {\n            rb2d.AddForce(rb2d.velocity);\n        }\n        if (isSick)\n        {\n            sickTime -= Time.deltaTime;\n            if (sickTime &lt; 0)\n            {\n                GetBetter();\n            }\n        }\n    }\n\n    void GetSick()\n    {\n        float myInfectionChance = Random.Range(0f, 1f);\n        if (isHeath)\n        {\n            if ((settingsScript.chanceToGetSick > myInfectionChance) || fist)\n            {\n                settingsScript.sickPeople++;\n                settingsScript.healthPeople--;\n                isHeath = false;\n                isSick = true;\n                SpriteRenderer color = GetComponent&lt;SpriteRenderer>();\n                color.color = new Color32(219, 166, 55, 255);\n            }\n        }\n    }\n\n    void GetBetter()\n    {\n        if (isSick)\n        {\n            settingsScript.sickPeople--;\n            settingsScript.curedPeople++;\n            isSick = false;\n            wasSick = true;\n            SpriteRenderer color = GetComponent&lt;SpriteRenderer>();\n            color.color = new Color32(248, 141, 210, 255);\n        }\n    }\n\n    private void OnCollisionEnter2D(Collision2D collision)\n    {\n        if (collision.gameObject.tag == \"Player\")\n        {\n            if (collision.gameObject.GetComponent&lt;Person>().isSick)\n            {\n                GetSick();\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<p>Nas linhas de 1 a 3 \u00e9 apresentado o <em><a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/csharp\/programming-guide\/namespaces\/\" target=\"_blank\" rel=\"noreferrer noopener\">namespace<\/a><\/em> que \u00e9 um conjunto de outros objetos que ser\u00e3o utilizados na programa\u00e7\u00e3o. O <em>namespace<\/em> \u00e9 equivalente \u00e0s bibliotecas das programa\u00e7\u00f5es estruturadas (os famosos <em>#include<\/em> da linguagem C, por exemplo).<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;<\/pre>\n\n\n\n<p>Como em <em>C#<\/em> tudo \u00e9 objeto o <em>namespace<\/em> \u00e9 importante para permitir que usemos alguns tipos de atributos no nosso objeto <em>Person<\/em>. Podendo virar os atributos <em>CircleCollider2D<\/em>, <em>GameObject <\/em>e outros que s\u00e3o s\u00e3o definidos nos namespace sure estamos usando.<\/p>\n\n\n\n<p>Na linha 5 iniciamos a descri\u00e7\u00e3o do nosso objeto <em>Person<\/em>. O nosso objeto ter\u00e1 todos os atributos e m\u00e9todos descrito entre o conjunto de chaves {} (linda 6 e linha 130).<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"5\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Person : MonoBehaviour<\/pre>\n\n\n\n<p>A linha 5 apresenta dois dos <a href=\"https:\/\/www.guj.com.br\/t\/definicoes-sobre-orientacao-a-objetos\/321141\" target=\"_blank\" rel=\"noreferrer noopener\">quartos pilares da POO<\/a>, o encapsulamento e a heran\u00e7a.<\/p>\n\n\n\n<p>A palavra <em>public<\/em> est\u00e1 relacionada ao encapsulamento. O encapsulamento est\u00e1 relacionado ao n\u00edvel de seguran\u00e7a dos dados, permiss\u00e3o de acesso. Ficar\u00e1 mais claro quando formos falar dos atributos. Em C# os encapsulamento pode ser do tipo <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/csharp\/programming-guide\/classes-and-structs\/access-modifiers\" target=\"_blank\"><em>public<\/em>, <em>private<\/em>, <em>protected<\/em>, <em>internal<\/em> e <em>protected internal<\/em><\/a>, por\u00e9m classes s\u00f3 podem ser do tipo <em>public<\/em> ou <em>internal<\/em>, com exce\u00e7\u00e3o a classes definida dentro de outra classes.<\/p>\n\n\n\n<p>A palavra <em>class<\/em> informa aquilo que estamos definindo. Neste caso \u00e9 uma classe (objeto) chamado <em>Person<\/em>. Por conven\u00e7\u00e3o, quando defini-se o nome de um objeto a primeira letra \u00e9 em mai\u00fasculo.<\/p>\n\n\n\n<p>Ap\u00f3s o nome da classe encontra-se <em>:<\/em> (dois pontos) que \u00e9 a simbologia em C# para indicar heran\u00e7a e, neste caso, o objeto <em>Person<\/em> herda os atributos e m\u00e9todos do objeto <em>MonoBehaviour<\/em>.<\/p>\n\n\n\n<p>O objeto <em>MonoBehaviour<\/em> est\u00e1 contido dentro do <em>namespace<\/em> <em>UnityEngine<\/em> e \u00e9 <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.unity3d.com\/ScriptReference\/MonoBehaviour.html\" target=\"_blank\">respons\u00e1vel pelo comportamentos para o funcionamento de jogos feitos com a Unity3D<\/a>.<\/p>\n\n\n\n<p>Por causa da heran\u00e7a o objeto <em>Person<\/em> possui alguns m\u00e9todos do objeto <em>MonoBehaviour<\/em> como, por exemplo, o m\u00e9todo GetComponent&lt;Rigidbody2D&gt;() apresentado na linha 34.<\/p>\n\n\n\n<p>Ao fazer uma inspe\u00e7\u00e3o cuidadosa do c\u00f3digo do objeto <em>Person<\/em> n\u00e3o \u00e9 poss\u00edvel encontrar como foi definido tal m\u00e9todo, a pesar dele possu\u00ed-lo. Isso se deve ao fato de ser um m\u00e9todo herdado de <em>MonoBehaviour<\/em> e a descri\u00e7\u00e3o do m\u00e9todo encontra-se em <em>MonoBehaviour<\/em>. Assim como m\u00e9todos um objeto tamb\u00e9m pode herdar atributos.<\/p>\n\n\n\n<p>Iniciado a nossa classe <em>Person<\/em> podemos definir os atributos do nosso objeto. Os atributos podem ser entendidos como as propriedades que o objeto possui.<\/p>\n\n\n\n<p>Como estamos fazendo algo semelhante ao apresentado no <a href=\"https:\/\/www.washingtonpost.com\/graphics\/2020\/health\/corona-simulation-portuguese\/\" target=\"_blank\" rel=\"noreferrer noopener\">The Washington Post<\/a> o nosso objeto precisa colidir com outros objetos e, para isso, vamos anexar um atributo que \u00e9 um objeto chamado <em><a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/CircleCollider2D.html\" target=\"_blank\" rel=\"noreferrer noopener\">CircleCollider2D<\/a><\/em> e cham\u00e1-lo de <em>playerCollider<\/em> (linha 7), pois este tipo de objeto faz parte da f\u00edsica da Unity3D e permite identificar as colis\u00f5es. Esse atributo foi definido como <em>private<\/em> uma vez que os outros objetos n\u00e3o precisam interagir com este atributo.<\/p>\n\n\n\n<p>Os objetos <em>Person<\/em> podem se interagir entre eles. caso um <em>Person<\/em> saud\u00e1vel entre em contato com o <em>Person<\/em> doente ele ter\u00e1 a chance de ficar doente. Ent\u00e3o, vamos dar um atributo <em><a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/GameObject.html\" target=\"_blank\" rel=\"noreferrer noopener\">GameObject<\/a><\/em> chamado <em>otherPerson<\/em> (linha 8) para que ele possa interagir com outra <em>Person<\/em>. Na Unity3D todos os objetos na cena s\u00e3o <em><a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/GameObject.html\" target=\"_blank\" rel=\"noreferrer noopener\">GameObject<\/a><\/em>.<\/p>\n\n\n\n<p>Para que o nosso objeto <em>Person<\/em> possa conhecer as configura\u00e7\u00f5es (se vai ficar parado ou se move, o tempo que ficar\u00e1 doente, e outras configura\u00e7\u00f5es feitas no in\u00edcio) vamos anexar dois atributos, o <em>settings<\/em> do tipo <em><a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/GameObject.html\" target=\"_blank\" rel=\"noreferrer noopener\">GameObject<\/a><\/em> (linha 10) e o <em>settingsScript<\/em> do tipo <em>Settings<\/em> (linha 12).<\/p>\n\n\n\n<p>Para que o objeto <em>Person<\/em> tenha conhecimento da f\u00edsica aplicada nele devemos adicionar o atributo <em>rb2d<\/em> do tipo <em><a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/Rigidbody2D.html\">Rigidbody2D<\/a><\/em> (linha 13). Da f\u00edsica temos o interesse que o objeto <em>Person<\/em> tenha conhecimento da dire\u00e7\u00e3o de seu movimento, inclusive para que ele inicie com movimento aleat\u00f3rio, foi adicionado os atributos <em>movement<\/em> do tipo <em><a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/Vector2.html\" target=\"_blank\" rel=\"noreferrer noopener\">Vector2<\/a><\/em> (linha 14) e <em>movmentNorm<\/em> do tipo <a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/csharp\/language-reference\/builtin-types\/floating-point-numeric-types\" target=\"_blank\" rel=\"noreferrer noopener\"><em>float<\/em><\/a> (Linda 15).<\/p>\n\n\n\n<p>Continuando a descri\u00e7\u00e3o do objeto o Person, ele precisa de alguns atributos num\u00e9ricos que definem o comportamento dele, como <em>sickTime<\/em> do tipo <em>float<\/em> (linha 17) que ser\u00e1 utilizado para computar o tempo que estar\u00e1 doente, <em>isolationPorcet<\/em> do tipo <em>float<\/em> (linha 19) que \u00e9 a taxa de isolamento (fornecido pela configura\u00e7\u00e3o) que ser\u00e1 comparada com <em>chanceToMove<\/em> do tipo <em>float<\/em> (linha 21). Caso <em>chanceToMove<\/em> seja maior que <em>isolationPorcet<\/em> o objeto <em>Person<\/em> ter\u00e1 movimento, caso contr\u00e1rio n\u00e3o.<\/p>\n\n\n\n<p>O objeto Person tamb\u00e9m precisa informar aos outros objetos o sei estado de sa\u00fade. Para isso foram definidos tr\u00eas atributos do tipo <em><a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/csharp\/language-reference\/builtin-types\/bool\" target=\"_blank\">bool<\/a><\/em>, sendo <em>isHeath<\/em> (linha 22) respons\u00e1vel por indicar que est\u00e1 saud\u00e1vel, <em>isSick<\/em> (linha 23) que indica que est\u00e1 doente e <em>wasSick<\/em> (linha 24) para indicar que j\u00e1 se curou. \u00c9 importante notar que esses atributos s\u00e3o <em>public<\/em>, isso porque outros objeto necessitam acessar essas informa\u00e7\u00f5es. Por exemplo, quando dois objetos <em>Person<\/em> colidem eles precisam saber se um deles est\u00e1 doente (<em>isSick<\/em>) e, caso um deles esteja, o que estiver saud\u00e1vel deve adoecer.<\/p>\n\n\n\n<p>Para finalizar a descri\u00e7\u00e3o dos atributos, o objeto Person tem os atributos <em>first<\/em> (Linda 28), para indicar se \u00e9 o primeiro pois ele sempre deve iniciar doente e poder se mover, e o <em>movable<\/em> (Linda 30), que indica se o objeto pode ser mover ou n\u00e3o.<\/p>\n\n\n\n<p>A parte do c\u00f3digo que cont\u00e9m os atributos \u00e9 apresentado a seguir. No c\u00f3digo \u00e9 poss\u00edvel visualizar, em diversos momentos, o campo <em><a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/SerializeField.html\" target=\"_blank\" rel=\"noreferrer noopener\">[SerializeField]<\/a><\/em>. A fun\u00e7\u00e3o deste campo \u00e9 permitir que a <em>Unity3D<\/em> apresente os atributos private no editor dela, o que facilita o desenvolvimento e corre\u00e7\u00f5es do c\u00f3digo.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"9, 11, 16, 18, 20, 25, 27\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"7\" data-enlighter-title=\"\" data-enlighter-group=\"\">private CircleCollider2D playerCollider;\nprivate GameObject otherPerson;\n[SerializeField]\nprivate GameObject settings;\n[SerializeField]\nprivate Settings settingsScript;\nprivate Rigidbody2D rb2d;\nprivate Vector2 movement;\nprivate float movmentNorm;\n[SerializeField]\nprivate float sickTime;\n[SerializeField]\nprivate float isolationPorcet;\n[SerializeField]\nprivate float chanceToMove;\npublic bool isHeath = true;\npublic bool isSick;\npublic bool wasSick;\n[SerializeField]\nprivate bool fist;\n[SerializeField]\nprivate bool movable;<\/pre>\n\n\n\n<p>Para finalizar o objeto <em>Person<\/em> deve ser atribu\u00eddo a ele alguns m\u00e9todos. Os m\u00e9todos podem entendidos como a\u00e7\u00f5es que o objeto fazem utilizados os atributos, podendo ou n\u00e3o notific\u00e1-los.<\/p>\n\n\n\n<p>O primeiro m\u00e9todo do nosso objeto \u00e9 o <em>Start()<\/em> (linha 31). Este m\u00e9todo \u00e9 chamado quando o objeto \u00e9 criado na cena. Isto acontece pois o objeto <em>Person<\/em> herda outros m\u00e9todos de <em>MonoBehaviour<\/em>.<\/p>\n\n\n\n<p>Como o m\u00e9todo <em>Start()<\/em> \u00e9 executado logo ap\u00f3s a cria\u00e7\u00e3o do objeto \u00e9 nele em que os atributos que necessitam acessar outros objetos podem assumir os dados. No caso desse projeto o m\u00e9todo <em>Start()<\/em> foi usado para iniciar alguns atributos, indicar uma dire\u00e7\u00e3o aleat\u00f3ria do movimento inicial e verifica se o objeto pode se mover.<\/p>\n\n\n\n<p>Na sequ\u00eancia temos o m\u00e9todo <em>Update()<\/em> (linha 74) que \u00e9 chamado pelo <em>MonoBehaviour<\/em> cada vez que os frames da cena s\u00e3o atualizados. Como este m\u00e9todo \u00e9 executado baseado no tempo de execu\u00e7\u00e3o ele foi usado para calcular o tempo que o objeto <em>Person<\/em> permanece doente e, regularmente, verifica a velocidade do objeto para acelerar ele caso ele fique muito lento.<\/p>\n\n\n\n<p>Tanto os m\u00e9todos <em>Start()<\/em> e <em>Update()<\/em> dependem de sinais enviados pela heran\u00e7a do <em>MonoBehaviour<\/em>. Mais podemos criar m\u00e9todos exclusivos do nosso objeto que n\u00e3o dependem de heran\u00e7as e nem de outros objetos. A exemplo temos, no objeto <em>Person<\/em>, os m\u00e9todos <em>GetSick()<\/em> (linha 90) e <em>GetBetter()<\/em> (linha 107).<\/p>\n\n\n\n<p>No m\u00e9todo <em>GetSick()<\/em> \u00e9 descrito todas as a\u00e7\u00f5es que o objeto <em>Person<\/em> deve realizar quando colide com um objeto doente e se adoece. Uma a\u00e7\u00e3o importante \u00e9 atualizar o contador de pessoas saud\u00e1veis e doentes que tem no objeto <em>Settings<\/em> e, consequentemente, o gr\u00e1fico.<\/p>\n\n\n\n<p>J\u00e1 o m\u00e9todo <em>GetBetter()<\/em> descreve todas as a\u00e7\u00f5es que devem ser executadas quando o objeto <em>Person<\/em> deixa de estar doente que, tamb\u00e9m, inclui atualizar os contadores do objeto <em>Settings<\/em>.<\/p>\n\n\n\n<p>Por fim, o nosso objeto <em>Person<\/em> possui o m\u00e9todo <em>OnCollisionEnter2D()<\/em> (linha 120). Este m\u00e9todo recebe um sinal do objeto <em>CircleCollider2D<\/em> que foi adicionado ao <em>Person<\/em> atrav\u00e9s do atributo <em>playerCollider<\/em> (linha 7). O <em>Person<\/em> executa este m\u00e9todo sempre que colide. Caso a comiss\u00e3o seja com outro <em>Person<\/em> o m\u00e9todo verifica se ele est\u00e1 doente e, se necess\u00e1rio, executa o m\u00e9todo <em>GetSick()<\/em>.<\/p>\n\n\n\n<p>Todos os m\u00e9todos do objeto <em>Person<\/em> podem ser vistos a seguir.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"31, 74, 90, 107, 120\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"30\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Update is called once per frame\nvoid Start()\n{\n    settings = GameObject.Find(\"Settings\");\n    settingsScript = settings.GetComponent&lt;Settings>();\n    rb2d = GetComponent&lt;Rigidbody2D>();\n    movement = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f));\n    if (Mathf.Abs(movement.x) &lt; 0.2f)\n    {\n        movement.x = 1f * Mathf.Sign(movement.x);\n    }\n    if (Mathf.Abs(movement.y) &lt; 0.2f)\n    {\n        movement.y = 1f * Mathf.Sign(movement.y);\n    }\n    movmentNorm = Mathf.Sqrt(Mathf.Pow(movement.x, 2) + Mathf.Pow(movement.y, 2));\n    sickTime = settingsScript.sickTime;\n    isolationPorcet = settingsScript.isolationPorcet;\n    chanceToMove = Random.Range(0f, 1f);\n    if (fist)\n    {\n        chanceToMove = 2;\n        GetSick();\n    }\n    if (isolationPorcet > chanceToMove)\n    {\n        movable = false;\n        settingsScript.stoppedPeople++;\n    }\n    else\n    {\n        movable = true;\n        settingsScript.movingPeople++;\n    }\n    if (movable)\n    {\n        rb2d.AddForce(new Vector2(movement.x * 100, movement.y * 100));\n        rb2d.constraints = RigidbodyConstraints2D.None;\n        rb2d.constraints = RigidbodyConstraints2D.FreezeRotation;\n    }\n    gameObject.GetComponent&lt;CircleCollider2D>().enabled = true;\n}\n\n\/\/ Update is called once per frame\nvoid Update()\n{\n    if (rb2d.velocity.magnitude &lt; 2f)\n    {\n        rb2d.AddForce(rb2d.velocity);\n    }\n    if (isSick)\n    {\n        sickTime -= Time.deltaTime;\n        if (sickTime &lt; 0)\n        {\n            GetBetter();\n        }\n    }\n}\n\nvoid GetSick()\n{\n    float myInfectionChance = Random.Range(0f, 1f);\n    if (isHeath)\n    {\n        if ((settingsScript.chanceToGetSick > myInfectionChance) || fist)\n        {\n            settingsScript.sickPeople++;\n            settingsScript.healthPeople--;\n            isHeath = false;\n            isSick = true;\n            SpriteRenderer color = GetComponent&lt;SpriteRenderer>();\n            color.color = new Color32(219, 166, 55, 255);\n        }\n    }\n}\n\nvoid GetBetter()\n{\n    if (isSick)\n    {\n        settingsScript.sickPeople--;\n        settingsScript.curedPeople++;\n        isSick = false;\n        wasSick = true;\n        SpriteRenderer color = GetComponent&lt;SpriteRenderer>();\n        color.color = new Color32(248, 141, 210, 255);\n    }\n}\n\nprivate void OnCollisionEnter2D(Collision2D collision)\n{\n    if (collision.gameObject.tag == \"Player\")\n    {\n        if (collision.gameObject.GetComponent&lt;Person>().isSick)\n        {\n            GetSick();\n        }\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Considera\u00e7\u00f5es Finais<\/h2>\n\n\n\n<p>Espera-se que com uma descri\u00e7\u00e3o mais concreta do que \u00e9 um objeto em programa\u00e7\u00e3o orientada a objeto, atrav\u00e9s de um exemplo l\u00fadico como a cria\u00e7\u00e3o de um jogo, possa facilitar o entendimento sobre o que \u00e9 o objeto.<\/p>\n\n\n\n<p>O foco, aqui, foi na descri\u00e7\u00e3o de apenas o objeto mais concreto utilizado no projeto e, mesmo assim, ainda foi descrito o uso de objetos muito abstratos, como o <em>MonoBehaviour<\/em>, <em>GameObject<\/em>, <em>Rigidbody2D<\/em> e outros. Entretanto, mesmo n\u00e3o conhecendo o comportamento total de todos os objetos foi poss\u00edvel desenvolver este projeto.<\/p>\n\n\n\n<p>O c\u00f3digo completo do projeto se no nosso reposit\u00f3rio do GitHub <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/visiorob\/simuladordecontaminacao\" target=\"_blank\">https:\/\/github.com\/visiorob\/simuladordecontaminacao<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Uma vis\u00e3o mais abstrata sobre programa\u00e7\u00e3o orientada a objeto e demonstrando como montar um simulador de propaga\u00e7\u00e3o do COVID-19.<\/p>\n<\/div>","protected":false},"author":1,"featured_media":956,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[42],"tags":[39,41,40],"class_list":["post-871","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacao","tag-programacao","tag-programcao-orientada-a-objetos","tag-unity3d"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/posts\/871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=871"}],"version-history":[{"count":169,"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/posts\/871\/revisions"}],"predecessor-version":[{"id":1046,"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/posts\/871\/revisions\/1046"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/media\/956"}],"wp:attachment":[{"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/visiorob.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}