PROBLEMA COM PREFAB
4 participantes
Página 1 de 1
PROBLEMA COM PREFAB
Meu inimigo funciona perfeitamente quando inicia direto na Hierachy mesmo sendo um prefab. Agora se tiro ele da Hierachy e tento instancia-lo via script até instancia, mas ocorre alguns bugs, como por exemplo quando o tiro acerta nele, a bala cai no chão, a particula de sangue não é instanciada, ele é empurrado pra traz quando o tiro acerta dentre outros.. E ao invez de instanciar 2 inimigos esta instanciando apenas 1... Como posso resolver alguem me ajuda?
Script para instanciar:
Script para instanciar:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnZombie : MonoBehaviour {
public Transform[] PontosdeSpawn;
public GameObject Zombie;
void Start () {
Spawn ();
}
void Spawn() {
int PontosSpawnIndex = Random.Range(0, PontosdeSpawn.Length);
Instantiate(Zombie, PontosdeSpawn[PontosSpawnIndex].position, PontosdeSpawn[PontosSpawnIndex].rotation);
}
}
Re: PROBLEMA COM PREFAB
Boa tarde cara! Ainda não fiz um sistema assim de spawn, mas dê uma olhada aqui: https://www.schultzgames.com/t224-spawn-de-inimigos-aleatorio?highlight=spwan+de+inimigos creio que possa te ajudar.Junim escreveu:Meu inimigo funciona perfeitamente quando inicia direto na Hierachy mesmo sendo um prefab. Agora se tiro ele da Hierachy e tento instancia-lo via script até instancia, mas ocorre alguns bugs, como por exemplo quando o tiro acerta nele, a bala cai no chão, a particula de sangue não é instanciada, ele é empurrado pra traz quando o tiro acerta dentre outros.. E ao invez de instanciar 2 inimigos esta instanciando apenas 1... Como posso resolver alguem me ajuda?
Script para instanciar:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnZombie : MonoBehaviour {
public Transform[] PontosdeSpawn;
public GameObject Zombie;
void Start () {
Spawn ();
}
void Spawn() {
int PontosSpawnIndex = Random.Range(0, PontosdeSpawn.Length);
Instantiate(Zombie, PontosdeSpawn[PontosSpawnIndex].position, PontosdeSpawn[PontosSpawnIndex].rotation);
}
}
Abraço!
Re: PROBLEMA COM PREFAB
Olha tentei desse metodo e ainda persiste o erro.. Mais posso tentar fazer de outra forma copiando o inimigo e colando na Hierarchy só que quando dou play e mato o primeiro inimigo na hora que vou pra matar o segundo (á copia) aparece este erro, como posso resolve-lo?
Re: PROBLEMA COM PREFAB
cara, acho que sei o que ta acontecendo, a cópia deve estar sem o componente animator, deve estar sendo instanciado sem os componentes necessários, dá um olha ai no inspector da cópia pra ver.Junim escreveu:Olha tentei desse metodo e ainda persiste o erro.. Mais posso tentar fazer de outra forma copiando o inimigo e colando na Hierarchy só que quando dou play e mato o primeiro inimigo na hora que vou pra matar o segundo (á copia) aparece este erro, como posso resolve-lo?
Abraço!
Re: PROBLEMA COM PREFAB
cara, na print ta com os dois selecionados, verifique apenas a cópia, pois ele não tem como mostrar o inspector dos dois juntos.Junim escreveu:
Olha ai cara ta tudo certo..
Abraço!
Re: PROBLEMA COM PREFAB
Os dois tem o animator ja conferi.. Mais acho que quando mato o primeiro inimigo e destruo o inimigo morto o animator é deletado.. ai o da copia nao funciona, mas nao sei resolver isso
Re: PROBLEMA COM PREFAB
pode ser mesmo, tive um problema parecido, meu player detecta direto uma tag de inimigo para mudar o estado de animação, então se eu mata-se todos eles, ocorria um erro, para tal, de uma forma simples, deixei um objeto vazio na cena com a mesma tag, sendo que esse objeto nunca é destruído, pois ele nem aparece no jogo. Vamos aguardar que daqui a pouco aparece alguém que tem uma ideia melhor de como resolver.Junim escreveu:Os dois tem o animator ja conferi.. Mais acho que quando mato o primeiro inimigo e destruo o inimigo morto o animator é deletado.. ai o da copia nao funciona, mas nao sei resolver isso
Abraço!
Re: PROBLEMA COM PREFAB
O Objeto que esta Instanciando o Prefab tem que Ser Prefab também
pq depois que vc Deleta o Prefab da Cena ele não vai ter nada Linkado (Ai a causa do Erro)
vc precisa criar um prefab do Objeto instanciador e linkar o Objeto Instanciado (Outro Prefab) dentro do Inspector mesmo
não sei se deu pra intender!
pq depois que vc Deleta o Prefab da Cena ele não vai ter nada Linkado (Ai a causa do Erro)
vc precisa criar um prefab do Objeto instanciador e linkar o Objeto Instanciado (Outro Prefab) dentro do Inspector mesmo
não sei se deu pra intender!
Re: PROBLEMA COM PREFAB
Só que tipo, mesmo assim não consigo destruir o inimigo pq o bug da bala persiste ele quando acerta o inimigo a bala bate no inimigo e cai no chao, como se o inimigo fosse blindado kks Aii nao tem como eu matar ele pra saberse funcionou ou nao..
Re: PROBLEMA COM PREFAB
Tente upar o projeto em algum diretório para que possamos ver... podem ser 1000 erros diferentes, todos relacionados a null ref quando instancia coisas.
Re: PROBLEMA COM PREFAB
Ta ai cara, se puder me ajudar tbm já com um outro problema, é que tipo nem toda vez que atiro eu acerto o zumbi, pode me explicar o pq isso acontece? sendo que o jogo é em 2D?
http://www.mediafire.com/file/9t9pr8efiqt11g8/Next-Project.rar
http://www.mediafire.com/file/9t9pr8efiqt11g8/Next-Project.rar
Re: PROBLEMA COM PREFAB
Acho que achei o erro...
primeiramente, faça o seu spawn assim:
Quanto ao problema, é MUITO simples... o erro está aqui:
Especificamente nesta parte:
Quando um objeto é instanciado, ele automaticamente ganha "(clone)" ao nome, então você não pode buscar o objeto pelo nome, tem que buscar pela tag, então basta trocar name por tag, ficando assim:
Isto já vai fazer funcionar... mas ai vão aparecer vários outros erros na sua lógica, como a parte dos animatores.
Cada animator deve ser privado e alocado nas void's Start, ou nas void's OnEnable. animator estático não rula n.
primeiramente, faça o seu spawn assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnZombie : MonoBehaviour {
public Transform[] PontosdeSpawn;
public GameObject Zombie;
public int numeroDeInimigos = 2;
void Start () {
Spawn (numeroDeInimigos);
}
void Spawn(int quantidade) {
for (int x = 0; x < quantidade; x++) {
int PontosSpawnIndex = Random.Range (0, PontosdeSpawn.Length);
Instantiate (Zombie, PontosdeSpawn [PontosSpawnIndex].position, PontosdeSpawn [PontosSpawnIndex].rotation);
}
}
}
Quanto ao problema, é MUITO simples... o erro está aqui:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour {
public float speed;
public ParticleSystem Part;
void Start () {
Part.Stop ();
}
// Update is called once per frame
void Update () {
GetComponent<Rigidbody>().velocity = (Vector3.right * speed * Time.deltaTime);
Destroy (gameObject, 3);
}
void OnCollisionEnter(Collision other){
if (other.gameObject.name == "Zumbie") {
ZombieController.ZombieHealth -= 25;
Part = Instantiate (Part, new Vector3(other.transform.position.x+0.3f, other.transform.position.y+0.3f,other.transform.position.z), Quaternion.identity);
Part.Play ();
Destroy (gameObject);
Destroy (Part,1);
if (ZombieController.ZombieHealth <= 25) {
ZombieController.AnimZombie.SetBool ("DieZ", true);
ZombieController.ZombieAtaca = false;
ZombieController.AnimZombie.SetBool ("IdleZ", false);
ZombieController.AnimZombie.SetBool ("WalkZ", false);
Destroy (other.gameObject,2f);
}
}
}
}
Especificamente nesta parte:
- Código:
if (other.gameObject.name == "Zumbie") {
Quando um objeto é instanciado, ele automaticamente ganha "(clone)" ao nome, então você não pode buscar o objeto pelo nome, tem que buscar pela tag, então basta trocar name por tag, ficando assim:
- Código:
if (other.gameObject.tag == "Zumbie") {
Isto já vai fazer funcionar... mas ai vão aparecer vários outros erros na sua lógica, como a parte dos animatores.
Cada animator deve ser privado e alocado nas void's Start, ou nas void's OnEnable. animator estático não rula n.
Re: PROBLEMA COM PREFAB
CARA MUITO OBRIGADO :D ! Você é foda, estou vendo mais um video seu por conhecidencia neste momento (Barra de HP) Sou seu fãn ! Pode me explicar como posso ta fazendo barra de hp encima da cabeça dos inimigos tbm?
Re: PROBLEMA COM PREFAB
Junim escreveu:CARA MUITO OBRIGADO :D ! Você é foda, estou vendo mais um video seu por conhecidencia neste momento (Barra de HP) Sou seu fãn ! Pode me explicar como posso ta fazendo barra de hp encima da cabeça dos inimigos tbm?
A UI da Unity tem a opção de World Space... se não me engano, no objeto Canvas mesmo... isto vai permitir que a barra fique em algum lugar do mundo.
Se quiser, também pode fazer com objetos, tipo, um Quad, mas ai já é diferente o esquema...
Re: PROBLEMA COM PREFAB
Entendi, mais a principio, ela iria funcionar igualmente a barra de hp do player? o script é o mesmo? Só tenho que configurar para seguir o inimigo e coloca-la em word space?
Re: PROBLEMA COM PREFAB
Entendi... Ultima duvida creio eu, Voce disse ali em cima que cada animator deve ser privado e alocados nas voids start. mas pelo o que vejo isto ja esta feito, olhe :
Re: PROBLEMA COM PREFAB
Ele só não ta privado, pq se coloco privado não consigo acessa-lo de outro script. E não sei se isso vai em causar algum problema, se for, como posso resolver?
Re: PROBLEMA COM PREFAB
Ajeitei 4 scripts da maneira correta... substitua pelos seus:
SpawnZombie
Bullet
Boss
ZombieController
SpawnZombie
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnZombie : MonoBehaviour {
public Transform[] PontosdeSpawn;
public GameObject Zombie;
public int numeroDeInimigos = 2;
void Start () {
Spawn (numeroDeInimigos);
}
void Spawn(int quantidade) {
for (int x = 0; x < quantidade; x++) {
int PontosSpawnIndex = Random.Range (0, PontosdeSpawn.Length);
Instantiate (Zombie, PontosdeSpawn [PontosSpawnIndex].position, PontosdeSpawn [PontosSpawnIndex].rotation);
}
}
}
Bullet
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class Bullet : MonoBehaviour {
public float speed;
public ParticleSystem Part;
Rigidbody rb;
void Start () {
Part.Stop ();
rb = GetComponent<Rigidbody> ();
}
void Update () {
rb.velocity = (Vector3.right* speed * Time.deltaTime);
Destroy (gameObject, 3);
}
void OnCollisionEnter(Collision other){
if (other.gameObject.tag == "Zumbie") {
ZombieController controller = other.gameObject.GetComponent<ZombieController> ();
controller.ZombieHealth -= 25;
Part = Instantiate (Part, new Vector3(other.transform.position.x+0.3f, other.transform.position.y+0.3f,other.transform.position.z), Quaternion.identity);
Part.Play ();
Destroy (gameObject);
Destroy (Part,1);
if (controller.ZombieHealth <= 25) {
controller.AnimZombie.SetBool ("DieZ", true);
controller.ZombieAtaca = false;
controller.AnimZombie.SetBool ("IdleZ", false);
controller.AnimZombie.SetBool ("WalkZ", false);
Destroy (other.gameObject,2f);
}
}
}
}
Boss
- Código:
using UnityEngine;
using System.Collections;
public class Boss : MonoBehaviour {
public GameObject targetPlayer;
public Transform transformOfPlayer;
public CharacterController charCon;
public Animation aiAnimation;
//Missle Spawn
public GameObject missle;
public GameObject mSpawn1;
public GameObject mSpawn2;
//Enemy Spawn
public GameObject LittleEnemy;
public GameObject EnemySpawn1;
public GameObject EnemySpawn2;
public int maxHealth;
public int currentHealth;
public int damageToPlayer;
public float clawRange;
public float shootingRange;
public float rotationSpeed;
public float maxIdleTime;
public float idleTimer;
public int aiStats;
public float playerDistance;
void Start (){
currentHealth = maxHealth;
targetPlayer = GameObject.FindGameObjectWithTag("Player");
transformOfPlayer = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update (){
Quaternion myRotation = Quaternion.LookRotation(transformOfPlayer.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation,myRotation,Time.deltaTime*rotationSpeed);
transform.eulerAngles = new Vector3 (0, transform.eulerAngles.z, 0);
idleTimer = idleTimer - Time.deltaTime;
playerDistance = Vector3.Distance(transform.position, transformOfPlayer.transform.position);
if(playerDistance <= clawRange)
{
aiStats = 0;
}
if(shootingRange >= playerDistance && playerDistance > clawRange)
{
aiStats = 1;
}
if(playerDistance > shootingRange)
{
aiStats = 2;
}
if(aiStats == 0 && idleTimer < 0)
{
aiAnimation.Play("bossAiClaw");
idleTimerReset();
}
if(aiStats == 1 && idleTimer < 0)
{
aiAnimation.Play("bossAiShooting");
idleTimerReset();
}
if(aiStats == 2 && idleTimer < 0)
{
aiAnimation.Play("bossAiSwarming");
idleTimerReset();
}
}
void idleTimerReset (){
idleTimer = Random.Range(0,maxIdleTime);
}
void PlayerToEnemyDamage ( int theDamage ){
currentHealth -= theDamage;
if(currentHealth <= 0)
{
currentHealth = 0;
aiStats = 4;
}
}
void EnemyAttack (){
if(playerDistance<clawRange)
{
targetPlayer.transform.SendMessage("EnemyToPlayerDamage",damageToPlayer,SendMessageOptions.DontRequireReceiver);
}
}
void missleAtk (){
Instantiate(missle,mSpawn1.transform.position,mSpawn1.transform.rotation);
Instantiate(missle,mSpawn2.transform.position,mSpawn2.transform.rotation);
}
void EnemySpawn (){
Instantiate(LittleEnemy,EnemySpawn1.transform.position,mSpawn1.transform.rotation);
Instantiate(LittleEnemy,EnemySpawn2.transform.position,mSpawn2.transform.rotation);
}
}
ZombieController
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ZombieController : MonoBehaviour {
public GameObject Zombie;
public float VelocidadeZ;
public bool ZombieAtaca;
public Transform Alvo;
public Animator AnimZombie;
public int ZombieHealth = 100;
public AudioSource ZombiSound;
void OnEnable() {
Alvo = GameObject.Find("Character").transform;
AnimZombie = GetComponent<Animator> ();
}
void FixedUpdate() {
if (ZombieAtaca == true) {
Zombie.GetComponent<Rigidbody>().velocity = (Vector3.left * VelocidadeZ);
AnimZombie.SetBool ("WalkZ", true);
AnimZombie.SetBool ("IdleZ", false);
}
if (ZombieAtaca == false) {
AnimZombie.SetBool ("WalkZ", false);
AnimZombie.SetBool ("IdleZ", true);
}
}
void OnTriggerEnter(Collider other) {
if(other.gameObject.tag == "AreaDeAtencao") {
ZombieAtaca = true;
ZombiSound.Play ();
}
}
void OnTriggerExit(Collider other) {
if(other.gameObject.tag == "AreaDeAtencao") {
ZombieAtaca = false;
ZombiSound.Stop ();
}
}
}
Re: PROBLEMA COM PREFAB
apenas atualize ele por hora... use aonde você ia usar anteriormente, heuehe.
Re: PROBLEMA COM PREFAB
Ah sim.. como em um gameobject vazio pra pegar a posição que o inimigo sera spawnado?
Re: PROBLEMA COM PREFAB
na verdade esse script do boss não precisa ser utilizado por hora... mas ele deve ser jogado no próprio boss quando você estiver fazendo essa parte.
Re: PROBLEMA COM PREFAB
Ah marcos.. Pode me ajudar com a ultima coisa, pq que nem toda vez que atiro minha bala acerta o inimigo? tem hora que ela passa do lado.. Pq isso ocorre?
Tópicos semelhantes
» Problema ao destruir Clone de um Prefab
» Ajuda com Prefab Urgente!!
» PREFAB(clone)
» Prefab De GUI fica com um X
» Ethan prefab
» Ajuda com Prefab Urgente!!
» PREFAB(clone)
» Prefab De GUI fica com um X
» Ethan prefab
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos