Unity - MonoBehaviour - Instancia (New) - AddComponent

Boa noite. Pessoal é o seguinte:

Tenho um Script que herda de MonoBehaviour, justamente para que ele conste nas scenas. Fiz 2 Construtores nele, sobrecarga de construtor, até aí tranquilo. Rodei o jogo e ele funciona, mas dá um Aviso de Atenção:

"You are trying to create a MonoBehaviour using the ‘new’ keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor ()"

Pesquisei e cada um diz uma coisa.
Um diz que o MonoBehaviour não funciona com a instãncia usando o “new”, que tem que usar o AddComponent;
Outro diz que isso é só um aviso, não significa que a coisa não vá funcionar. E é o que está acontecendo de fato, ele só dá essa atenção, mas o conteúdo é rodado sim, usando o new e tudo mais.

Pergunta pra quem já passou por isso ou viu em algum lugar: É só ignorar o aviso de Atenção, ou tem que não instanciar com o “new” e usar o AddComponent? Se for o AddComponent, como seria o uso correto?

Por que seu script precisa herdar de MonoBehavior? Por que ele precisa constar nas cenas?

Você pode usar classes normais de C# (classes que não herdam de MonoBehavior) nos seus scripts. Nessas classes, você pode usar new. Se não precisa das características de um MonoBehavior, (ex: métodos como Awake, Start(), Update(), FixedUpdate()), não faz sentido que sua classe herde de MonoBehavior.

A documentação é meio vaga, mas simplesmente criar uma classe que herda MonoBehavior com new não a insere apropriadamente no fluxo de execução de um script, então as chamadas à métodos como os citados acima não vai ocorrer. Você pode testar isso aí, adicionando o método Awake ou Start nessa classe, e colocando um Debug.Log neles. Vai notar que esses Debug.Log não são exibidos.

Outros partes do seu script podem até funcionar, mas a parte que depende de ele ser um monobehavior criado com addcomponent não. Esse é um jeito bem fácil de criar código com bugs. Tanto mudar a classe pra não herdar de MonoBehavior quanto usar AddComponent são alterações pequenas e rápidas, não vejo motivo pra não aplicá-las.

Se for o AddComponent, como seria o uso correto?

A documentação dá um exemplo de como usar o AddComponent: Unity - Scripting API: GameObject.AddComponent , veja se ajuda. Tem também vários exemplos, vídeos inclusive, se pesquisar por unity addcomponent (ex: How to add components using script in Unity - VionixStudio ).

Abraço.

1 curtida

Obg pela respsota!

A criatura aqui está tão acostumada com o MonoBehaviour que acabei indo no automático e anexando o script em um objeto da scene introdutoria e deixando ele indestrutivel para que outros scripts de outras scenes vejam ele kkk não lembrei de uma coisa tão trivial como essa que vc falou meu Deus kkk tô rindo de nervosa já :unamused: Muito obg pela ajuda!