Dans l'idée, définir une fonction par action n'est pas forcément lisible et efficace, surtout si elle fait la même chose. Mieux vaut définir une voir deux fonctions pour synthétiser:
Code : Tout sélectionner
void affichertexteporter()
{
text_interaction_porter.GetComponent<Text>().enabled = true;
}
void enlevertexteporter()
{
text_interaction_porter.GetComponent<Text>().enabled = false;
}
void affichertexteramasser()
{
text_interaction_ramasser.GetComponent<Text>().enabled = true;
}
void enlevertexteramasser()
{
text_interaction_ramasser.GetComponent<Text>().enabled = false;
}
devient:
Code : Tout sélectionner
//Afficher le Text _texte par défaut ou le masquer
void AfficherTexte (Text _texte, bool _afficher = true)
{
_texte.enabled = _afficher;
}
Le component Text et le booléen sont passés en paramètre.
Code : Tout sélectionner
void Awake ()
{
// Récupérer les components Text
textePorter = text_interaction_porter.GetComponent<Text>();
texteRamasser = text_interaction_ramasser.GetComponent<Text>();
}
void Start()
{
// Masquer les Texts
AfficherTexte (textePorter, false);
AfficherTexte (texteRamasser, false);
}
pareil pour ramasser_objet () et lacher_objet () deviennent:
Code : Tout sélectionner
// Ramasser ou Lacher l'objet en fonction de _ramasser
void RamasserObjet (bool _ramasser)
{
game_object_touched.GetComponent<Rigidbody>().isKinematic = _ramasser;
game_object_touched.transform.parent = _ramasser ? player.transform : null;
porter = _ramasser;
}
Ce que tu fais fonctionne, c'est juste que ça prend beaucoup de place et quand tu auras une vingtaine d'action, ce sera encore plus lisible de regrouper.
Par contre, comme disait JMHoubre, ton Update () est difficile à comprendre au niveau des conditions. Beaucoup de répétitions, de tests inutiles et de logique séparée. J'ai essayé de concaténer ça, mais ça ne me parle pas trop encore...
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ramassage : MonoBehaviour
{
public GameObject game_object_touched;
bool porter;
public GameObject text_interaction_porter;
public GameObject text_interaction_ramasser;
public GameObject player;
public int nombre_de_cubes;
private Text texteRamasser = null;
private Text textePorter = null;
void Awake ()
{
// Récupérer les components Text
textePorter = text_interaction_porter.GetComponent<Text>();
texteRamasser = text_interaction_ramasser.GetComponent<Text>();
}
void Start()
{
// Masquer les Texts
AfficherTexte (textePorter, false);
AfficherTexte (texteRamasser, false);
}
// Update is called once per frame
void Update()
{
RaycastHit hit;
Debug.DrawRay(transform.position, transform.forward * 3, Color.red);
if (Physics.Raycast(transform.position, transform.forward , out hit, 3))
{
game_object_touched = hit.transform.gameObject;
}
else
{
game_object_touched = null;
}
if (game_object_touched != null)
{
if (game_object_touched.tag == "Ramassable")
{
if (porter)
AfficherTexte (textePorter, false);
else
AfficherTexte (texteRamasser);
if (Input.GetKeyDown(KeyCode.E))
{
RamasserObjet (!porter);
}
}
else
{
if(game_object_touched.tag == "Cube")
{
AfficherTexte (texteRamasser, !porter);
if (Input.GetKeyDown(KeyCode.E) && !porter)
{
collect();
nombre_de_cubes += 1;
AfficherTexte (texteRamasser, porter);
}
}
}
}
}
void collect()
{
game_object_touched.SetActive(false);
}
// Ramasser ou Lacher l'objet en fonction de _ramasser
void RamasserObjet (bool _ramasser)
{
game_object_touched.GetComponent<Rigidbody>().isKinematic = _ramasser;
game_object_touched.transform.parent = _ramasser ? player.transform : null;
porter = _ramasser;
}
//Afficher le Text _texte par défaut ou le masquer
void AfficherTexte (Text _texte, bool _afficher = true)
{
_texte.enbaled = _afficher;
}
}
En regroupant, on constate que la logique est chancelante, que les cas sont traités un par un plutôt que d'entrevoir une globalité.
Attention, ce code ne fonctionne peut être pas exactement comme tu le souhaites. J'ai concaténé sans être sûr de comprendre la logique derrière.