Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Problema con script(de nuevo : v)

Iniciado por Biarox1166, Septiembre 06, 2016, 09:53:24 PM

Tema anterior - Siguiente tema
Septiembre 06, 2016, 09:53:24 PM Ultima modificación: Septiembre 16, 2016, 02:20:27 PM por pioj
Buenas a todos estoy nuevamente acá para que me ayuden con un problema que tengo con mi script el cual me estuvo rompiendo la cabeza desde hace días(y seguro es algo tonto jajaja pero soy noob) . El tema es este: hice una script para un enemigo, el problema es que cuando detecta al Player este realiza la animación correcta(de correr) pero nose por qué no se mueve, osea como que lo intenta pero algo lo tira hacia atras, y lo segundo es que cuando el Player está lo suficientemente cerca hice que mediante animation Events(en la animación de ataque) llame a la void TiempoAttack, y en efecto lo hace pero no se por qué no se cumple lo que pongo en dicha void(fijense en la imagen) estuve probando con el debug.Log y se cumple hasta la línea en la que digo que si el objeto con el que "choca" el Ray tiene el tag Player(no se si es que no se escribe así). Pero mi duda es que en otro proyecto más viejo utilicé lo mismo y me funcionó(pero puede ser que sea porque ese proyecto es de un Unity 5.0 o algo así) ahora estoy usando Unity.5.4.0 f3 . Gracias de antemano y saludos!!
 

using UnityEngine;
using System.Collections;
[RequireComponent(typeof(CharacterController))]
public class ControladorEnemigo : MonoBehaviour {
public Animator ani;
public CharacterController Char;
public Transform Player;
public float MinCercania, MaxCercania, velocidad, dano;
public bool ***guir;
// Use this for initialization
void Start () {

   Char = GetComponent<CharacterController>();
   ani = GetComponent<Animator>();
   ***guir = false;
}
// Update is called once per frame
void Update () {      
 
   float Distancia = Vector3.Distance(transform.position, Player.position);
   if(Distancia < MaxCercania){
      ***guir = true;
   }else{
      ***guir = false;
   }
   Vector3 rot = new Vector3(Player.position.x, transform.position.y, Player.position.z);
   Vector3 forward = transform.TransformDirection(Vector3.forward);
   if(***guir){
      transform.LookAt(rot);
      ani.SetBool("Detectado", true);
      ani.SetBool("AtaqueBase", false);
      Char.SimpleMove(forward * velocidad * Time.deltaTime);
      }else{
      ani.SetBool("Detectado", false);
   }
   if(Distancia <= MinCercania){
      ***guir = false;
      ani.SetBool("AtaqueBase", true);
   }
 
}
void TiempoAttack () {
   RaycastHit hit;
   if(Physics.Raycast(transform.position, transform.forward, out hit, 20)){
      if(ani.GetCurrentAnimatorStateInfo().IsName("AtaqueBase")){            //Si se estareproduciendo la animacion "AtaqueBase"
         if (hit.collider.tag == "Player"){                              //y el ray colisiona con el Player
            Debug.Log("holaaa");
            SaludyMana.Salud -= dano;                                           //se le quite X cantidad de vida   
         }
      }
   }
}
}                 

 
 
 

 

Cuando llamas la funcion de otro script, que seria 
 

SaludyMana.Salud -= dano;    

 
Tenes que llamarla con GetComponent<SaludyMana>();
 
porque ahi no haces referencia a nada, creo que es eso.

Podría ser.. pero igual el problema estoy seguro de que está en esta script ya que por más que no le quite vida al Player, en la consola me debería aparecer el"holaaa" del debug.log y no aparece, y me fijé los tags y están bien así que ya lo que se me ocurre es que algo esté mal escrito. @iRobb 
 
 

Cita de: Biarox1166 date=1473213660Podría ser.. pero igual el problema estoy seguro de que está en esta script ya que por más que no le quite vida al Player, en la consola me debería aparecer el"holaaa" del debug.log y no aparece, y me fijé los tags y están bien así que ya lo que se me ocurre es que algo esté mal escrito. @iRobb 
   
   
       
   


Aaah perdón, no entendí pensé que te aparecía el tag "holaaa", en ese sentido tendrías que ver que el script este puesto en un gameObject Vacio puesto en la cabeza del personaje ya que lo tiras con un forward (Adelante) entonces si se lo pones en cualquier lado no detectara nunca el collider. fijate de ultima debugea el raycast que lo que hace es mostrar un rayo en el juego, para saber hacia adonde apunta para asegurarte. si persiste el problema avísame y seguimos probando.

Has probado en poner un log justo antes del  "if (hit.collider.tag == "Player"){" del tipo Debug.Log(hit.collider.tag), para saber si llega el Tag que quieres o has probado en poner un breakpoint y depurar.

Septiembre 07, 2016, 10:33:23 AM #5 Ultima modificación: Septiembre 07, 2016, 12:13:14 PM por pioj
Empieza a meter Debug.Log dentro de todos los if a ver en cual es el que no entra,diria que es el GetCurrentAnimationState, esta basado en layers prueba asi a ver
 



   
      ani.GetCurrentAnimatorStateInfo(0).IsName("Base Layer.AtaqueBase")
   

[/quote]
 
 

Gracias a @NicolasProner, y la solución estaba en lo que dijo esr ya que(soy tan noob que no sabía como debuggear el tag del hit jeje) este "chocaba" con el suelo por lo que de ahí el error. Ahora lo quiero solucionar subiendo un poco arriba el origen del raycast pero no se cómo hacerlo ya que lo que quiero hacer es sumarle al vector que utilizo(transform.position) en el eje Y pero probé de varias formas y no se como lograrlo. O me recomiendan crear un GameObject a la altura que quiero, en el enemigo, y usar eso como origen?

Cita de: Biarox1166 date=1473724109Gracias a @NicolasProner, y la solución estaba en lo que dijo esr ya que(soy tan noob que no sabía como debuggear el tag del hit jeje) este "chocaba" con el suelo por lo que de ahí el error. Ahora lo quiero solucionar subiendo un poco arriba el origen del raycast pero no se cómo hacerlo ya que lo que quiero hacer es sumarle al vector que utilizo(transform.position) en el eje Y pero probé de varias formas y no se como lograrlo. O me recomiendan crear un GameObject a la altura que quiero, en el enemigo, y usar eso como origen?
   


Siempre lo que hago pera mejor control es hacer un gameObject vació para controlar mejor y mas cómodamente el raycast.

Para depurar los raycast te recomiendo que uses Debug.DrawRay o Debug.DrawLine, que te permiten ver mas o menos por donde va el rayo y son muy visuales.

Etiquetas: