Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: ramunda en Julio 21, 2015, 08:29:38 AM

Título: Animacioón recarga...
Publicado por: ramunda en Julio 21, 2015, 08:29:38 AM
Buenoooo, despues de la ayuda hace unas semanas he avanzado terriblemente bien en mi proyecto , gracias a todos de nuevo por las ayudas/ideas me fueron geniales. Pero...llego el parche using UnityEngine;
using System.Collections;
public class disparosyrecargos2 : MonoBehaviour {
public Rigidbody Bala;
public float Velocidad = 80;
public float municion = 10;
public Animation reload;
float municionderecargo = 10;
public float municiontotal = 200;
///public static float municiontotal = 150;
public disparosyrecargos2 MyScriptShoot;
public float Conteo = 0;
public GUIText guimuni;
public GUIText guitotal;
public GameObject destello;
//public GameObject manoanim;
public GameObject expulsabalas;
//GameObject municionanim;
//AudioClip sonido;
public AudioClip recarga;
public AudioClip gunShot;
public AudioClip vacio;
void Start (){

destello.active = false;
}

void Update (){

guimuni.text = "Balas " + municion.ToString();
guitotal.text = "Total Balas " + municiontotal.ToString();

    //if (Input.GetButton("Fire1")){
if(Input.GetMouseButtonDown(0)){   
        Conteo = Conteo + 1;
       
    if(Conteo > 1){
    
     Conteo = 0;
}   
    if(Conteo == 1 && municion > 0 && municiontotal >= 0){
          
        //var clona=Instantiate(Bala, transform.position, transform.rotation);
   //clona.velocity = transform.TransformDirection(Vector3(0, 0, Velocidad));
   Rigidbody clone;
   clone=Instantiate(Bala, transform.position, transform.rotation) as Rigidbody;
   clone.velocity = transform.TransformDirection(Vector3.forward * 400);
   municion -= 1;
         Destroy (clone,1.0f);
   GetComponent<AudioSource>().PlayOneShot(gunShot);
   //AudioSource.PlayClipAtPoint(gunShot, transform.position, 1);//AudioListener.volume = 0.2f;
}
}
if(Input.GetKeyDown("r") && municiontotal > 0 && !Input.GetMouseButton(0) && !Input.GetMouseButton(1)){
reload.Play("reload");
municion = 0;
    Invoke ("recargando",2);
    AudioSource.PlayClipAtPoint(recarga, transform.position, 1);
 
}

if(Input.GetMouseButtonDown(0)){
///AudioSource.PlayClipAtPoint(vacio, transform.position, 1);
destello.active = true;
}
else
if(Input.GetMouseButtonUp(0)){
//AudioSource.PlayClipAtPoint(vacio, transform.position, 1);
destello.active = false;
}   
if (municion <= 0){
if(Input.GetMouseButtonUp(0)){
expulsabalas.SetActive(false);
AudioSource.PlayClipAtPoint(vacio, transform.position, 1);
destello.active = false;
}   
}
}
void recargando (){

expulsabalas.SetActive(true);
if(municiontotal > 0){
municiontotal -= municionderecargo;
municion += municionderecargo;

}
if (municion > municionderecargo){
municion = municionderecargo;
}
}
Linea 7:public Animation reload; animación publica que me pide en el inspector que tengo en un gameobject , se la pongo.linea 55:reload.Play("reload"); le digo que me reproduzca despues de apretar al "r" la animación que tengo metidilla dentro de el gameobject que me lo reconoce como animación y se llama reload. por si las moscas y para descartar he puesto un animator....con esa animación tambien pero....ni errores ni animación. Ideas por favor? Gracias de antemanooooo
Título: Animacioón recarga...
Publicado por: H@pesend en Julio 21, 2015, 10:17:21 AM
Mare de deu de senyor.... vaya longaniza de script....
Título: Animacioón recarga...
Publicado por: ramunda en Julio 21, 2015, 01:21:57 PM
Er si.. hahahhaa pero ya sabes , lo conseguí a base de mil pruebas y 4000 fracasos.....pot fer res?, :() 
Título: Animacioón recarga...
Publicado por: cazagavilan en Julio 21, 2015, 01:31:06 PM
Hola!Falla la recarga de las balas en los digitos tambien o solo falla la animacion?Osea te hace el cambio de municion de (ejemplo): 0 a 100?Por ir descartando cosas xD
Título: Animacioón recarga...
Publicado por: ramunda en Julio 21, 2015, 01:42:31 PM
Nono la recarga la hace bien , se queda sin balas, y chasquea cundo no tiene y hasta que no aprietas la r no recarga ni dispara.Luego sigue disparado normalmente y descontando balas  Gracias !!   
Título: Animacioón recarga...
Publicado por: Antonio en Julio 21, 2015, 02:08:10 PM
Animator no, si lo que estás intentando activar es una animación en legacy con el componente animation, lo que tienes que usar es el propio componente animation, el animator sobraría ahí.

En Animation reload, ¿estas poniendo el propio componente "animation" que hay en el game object? es decir, si el componente está en el mismo objeto donde está este script, eso significa que tendrías que arrastras el propio objeto sobre su variable reload en el inspector. (Es que no entendí si estás haciendo eso o si estás arrastrando otro).

Como usas el sistema de animación legacy, ¿estás seguro de que el modelo usa ese sistema (elige el modelo en la ventana de assets del proyecto, en el inspector, la 2º pestaña llamada "Rig", mira que esté puesto en modo legacy, no Generic ni Humanoid.
Título: Animacioón recarga...
Publicado por: ramunda en Julio 21, 2015, 04:41:11 PM
Estimado @Adngel, gracias por responder y si, la animación esta en legacy, y el objeto con la animación lo arrastro en el ispector como dijistes. Aquí te dejo unas screens para que veas lo que digo y te agas la idea.  
 (//<fileStore.core_Attachment>/monthly_2015_07/reload.png.b88eaa353a3d8b9830d447b37e9082b0.png)
 (//<fileStore.core_Attachment>/monthly_2015_07/inspector.png.f308afd9483200fec3bd5bf132f48bbd.png)
 (//<fileStore.core_Attachment>/monthly_2015_07/animacion.png.69f2c7b164be4d1475a035570b0f519b.png)
Título: Animacioón recarga...
Publicado por: Antonio en Julio 21, 2015, 06:23:51 PM
El nombre de la animación es "Reload" en vez de "reload", ¿puede ser eso? 
 
reload.Play("Reload"); 
Título: Animacioón recarga...
Publicado por: ramunda en Julio 21, 2015, 06:32:00 PM
Acababa de verlo, porque me tiro un fallo en el script, lo cambie para probar cosas ya esta puesto bien el nombre y.... sin cambios , no hace nada...ni errores ni nada pero la animación no se ejecuta (
Título: Animacioón recarga...
Publicado por: Antonio en Julio 21, 2015, 06:56:18 PM
Hola Ramunda, he probado el script, reduciendo las cosas que no tengo pero dejando sólo la animación, y me funciona correctamente.
  
using UnityEngine;
using System.Collections;
public class disparosyrecargos2 : MonoBehaviour {
public Rigidbody Bala;
public float Velocidad = 80;
public float municion = 10;
public Animation reload;
float municionderecargo = 10;
public float municiontotal = 200;
///public static float municiontotal = 150;
public disparosyrecargos2 MyScriptShoot;
public float Conteo = 0;
public GUIText guimuni;
public GUIText guitotal;
public GameObject destello;
//public GameObject manoanim;
public GameObject expulsabalas;
//GameObject municionanim;
//AudioClip sonido;
public AudioClip recarga;
public AudioClip gunShot;
public AudioClip vacio;
void Start (){
   
   //destello.active = false;
}

void Update (){
   
   /*guimuni.text = "Balas " + municion.ToString();
   guitotal.text = "Total Balas " + municiontotal.ToString();*/
   
   //if (Input.GetButton("Fire1")){
   /*if(Input.GetMouseButtonDown(0)){   
      Conteo = Conteo + 1;
      
      if(Conteo > 1){
         
         Conteo = 0;
      }   
      if(Conteo == 1 && municion > 0 && municiontotal >= 0){
         
         //var clona=Instantiate(Bala, transform.position, transform.rotation);
         //clona.velocity = transform.TransformDirection(Vector3(0, 0, Velocidad));
         Rigidbody clone;
         clone=Instantiate(Bala, transform.position, transform.rotation) as Rigidbody;
         clone.velocity = transform.TransformDirection(Vector3.forward * 400);
         municion -= 1;
         Destroy (clone,1.0f);
         GetComponent<AudioSource>().PlayOneShot(gunShot);
         //AudioSource.PlayClipAtPoint(gunShot, transform.position, 1);//AudioListener.volume = 0.2f;
      }
   }*/
   if(Input.GetKeyDown("r") && municiontotal > 0 && !Input.GetMouseButton(0) && !Input.GetMouseButton(1)){
      reload.Play("Reload");
      //municion = 0;
      Invoke ("recargando",2);
      //AudioSource.PlayClipAtPoint(recarga, transform.position, 1);
      
   }
   
   /*if(Input.GetMouseButtonDown(0)){
      ///AudioSource.PlayClipAtPoint(vacio, transform.position, 1);
      destello.active = true;
   }
   else
   if(Input.GetMouseButtonUp(0)){
      //AudioSource.PlayClipAtPoint(vacio, transform.position, 1);
      destello.active = false;
   }   
   if (municion <= 0){
      if(Input.GetMouseButtonUp(0)){
         expulsabalas.SetActive(false);
         AudioSource.PlayClipAtPoint(vacio, transform.position, 1);
         destello.active = false;
      }   
   }*/
}
void recargando (){
   
   /*expulsabalas.SetActive(true);
   if(municiontotal > 0){
      municiontotal -= municionderecargo;
      municion += municionderecargo;
      
   }
   if (municion > municionderecargo){
      municion = municionderecargo;
   }*/
}
}
[/quote]¿Puede ser un problema de la animación en si?, se me ocurre in tentar probarla en otro objeto a ver qué le puede pasar.
Título: Animacioón recarga...
Publicado por: ramunda en Julio 21, 2015, 07:28:07 PM
Adngel, gracias de nuevo por el interes, he provado lo que me has dicho , he puesto la animación Reload en un objeto vacio nuevo......la he arrastrado a su casilla y nada sigue igual sin dar fallo pero sin ejecutarse. Con que animación has provado tu?, esque estoy por tirarme a un pozo :), y has usado dices mi mismo script?, no lo entiendo.... Aver explicare mas detalles...este script el que tu tienes y yo he puesto, esta metido en Bocaarma que es el cubo de donde sale todo las balas el diaparo etc....mi jugador tiene unas manos puestas con su pistolita su recoil y tal. Y este dichoso anim que no funciona XDD espero que tengas mas ideas....o si no te es molestia súbeme una animación que te funcione aver si ami tambien me resulta esque no se que hacer  
te dejo el link de donde pille el arma y las animaciones el script no lo use.He probado con otra animación....no funciona igualmente pero veo que el puntero de el mouse parpadea como si algo pasara y yo n lo viera...no tendra que ver que le tenemos que dar unos segundos o algo asi??En fil el packhttps://mega.nz/#!1EkhgThJ!3jA_HjJAHPSwQsQPSVyLCaHQTMBgy9ayJxgJpKhXOEU    
Título: Animacioón recarga...
Publicado por: Antonio en Julio 21, 2015, 07:44:41 PM
La animación que he usado, pues es una que he hecho sin pensar mucho con el animador de Unity (Ctrl+6) ahí creé una animación llamada Recargar, y roté algunos huesos de mi personaje para reconocerla.

Después, esa animación, la puse dentro del componente animation, y el componente animation, dentro de la variable Reload de tu script. (Como se ve en tu captura). Pensando, a ver si lo que necesitas es ponerle el componente Animation a tu objeto "Arms" que es el modelo que se anima, y de ahí, pasarlo a la variable Reload del script del objeto bocarama. O.ò

Si no, intenta eso, crear una animación para el objeto Arms en el Ctrl+6 o en 3ds max o donde ves más cómodo (algo rápido, estirar un brazo o cualquier cosa). A ver si es que es problema de la animación en sí.

Si es Legacy, necesito saber los nombres y jerarquía de los huesos de tu objeto Arms para poder hacer una animación que sirva en él.

 
Título: Animacioón recarga...
Publicado por: ramunda en Julio 21, 2015, 08:21:21 PM
Aver he echo una cosa ...he cojido el arma y los brazos que estan juntos y he creado una animación ctrl+6 , muy basica arriba y abajo ok? La cosa esque me ha creado un controller y la animación bien, esto es nuevo   si arrastro la animación a el inspector me crea un animator que lleva la animación que he creado.....Pero esto no puedo arrastrarlo a ninguna parte....Vale, algo he hecho no lo que queria..pero algo , he puesto la animación en un Animator, he arrastrado el controller a el inspector...y bueno cuando coje el arma se ejecuta seguidamente la animación que he grabado...pero solo hace eso anula todo y solo se mueve arriba y abajo XD Vale i si lo enfocamos de otra manera....como seria para llamar a una animación en c#? GetComponent<animator>(); algo asi??? Siguiendo tus pasos:He creado animación , la he puesto en legacy, tengo la animación que se llama ahora : armamueve y el animator o controller o como se diga que se llama:. bocaarma ,meta donde lo meta no anima. mando foto!!y....he puesto la animación dentro de un empty y la he cargado en el inspector.....y nanay de la china       
 (//<fileStore.core_Attachment>/monthly_2015_07/armamueve.png.3c5fc178383a28cce38ecafa1489defb.png)
 (//<fileStore.core_Attachment>/monthly_2015_07/legazy.png.82d5bc7a5d5e933da1543d04e3b95714.png)
Título: Animacioón recarga...
Publicado por: Antonio en Julio 21, 2015, 09:28:32 PM
Unity tiene 2 sistemas de animaciones (bueno, 3, pero sin mucho lio) Mecanim y Legacy.

Legacy es el original, se controla mayormente mediante scripts y para utilizarlo, necesitas el componente "Animation".

Mecanim es el nuevo sistema que incorporaron con Unity 4, es al que le dan soporte ahora y tiene varias cosas que lo hacen interesante, aunque se controla mayormente mendiante gráficos y modificación de varialbes, para ello, se usa el componente "Animator".

Son dos compenente diferentes para dos sistemas diferentes, no deberían tener que mezclarse.

Al crear una animación en un objeto (Ctrl+6), cuando no tienen ninguna, Unity automáticamente le crea un pequeño sistema para que la animación se pueda autoejecutar al pulsar play, en un juego esto lo quitarías y lo adaptarías para tu código, pero bueno a lo mejor para testear la animación o una flyby camera, pues viene bien. Ahora. la cosa es que ese sistema que crea, lo hace en base al sistema de animación del objeto. Si el objeto está en Legacy, unity automáticamente debería haber añadido un Animation y haber organizado las cosas por ahí, el hecho de que le ponga un Animator y le cree un controller para ejecutar la animación, es una pista de que algo no esta bien con ese objeto. XD
(Si es un objeto de mecanim, por muchas instrucciones de animation que le mandemos, no se moverá).


A ver, para animar algo en Legacy, lo básico sería:
 
using UnityEngine;

public class animationTest : MonoBehaviour
{
public Animation anim;

void Start ()
    {
        anim = GetComponent<Animation>();
    }

void Update ()
{
   if(Input.GetKeyDown("r"))
   {
      anim.Play("Reload");
   }
}
}
Esto se pondría en un gameobject cuyos hijos sean, mesh renderers, y huesos. El objeto también tiene que tener el componente Animation, y dicho compenente, tiene que tener la animación a ejecutar, en la lista, (no hace falta que esté en ejecutar automáticamente, sólo tiene que estar en la lista). La animación que se le aplica, al ser de Legacy, tiene que se una animación de ese objeto (una que tenga una jerarquía de huesos similar y con los mismos nombres). Pero el modelo, en la pestaña rig tiene que ser Legacy. 



 
Título: Animacioón recarga...
Publicado por: ramunda en Julio 21, 2015, 10:12:42 PM
Vale, he simplificado y leido atentamente lo que me has dicho.He cojido la pistola, le he creado una animación.....pero la pistola no es legacy ni es nada XDDD es un objeto sin mas el cual le he creado una animación y ...se ha vuelto a crear una animación y un Mecanim de esos qu ecomentas, si cojo la animación a solas la convierto en legacy.....bastara?, le pondre el animation....la pondre dentro...AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA FUNCIONA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!TIO!!! TE QUIEROOOO has tenido la paciencia , las ganas y el aguante!!!, y te has explicado como una enciclopedia!!! y la cosa ahora funciona!!!1 Espera repasemos hahahhah que demonios he echo ... aver docuemntare para posibles vistas de este milagro... He creado una animación desde 0 de el arma...que a la vez lleva los brazos pegados.Al terminarla me ha creado 2 archivos:un mecanim y una animación.A la animación la he convertido en Legacy:Como lo he echo:seleccionas la animación en si, vas arriba derecha de el inspector alli hay un canadadito y unas rayitas, pues las rayitas cambias el estado de Normal a Debug,Se despliegan opciones y alli un cuadrito que pone "Legazy" lo seleccionas lo pones en normal de nuevo y yata.Seguidamente, he puesto un Animator a la pistola, la cual hemos creado la animacion....y dentro de el la animación    A    
Título: Animacioón recarga...
Publicado por: ramunda en Julio 21, 2015, 11:34:34 PM
Y...ya que estamos en materia :), para crear una animacion que cuando camine se le bajen los brazos y tal...seria el mismo procedimiento pero ...donde decirle que cuando aprietas la W o el arrow UP active esa animación?,o simplemente creo un script se lo añado al objeto anterior y listo? tipo tu ejemplo: 
using UnityEngine;

public class animationTest : MonoBehaviour
{
public Animation anim;

void Start ()
    {
        anim = GetComponent<Animation>();
    }

void Update ()
{
   if(Input.GetKeyDown("w"))
   {
      anim.Play("caminar");
   }
}
}
 por ejemplo?bien ya lo he echo pero me dice que ya hay un animator aqui y que no puedo meter otro , he puesto la segunda animación en el element 1, de el mismo animator pero dice que no la encuentra....hay que decirle que esta en el element 1?Lo he puesto asi:
using UnityEngine;
using System.Collections;

public class caminaarma : MonoBehaviour {

    public Animation caminar;
   
    void Start ()
    {
        caminar = GetComponent<Animation>();
    }
   
    void Update ()
    {
        if(Input.GetKeyDown("w"))
        {
            caminar.Play("caminaarma");
        }
    }
}
He arrastrado el objeto..igual que antes solo que ahora este objeto lleva 2 animaciónes la de recarga y la de caminar .....ideas? using UnityEngine;
using System.Collections;

public class caminaarma : MonoBehaviour {

public Animation caminar;

void Start ()
{
   caminar = GetComponent<Animation>();
}

void Update ()
{
   if(Input.GetKey("up"))
   {
      caminar.Play("caminararma");
   }
}
}Vale, mas escuela para os que aprenden como yo Ahora viene la chunga....todo funciona, pero solo reproduce la animación cuando le doy la primera vez a la tecla "UP" y se para , le he puesto un loop mode en la propia animación pero no para de moverse...en Once la hace una vez....alguna teoria maestro?Me autocorrijo:Si se pone en Once va perfecto se mueve al pulsar y se para al soltar!! Jur peazo tutorial estamos liando!!!           
Título: Animacioón recarga...
Publicado por: Antonio en Julio 22, 2015, 12:20:54 AM
Yo sigo algo liado XD, si los brazos te han creado la animación en mecanim (con el animator y el controller) es que tiene que estar configurado para tal. Pero bueno, también se puede animar en Mecanim (que al fin y al cabo para eso existe).

Ese gráfico que muestras ahí, es el esquema por el que se basará tus animaciones, lo suyo es que añadieras varios estados (cada estado es una animación), por ejemplo, los brazos estirados cuando están quietos, moviéndose arriba y abajo cuando están andando, disparando y recargando (y cuantas más quieras, pero para hacernos una idea).

Lo siguiente sería crear propiedades para manejar esas animaciones, en la ventana del controller del animator (la del gráfico) Hay un apartado llamado Parameters, que sirve para crear esas propiedades, puedes crear por ejemplo, una de tipo float que se llame speed, y con ella, creas una conexión entre la animación de estar quieto, y la de andar, diciéndole que si speed es mayor que... 0.1, se activa la animación de andar, en caso contrario, pues vuelve a la de estar quieto. Así con las otras animaciones (un parámetro trigger llamado "disparar", si está activado, que pase a la animación de disparar, otro trigger llamado reload, para la animación de recargar.

Una vez hecho eso, falta decir, esos parámetros, ¿quien los controla? pues para ello hay que crear el código que actualice esos parámetros con las variables de tu código. Algo como:

 
using UnityEngine;


public class Player_Manager : MonoBehaviour
{

     Animator m_Animator;

     float Velocidad;
     
     void Start ()
     {
          m_Animator = GetComponent<Animator>();
     }

     void Update ()
     {
          Velocidad = 10 * Time.deltaTime * Input.GetAxis("Vertical");      
          m_Animator.SetFloat("Speed", Velocidad, 0.1f, Time.deltaTime); //El 0.1f es el tiempo que tarda en cambiar entre un valor y otro.

          if (Input.GetKeyDown ("r")
          {
              m_Animator.SetTrigger("Reloading");
          }

          if (Input.GetButtonDown ("Fire")
          {
              m_Animator.SetTrigger("Shooting");
          }
    }
}

 
[quote author=ramunda" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15754" data-ipsquote-contentcommentid="100557">Ahora viene la chunga....todo funciona, pero solo reproduce la animación cuando le doy la primera vez a la tecla "UP" y se para , le he puesto un loop mode en la propia animación pero no para de moverse...en Once la hace una vez....alguna teoria maestro?Me autocorrijo:Si se pone en Once va perfecto se mueve al pulsar y se para al soltar!! Jur peazo tutorial estamos liando!!! [/quote]

Título: Animacioón recarga...
Publicado por: ramunda en Julio 22, 2015, 12:32:24 AM

Esto se complica hahhaha eres un Mostruo @Adngel (en el buen sentido claro),  lo de los brazos te lo explico facil.Lo brazos estan ligados a la pistola osea pistola y brazos una pieza.Al crear la animación si, me ha creado un controller pero también me ha creado la animación normal asi que, he añadido el componente Animation al objeto que tiene la animación(pistola/brazos), le he arrastrado la animación (la buena), y ya esta y en el inspector donde cree la public le meto el objeto de el arma/brazos que es la que he creado la anim....y funciona.Y lo del mecanim lo dejo por ai por si algun dia. XDDD. Pero esto que me has puesto es muyyy interesante pero como tengo la cabeza como una holla a presion...lo dejo para mañana :),De momento ya tenemos 2 animaciones funcionando , la de recargar y la de caminar.Y lo mejor es que las he echo sobre el mismo objeto (Pistola/brazos), así se añade la segunda automaticamente en el Animator....solo he tenido que crear ese pequeño script...poner el nombre correcto...arrastrar de nuevo el gameobject en su agujero....y yata!! LOL...lo que he sudado hahhaha En fin lo dicho, mañana seguire dando guerra!!!!!!, muchas gracias y buenas noches!!