Noticias

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

Activar componentes de otros objetos

Iniciado por newuser, Septiembre 01, 2015, 01:17:20 AM

Tema anterior - Siguiente tema
Hola,soy nuevo en Unity3D y tengo una pequeña duda.¿Cómo podría activar componentes de otros objetos con scripts?Lo digo porque tengo un personaje en el cual quiero que al presionar click izquierdo ejecute una sola vez una animación y desactive un thirdperson controler.Basicamente y como aclaración estoy intentando hacer mi propio sistema de combate melee y esto es lo que me falta.¿Alguna idea,algún componente?Muchas Gracias

Septiembre 01, 2015, 01:45:04 AM #1 Ultima modificación: Septiembre 01, 2015, 01:46:14 AM por juanma_teso
Primero necesitas una referencia al componente que quieres activar/desactivar, si el componente está en otro objeto también necesitarás una referencia al objeto (Pero es complicarse) , para que se ejecute la animación puedes gestionarlo con un AnimatorController o por código.
CharacterControler controler;
Animator anim;

void Start () {
    controler = GetComponent <CharacterControler> (); //Esta es la referencia.
    anim = GetComponent <Animator> ();
}

void Update () {
    if(Input.GetMouseButton(0))
        controler.enabled = false; //Aqui la desactivas.
        //Según cómo gestiones las animaciones le das al play o activas un trigger
        anim.Play("nombreDeTuAnimacion");//Gestión por código
        anim.setTrigger("nombreDelTrigger");//Animator lo gestiona
}
Aquí te dejo para activar desactivar componentes y aquí el animator.

Septiembre 01, 2015, 12:59:12 PM #2 Ultima modificación: Septiembre 01, 2015, 03:13:02 PM por newuser
[quote author=juanma_teso date=1441064704" data-ipsquote="" data-cite="juanma_teso" class="ipsQuote">Primero necesitas una referencia al componente que quieres activar/desactivar, si el componente está en otro objeto también necesitarás una referencia al objeto (Pero es complicarse) , para que se ejecute la animación puedes gestionarlo con un AnimatorController o por código.
CharacterControler controler;Animator anim;

void Start () {
    controler = GetComponent <CharacterControler> (); //Esta es la referencia.
    anim = GetComponent <Animator> ();
}

void Update () {
    if(Input.GetMouseButton(0))
        controler.enabled = false; //Aqui la desactivas.
        //Según cómo gestiones las animaciones le das al play o activas un trigger
        anim. Play("nombreDeTuAnimacion");/ Gestión por código
        anim.setTrigger("nombreDelTrigger");//Animator lo gestiona
}
https://unity3d.com/es/learn/tutorials/modules/beginner/scripting/enabling-disabling-components">Aquí te dejo para activar desactivar componentes y http://docs.unity3d.com/es/current/ScriptReference/Animator.html">aquí el animator. [/quote]Hmm de acuerdo muchas gracias. .Play("Attack");
    
    }
    
    if(Input.GetKey(KeyCode.Mouse1))
    {
    
    animation.Play("SecondAttack");
    
    }
    } 

En la cuarta línea no va un "=" sino un ":".El error que te tira es que falta un semicolon al final ";" pero te lo dice en ingles. Cuando te salgan errores, fíjate en la línea que es y revísala -> (4,21) el primer número es la línea en el que te tira el error, el segundo la posición en esa línea.

Septiembre 03, 2015, 01:59:11 AM #4 Ultima modificación: Septiembre 03, 2015, 02:38:02 AM por Oak Human Flesh
[quote author=newuser" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="20227" data-ipsquote-contentcommentid="106552">Hmm de acuerdo muchas gracias. var mensaje : string;ahora lo que falta es asignarle un valor a esa variable:
    // imprime en la consola de unity Hola Worldlenses.
    print (mensaje);
    // asigna un valor nulo a la variable mensaje
    mensaje = null;
     // imprime en la consola de unity .
    print (mensaje);
    // asigna un valor vacio a la variable mensaje
    mensaje = "";// no es lo mismo que null
     // imprime en la consola de unity.
    print (mensaje);
   
}
/* los resultados son estos en la consola Unity
Hola Worldlenses
null
      aqui un item vacio
*/
luego ya podemos instanciar una variable llamada myAnimator de tipo Animator, luego asignarle el componente Animator a esa variable:
var myAnimator : Animator;

function Start ()
{
    myAnimator = GetComponent (Animator);
}
// solicita que el objeto portador de este script tenga el componente animator
@script RequireComponent(Animator)
ahora se puede asignar una variable de un tipo o clase que no este siendo accesible en el editor de código importando esa librería usando la palabre clave "import":
// hace acceisible los metodeos y clases asociadas a UnityStandardAssets.Characters.ThirdPerson
import UnityStandardAssets.Characters.ThirdPerson;
// creamos una variable de tipo/Clase ThirdPersonCharacter que se encuentra dentro del UnityStandardAssets.Characters.ThirdPerson
var tpcharacter : ThirdPersonCharacter;

function Start ()
{
    tpcharacter = GetComponent (ThirdPersonCharacter);
}
// aqui se ve como acceder a una clase que esta en otra libreria
// entonces al importar con la palabra clave import accedemos a esa libreria
// es como si esa libreria estuviera puesta en una carpeta de archivos diferente y nosotros
// al usar la palabra import abrieramos la carpeta y dejamos su contenido accesible.
// muchas librerias o plugins son archivos que deben ser puestos dentro de nuestra carpeta de assets de unity,
// alginas dentro de carpetas especificas como por ejemplo carpeta plugins y  otras librerias solo requieren
// estar dentro de nuestro proyecto, la myoria de las cosas que se requieren las trae el engine de unity.
el código anterior es lo mismo que este si no quisiéramos usar import:
var tpcontroller : UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter;

function Start ()
{
    tpcontroller = GetComponent (UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter);
}
en estos tres últimos casos se requiere que el componente este asignado al objeto que posea este script para completar el llenado de la variable, muchas veces arroja un error al querer acceder a dicho componente si no hacemos referencia a su ubicación primero.por ejemplo si esta en un gameobject llamado Tank que no porta este script podríamos escribir algo asi:
var tankObj : GameObject;
var tankAnimator : Animator;

function Start ()
{
       // primero se indica quien es tank
      tankObj = GameObject.Find("tank");// tank es un objeto de nuestra escena llamado "tank"
// ahora podemos acceder a los componentes de tank y almacenarlos en  tankAnimator
       tankAnimator = tankObj.GetComponent(Animator);
   
       print("Se encontro a: " + tankObj.name)
}
y por ultimo algo sencillo... también se pueden crear variables que no se indique de que tipo son, pero JavaScript cuando le asignas su valor las convierte a lo que se necesita por ej:
#pragma strict
var myAnimator : Animator;
    // la funcion Start llamada una vez( por única vez al comienzo), y antes de la Update

function Start (){
    var posicionTemporal = transform.position;
    var target = GameObject.Find("gato").transform.position;
    var heading = posicionTemporal - target;
    myAnimator = GetComponent("Animator");
    myAnimator.SetFloat(heading.x);
}
 

Bye Bye



Desde luego el día que tenga un problema acudiré a tí. Que explicaciones más magníficas.

[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="20227" data-ipsquote-contentcommentid="107108">Desde luego el día que tenga un problema acudiré a tí. Que explicaciones más magníficas.[/quote]jajajaja mi nivel es bueno pero me falta ;)

Bye Bye



La verdad es que sí!! Pedazo de posts 

