Mexer em variavel de objeto instanciado
3 participantes
Página 1 de 1
Mexer em variavel de objeto instanciado
Boa noite. Como eu faço para mexer em uma variavel de um objeto instanciado. Tentei de todo jeito e aparece esse erro.
Object reference not set to an instance of an object
Está acontecendo isso pq deixo ele desativado, e quero ativar só quando o player entrar na sala.
Object reference not set to an instance of an object
Está acontecendo isso pq deixo ele desativado, e quero ativar só quando o player entrar na sala.
- Código:
public class Salas : MonoBehaviour
{
private Inimigo inimigo;
void Start()
{
inimigo = FindObjectOfType(typeof(Inimigo)) as Inimigo;
}
private void OnTriggerStay2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
CameraController.instance.SetPosition(new Vector2(transform.position.x, transform.position.y));
>>>> inimigo.ativar = true;
}
}
}
vinicius12412- Iniciante
- PONTOS : 1276
REPUTAÇÃO : 1
Respeito as regras :
Re: Mexer em variavel de objeto instanciado
Boa vinicius12412.
Cara, não resolveria se você pegasse o script diretamente do Inimigo?
ex:
switch (other.gameObject.tag)
{
case "Inimigo":
other.getComponent<Inimigo>().ativar = true;
break;
}
Cara, não resolveria se você pegasse o script diretamente do Inimigo?
ex:
switch (other.gameObject.tag)
{
case "Inimigo":
other.getComponent<Inimigo>().ativar = true;
break;
}
RobsonRAS- Iniciante
- PONTOS : 3202
REPUTAÇÃO : 6
Respeito as regras :
Re: Mexer em variavel de objeto instanciado
Todo método Find vai funcionar somente SE o objeto estiver ativo na cena, caso ele esteja desativado, o Find vai retornar null, e daí vem o erro de referência inválida (nula).
Olha, existem diversas formas de arrumar isso, e como vc quer que o inimigo fique desativado por inicial, não tem pq utilizar o Find, só se vc deixar o inimigo ativado, e depois do find, desativar ele, oq não faz mto sentido pq essa responsabilidade vai ficar dento da classe do trigger q não tem q gerenciar isso.
Se só tem um inimigo nessa cena, vc pode criar uma variável pública para o inspector do tipo "Inimigo" e anexar esse objeto nessa variável, via interface da Unity, assim:
E assim, vc pode ativar ele sem problemas, pq a referência do objeto dele está salvo na sua variável, mesmo estando desativado.
Ou vc pode no momento de instanciar esse inimigo, guardar ele numa variável (a referência dele) e passar essa referência pra classe do Trigger:
(A variável 'inimigo' da classe 'sala' tem q ser pública).
Mas no fim das contas, se vc tem mais de um inimigo nessa sala aí, isso só vai funcionar pro último inimigo instanciado, os outros vão perder a referência, oq vc pode fazer é guardar esses inimigos num array e ativar todos de uma vez percorrendo esse array dentro do Trigger.
Ou vc pode criar uma estrutura baseada em notificações (oq eu prefiro), onde os prefabs dos inimigos tem um objeto vazio q contém a assinatura no evento do trigger, e como filho, esse objeto tem de fato o inimigo, só q desativado, assim qnd o trigger for acionado ele emite o evento, e os objetos pais dos inimigos (q estão ativados) recebem essa notificação e ativam os filhos (os inimigos), algo assim:
A classe acima, no objeto pai que fica ativo na cena.
Na classe da sala:
Olha, existem diversas formas de arrumar isso, e como vc quer que o inimigo fique desativado por inicial, não tem pq utilizar o Find, só se vc deixar o inimigo ativado, e depois do find, desativar ele, oq não faz mto sentido pq essa responsabilidade vai ficar dento da classe do trigger q não tem q gerenciar isso.
Se só tem um inimigo nessa cena, vc pode criar uma variável pública para o inspector do tipo "Inimigo" e anexar esse objeto nessa variável, via interface da Unity, assim:
- Código:
public Inimigo inimigo;
E assim, vc pode ativar ele sem problemas, pq a referência do objeto dele está salvo na sua variável, mesmo estando desativado.
Ou vc pode no momento de instanciar esse inimigo, guardar ele numa variável (a referência dele) e passar essa referência pra classe do Trigger:
- Código:
GameObject inimigo = Instantiate(prefabDoInimigo, posicao, rotacao);
FindObjectOfType<Salas>().inimigo = inimigo;
(A variável 'inimigo' da classe 'sala' tem q ser pública).
Mas no fim das contas, se vc tem mais de um inimigo nessa sala aí, isso só vai funcionar pro último inimigo instanciado, os outros vão perder a referência, oq vc pode fazer é guardar esses inimigos num array e ativar todos de uma vez percorrendo esse array dentro do Trigger.
Ou vc pode criar uma estrutura baseada em notificações (oq eu prefiro), onde os prefabs dos inimigos tem um objeto vazio q contém a assinatura no evento do trigger, e como filho, esse objeto tem de fato o inimigo, só q desativado, assim qnd o trigger for acionado ele emite o evento, e os objetos pais dos inimigos (q estão ativados) recebem essa notificação e ativam os filhos (os inimigos), algo assim:
- Código:
using UnityEngine;
public class EnemyController : MonoBehaviour{
private void Awake(){
Salas.OnEnter += ActivateEnemy;
Salas.OnExit += DisableEnemy;
}
private void OnDestroy(){
Salas.OnEnter -= ActivateEnemy;
Salas.OnExit -= DisableEnemy;
}
private void ActivateEnemy(){
transform.GetChild(0).gameObject.SetActivate(true);
}
private void DisableEnemy(){
transform.GetChild(0).gameObject.SetActivate(false);
}
}
A classe acima, no objeto pai que fica ativo na cena.
Na classe da sala:
- Código:
public class Salas : MonoBehaviour
{
public static event System.Action OnEnter;
public static event System.Action OnExit;
private void OnTriggerStay2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
CameraController.instance.SetPosition(new Vector2(transform.position.x, transform.position.y));
OnEnter?.Invoke();
}
}
private void OnTriggerExit2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
OnExit?.Invoke();
}
}
}
Tópicos semelhantes
» Como acessar uma variável de um script utilizando como parâmetro uma variável nomescript
» Linkar objeto da cena dentro de variavel
» Setar um objeto que esta em contato com o Player em uma variável
» Como fazer um objeto aumentar sua variável a cada segundo?
» Como acessar uma variável de outro script sem saber o objeto?
» Linkar objeto da cena dentro de variavel
» Setar um objeto que esta em contato com o Player em uma variável
» Como fazer um objeto aumentar sua variável a cada segundo?
» Como acessar uma variável de outro script sem saber o objeto?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos