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

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
simiji
Messages : 21
Inscription : 06 Avr 2017 16:51

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

Message par simiji » 08 Août 2020 12:26

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;
        }
    }
}

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 08 Août 2020 15:10

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.

simiji
Messages : 21
Inscription : 06 Avr 2017 16:51

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

Message par simiji » 12 Août 2020 15:34

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:

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 12 Août 2020 21:53

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.

simiji
Messages : 21
Inscription : 06 Avr 2017 16:51

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

Message par simiji » 13 Août 2020 12:00

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 :)

simiji
Messages : 21
Inscription : 06 Avr 2017 16:51

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

Message par simiji » 13 Août 2020 12:02

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.

simiji
Messages : 21
Inscription : 06 Avr 2017 16:51

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

Message par simiji » 13 Août 2020 12:11

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...

simiji
Messages : 21
Inscription : 06 Avr 2017 16:51

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

Message par simiji » 13 Août 2020 13:29

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());
     	}

Répondre

Revenir vers « (C#) CSharp »