[quote author=Oak Human Flesh date=1441238351" data-ipsquote="" data-cite="Oak Human Flesh" class="ipsQuote"> 

Como instanciar una variable en javascript, esa es la cuestión... antepones var, luego pones el nombre deseado para esa variable, luego puedes poner los dos puntos, seguido de el nombre del tipo de variable que va a ser ahi puedes meter float, integer, o un Vector3 o un nombre alusivo a algún componente una clase etc..., y al final pones el punto y coma para indicarle a la maquina que ha terminado esa línea de código.

luego este ejemplo crea una variable llamada mensaje:
var mensaje : string;
ahoralo que falta es asignarle un valor a esa variable:
// crea la variable mensaje tipo cadena (texto)var mensaje : String;

// la funcion Start llamada una vez( por única vez al comienzo), y antes de la Update
function Start ()
{
    // asigna el valor Hola Worldlenses a la variable mensaje.
    mensaje = "Hola Worldlenses";
    // imprime en la consola de unity Hola Worldlenses.
    print (mensaje);
    // asigna un valor nulo a la variable mensaje
    mensaje = null;
     // imprime en la consola de unity .
    print (mensaje);
    // asigna un valor vacio a la variable mensaje
    mensaje = "";// no es lo mismo que null
     // imprime en la consola de unity.
    print (mensaje);
   
}
/* los resultados son estos en la consola Unity
Hola Worldlenses
null
      aqui un item vacio
*/
luego ya podemos instanciar una variable llamada myAnimator de tipo Animator, luego asignarle el componente Animator a esa variable:
var myAnimator : Animator;

function Start ()
{
    myAnimator = GetComponent (Animator);
}
// solicita que el objeto portador de este script tenga el componente animator
@script RequireComponent(Animator)
ahora se puede asignar una variable de un tipo o clase que no este siendo accesible en el editor de código importando esa librería usando la palabre clave "import":
// hace acceisible los metodeos y clases asociadas a UnityStandardAssets.Characters.ThirdPerson
import UnityStandardAssets.Characters.ThirdPerson;
// creamos una variable de tipo/Clase ThirdPersonCharacter que se encuentra dentro del UnityStandardAssets.Characters.ThirdPerson
var tpcharacter : ThirdPersonCharacter;

function Start ()
{
    tpcharacter = GetComponent (ThirdPersonCharacter);
}
// aqui se ve como acceder a una clase que esta en otra libreria
// entonces al importar con la palabra clave import accedemos a esa libreria
// es como si esa libreria estuviera puesta en una carpeta de archivos diferente y nosotros
// al usar la palabra import abrieramos la carpeta y dejamos su contenido accesible.
// muchas librerias o plugins son archivos que deben ser puestos dentro de nuestra carpeta de assets de unity,
// alginas dentro de carpetas especificas como por ejemplo carpeta plugins y  otras librerias solo requieren
// estar dentro de nuestro proyecto, la myoria de las cosas que se requieren las trae el engine de unity.
el código anterior es lo mismo que este si no quisiéramos usar import:
var tpcontroller : UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter;

function Start ()
{
    tpcontroller = GetComponent (UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter);
}
en estos tres últimos casos se requiere que el componente este asignado al objeto que posea este script para completar el llenado de la variable, muchas veces arroja un error al querer acceder a dicho componente si no hacemos referencia a su ubicación primero.por ejemplo si esta en un gameobject llamado Tank que no porta este script podríamos escribir algo asi:
var tankObj : GameObject;
var tankAnimator : Animator;

function Start ()
{
       // primero se indica quien es tank
      tankObj = GameObject.Find("tank");// tank es un objeto de nuestra escena llamado "tank"
// ahora podemos acceder a los componentes de tank y almacenarlos en  tankAnimator
       tankAnimator = tankObj.GetComponent(Animator);
   
       print("Se encontro a: " + tankObj.name)
}
y por ultimo algo sencillo... también se pueden crear variables que no se indique de que tipo son, pero JavaScript cuando le asignas su valor las convierte a lo que se necesita por ej:
#pragma strict
var myAnimator : Animator;
    // la funcion Start llamada una vez( por única vez al comienzo), y antes de la Update

function Start (){
    var posicionTemporal = transform.position;
    var target = GameObject.Find("gato").transform.position;
    var heading = posicionTemporal - target;
    myAnimator = GetComponent("Animator");
    myAnimator.SetFloat(heading.x);
}
 [/quote]Woow muchas gracias,y por si quieres saberlo al final lo consegui!

Etiquetas: