Duvida sobre script
4 participantes
Página 1 de 1
Duvida sobre script
Olá estava criando uma cena onde duas esferas, uma azul e uma vermelha, ficariam se chocando e se afastando. Para que elas fossem em direção uma a outra eu usei este código:
Entretanto quando eu inicio a cena ambas as esferas ficam paradas e o console retorna a mensagem:
NullReferenceException: Object reference not set to an instance of an object
CombateBlue.Update () (at Assets/Scripts/CombateBlue.cs:26)
Para que elas se afastem vou usar objetos vazios como spots e um trigger em cada esfera de forma a testar se a colisão foi com a sua rival e em caso positivo elas iriam para um desses spots. Também vou usar um contador para definir qual spot elas irão.
Mas a questão é: Por que estou tendo este retorno no console? Ambas estão com as tags certas.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class CombateBlue : MonoBehaviour {
private GameObject sphereRed;
private NavMeshAgent navMesh;
// Use this for initialization
void start () {
sphereRed = GameObject.FindWithTag("SphereRed");
navMesh = GetComponent<NavMeshAgent> ();
}
// Update is called once per frame
void Update () {
navMesh.destination = sphereRed.transform.position;
}
}
Entretanto quando eu inicio a cena ambas as esferas ficam paradas e o console retorna a mensagem:
NullReferenceException: Object reference not set to an instance of an object
CombateBlue.Update () (at Assets/Scripts/CombateBlue.cs:26)
Para que elas se afastem vou usar objetos vazios como spots e um trigger em cada esfera de forma a testar se a colisão foi com a sua rival e em caso positivo elas iriam para um desses spots. Também vou usar um contador para definir qual spot elas irão.
Mas a questão é: Por que estou tendo este retorno no console? Ambas estão com as tags certas.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Bom dia cara! Faça as seguintes alterações no seu script:
Abraço!
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
public class Teste : MonoBehaviour {
private GameObject SphereRed;
private UnityEngine.AI.NavMeshAgent navMesh;
// Use this for initialization
void Start () {
SphereRed = GameObject.FindGameObjectWithTag ("SphereRed");
navMesh = GetComponent<UnityEngine.AI.NavMeshAgent> ();
}
// Update is called once per frame
void Update () {
navMesh.destination = SphereRed.transform.position;
}
}
Abraço!
Re: Duvida sobre script
Obrigado. Só adicionei o UnityEngine.AI. e [RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
Agora entendi ele não estava conseguindo "instanciar" o navmeshagent.
Agora entendi ele não estava conseguindo "instanciar" o navmeshagent.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
blz, funcionou então?arnaldojunior escreveu:Obrigado. Só adicionei o UnityEngine.AI. e [RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
Agora entendi ele não estava conseguindo "instanciar" o navmeshagent.
Re: Duvida sobre script
Esta funcionando. Agora estou procurando um script para usar no OnTriggerEnter.
Ainda não sei como direcionar as esferas para os waypoints. A principio estou comparando tags, mas direciona-las... Estava pensando em usar o navmesh. Estou tentando lembrar como crio uma lista de array.
Ainda não sei como direcionar as esferas para os waypoints. A principio estou comparando tags, mas direciona-las... Estava pensando em usar o navmesh. Estou tentando lembrar como crio uma lista de array.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Desculpem os constantes questionamentos, mas como estou iniciando na área ainda tenho duvidas por demais.
Agora estou com problemas na hora de testar a colisão e minhas esferas irem em direção aos spots.
Agora estou com problemas na hora de testar a colisão e minhas esferas irem em direção aos spots.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
public class CombateBlue : MonoBehaviour {
private GameObject SphereRed;
private UnityEngine.AI.NavMeshAgent navMesh;
public Transform [] spot;
private int x;
// Use this for initialization
void Start () {
//Localiza o alvo, seleciona-o para a variavel e instancia o navmeshagent
SphereRed = GameObject.FindGameObjectWithTag ("SphereRed");
navMesh = GetComponent<UnityEngine.AI.NavMeshAgent> ();
}
// Update is called once per frame
void Update () {
//diz ao navmeshagent para onde ir
navMesh.destination = SphereRed.transform.position;
x = 0;
}
void OnTriggerEnter (Collider other){
if (gameObject.CompareTag ("SphereRed") && (x < spot.Length)) {
Vector3 alvo = spot[x].transform.position;
transform.position = Vector3.MoveTowards(transform.position,alvo,50);
x++;
if (x >= spot.Length) {
x = 0;
}
}
}
}
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Boa tarde cara! dá uma olhada na busca do fórum sobre waypoints, achei esse aqui que acho que pode te ajudar, https://www.schultzgames.com/t2957-resolvido-pegar-objetos-filhos-e-adicionar-em-uma-lista-ou-array-para-usalos-como-waypoints?highlight=waypoints
Abraço!
Abraço!
Re: Duvida sobre script
Eu vi o tópico que me indicou, mas percebi que meu erro era de lógica. Modifiquei meu script, mas agora meu problema é com o "trigger". Através do Debug percebi que o trigger não recebe um valor verdadeiro e não sei o motivo.
Poderiam me dizer o que esta errado?
- Código:
public class CombateBlue : MonoBehaviour {
private GameObject SphereRed;
private UnityEngine.AI.NavMeshAgent navMesh;
public Transform [] spot;
private int x;
private bool sphere;
// Use this for initialization
void Start () {
//Localiza o alvo, seleciona-o para a variavel e instancia o navmeshagent
SphereRed = GameObject.FindGameObjectWithTag ("SphereRed");
navMesh = GetComponent<UnityEngine.AI.NavMeshAgent> ();
x = 0;
sphere = false;
}
void OnTriggerEnter(Collider outro){
//verifica se colidiu com a outra esfera e define o valor da boleana
if (outro.gameObject.CompareTag ("SphereRed") && (x < spot.Length)) {
sphere = true;
} else {
sphere = false;
}
}
// Update is called once per frame
void Update () {
//Se a Boleana for verdadeira a esfera vai para os spots
if (sphere == true) {
Vector3 alvo = spot[x].transform.position;
transform.position = Vector3.MoveTowards(transform.position,alvo,50);
x++;
//Zera o x caso antes que ele ultrapasse o array
if (x >= spot.Length) {
x = 0;
}
} else {
//diz ao navmeshagent para onde ir
navMesh.destination = SphereRed.transform.position;
}
}
}
Poderiam me dizer o que esta errado?
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Acabei de tentar e retorna a mensagem: Membro não invocável...não pode ser usado como método.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Cara, o script que vc colou está sem o cabeçalho com as Bibliotecas da Unity, testei aqui e funcionou perfeitamente, lembrando que tem que por true no Sphere para ele ir pro spot, se não ele vai para o SphereRed, funciona direitinho.
Abraço!
Abraço!
Re: Duvida sobre script
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
public class CombateBlue : MonoBehaviour {
private GameObject SphereRed;
private UnityEngine.AI.NavMeshAgent navMesh;
public Transform [] spot;
private int x;
private bool sphere;
// Use this for initialization
void Start () {
//Localiza o alvo, seleciona-o para a variavel e instancia o navmeshagent
SphereRed = GameObject.FindGameObjectWithTag ("SphereRed");
navMesh = GetComponent<UnityEngine.AI.NavMeshAgent> ();
x = 0;
sphere = false;
}
void OnTriggerEnter(Collider outro){
//verifica se colidiu com a outra esfera e define o valor da boleana
if (outro.gameObject.CompareTag ("SphereRed") && (x < spot.Length)) {
sphere = true;
} else {
sphere = false;
}
}
// Update is called once per frame
void Update () {
//Se a Boleana for verdadeira a esfera vai para os spots
if (sphere == true) {
Vector3 alvo = spot[x].transform.position;
transform.position = Vector3.MoveTowards(transform.position,alvo,50);
x++;
//Zera o x caso antes que ele ultrapasse o array
if (x >= spot.Length) {
x = 0;
}
} else {
//diz ao navmeshagent para onde ir
navMesh.destination = SphereRed.transform.position;
}
}
}
Esse é o script completo.
A cena começa com sphere = false e quando testa a colisão que modifica ou não o estado.
- Código:
if (outro.gameObject.tag ("SphereRed") && (x < spot.Length)) {...}
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
a parte da tag ta errada, pelo menos sempre uso da seguinte forma: outro.gameObject.tag == "SphereRed" e dai o restante. Tentei aqui mas não consegui fazer a colisão funcionar, o script ficou sem erro, to sem tempo agora, se não conseguir resolver, a hora que eu tiver um tempo tento ver aqui.
Abraço!
Abraço!
Re: Duvida sobre script
Obrigado, a parte da tag estava errado mesmo, mas meu trigger continua não disparando. estou usando sphere collider e minhas esferas estão com as tags corretas. Não sei o que pode ser.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Fiz um teste com a booleana começando em verdadeiro e a esfera parou no primeiro spot. pelo visto meu problema é que meu trigger não esta funcionando.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Hahahahaha, descobri meu erro. Precisa ter um rigidBody para usar colisões.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
blz, e funcionou certinho?arnaldojunior escreveu:Hahahahaha, descobri meu erro. Precisa ter um rigidBody para usar colisões.
Abraço!
Re: Duvida sobre script
Não esta funcionando muito bem. Eu adicionei uma variável de velocidade e deixei:
Mas a esfera faz o percurso direto para o segundo spot, após isso ela retorna e vai para o quarto e depois ele apenas acompanha a esfera vermelha sem zerar o contador. Sabem me dizer onde estor errando?
- Código:
void Update () {
//Se a Boleana for verdadeira a esfera vai para os spots
if (sphere == true) {
Debug.Log ("Passou");
Vector3 alvo = spot[x].transform.position;
transform.position = Vector3.MoveTowards(transform.position,alvo,velocSphere*Time.deltaTime);
//Zera o x caso ele ultrapasse o array
if (x >= spot.Length) {
x = 0;
}
} else {
//diz ao navmeshagent para onde ir
navMesh.destination = SphereRed.transform.position;
}
Mas a esfera faz o percurso direto para o segundo spot, após isso ela retorna e vai para o quarto e depois ele apenas acompanha a esfera vermelha sem zerar o contador. Sabem me dizer onde estor errando?
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Bom dia! por gentileza, quando postar seus scripts, poste-os inteiros.
Abraço!
Abraço!
Re: Duvida sobre script
Tenta
If( x - 1 for maior que spot.length)...
If( x - 1 for maior que spot.length)...
Phph09- Profissional
- PONTOS : 3789
REPUTAÇÃO : 240
Idade : 19
Respeito as regras :
Re: Duvida sobre script
Achei que seria melhor postar só uma parte para não poluir, mas se não tiver problema eu posto inteiro.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
public class CombateBlue : MonoBehaviour {
private GameObject SphereRed;
private UnityEngine.AI.NavMeshAgent navMesh;
public Transform [] spot;
private int x;
private bool sphere;
public float velocSphere;
// Use this for initialization
void Start () {
//Localiza o alvo, seleciona-o para a variavel e instancia o navmeshagent
SphereRed = GameObject.FindGameObjectWithTag ("SphereRed");
navMesh = GetComponent<UnityEngine.AI.NavMeshAgent> ();
x = 0;
sphere = false;
}
void OnTriggerEnter(Collider outro){
//verifica se colidiu com a outra esfera e define o valor da boleana
if (outro.gameObject.tag == "SphereRed" ) {
Debug.Log("colidiram");
sphere = true;
x++;
} else {
Debug.Log ("Não era");
sphere = false;
}
}
// Update is called once per frame
void Update () {
//Se a Boleana for verdadeira a esfera vai para os spots
if (sphere == true) {
Debug.Log ("Passou");
Vector3 alvo = spot[x].transform.position;
transform.position = Vector3.MoveTowards(transform.position,alvo,velocSphere*Time.deltaTime);
//Zera o x caso ele ultrapasse o array
if (x >= spot.Length) {
x = 0;
}
} else {
//diz ao navmeshagent para onde ir
navMesh.destination = SphereRed.transform.position;
}
}
}
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Olá eu sou o Goku... pera, não errei.
Olá pessoal, eu analisei o código exaustivamente (fiquei quase 15 minutos sem tomar café) e descobri o erro na questão de zerar o contador para não ocorrer estouro, mas ainda não descobri o por quê de o incremento em "x" não seguir um padrão.
Resolvido este problema volto a pedir ajuda sobre o fato do incremento despadronizado.
Olá pessoal, eu analisei o código exaustivamente (fiquei quase 15 minutos sem tomar café) e descobri o erro na questão de zerar o contador para não ocorrer estouro, mas ainda não descobri o por quê de o incremento em "x" não seguir um padrão.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
public class CombateBlue : MonoBehaviour {
private GameObject SphereRed;
private UnityEngine.AI.NavMeshAgent navMesh;
public Transform [] spot;
private int x;
private bool sphere;
public float velocSphere;
// Use this for initialization
void Start () {
//Localiza o alvo, seleciona-o para a variavel e instancia o navmeshagent
SphereRed = GameObject.FindGameObjectWithTag ("SphereRed");
navMesh = GetComponent<UnityEngine.AI.NavMeshAgent> ();
sphere = false;
x = 0;
}
void OnTriggerEnter(Collider outro){
//verifica se colidiu com a outra esfera e define o valor da boleana
if (outro.gameObject.tag == "SphereRed" ) {
Debug.Log("colidiram");
sphere = true;
//Zera o x caso ele ultrapasse o array
if (x >= 5) {
Debug.Log ("Passou");
x = 0;
}
} else {
sphere = false;
Debug.Log ("Não era");
x++;
}
}
// Update is called once per frame
void Update () {
//Se a Boleana for verdadeira a esfera vai para os spots
if (sphere == false){
//Diz ao navmeshagent para onde ir
navMesh.destination = SphereRed.transform.position;
} else {
Vector3 alvo = spot[x].transform.position;
transform.position = Vector3.MoveTowards(transform.position,alvo,velocSphere*Time.deltaTime);
}
}
}
Resolvido este problema volto a pedir ajuda sobre o fato do incremento despadronizado.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Meu contador x deveria incrementar uma unidade por vez, assim ele seguiria o padrão que defini para o índice, mas toda vez que o trigger é acionado ele adiciona dois, três, um... sabe não descobri um padrão nessa soma estranha.
Detalhe: Onde eu defino um destino para as esferas eu alterei a ordem dos comentários mas não alterei a ordem dos comandos.
Detalhe: Onde eu defino um destino para as esferas eu alterei a ordem dos comentários mas não alterei a ordem dos comandos.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Fiz estas alterações no script, e apesar de o meu contador ter melhorado, ainda tenho problemas: As esferas se chocam perfeitamente num primeiro momento, mas depois elas ficam girando sem se encostarem, o contador não zera.
Como podem ver eu só adicionei uma variável de spot atual.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
public class CombateBlue : MonoBehaviour {
private GameObject SphereRed;
private UnityEngine.AI.NavMeshAgent navMesh;
public Transform [] spot;
private int x;
private int spotatual;
private bool sphere;
public float velocSphere;
// Use this for initialization
void Start () {
//Localiza o alvo, seleciona-o para a variavel e instancia o navmeshagent
SphereRed = GameObject.FindGameObjectWithTag ("SphereRed");
navMesh = GetComponent<UnityEngine.AI.NavMeshAgent> ();
sphere = false;
x = 0;
spotatual = 0;
}
void OnTriggerEnter(Collider outro){
//verifica se colidiu com a outra esfera e define o valor da boleana
if (outro.gameObject.tag == "SphereRed" ) {
Debug.Log("colidiram");
sphere = true;
//Zera o x caso ele ultrapasse o array
if (x >= 5) {
Debug.Log ("Passou");
x = 0;
spotatual = 0;
}
} else {
sphere = false;
Debug.Log ("Não era");
spotatual++;
}
}
// Update is called once per frame
void Update () {
//Se a Boleana for verdadeira a esfera vai para os spots
if (sphere == false){
//Diz ao navmeshagent para onde ir
navMesh.destination = SphereRed.transform.position;
x = spotatual;
} else {
Vector3 alvo = spot[x].transform.position;
transform.position = Vector3.MoveTowards(transform.position,alvo,velocSphere*Time.deltaTime);
}
}
}
Como podem ver eu só adicionei uma variável de spot atual.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
[RequireComponent(typeof(NavMeshAgent))]
public class CombateBlue : MonoBehaviour {
public Transform [] spot;
GameObject SphereRed;
NavMeshAgent navMesh;
int x, spotatual;
bool sphere;
void Start () {
SphereRed = GameObject.FindGameObjectWithTag ("SphereRed");
navMesh = GetComponent<NavMeshAgent> ();
sphere = false;
x = spotatual = 0;
}
void OnTriggerEnter(Collider outro){
if (outro.gameObject.tag == "SphereRed") {
if (sphere == false) {
Debug.Log ("colidiram");
sphere = true;
if (x >= 5) {
Debug.Log ("Passou");
x = 0;
spotatual = 0;
}
}
} else {
sphere = false;
Debug.Log ("Não era");
spotatual++;
}
}
void Update () {
if (sphere == false){
navMesh.destination = SphereRed.transform.position;
x = spotatual;
} else {
Vector3 alvo = spot[x].transform.position;
navMesh.destination = alvo;
}
}
}
Seria interessante você passar uma demo do projeto para que possamos entender como está montada a cena
Re: Duvida sobre script
Olá como eu disse antes sou um novato em criação de jogos, agradeceria se me explicassem como gerar um demo.
Agradeço pela ajuda que me estão prestando.
Agradeço pela ajuda que me estão prestando.
arnaldojunior- Membro
- PONTOS : 3052
REPUTAÇÃO : 2
Respeito as regras :
Re: Duvida sobre script
Bom dia! você quer então fazer uma compilação do game, para tal, vá em Project>Build Settings em Scenes in Build, coloque as cenas que quer na versão do seu jogo, selecione a plataforma, creio ser para PC mesmo, no caso se for windows, deixe Windows em "Target Platform", e em "Architecture" deixe "x86_64". Agora clique em Build e escolha um local para salvar o jogo e siga em frente. Mas sugiro pesquisar mais a respeito para aprender a configurar o "Player Settings", para incluir sua logo marca, detalhes do produto e outras configurações, dá uma pesquisada na net.arnaldojunior escreveu:Olá como eu disse antes sou um novato em criação de jogos, agradeceria se me explicassem como gerar um demo.
Agradeço pela ajuda que me estão prestando.
Abraço!
Tópicos semelhantes
» [DÚVIDA] Dúvida sobre script e rigidbody
» Duvida sobre um script de contagem 1, 2, 3, GO!.
» Dúvida sobre o script de Mover Objetos
» [Duvida] Duvida Com script de mover em direção ao mouse.
» Jogo de Maior ou Menor - Duvida sobre melhorias no script
» Duvida sobre um script de contagem 1, 2, 3, GO!.
» Dúvida sobre o script de Mover Objetos
» [Duvida] Duvida Com script de mover em direção ao mouse.
» Jogo de Maior ou Menor - Duvida sobre melhorias no script
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos