Como alterar um GameObject dentro de uma array
3 participantes
Página 1 de 1
Como alterar um GameObject dentro de uma array
olá, eu estou desenvolvendo um FPS e recentemente criei um método de troca de armas com o array, eu quero implementar o "can and drop" porém não sei como referenciar muito menos alterar um objeto que esta dentro do array.....
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace FPS
{
public class ItensManagers : MonoBehaviour
{
public GameObject[] itens;
public int index;
public UIManagers uiScript;
float tempo;
public float temp = 0.3f;
public bool troca = false;
public bool podetroca = true;
public float tempoEspera = 1f;
public List<Animator> animItens = new List<Animator>();
public static ItensManagers instance;
void Awake ()
{
instance = this;
}
// Start is called before the first frame update
void Start()
{
tempo = 0;
index = 0;
//uiScript = GameObject.FindWithTag("uiManager").GetComponent<UIManagers>();
for (int i = 0; i < itens.Length; i++)
{
animItens.Add(itens[i].GetComponent<Animator>());
itens[index].SetActive(true);
uiScript.iconeImagem.sprite = uiScript.spriteIntens[index];
}
}
// Update is called once per frame
void FixedUpdate()
{
tempo += Time.deltaTime;
if (Input.GetKeyDown(KeyCode.Alpha1) && !animItens[index].GetBool("ocorreacao") && podetroca == true)
{
animItens[index].SetTrigger("trocaArma");
StartCoroutine (Espera (temp));
podetroca = false;
StartCoroutine (Esperar (tempoEspera));
}
if(troca == true)
{
itens[index].SetActive(false);
index--;
if(index < 0)
{
index = itens.Length - 1;
}
itens[index].SetActive(true);
uiScript.iconeImagem.sprite = uiScript.spriteIntens[index];
troca =false;
}
}
IEnumerator Espera(float intervalo)
{
yield return new WaitForSeconds (intervalo);
troca = true;
}
IEnumerator Esperar(float intervaloTemp)
{
yield return new WaitForSeconds (intervaloTemp);
podetroca = true;
}
}
}
quero alterar "GameObjects[] intens" por meio de outro script....
Maston- Iniciante
- PONTOS : 1653
REPUTAÇÃO : 1
Respeito as regras :
Re: Como alterar um GameObject dentro de uma array
Existem várias alternativas pra vc referenciar a classe em classes externas, segue algumas delas:
1. Inspector:
O método mais comum e talvez mais simples pra isso, seria vc criar uma variável pública do tipo da classe q vc quer acesso (no seu caso, ItensManagers), dentro da classe q vai acessar essa referência, e setar o objeto da cena q contém esse script dentro desse campo via inspector.
Agora essa variável ''carrega'' consigo a referência dessa classe, e sempre q vc quiser alterar algum campo dela, basta usar essa variável. (Lembrando que os campos q vc quer aberto para edição/leitura devem ser public.)
2. Find:
Ao invés de referenciar por inspector, vc pode querer fazer isso em tempo de execução no seu código, isto é, com o jogo rodando, nesse caso, vc pode usar o FindObjectOfType e procurar pelo tipo desejado (ItensManagers) na cena, guardando o objeto encontrado numa variável.
Aí novamente, sempre que quiser alterar/ler algo dessa classe, use essa variável de referência.
3. GetComponent:
Se a classe q vc quer fazer acesso está no mesmo objeto que a classe ItensManagers é mto simples, basta usar o GetComponent para acessá-la.
4. Singleton:
Como vi pelo nome q essa classe é um "Manager" oq eu mais recomendo é usar o pattern singleton para gerenciar melhor essas classes com tarefa de gerenciador.
Aqui não precisa de referência por objeto, vc acessa a classe diretamente como se ela fosse estática.
Nesse tópico eu explico melhor sobre singleton e aqui tem um artigo mais robusto sobre o assunto.
1. Inspector:
O método mais comum e talvez mais simples pra isso, seria vc criar uma variável pública do tipo da classe q vc quer acesso (no seu caso, ItensManagers), dentro da classe q vai acessar essa referência, e setar o objeto da cena q contém esse script dentro desse campo via inspector.
Agora essa variável ''carrega'' consigo a referência dessa classe, e sempre q vc quiser alterar algum campo dela, basta usar essa variável. (Lembrando que os campos q vc quer aberto para edição/leitura devem ser public.)
2. Find:
Ao invés de referenciar por inspector, vc pode querer fazer isso em tempo de execução no seu código, isto é, com o jogo rodando, nesse caso, vc pode usar o FindObjectOfType e procurar pelo tipo desejado (ItensManagers) na cena, guardando o objeto encontrado numa variável.
Aí novamente, sempre que quiser alterar/ler algo dessa classe, use essa variável de referência.
3. GetComponent:
Se a classe q vc quer fazer acesso está no mesmo objeto que a classe ItensManagers é mto simples, basta usar o GetComponent para acessá-la.
4. Singleton:
Como vi pelo nome q essa classe é um "Manager" oq eu mais recomendo é usar o pattern singleton para gerenciar melhor essas classes com tarefa de gerenciador.
Aqui não precisa de referência por objeto, vc acessa a classe diretamente como se ela fosse estática.
Nesse tópico eu explico melhor sobre singleton e aqui tem um artigo mais robusto sobre o assunto.
Re: Como alterar um GameObject dentro de uma array
1-Realmente o inspector e muito simples e prático,MayLeone escreveu:Existem várias alternativas pra vc referenciar a classe em classes externas, segue algumas delas:
1. Inspector:
O método mais comum e talvez mais simples pra isso, seria vc criar uma variável pública do tipo da classe q vc quer acesso (no seu caso, ItensManagers), dentro da classe q vai acessar essa referência, e setar o objeto da cena q contém esse script dentro desse campo via inspector.
Agora essa variável ''carrega'' consigo a referência dessa classe, e sempre q vc quiser alterar algum campo dela, basta usar essa variável. (Lembrando que os campos q vc quer aberto para edição/leitura devem ser public.)
2. Find:
Ao invés de referenciar por inspector, vc pode querer fazer isso em tempo de execução no seu código, isto é, com o jogo rodando, nesse caso, vc pode usar o FindObjectOfType e procurar pelo tipo desejado (ItensManagers) na cena, guardando o objeto encontrado numa variável.
Aí novamente, sempre que quiser alterar/ler algo dessa classe, use essa variável de referência.
3. GetComponent:
Se a classe q vc quer fazer acesso está no mesmo objeto que a classe ItensManagers é mto simples, basta usar o GetComponent para acessá-la.
4. Singleton:
Como vi pelo nome q essa classe é um "Manager" oq eu mais recomendo é usar o pattern singleton para gerenciar melhor essas classes com tarefa de gerenciador.
Aqui não precisa de referência por objeto, vc acessa a classe diretamente como se ela fosse estática.
Nesse tópico eu explico melhor sobre singleton e aqui tem um artigo mais robusto sobre o assunto.
2-Eu uso o findObjectOfTag apenas no start já que ele faz busca em todo o jogo acaba pesando,
3-Singleton desconheço vou dar uma olhada,
A questão é que eu não consigo referênciar um gameObject dentro de uma matriz por outro script... Por falta de conhecimento em relação a matriz/lista vou ter que arrumar um jeito mais simples de lidar com o meu script, mesmo assim obrigado pelo comentário
Maston- Iniciante
- PONTOS : 1653
REPUTAÇÃO : 1
Respeito as regras :
Re: Como alterar um GameObject dentro de uma array
Não sei se você já resolveu este problema, mas é bem simples. A primeira coisa que você precisa ter é um valor da DATA (int) para a escolha das armas/personagens que não se destrói entre cenas, provavelmente isso você já tem no seu projeto. Então no seu script você deve criar uma nova variável array GameObject e adicionar uma pequena instrução no Awake() dizendo para a Unity que você quer que o elemento(0) do seu array seja substituído conforme a escolha que você fez no script DATA do seu game. Ficaria assim:
[SerializeField] private GameObject[] ArrayQueVocêQuerAlterar, NovoArray;
private int indexDATA; //Escolha da sua arma/personagem
private void Awake()
{
indexDATA = DATA.index;
ArrayQueVocêQuerAlterar[0] = NovoArray[indexDATA];
}
E você pode utilizar esse sistema para alterar qualquer elemento do seu Array, basta criar um laço For se precisar alterar mais do que um elemento.
[SerializeField] private GameObject[] ArrayQueVocêQuerAlterar, NovoArray;
private int indexDATA; //Escolha da sua arma/personagem
private void Awake()
{
indexDATA = DATA.index;
ArrayQueVocêQuerAlterar[0] = NovoArray[indexDATA];
}
E você pode utilizar esse sistema para alterar qualquer elemento do seu Array, basta criar um laço For se precisar alterar mais do que um elemento.
LucasJhonatan- Iniciante
- PONTOS : 683
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» Validar a posição de GameObject dentro de uma Array.
» Como Pegar um GameObject dentro do Getcomponentschild?
» Buscar o índice de um array que está dentro de outro array (JavaScript)
» Como fazer objeto se mover dentro de um collider 2d ou dentro de um sprite?
» Duvida sobre array de gameobject
» Como Pegar um GameObject dentro do Getcomponentschild?
» Buscar o índice de um array que está dentro de outro array (JavaScript)
» Como fazer objeto se mover dentro de um collider 2d ou dentro de um sprite?
» Duvida sobre array de gameobject
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos