Page 1 sur 1

[DB-AL] Faire changer la forme d'un cube selon si la touche du clavier est enfoncée ou non

Publié : 08 Août 2020 12:26
par simiji
Bonjour à tous :D

J'ai besoin d'aide :/ je galère tellement, le code ça n'a jamais été ma tasse de thé donc je m'excuse d'avance pour la simplicité du problème, pour moi c'est la mer à boire mais pour vous ça sera surement un jeu d'enfant.

J'essaye de faire en sorte qu'un cube change de forme lorsqu'on appuie sur une touche du clavier. Je veux l’agrandir quand la touche est enfoncé et le faire revenir à sa forme initial lorsque qu'on relâche la touche.

ça me semblait facile ahah mais non, ça va faire plusieurs heures que je tourne en rond :/

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SmoothAnimation : MonoBehaviour
{
    float speed = 5f;    
    KeyCode KeySelected;

    void OnGUI()
    {
            KeySelected = Event.current.keyCode;
    }

    void Update ()
    {
       
        if (Input.GetKeyDown(KeySelected))
        {            
            StartCoroutine(ScaleDown());
        }
        if (Input.GetKeyUp(KeySelected))
        {            
            StartCoroutine(ScaleUp());
        }
    }

    IEnumerator ScaleDown()
    {
        while(Input.GetKeyDown(KeySelected))
        {
            Debug.Log("Down "+KeySelected);
            GameObject CubeSelected = GameObject.FindGameObjectWithTag("Key"+KeySelected);                     
            CubeSelected.gameObject.transform.localScale += new Vector3(0, 10, 0)* (Time.deltaTime * speed);                 
            yield return null;
        }
    }

    IEnumerator ScaleUp()
    {
        while(Input.GetKeyUp(KeySelected))
        {
            Debug.Log("Up "+KeySelected);
            GameObject CubeSelected = GameObject.FindGameObjectWithTag("Key"+KeySelected);                     
            CubeSelected.gameObject.transform.localScale += new Vector3(0, 1, 0)* (Time.deltaTime * speed);                 
            yield return null;
        }
    }
}

Re: [DB-AL] Faire changer la forme d'un cube selon si la touche du clavier est enfoncée ou non

Publié : 08 Août 2020 15:10
par jmhoubre
Bonjour,
voici un petit script qui devrait pouvoir t'aider, même si je n'ai pas reproduit exactement le comportement que tu décris.
Le script est attaché au cube que tu veux modifier.

Code : Tout sélectionner

using System.Collections;

using UnityEngine;

public class CubeScaling : MonoBehaviour {
    // SerializeField pour voir scale dans l'inspecteur
    [SerializeField] private float scale = 1f;
    private IEnumerator myCoroutine;

    private void Start () {
        myCoroutine = Scale ();
        StartCoroutine (myCoroutine);
    }
	
    private void Update () {
	// éventuellement, clamper scale après les if.
        if (Input.GetKeyDown (KeyCode.A)) {
            scale *= 1.01f;
        }
        if (Input.GetKeyUp (KeyCode.E)) {
            scale /= 1.01f;            
        }
    }

    IEnumerator Scale () {
        while (true) {
            transform.localScale *= scale;
            yield return new WaitForSeconds(0.1f);
        }
    }
}
Je ne suis pas un pro des coroutines, mais je pense que dans ton update, à chaque appui de touche, tu en lances une nouvelle, toutes s'exécutant. Si tu tiens absolument à les lancer dans l'update, tu devrais avant d'en lancer une autre, vérifier si une coroutine est en cours et l'annuler.

Re: [DB-AL] Faire changer la forme d'un cube selon si la touche du clavier est enfoncée ou non

Publié : 12 Août 2020 15:34
par simiji
En premier lieu, merci pour ta réponse. :cote:

J'ai pu le tester et ton code fonctionne super bien :D

Cependant, ça m'embête de dire ça mais, il ne correspondait pas totalement à ce que je cherchais et je l'ai pas mal modifié... je suis désolé, ce n'est pas très cool de ma part surtout que maintenant je suis partie sur autre chose... :gene:

J'ai réussi a obtenir quelques chose qui fonctionne plus ou moins même si le résultat reste encore approximatif.

J'aimerais te demander un dernier avis si cela te va ? Pour une raison que j'ignore, malgré que le code soit dans Update, il ne se lance qu'une seul fois. Si je re-appuie sur une touche, rien ne se passe. Aurais-tu une idée ?

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class SmoothAnimation : MonoBehaviour {

    KeyCode KeySelected;
    [Range(0.1f, 1f)]
    public float scaleSpeed = 1f; 

    void OnGUI()
    {
            KeySelected = Event.current.keyCode;
    }

    private void Update () {
        Debug.Log("Ok update");

        if (Input.GetKeyDown(KeySelected)) 
        {
            Debug.Log("Ok key down");
            Color color = new Color(Random.Range(0f, 1f),Random.Range(0f, 1f),Random.Range(0f, 1f));          
            GameObject[] objects = GameObject.FindGameObjectsWithTag("Key"+KeySelected);             
            foreach (GameObject go in objects) 
            {
                MeshRenderer[] renderers = go.GetComponentsInChildren<MeshRenderer>();
                foreach (MeshRenderer r in renderers) 
                {
                    foreach (Material m in r.materials) 
                    {
                        if (m.HasProperty("_Color"))
                        m.color = color;
                    }
                }
            }
            StartCoroutine(scaleKey());           
        }
    }

    IEnumerator scaleKey()
    { 
            GameObject CubeSelected = GameObject.FindGameObjectWithTag("Key"+KeySelected); 
            CubeSelected.gameObject.transform.localScale = new Vector3 (transform.localScale.x +0.1f, transform.localScale.y +2.0f * scaleSpeed, 0.5f); 
            yield return new WaitForSeconds(1);
            CubeSelected.gameObject.transform.localScale = new Vector3 (0.5f, 0.5f,0.5f);
            yield return null;          
    }
}
Encore une fois, merci pour tout ton aide :cote:

Re: [DB-AL] Faire changer la forme d'un cube selon si la touche du clavier est enfoncée ou non

Publié : 12 Août 2020 21:53
par jmhoubre
Bonsoir,

j'ai essayé ton code chez moi, il fonctionne, et plusieurs fois. Toutefois seul un petit nombre de touches réagissent, comme les touches de fonction F1 .. F12, fléchées, Ins, Suppr, ... Je n'ai pas trop approfondi la logique de Event.current. Je ne sais pas pourquoi il ne fonctionne qu'une fois chez toi.

Re: [DB-AL] Faire changer la forme d'un cube selon si la touche du clavier est enfoncée ou non

Publié : 13 Août 2020 12:00
par simiji
aha... plus rien ne marche maintenant x)

Je suis perdu :pleur4: Après point positif, si ça a marché de ton côté c'est que, au moins, le code est fonctionnel.

Il doit y avoir un élément qui empêche le lancement de ce bout de code sur ma scène. Je vais voir pour le lancer sur une scène vierge.

Aussi, la version de mon logiciel n'est pas à jour (unity 2019.2.18f1 ) mais je ne pense pas que ce soit ça ; si une condition aussi simple ne fonctionne pas sur une ancienne version c'est qu'on a du soucis à se faire x).

Je reviens vers toi si j'ai du nouveau, merci encore pour ton aide :)

Re: [DB-AL] Faire changer la forme d'un cube selon si la touche du clavier est enfoncée ou non

Publié : 13 Août 2020 12:02
par simiji
En fait (je me rend que je ne l'ai expliqué nul part), l'idée est de réaliser clavier virtuel qui fonctionne dans le jeu et qui réagis selon sur quel touche on appuie. Normalement, les seules touches qui devraient marcher sont les lettres et l'espace.

Re: [DB-AL] Faire changer la forme d'un cube selon si la touche du clavier est enfoncée ou non

Publié : 13 Août 2020 12:11
par simiji
Mouais, alors sur la nouvelle scène le code re-fonctionne mais qu'une seule fois encore. J'appuie sur une touche et après il ne veux plus rien faire...

Re: [DB-AL] Faire changer la forme d'un cube selon si la touche du clavier est enfoncée ou non

Publié : 13 Août 2020 13:29
par simiji
J'ai résolu mon problème finalement, j'ai triché et juste je fait apparaitre des cube plus grand lorsqu'on appuie sur la touche en question. C'est plus archaïque mais ça marche donc je suis contente ahah

Merci encore pour ton aide même si je n'ai pas utilisé ton code, c'est cool de savoir que quelqu'un répondra lorsqu'on galère ;)

Voici finalement à quoi ça ressemble :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;


public class KeyboardController : MonoBehaviour
{

public List<GameObject> BigKeyboard;


void Start (){
	foreach (GameObject obj in BigKeyboard){
      obj.SetActive(false);
	}
	

}

IEnumerator ExampleCoroutine()
    {
        
        yield return new WaitForSeconds(1);

        foreach (GameObject obj in BigKeyboard)
        {
      		obj.SetActive(false);
		}
    }

void Update()
    {
    //A	

        if (Input.GetKeyDown(KeyCode.A)) 
        {
            BigKeyboard[0].SetActive(true);
         	Color color = new Color(Random.Range(0f, 1f),Random.Range(0f, 1f),Random.Range(0f, 1f));
         	
            GameObject[] objects = GameObject.FindGameObjectsWithTag("KeyA");         	  

            foreach (GameObject go in objects) 
         	{

            	MeshRenderer[] renderers = go.GetComponentsInChildren<MeshRenderer>();
             	foreach (MeshRenderer r in renderers) 
             	{
                	foreach (Material m in r.materials) 
                	{
                     	if (m.HasProperty("_Color"))
                        m.color = color;
                 	}
             	}
         	}

         	StartCoroutine(ExampleCoroutine());
     	}