Noticias

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

Manejar Input Manager desde Script

Iniciado por ftejada, Julio 29, 2015, 02:34:52 AM

Tema anterior - Siguiente tema
Hola chicos!!!¿De qué manera puedo acceder al InputManager desde un script para crear nuevos botones de input??? Es decir..... lo mismo que se puede hacer desde el inspector pero desde un Script... Saludos y gracias por adelantado.

Actualmente no se puede añadir ni quitar funcionalidad (es una feature propuesta en el Roadmap), pero sí que puedes acceder al manager para verificar y gestionar inputs.
http://www.plyoung.com/blog/mani***ting-input-manager-in-script.html

Esto era lo que andaba buscando....creo!!!! jajaja. Voy a verlo a fondo gracias por la ayuda

[quote author=pioj date=1438158913" data-ipsquote="" data-cite="pioj" class="ipsQuote">Actualmente no se puede añadir ni quitar funcionalidad (es una feature propuesta en el Roadmap), pero sí que puedes acceder al manager para verificar y gestionar inputs.
http://www.plyoung.com/blog/mani***ting-input-manager-in-script.html]http://www.plyoung.com/blog/mani***ting-input-manager-in-script.html[/quote]Hola de nuevo!!!! retomo este asunto de nuevo por la siguiente cuestión... Necesito cambiar la variable "Sensitivity" de un button del InputManager, ("llamemosle Horizontal"), desde un script en tiempo de ejecucion.... No se si se puede hacer, pero por lo que me respondió pioj creo que esto si se podia....Pero el enlace que me facilitó ya no existe y no se como puedo acceder a la variable Sensitivity de Horizontal del InputManager desde script.... ¿Alguien puede ayudarme? Saludos y gracias de nuevo

Enero 23, 2016, 09:44:44 PM #4 Ultima modificación: Enero 23, 2016, 09:47:30 PM por kaito
using UnityEngine;
using System.Collections;

public class Axis : MonoBehaviour {

public Axe customAxe;

public float value;

// Use this for initialization
void Start () {

   StartCoroutine(this.customAxe.Update());

}

// Update is called once per frame
void Update () {

   this.value = this.customAxe.Value;

}
}

[System.Serializable]
public class Axe{

public KeyCode NegativeButton;
public KeyCode PositiveButton;
public KeyCode AltNegativeButton;
public KeyCode AltPositiveButton;
public float Range = 1f;
public float smoothTimeUp = 1f;
public float smoothTimeDown = 1f;
public float Dead = 0.001f;
public float Value{ get; private set; }
private float velocity = 0f;

public IEnumerator Update(){

   while(Application.isPlaying){

      if(Input.GetKey(this.NegativeButton) || Input.GetKey(this.AltNegativeButton)){

         this.Value = Mathf.SmoothDamp(this.Value,-this.Range,ref this.velocity, this.smoothTimeUp);
         if(this.Value+this.Range < this.Dead) this.Value = -this.Range;

      } else if(Input.GetKey(this.PositiveButton) || Input.GetKey(this.AltPositiveButton)){

         this.Value = Mathf.SmoothDamp(this.Value,this.Range,ref this.velocity,this.smoothTimeUp);
         if(this.Range-this.Value < this.Dead) this.Value = this.Range;

      } else {

         this.Value = Mathf.SmoothDamp(this.Value,0f,ref this.velocity,this.smoothTimeDown);
         if(Mathf.Abs(this.Value) < this.Dead) this.Value = 0f;

      }

      yield return 0;

   }

}

}
 He creado una clase similar a la que utilizar Unity en el InputManager.En lugar de Sensitivity y Gravity, utilizo smoothTimeUp y smoothTimeDown para el incremento y disminucion de valor.También he incluido una variable Range, para establecer el intervalo y que no sea siempre uno.La variable Dead es el margen o distancia minima a los valores -Range, 0, Range.La clase se actualiza desde una corrutine, y para acceder a su valor consultamos la propiedad Value.

Enero 24, 2016, 09:54:34 AM #5 Ultima modificación: Enero 24, 2016, 10:16:47 AM por ftejada
[quote author=kaito date=1453581884" data-ipsquote="" data-cite="kaito" class="ipsQuote">
using UnityEngine;using System.Collections;

public class Axis : MonoBehaviour {

public Axe customAxe;

public float value;

// Use this for initialization
void Start () {

   StartCoroutine(this.customAxe.Update());

}

// Update is called once per frame
void Update () {

   this.value = this.customAxe.Value;

}
}

[System.Serializable]
public class Axe{

public KeyCode NegativeButton;
public KeyCode PositiveButton;
public KeyCode AltNegativeButton;
public KeyCode AltPositiveButton;
public float Range = 1f;
public float smoothTimeUp = 1f;
public float smoothTimeDown = 1f;
public float Dead = 0.001f;
public float Value{ get; private set; }
private float velocity = 0f;

public IEnumerator Update(){

   while(Application.isPlaying){

      if(Input.GetKey(this.NegativeButton) || Input.GetKey(this.AltNegativeButton)){

         this.Value = Mathf.SmoothDamp(this.Value,-this.Range,ref this.velocity, this.smoothTimeUp);
         if(this.Value+this.Range < this.Dead) this.Value = -this.Range;

      } else if(Input.GetKey(this.PositiveButton) || Input.GetKey(this.AltPositiveButton)){

         this.Value = Mathf.SmoothDamp(this.Value,this.Range,ref this.velocity,this.smoothTimeUp);
         if(this.Range-this.Value < this.Dead) this.Value = this.Range;

      } else {

         this.Value = Mathf.SmoothDamp(this.Value,0f,ref this.velocity,this.smoothTimeDown);
         if(Mathf.Abs(this.Value) < this.Dead) this.Value = 0f;

      }

      yield return 0;

   }

}

}
 He creado una clase similar a la que utilizar Unity en el InputManager.En lugar de Sensitivity y Gravity, utilizo smoothTimeUp y smoothTimeDown para el incremento y disminucion de valor.También he incluido una variable Range, para establecer el intervalo y que no sea siempre uno.La variable Dead es el margen o distancia minima a los valores -Range, 0, Range.La clase se actualiza desde una corrutine, y para acceder a su valor consultamos la propiedad Value.[/quote]De nuevo muchas gracias por la ayuda!!! Hay algunas cosas que no entiendo o no se.... ¿Porqué haces la variable ...
public Axe customAxe;
... publica?¿Las dos clases las creas dentro del mismo script??? y me imagino que dicho script va adjunto al player? Pero aun así no veo de donde obtienes los valores que suelta el InputManager de Unity...Veras! veo que las variables ...
public KeyCode NegativeButton;
public KeyCode PositiveButton;
public KeyCode AltNegativeButton;
public KeyCode AltPositiveButton;
son las que te lo proporcionan de algun modo, ¿pero como toman estas variables los datos... no deberia haber por algun sitio una cosa como esta?:PositiveButton = InputManager.Horizontal;     //o algo así??? jajaja perdona mi ignorancia! pero estoy algo liado...Veo que haces el Input.GetKey(this.PositiveButton) y demas.... pero PositiveButton, NegativeButton, etc, son variables que tu has creado y no se porque reciben actualizacion del Input....Podrías explicarmelo porfa?De nuevo, muchas gracias maquina!!! Saludos

Enero 26, 2016, 09:01:02 PM #6 Ultima modificación: Enero 26, 2016, 09:03:11 PM por kaito
¿Has probado el script, de verdad? O solo lo has leido.Axe es una clase serializada para poder ser modificada/definida desde el inspector de Unity.Es decir, que al crear customAxe como pública y serializada, aparece en el inspector para poder modificar sus valores.Por eso te pregunto si lo has probado. Porque si lo hubieras probado habrías visto la clase en el Inspector.Y utilizo Input.GetKey para comprobar si se ha pulsado en cada frame los botones asignados. Por eso se encuentra en una corrutina.

a ver yo creo que te estas complicando mucho,cual es la razon por la cual quieres modificar el inputManager?como en todo siempre hay mas de 1 solucion a un problema, entonces hay que encontrarlos  

Cita de: kaito date=1453838462" data-ipsquote="" data-cite="kaito" class="ipsQuote¿Has probado el script, de verdad? O solo lo has leido.Axe es una clase serializada para poder ser modificada/definida desde el inspector de Unity.Es decir, que al crear customAxe como pública y serializada, aparece en el inspector para poder modificar sus valores.Por eso te pregunto si lo has probado. Porque si lo hubieras probado habrías visto la clase en el Inspector.Y utilizo Input.GetKey para comprobar si se ha pulsado en cada frame los botones asignados. Por eso se encuentra en una corrutina.
Gracias por contestar de nuevo kaito. No he podido probarlo aun, solo lo he leido ya que, como te comenté en otro mensaje que me contestastes el otro día ( el de la pregunta del temblor de la camara), estoy fuera y llego mañana por la tarde noche. Hasta entonces no puedo probar ni esto ni lo del temblor de la camara que me dijiste... Por esto solo he podido leerlo sin probar nada, por lo que me surgieron las dudas que te expuse. Pero la verdad es que con la explicación que me has dado en este ultimo mensaje, creo que empiezo a comprender... de todos modos el Jueves comentaré algo a ver como me ha ido... De nuevo muchas gracias! un saludo.
[quote author=ACarranza date=1453843621" data-ipsquote="" data-cite="ACarranza" class="ipsQuote">a ver yo creo que te estas complicando mucho,cual es la razon por la cual quieres modificar el inputManager?como en todo siempre hay mas de 1 solucion a un problema, entonces hay que encontrarlos :)

Hola que tal!!Kaito he estado probando el script del input que me dejastes arriba pero ¿No se pueden asignar las palancas analogicas al input? He estado mirando y solo viene para asignarles Buttons al gamepad pero no las palancas....Es que si no puedo utilizar las palancas analogicas con este script, desgraciadamente no me sirve....  ¿O se me está pasando algo?? Saludos

Abril 04, 2016, 05:05:44 PM #10 Ultima modificación: Abril 04, 2016, 05:09:15 PM por ftejada
Hola a todos gente!Vuelvo a sacar este tema a la luz para aportar una solucion provisional mientras a los chicos de Unity, les da por dejarnos acceder a toda la interface que nos sale en el inspector del InputManager....La verdad es que he dejado aparcado bastante tiempo este asunto porque no se me ocurria nada para poder solucionar el problema que planteé y también porque he estado liado con otras cosas. Pero la solución era bastante sencilla y no se como no me di cuenta antes.El tema es que Unity nos proporciona una interface grafica desde el inspector para el InputManager... todos lo sabemos a estas alturas.//Obtenemos el input de las palancas analogicas
            float despInputEjeLocal_X_Global = Input.GetAxis("AnalogicStickHorizontal");
            float despInputEjeLocal_Z_Global = Input.GetAxis("AnalogicStickVertical");

            //Para el control de la cruceta del mando si no se pulsó la palanca analogica
            if(despInputEjeLocal_X_Global == 0 && despInputEjeLocal_Z_Global == 0)
            {
                despInputEjeLocal_X_Global = Input.GetAxis("CrucetaHorizontal");
                despInputEjeLocal_Z_Global = Input.GetAxis("CrucetaVertical");
            }

            //Para el control por el teclado si no se pulsaron ni palanca ni cruceta
            if(despInputEjeLocal_X_Global == 0 && despInputEjeLocal_Z_Global == 0)
            {
                despInputEjeLocal_X_Global = Input.GetAxis("Horizontal");
                despInputEjeLocal_Z_Global = Input.GetAxis("Vertical");
            }Como mi juego se maneja con teclado o con gamepad, tengo en cuenta si se pulsó cualquiera de las opciones de input para mi InGame. Si alguien tiene alguna duda que me lo diga. Espero que le sirva a alguien. Saludos    

Etiquetas: