Variável static e script de inventário
4 participantes
Página 1 de 1
Variável static e script de inventário
Pessoal, estou fiz um inventário para o meu jogo e fiz um comando para remover alguns botões do inventário. Aí preciso de trocar o índice dos botões e estou com problema nisso.
Script em cada um dos botões:
Script do Inventário:
Quando eu removo o botão com o maior índice, a variável atualizaIndice fica true.
Porém, quando há algum índice maior do que o que foi removido, o atualizaIndice fica false, mas a variável teste não fica true e a IndBotao não diminui em 1.
Alguém pode me explicar porque isso acontece e pode me ajudar a resolver?
Obrigado.
Script em cada um dos botões:
- Código:
public class Btn_Ave : MonoBehaviour {
void Update () {
RecebeAtualizaIndice = Inventario.atualizaIndice;
verIndiceRemovido = Inventario.indiceBtn; // apagar
if (Inventario.atualizaIndice == true && IndBotao > Inventario.indiceBtn)
{
teste = true; // apagar
IndBotao = IndBotao - 1;
Inventario.atualizaIndice = false;
}
Script do Inventário:
- Código:
public class Inventario : MonoBehaviour {
public static int indiceBtn;
public int verIndiceRemovido; // apagar depois
public static bool atualizaIndice;
public bool verAtualizaIndice; // apagar depois
void Update () {
if (BotaoOk.liberaRemover == true)
{
objetoRemover = GameObject.FindGameObjectWithTag("TagRemover");
indiceBtn = objetoRemover.GetComponent<Btn_Ave>().IndBotao;
RemoveBotao(indiceBtn);
Btn_Remover.podeRemover = false;
BotaoOk.liberaRemover = false;
}
}
public void RemoveBotao(int ind)
{
content.GetChild(ind).parent = null;
botoes.RemoveAt(ind);
Destroy(objetoRemover);
verIndiceRemovido = indiceBtn; //apagar
atualizaIndice = true;
}
Quando eu removo o botão com o maior índice, a variável atualizaIndice fica true.
Porém, quando há algum índice maior do que o que foi removido, o atualizaIndice fica false, mas a variável teste não fica true e a IndBotao não diminui em 1.
Alguém pode me explicar porque isso acontece e pode me ajudar a resolver?
Obrigado.
JoelMJunior- MembroAvançado
- PONTOS : 2944
REPUTAÇÃO : 13
Respeito as regras :
Re: Variável static e script de inventário
poste os códigos inteiros por favor... tem várias referências que estão faltando.
Re: Variável static e script de inventário
Antes de colocar os scripts inteiros... Você acha que tem a ver com o problema o fato de a variável ser do tipo static e ser alterada em um script que está em muitos objetos?
Script dos botões:
Script do Inventário:
Script dos botões:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Btn_Ave : MonoBehaviour {
public float posX, posY, posZ;
public GameObject objNovo;
public string sexo;
public Color vermelha, rosa, marrom, preta;
public int indBotao;
public bool RecebeAtualizaIndice; // apagar depois
bool boolSexo = true;
bool boolReduzIndice;
public bool teste; // apagar depois
public int verIndiceRemovido; // apagar depois
// Use this for initialization
void Start () {
posX = transform.position.x;
posY = transform.position.y;
posZ = transform.position.z - 0.1f;
gameObject.tag = "Untagged";
indBotao = Inventario.passaIndBotao;
objNovo = GameObject.FindGameObjectWithTag("ObjNovo");
TrocarTextoIndice();
if (objNovo != null)
{
GameObject btn = Instantiate(objNovo, new Vector3(posX, posY, posZ), Quaternion.identity, gameObject.transform);
btn.transform.localScale = new Vector3(25, 25, 1);
}
}
// Update is called once per frame
void Update () {
if (objNovo != null && boolSexo == true)
{
sexo = objNovo.GetComponent<AveInCarac>().sexo;
boolSexo = false;
}
RecebeAtualizaIndice = Inventario.atualizaIndice;
verIndiceRemovido = Inventario.indiceBtn; // apagar
if (Inventario.atualizaIndice == true && indBotao > Inventario.indiceBtn)
{
teste = true; // apagar
indBotao = indBotao - 1;
Inventario.atualizaIndice = false;
}
// RecebeAtualizaIndice = false;
// Inventario.atualizaIndice = false; //Analisar onde esse comando deve ficar.
CorPadrao();
}
public void CorPadrao()
{
if (BotaoReproduzir.podeReproduzir == false && GetComponent<Image>().color == rosa)
{
gameObject.tag = "Untagged";
GetComponent<Image>().color = marrom;
}
else if (BotaoLutar.podeLutar == false && GetComponent<Image>().color == vermelha)
{
gameObject.tag = "Untagged";
GetComponent<Image>().color = marrom;
}
else if (Btn_Remover.podeRemover == false && GetComponent<Image>().color == preta)
{
GetComponent<Image>().color = marrom;
}
}
public void OnMouseUpAsButton()
{
if (BotaoReproduzir.podeReproduzir == true)
{
GameObject tagPai = GameObject.FindGameObjectWithTag("BtnPai");
GameObject tagMae = GameObject.FindGameObjectWithTag("BtnMae");
if (sexo == "Macho")
{
if (gameObject.tag == "Untagged")
{
if (tagPai != null)
{
tagPai.gameObject.tag = "Untagged";
tagPai.GetComponent<Image>().color = marrom;
}
gameObject.tag = "BtnPai";
GetComponent<Image>().color = rosa;
}
else if (gameObject.tag == "BtnPai")
{
gameObject.tag = "Untagged";
GetComponent<Image>().color = marrom;
}
}
else if (sexo == "Fêmea")
{
if (gameObject.tag == "Untagged")
{
if (tagMae != null)
{
tagMae.gameObject.tag = "Untagged";
tagMae.GetComponent<Image>().color = marrom;
}
gameObject.tag = "BtnMae";
GetComponent<Image>().color = rosa;
}
else if (gameObject.tag == "BtnMae")
{
gameObject.tag = "Untagged";
GetComponent<Image>().color = marrom;
}
}
}
else if (BotaoLutar.podeLutar == true && sexo == "Macho")
{
GameObject c1 = GameObject.FindGameObjectWithTag("BtnCombat1");
GameObject c2 = GameObject.FindGameObjectWithTag("BtnCombat2");
if (gameObject.tag == "Untagged")
{
if (c1 == null)
{
gameObject.tag = "BtnCombat1";
GetComponent<Image>().color = vermelha;
}
else if (c2 == null)
{
gameObject.tag = "BtnCombat2";
GetComponent<Image>().color = vermelha;
}
else if (c1 != null && c2 != null)
{
c1.gameObject.tag = "Untagged";
c1.GetComponent<Image>().color = marrom;
c2.gameObject.tag = "BtnCombat1";
c2.GetComponent<Image>().color = vermelha;
gameObject.tag = "BtnCombat2";
GetComponent<Image>().color = vermelha;
}
}
else if (GetComponent<Image>().color == vermelha)
{
if (gameObject.tag == "BtnCombat1" && c2 != null)
{
c2.gameObject.tag = "BtnCombat1";
c2.GetComponent<Image>().color = vermelha;
}
gameObject.tag = "Untagged";
GetComponent<Image>().color = marrom;
}
}
else if (Btn_Remover.podeRemover == true)
{
GameObject tagRemover = GameObject.FindGameObjectWithTag("TagRemover");
if (gameObject.tag == "Untagged")
{
if (tagRemover != null)
{
tagRemover.gameObject.tag = "Untagged";
tagRemover.GetComponent<Image>().color = marrom;
}
gameObject.tag = "TagRemover";
GetComponent<Image>().color = preta;
}
else if (gameObject.tag == "TagRemover")
{
gameObject.tag = "Untagged";
GetComponent<Image>().color = marrom;
}
}
}
public void TrocarTextoIndice ()
{
if (indBotao < 9)
{
transform.GetChild(0).GetComponent<Text>().text = "0" + (indBotao + 1);
}
else
{
transform.GetChild(0).GetComponent<Text>().text = (indBotao + 1) + "";
}
}
}
Script do Inventário:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inventario : MonoBehaviour {
public RectTransform content;
public List<GameObject> botoes;
public static int passaIndBotao;
public static int indiceBtn;
public int verIndiceRemovido; // apagar depois
public static bool atualizaIndice;
public bool verAtualizaIndice; // apagar depois
public GameObject objetoBotao;
public GameObject objetoAve;
public GameObject objetoRemover;
public float scaleX, scaleY, scaleZ;
// Use this for initialization
void Start () {
scaleX = 1;
scaleY = 1;
scaleZ = 1;
}
// Update is called once per frame
void Update () {
objetoBotao = GameObject.FindGameObjectWithTag("BtnNovo");
objetoAve = GameObject.FindGameObjectWithTag("ObjNovo");
verAtualizaIndice = atualizaIndice; // apagar depois
if (objetoBotao != null && objetoAve != null)
{
AddBotao();
}
if (BotaoOk.liberaRemover == true)
{
objetoRemover = GameObject.FindGameObjectWithTag("TagRemover");
indiceBtn = objetoRemover.GetComponent<Btn_Ave>().indBotao;
RemoveBotao(indiceBtn);
Btn_Remover.podeRemover = false;
BotaoOk.liberaRemover = false;
}
}
public void AddBotao ()
{
botoes.Add(objetoBotao);
DesenhaBotao();
}
public void RemoveBotao(int ind)
{
content.GetChild(ind).parent = null;
botoes.RemoveAt(ind);
Destroy(objetoRemover);
verIndiceRemovido = indiceBtn; //apagar
atualizaIndice = true;
}
public void DesenhaBotao ()
{
if (content.childCount < botoes.Count)
{
GameObject btn = Instantiate(botoes[content.childCount], content.position, Quaternion.identity, content.transform);
btn.transform.localScale = new Vector3(scaleX, scaleY, scaleZ);
passaIndBotao = content.childCount -1;
}
}
}
JoelMJunior- MembroAvançado
- PONTOS : 2944
REPUTAÇÃO : 13
Respeito as regras :
Re: Variável static e script de inventário
Alguém tem alguma ideia do por que isso acontece?
Ou como posso fazer isso de outra forma?
Ou como posso fazer isso de outra forma?
JoelMJunior- MembroAvançado
- PONTOS : 2944
REPUTAÇÃO : 13
Respeito as regras :
Re: Variável static e script de inventário
Pelo que estou notando, o problema é onde e quando setar a variável static atualizaIndice para false.
Se eu deixar ela true, até consigo atualizar os índices, mas todos os índices com valor maior do que o botão que foi deletado ficam com índice igual ao índice que foi deletado, porque vai reduzido de 1 em 1, até parar de ser maior do que ele.
Se eu deixar ela true, até consigo atualizar os índices, mas todos os índices com valor maior do que o botão que foi deletado ficam com índice igual ao índice que foi deletado, porque vai reduzido de 1 em 1, até parar de ser maior do que ele.
JoelMJunior- MembroAvançado
- PONTOS : 2944
REPUTAÇÃO : 13
Respeito as regras :
Re: Variável static e script de inventário
Bom dia brow! nunca programei um inventário, mas posso te dizer que a static as vezes causa o problema, por exemplo, se eu tenho vários inimigos no cenário com o mesmo script e com uma vida em static, ao causar dano em um, todos recebem o mesmo dano, por isso nesse caso não pode-se usar o static para o dano, só um exemplo.
Flw!
Flw!
Re: Variável static e script de inventário
O que eu não entendo é que a variável não fica true.
Tentei fazer de outra forma, mas também não funcionou. Tentei setar false para a variável atualizaIndice no próprio índice do inventário.
A ideia era fazer a variável ficar true, aí rodar o comando nos scripts dos botões, e setar false para a variável. Ela funcionaria como um "gatilho". Mas não deu certo não sei por quê.
Ainda não sei como resolver isso.
Tentei fazer de outra forma, mas também não funcionou. Tentei setar false para a variável atualizaIndice no próprio índice do inventário.
- Código:
void Update () {
if (BotaoOk.liberaRemover == true)
{
objetoRemover = GameObject.FindGameObjectWithTag("TagRemover");
indiceBtn = objetoRemover.GetComponent<Btn_Ave>().indBotao;
RemoveBotao(indiceBtn);
atualizaIndice = false; // desligo a variável aqui
Btn_Remover.podeRemover = false;
BotaoOk.liberaRemover = false;
}
}
public void RemoveBotao(int ind)
{
content.GetChild(ind).parent = null;
botoes.RemoveAt(ind);
Destroy(objetoRemover);
verIndiceRemovido = indiceBtn; //apagar
atualizaIndice = true;
}
A ideia era fazer a variável ficar true, aí rodar o comando nos scripts dos botões, e setar false para a variável. Ela funcionaria como um "gatilho". Mas não deu certo não sei por quê.
Ainda não sei como resolver isso.
JoelMJunior- MembroAvançado
- PONTOS : 2944
REPUTAÇÃO : 13
Respeito as regras :
Re: Variável static e script de inventário
- Código:
using UnityEngine;
using System.Collections;
public class Mortadela : MonoBehaviour {
public static Mortadela instance { get; set; }// acho muito bom esse mas funciona so em alguns casos
public static Mortadela m_Instance;
public static bool canPeidarEmIngles;//não é muito bom usar esse depende
public bool noHire = true;
void Start () {
instance = this;//não se esqueça mas o melhor seria no onEnable
}
void OnEnable () {//void bom
m_Instance = this;//se eu não me engano sempre q atualizar o jogo ou unity ele recebe tal codigo
}
public void ButtonSoltarFlatulenciaCheirosa () {
noHire = false;
Mortadela.canPeidarEmIngles = !Mortadela.canPeidarEmIngles;
Mortadela.canPeidarEmIngles = false;
Mortadela.canPeidarEmIngles = true;
Mortadela.instance.noHire = true;
Debug.Log (Mortadela.canPeidarEmIngles); // true
}
public static class ClasseIdependente {
public static void SouMesmo () {
}
}
void Update () {
if (!noHire) {
if (canPeidarEmIngles) {
print ("Que aliveo!");
}
}
}
}
Re: Variável static e script de inventário
cara depende muito o que você pretende mas a ideia do inventario é você pensar como vc vai guardar as informações depois é a dica
Tópicos semelhantes
» [Duvida] Como acessar uma variavel nãa estatica(static).
» Como acessar uma variável de um script utilizando como parâmetro uma variável nomescript
» Como acessar variável de um script usando outro script (Entre e entenda).
» Ajuda em script de inventario
» [Ajuda]Script de inventario
» Como acessar uma variável de um script utilizando como parâmetro uma variável nomescript
» Como acessar variável de um script usando outro script (Entre e entenda).
» Ajuda em script de inventario
» [Ajuda]Script de inventario
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos