[Ajuda] Variavel não esta recebendo o valor do outro script
5 participantes
Página 1 de 1
[Ajuda] Variavel não esta recebendo o valor do outro script
Queria ajuda pra saber o que pode esta errado, estou fazendo um jogo de carta, e estou tentando fazer um sistema com raycast pra selecionar as cartas da mao que serão ativa, ao clicar sobre a carta um objeto fica selecionado e a ideia era usar o objeto da variavel ObjetoSelecionado pra pegar o valor int da variavel IndIST do script da card e usar esse valor no indice da lista da mao para remover o elemento da lista, mas nao esta funcional dessa forma e aparece o erro NullReferenceException: Object reference not set to an instance of an object se alguem puder me ajudar vou postar os 2 scripts
e esse é o script da carta que eu quero acessar
o erro ocorre na linhas 123 sendo que o objeto é setado na variavel mas nao consigo pegar o valor que eu quero do outro script
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class CardsDeck : MonoBehaviour {
public List<GameObject> deck = new List<GameObject>();
public List<GameObject> cards = new List<GameObject>();
public List<GameObject> mao = new List<GameObject>();
private int cardsSacado = 0;
private bool showReset = false;
public List<Transform> CartasM = new List<Transform>();
GameObject[] Cartas;
public List<bool> Usado = new List<bool>();
public GameObject ObjetoSelecionado;
public bool selecionar = false;
public Camera kamera;
public Vector3 distance;
Transform CartasT;
public int index = -1;
public int auxIndice ;
float leque = 15.0f;
public float auxLeque;
void ResetDeck()
{
cardsSacado = 0;
for (int i = 0; i < mao.Count; i++) {
Destroy(mao[i]);
Usado[i] = false;
}
CartasM.Clear();
mao.Clear();
cards.Clear();
cards.AddRange(deck);
showReset = false;
}
GameObject SacaCard (){
if(cards.Count == 0)
{
showReset = true;
return null;
}
int card = Random.Range(0, cards.Count - 1);
GameObject go = GameObject.Instantiate(cards[card]) as GameObject;
cards.RemoveAt(card);
index = index + 1;
if(cards.Count == 0) {
showReset = true;
}
return go;
}
void Start () {
ResetDeck();
auxLeque = leque;
Sort();
}
// Update is called once per frame
void Update () {
SelectCarta ();
if (!showReset) {
if(Input.GetKeyDown(KeyCode.PageUp))
{
MoveOrdenaCard();
auxLeque = auxLeque - 1.5f;
}
}
else {
// Reset button
if(Input.GetKeyDown(KeyCode.Home))
{
ResetDeck();
auxLeque = leque;
}
}
// GameOver button
if(Input.GetKeyDown(KeyCode.PageDown))
{
GameOver();
}
}
void GameOver()
{
cardsSacado = 0;
for (int m = 0; m < mao.Count; m++) {
Destroy(mao[m]);
Usado[m] = false;
}
CartasM.Clear();
mao.Clear();
cards.Clear();
cards.AddRange(deck);
}
public void SelectCarta ()
{
if(Input.GetMouseButtonDown (0)){
RaycastHit hit;
if(Physics.Raycast(kamera.ScreenPointToRay(Input.mousePosition),out hit, LayerMask.GetMask("Carta")))
{
if (hit.collider.gameObject.tag == "Cartas" && Input.GetMouseButtonDown (0)) {
int indexx = 0;
ObjetoSelecionado = hit.transform.gameObject;
ObjetoSelecionado.GetComponent<Card>().IndIST = auxIndice;
mao.RemoveAt(auxIndice);
Usado[auxIndice] = false;
Debug.Log(gameObject);
Debug.Log(auxIndice);
index = index - 1;
auxLeque = auxLeque + 1.5f;
selecionar = true;
return;
}
}
if(selecionar == true && Input.GetMouseButtonDown (0)){
selecionar = false;
return;
}
}
}
void MoveOrdenaCard()
{
GameObject newCard = SacaCard();
if (newCard == null) {
Debug.Log("Out of Cards");
showReset = true;
return;
}
mao.Add(newCard);
Usado[cardsSacado] = true;
cardsSacado ++;
Cartas = GameObject.FindGameObjectsWithTag("Cartas");
for(int i = 0; i<Cartas.Length; i++){
CartasT = Cartas[i].GetComponent<Transform> ();
}
CartasM.Add(CartasT);
}
void Sort()
{
Vector3 startPos = new Vector3(distance.x * (CartasM.Count / 2), distance.y * (CartasM.Count / 2),distance.z * (CartasM.Count / 2));
Vector3 direction = startPos;
direction.y = 0;
for (int i = 0; i < CartasM.Count; i++)
{
CartasM[i].GetComponent<Card>().direction = direction;
direction.x += distance.x;
if (i >= (CartasM.Count / 2))
direction.y -= startPos.y;
else
direction.y += startPos.y;
}
}
}
e esse é o script da carta que eu quero acessar
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Card : MonoBehaviour {
public int ID, indice;
public string Nome;
public Texture2D imagem;
//public GameObject MAO;
// Animator anim;
// public bool CartaAtivada = false;
public GameObject deck;
public int IndIST;
public Vector3 direction = new Vector3();
float FLeque ;
void Start () {
deck = GameObject.FindWithTag("Deck");
IndIST = deck.GetComponent<CardsDeck>().index;
// anim = GetComponent<Animator>();
FLeque = deck.GetComponent<CardsDeck>().auxLeque;
direction = new Vector3 (FLeque, -14, -24);
}
// Update is called once per frame
void Update () {
transform.position = Vector3.Lerp (transform.position, direction, 3 * Time.deltaTime);
}
}
o erro ocorre na linhas 123 sendo que o objeto é setado na variavel mas nao consigo pegar o valor que eu quero do outro script
Ronmaster- Membro
- PONTOS : 2889
REPUTAÇÃO : 4
Respeito as regras :
Re: [Ajuda] Variavel não esta recebendo o valor do outro script
Sou um iniciante em programação, mas nesse caso acho que tem que ver se o objeto que você quer setar em "ObjetoSelecionado" tem Box Collider e se o script Card é um dos seus componentes.
JoelMJunior- MembroAvançado
- PONTOS : 2963
REPUTAÇÃO : 13
Respeito as regras :
Re: [Ajuda] Variavel não esta recebendo o valor do outro script
talvez te ajude!Ronmaster escreveu:Queria ajuda pra saber o que pode esta errado, estou fazendo um jogo de carta, e estou tentando fazer um sistema com raycast pra selecionar as cartas da mao que serão ativa, ao clicar sobre a carta um objeto fica selecionado e a ideia era usar o objeto da variavel ObjetoSelecionado pra pegar o valor int da variavel IndIST do script da card e usar esse valor no indice da lista da mao para remover o elemento da lista, mas nao esta funcional dessa forma e aparece o erro NullReferenceException: Object reference not set to an instance of an object se alguem puder me ajudar vou postar os 2 scripts
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class CardsDeck : MonoBehaviour {
public List<GameObject> deck = new List<GameObject>();
public List<GameObject> cards = new List<GameObject>();
public List<GameObject> mao = new List<GameObject>();
private int cardsSacado = 0;
private bool showReset = false;
public List<Transform> CartasM = new List<Transform>();
GameObject[] Cartas;
public List<bool> Usado = new List<bool>();
public GameObject ObjetoSelecionado;
public bool selecionar = false;
public Camera kamera;
public Vector3 distance;
Transform CartasT;
public int index = -1;
public int auxIndice ;
float leque = 15.0f;
public float auxLeque;
void ResetDeck()
{
cardsSacado = 0;
for (int i = 0; i < mao.Count; i++) {
Destroy(mao[i]);
Usado[i] = false;
}
CartasM.Clear();
mao.Clear();
cards.Clear();
cards.AddRange(deck);
showReset = false;
}
GameObject SacaCard (){
if(cards.Count == 0)
{
showReset = true;
return null;
}
int card = Random.Range(0, cards.Count - 1);
GameObject go = GameObject.Instantiate(cards[card]) as GameObject;
cards.RemoveAt(card);
index = index + 1;
if(cards.Count == 0) {
showReset = true;
}
return go;
}
void Start () {
ResetDeck();
auxLeque = leque;
Sort();
}
// Update is called once per frame
void Update () {
SelectCarta ();
if (!showReset) {
if(Input.GetKeyDown(KeyCode.PageUp))
{
MoveOrdenaCard();
auxLeque = auxLeque - 1.5f;
}
}
else {
// Reset button
if(Input.GetKeyDown(KeyCode.Home))
{
ResetDeck();
auxLeque = leque;
}
}
// GameOver button
if(Input.GetKeyDown(KeyCode.PageDown))
{
GameOver();
}
}
void GameOver()
{
cardsSacado = 0;
for (int m = 0; m < mao.Count; m++) {
Destroy(mao[m]);
Usado[m] = false;
}
CartasM.Clear();
mao.Clear();
cards.Clear();
cards.AddRange(deck);
}
public void SelectCarta ()
{
if(Input.GetMouseButtonDown (0)){
RaycastHit hit;
if(Physics.Raycast(kamera.ScreenPointToRay(Input.mousePosition),out hit, LayerMask.GetMask("Carta")))
{
if (hit.collider.gameObject.tag == "Cartas" && Input.GetMouseButtonDown (0)) {
int indexx = 0;
ObjetoSelecionado = hit.transform.gameObject;
ObjetoSelecionado.GetComponent<Card>().IndIST = auxIndice;
mao.RemoveAt(auxIndice);
Usado[auxIndice] = false;
Debug.Log(gameObject);
Debug.Log(auxIndice);
index = index - 1;
auxLeque = auxLeque + 1.5f;
selecionar = true;
return;
}
}
if(selecionar == true && Input.GetMouseButtonDown (0)){
selecionar = false;
return;
}
}
}
void MoveOrdenaCard()
{
GameObject newCard = SacaCard();
if (newCard == null) {
Debug.Log("Out of Cards");
showReset = true;
return;
}
mao.Add(newCard);
Usado[cardsSacado] = true;
cardsSacado ++;
Cartas = GameObject.FindGameObjectsWithTag("Cartas");
for(int i = 0; i<Cartas.Length; i++){
CartasT = Cartas[i].GetComponent<Transform> ();
}
CartasM.Add(CartasT);
}
void Sort()
{
Vector3 startPos = new Vector3(distance.x * (CartasM.Count / 2), distance.y * (CartasM.Count / 2),distance.z * (CartasM.Count / 2));
Vector3 direction = startPos;
direction.y = 0;
for (int i = 0; i < CartasM.Count; i++)
{
CartasM[i].GetComponent<Card>().direction = direction;
direction.x += distance.x;
if (i >= (CartasM.Count / 2))
direction.y -= startPos.y;
else
direction.y += startPos.y;
}
}
}
e esse é o script da carta que eu quero acessar
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Card : MonoBehaviour {
public int ID, indice;
public string Nome;
public Texture2D imagem;
//public GameObject MAO;
// Animator anim;
// public bool CartaAtivada = false;
public GameObject deck;
public int IndIST;
public Vector3 direction = new Vector3();
float FLeque ;
void Start () {
deck = GameObject.FindWithTag("Deck");
IndIST = deck.GetComponent<CardsDeck>().index;
// anim = GetComponent<Animator>();
FLeque = deck.GetComponent<CardsDeck>().auxLeque;
direction = new Vector3 (FLeque, -14, -24);
}
// Update is called once per frame
void Update () {
transform.position = Vector3.Lerp (transform.position, direction, 3 * Time.deltaTime);
}
}
o erro ocorre na linhas 123 sendo que o objeto é setado na variavel mas nao consigo pegar o valor que eu quero do outro script
Gabriel César O- Profissional
- PONTOS : 4004
REPUTAÇÃO : 217
Idade : 23
Áreas de atuação : (ESTUDANDO SEGUNDO GRAU), (FUÇANDO NO UNITY)){
Respeito as regras :
Re: [Ajuda] Variavel não esta recebendo o valor do outro script
Ronmaster escreveu:Queria ajuda pra saber o que pode esta errado, estou fazendo um jogo de carta, e estou tentando fazer um sistema com raycast pra selecionar as cartas da mao que serão ativa, ao clicar sobre a carta um objeto fica selecionado e a ideia era usar o objeto da variavel ObjetoSelecionado pra pegar o valor int da variavel IndIST do script da card e usar esse valor no indice da lista da mao para remover o elemento da lista, mas nao esta funcional dessa forma e aparece o erro NullReferenceException: Object reference not set to an instance of an object se alguem puder me ajudar vou postar os 2 scripts
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class CardsDeck : MonoBehaviour {
public List<GameObject> deck = new List<GameObject>();
public List<GameObject> cards = new List<GameObject>();
public List<GameObject> mao = new List<GameObject>();
private int cardsSacado = 0;
private bool showReset = false;
public List<Transform> CartasM = new List<Transform>();
GameObject[] Cartas;
public List<bool> Usado = new List<bool>();
public GameObject ObjetoSelecionado;
public bool selecionar = false;
public Camera kamera;
public Vector3 distance;
Transform CartasT;
public int index = -1;
public int auxIndice ;
float leque = 15.0f;
public float auxLeque;
void ResetDeck()
{
cardsSacado = 0;
for (int i = 0; i < mao.Count; i++) {
Destroy(mao[i]);
Usado[i] = false;
}
CartasM.Clear();
mao.Clear();
cards.Clear();
cards.AddRange(deck);
showReset = false;
}
GameObject SacaCard (){
if(cards.Count == 0)
{
showReset = true;
return null;
}
int card = Random.Range(0, cards.Count - 1);
GameObject go = GameObject.Instantiate(cards[card]) as GameObject;
cards.RemoveAt(card);
index = index + 1;
if(cards.Count == 0) {
showReset = true;
}
return go;
}
void Start () {
ResetDeck();
auxLeque = leque;
Sort();
}
// Update is called once per frame
void Update () {
SelectCarta ();
if (!showReset) {
if(Input.GetKeyDown(KeyCode.PageUp))
{
MoveOrdenaCard();
auxLeque = auxLeque - 1.5f;
}
}
else {
// Reset button
if(Input.GetKeyDown(KeyCode.Home))
{
ResetDeck();
auxLeque = leque;
}
}
// GameOver button
if(Input.GetKeyDown(KeyCode.PageDown))
{
GameOver();
}
}
void GameOver()
{
cardsSacado = 0;
for (int m = 0; m < mao.Count; m++) {
Destroy(mao[m]);
Usado[m] = false;
}
CartasM.Clear();
mao.Clear();
cards.Clear();
cards.AddRange(deck);
}
public void SelectCarta ()
{
if(Input.GetMouseButtonDown (0)){
RaycastHit hit;
if(Physics.Raycast(kamera.ScreenPointToRay(Input.mousePosition),out hit, LayerMask.GetMask("Carta")))
{
if (hit.collider.gameObject.tag == "Cartas" && Input.GetMouseButtonDown (0)) {
int indexx = 0;
ObjetoSelecionado = hit.transform.gameObject;
ObjetoSelecionado.GetComponent<Card>().IndIST = auxIndice;
mao.RemoveAt(auxIndice);
Usado[auxIndice] = false;
Debug.Log(gameObject);
Debug.Log(auxIndice);
index = index - 1;
auxLeque = auxLeque + 1.5f;
selecionar = true;
return;
}
}
if(selecionar == true && Input.GetMouseButtonDown (0)){
selecionar = false;
return;
}
}
}
void MoveOrdenaCard()
{
GameObject newCard = SacaCard();
if (newCard == null) {
Debug.Log("Out of Cards");
showReset = true;
return;
}
mao.Add(newCard);
Usado[cardsSacado] = true;
cardsSacado ++;
Cartas = GameObject.FindGameObjectsWithTag("Cartas");
for(int i = 0; i<Cartas.Length; i++){
CartasT = Cartas[i].GetComponent<Transform> ();
}
CartasM.Add(CartasT);
}
void Sort()
{
Vector3 startPos = new Vector3(distance.x * (CartasM.Count / 2), distance.y * (CartasM.Count / 2),distance.z * (CartasM.Count / 2));
Vector3 direction = startPos;
direction.y = 0;
for (int i = 0; i < CartasM.Count; i++)
{
CartasM[i].GetComponent<Card>().direction = direction;
direction.x += distance.x;
if (i >= (CartasM.Count / 2))
direction.y -= startPos.y;
else
direction.y += startPos.y;
}
}
}
e esse é o script da carta que eu quero acessar
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Card : MonoBehaviour {
public int ID, indice;
public string Nome;
public Texture2D imagem;
//public GameObject MAO;
// Animator anim;
// public bool CartaAtivada = false;
public GameObject deck;
public int IndIST;
public Vector3 direction = new Vector3();
float FLeque ;
void Start () {
deck = GameObject.FindWithTag("Deck");
IndIST = deck.GetComponent<CardsDeck>().index;
// anim = GetComponent<Animator>();
FLeque = deck.GetComponent<CardsDeck>().auxLeque;
direction = new Vector3 (FLeque, -14, -24);
}
// Update is called once per frame
void Update () {
transform.position = Vector3.Lerp (transform.position, direction, 3 * Time.deltaTime);
}
}
o erro ocorre na linhas 123 sendo que o objeto é setado na variavel mas nao consigo pegar o valor que eu quero do outro script
Você está esquecendo de verificar se o hit não é nulo:
- Código:
[size=14][b]if[/b][/size][size=14] [/size][size=14]([/size][size=14]hit[/size][size=14].[/size][size=14]collider[/size][size=14][color=#666666] != null){[/color][/size]
[color=#666666][font=Consolas, Bitstream Vera Sans Mono, Andale Mono, Monaco, DejaVu Sans Mono, Lucida Console, monospace][size=14]//Aqui coloca o codigo que esteja usando "[/size][/font][/color]hit.collider"
[size=14][color=#666666]}[/color][/size]
Re: [Ajuda] Variavel não esta recebendo o valor do outro script
- Código:
raycast...
if(hit.collider != null){
//Aqui coloca todo o codigo que esteja usando "hit.collider"
...
}
Re: [Ajuda] Variavel não esta recebendo o valor do outro script
Valeu galera eu consegui aqui, no caso antes eu nao estava tentando pegar o valor via getComponent porque dava aquele erro, eu chequei os components fiz todos os testes e esta tudo certo, o raycast tambem ta funcional, mas antes eu nao estava conseguindo pegar o valor via getComponent entao eu mudei a variavel indIST pra static e a igualei à indice e chamei via getComponent novamente no outro script e funcionou, valeu mesmo :D agora ja estou com um outro problema diferente, vou tentar ver se resolvo
Ronmaster- Membro
- PONTOS : 2889
REPUTAÇÃO : 4
Respeito as regras :
Re: [Ajuda] Variavel não esta recebendo o valor do outro script
Galera eu sei que tem como pegar um valor de uma variavel de outro script, mas agora eu queria saber se é possivel modificar ou somar um valor a uma variavel float por exemplo de um script diferente?
Ronmaster- Membro
- PONTOS : 2889
REPUTAÇÃO : 4
Respeito as regras :
Re: [Ajuda] Variavel não esta recebendo o valor do outro script
Sim é possivel ;-;Ronmaster escreveu:Galera eu sei que tem como pegar um valor de uma variavel de outro script, mas agora eu queria saber se é possivel modificar ou somar um valor a uma variavel float por exemplo de um script diferente?
- Código:
public class OutroScript : MonoBehaviour {
public static float Numero2;
}
- Código:
public float Numero1,Soma;
void Start () {
Soma = Numero1 + OutroScript.Numero2;
}
Também da para fazer isso por uma variavel não static... ;-;
Re: [Ajuda] Variavel não esta recebendo o valor do outro script
Blz vou testar aqui
Ronmaster- Membro
- PONTOS : 2889
REPUTAÇÃO : 4
Respeito as regras :
Tópicos semelhantes
» Preciso de ajuda para substituir valor de variavel em outro script
» Json esta recebendo um valor mas devolve outro
» Nao consigo alterar o valor da variavel de outro script
» Enviar valor de variável para outro script ao apertar um botão.
» Dúvida de pegar variável de outro script / sistema de compra e venda (Ajuda aí pfv)
» Json esta recebendo um valor mas devolve outro
» Nao consigo alterar o valor da variavel de outro script
» Enviar valor de variável para outro script ao apertar um botão.
» Dúvida de pegar variável de outro script / sistema de compra e venda (Ajuda aí pfv)
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos