Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: newuser en Septiembre 01, 2015, 01:17:20 AM

Título: Activar componentes de otros objetos
Publicado por: newuser en Septiembre 01, 2015, 01:17:20 AM
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
Título: Activar componentes de otros objetos
Publicado por: juanma_teso en Septiembre 01, 2015, 01:45:04 AM
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í (https://unity3d.com/es/learn/tutorials/modules/beginner/scripting/enabling-disabling-components) te dejo para activar desactivar componentes y aquí (http://docs.unity3d.com/es/current/ScriptReference/Animator.html) el animator.
Título: Activar componentes de otros objetos
Publicado por: newuser en Septiembre 01, 2015, 12:59:12 PM
[quote author=juanma_teso date=1441064704" data-ipsquote="" data-cite="juanma_teso" class="ipsQuote">Primero necesitas una referencia al componente que quieres activar(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png)/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(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) () {
    if(Input.GetMouseButton(0))
        controler.enabled = false; //Aqui la desactivas.
        //Según cómo gestiones las animaciones le das al play(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) o activas un trigger
        anim. Play(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png)("nombreDeTuAnimacion");/ Gestión(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) por código
        anim.setTrigger("nombreDelTrigger");//Animator lo gestiona(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png)
}
Aquí te dejo para activar desactivar componentes y aquí el animator. [/quote]Hmm de acuerdo muchas gracias. .Play("Attack");
    
    }
    
    if(Input.GetKey(KeyCode.Mouse1))
    {
    
    animation.Play("SecondAttack");
    
    }
    } 
Título: Activar componentes de otros objetos
Publicado por: juanma_teso en Septiembre 01, 2015, 04:59:20 PM
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.
Título: Activar componentes de otros objetos
Publicado por: Oak Human Flesh en Septiembre 03, 2015, 01:59:11 AM
[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);
}
 
Título: Activar componentes de otros objetos
Publicado por: iRobb en Septiembre 03, 2015, 02:02:18 AM
Desde luego el día que tenga un problema acudiré a tí. Que explicaciones más magníficas.
Título: Activar componentes de otros objetos
Publicado por: Oak Human Flesh en Septiembre 03, 2015, 02:10:40 AM
[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 ;) Título: Activar componentes de otros objetos
Publicado por: juanma_teso en Septiembre 03, 2015, 10:13:47 PM
La verdad es que sí!! Pedazo de posts 
Título: Activar componentes de otros objetos
Publicado por: newuser en Septiembre 08, 2015, 03:47:43 PM
[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(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) ejemplo crea una variable llamada mensaje:
var mensaje : string;
ahora(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png)lo que falta es asignarle un valor a esa variable:
// crea la variable mensaje tipo(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) cadena (texto)var mensaje : String;

// la funcion Start llamada una vez( por única vez al comienzo), y antes de la Update(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png)
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(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) 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(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) siendo accesible(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) 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(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) en una carpeta de archivos diferente y nosotros
// al usar la palabra import abrieramos la carpeta y dejamos su contenido(http://cdncache3-a.akamaihd.net/items/it/img/arrow-10x10.png) 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!