[Résolu] [DB-AL] coder à l'aide de la hiérarchie en jeu.

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
Beogus
Messages : 13
Inscription : 29 Mars 2021 17:42

[Résolu] [DB-AL] coder à l'aide de la hiérarchie en jeu.

Message par Beogus » 19 Nov 2021 21:39

Bonsoir,

Alors voila, mon objectif est de faire ralentir mon personnage lorsqu'il porte un objet trop lourd, j'ai tenté plusieurs méthodes différentes qui ont toutes échoué car je m'y suis probablement mal pris (n'y connaissant pas grand chose).

puis une idée m'est venu (qui m'a semblé beaucoup plus simple), mais je ne sais pas comment la mettre en application.

Image


En gros, en jeu lorsque j'ai un objet dans le slot sélectionné, les bras liés à l'objet sont ajoutés dans le "ArmHolder" (ici le clone représente des bras qui porte le rondin) afin de les voir à l'écran. (jeu à la première personne).

Et donc sur le script que j'ai placé sur "Player", j'aimerais placer une condition du genre

Code : Tout sélectionner

"if (player.FpsCamera.ArmHolder.Arm_Rondin)
{
}
"
Mais en passant non pas par des classes et variables lié à des script mais directement par les empty en jeu. Est-ce possible?
Dernière édition par Beogus le 20 Nov 2021 21:32, édité 1 fois.

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

Re: [DB-AL] coder à l'aide de la hiérarchie en jeu.

Message par jmhoubre » 20 Nov 2021 01:10

Bonsoir,
à ta place, je mettrais les bras dans la hiérarchie, désactivés.
Dans le script, un :

Code : Tout sélectionner

	[SerializableField] private GameObject bras;
	
	// Condition.
	if (CestTropLourd)
	{
		bras.SetActive (true);
		// Ne pas oublier de mettre à false au déchargement.
	}

Beogus
Messages : 13
Inscription : 29 Mars 2021 17:42

Re: [DB-AL] coder à l'aide de la hiérarchie en jeu.

Message par Beogus » 20 Nov 2021 16:50

Merci beaucoup pour ta réponse, mais je pense que je me suis mal expliqué.

J'ai déjà un système qui me permet de changer de bras en fonction des objets que j'ai en main.

ici, ce que j'aimerais tenter de mettre en place, c'est le fait de modifier des variables en fonction du bras (clone) qui arrive dans le gameobject ArmOlder.

au lieu du : if ( c'est trop lourd) j'aimerais un if(tel bras ou tel bras est présent dans le ArmOlder).

en me basant sur ta réponse je pourrais faire quelque chose comme ça :

Code : Tout sélectionner

[SerializableField] private GameObject bras1;
[SerializableField] private GameObject bras2;
[SerializableField] private GameObject bras3;
	
	// Condition.
	if (// là je bloque sur le chemin à emprunter (le code à définir) pour parvenir jusqu'au potentiel bras)
	{
		//modification de la vitesse
	}
dans le if, je ne sais pas quoi mettre pour faire fonctionner la condition (en gros j'aimerais mettre le chemin lié à l'image que j'avais partagé : Player> FpsCamera >ArmOlder > Bras1/bras2/bras3)

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

Re: [DB-AL] coder à l'aide de la hiérarchie en jeu.

Message par jmhoubre » 20 Nov 2021 19:23

Je ne suis pas sur d'avoir compris ton problème, mais voici ce à quoi je pense :

Code : Tout sélectionner

if (bras3 != null)
{
	// bras3 est une référence valide. On peut la manipuler.
}
else
{
	// Si on manipule bras3, on obtient un NullReferenceError.
}

Beogus
Messages : 13
Inscription : 29 Mars 2021 17:42

Re: [DB-AL] coder à l'aide de la hiérarchie en jeu.

Message par Beogus » 20 Nov 2021 21:32

Désolé mais ça ne convient pas vraiment à ce que j'ai en tête, mais tes réponses m'ont bien aidé et orienté, ce qui m'a permis de trouver quelque chose qui fonctionne.

Code : Tout sélectionner

private void Fatigue() // Classe que le placerais dans l'UpDate
        {
			
			if (fpsCamera.armHolder.Find("Arm_Rondin(Clone)")) // si je trouve le gameObject correspondant à ce nom en jeu.
            {
				status.isTired = true; // je modifie la variable qui indique que le joueur est fatigué
				Debug.Log("youhou");
            }
            else // sinon, je la laisse sur faux
			{
				status.isTired = false;
			}

            if (status.isTired == true) // si il est fatigué, je modifie sa vitesse de course
            {
				currentWalkSpeed = Mathf.Lerp(currentWalkSpeed, stats.tired,
						Time.deltaTime * stats.smoothWalkSpeed);
			}
Merci beaucoup pour tes réponses rapides, je vais marquer le sujet comme résolu.

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

Re: [Résolu] [DB-AL] coder à l'aide de la hiérarchie en jeu.

Message par jmhoubre » 20 Nov 2021 22:13

Mauvaise idée de mettre un Find (ou toute fonction qui cherche un objet à partir de son nom ou de son tag) dans une fonction appelée dans l'update.

Beogus
Messages : 13
Inscription : 29 Mars 2021 17:42

Re: [Résolu] [DB-AL] coder à l'aide de la hiérarchie en jeu.

Message par Beogus » 20 Nov 2021 23:56

ha, ça prend trop de ressources?

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

Re: [Résolu] [DB-AL] coder à l'aide de la hiérarchie en jeu.

Message par jmhoubre » 21 Nov 2021 11:10

Dans la doc de GameObject.Find :
For performance reasons, it is recommended to not use this function every frame. Instead, cache the result in a member variable at startup. or use GameObject.FindWithTag.

Beogus
Messages : 13
Inscription : 29 Mars 2021 17:42

Re: [Résolu] [DB-AL] coder à l'aide de la hiérarchie en jeu.

Message par Beogus » 21 Nov 2021 16:30

Ha oui, je vois (c'est vrai que ce n'est pas étonnant d'un autre côté si il doit chercher l'info au sein de toutes les scènes à chaque frame ^^')

bon bhen je crois que cette fois j'ai trouvé.

J'ai un script qui me permet de sélectionner un bras en fonction de l'item qui se trouve dans le slot que je sélectionne dans ma barre d'action (bras que je place manuellement dans le scriptable de chaque item). Donc j'ai ajouté une fonction qui permet de récupérer le bras dans une variable au moment de sélectionner l'item. ce script a un "public static de lui même"

Puis j'ai ajouté un script sur chaque bras :

Code : Tout sélectionner

public class ArmController : MonoBehaviour
    {
	[SerializeField]
        private bool chargeLourde = false;
        	
        public bool ChargeLourde { get { return chargeLourde; } }
    }
}
que je coche manuellement en fonction du bras pour indiquer si il s'agit d'une charge lourde ou non.

ensuite j'ai repris le script du joueur et ai modifié la fonction que j'avais montré précédemment pour faire ceci.
fonction que je placerais dans l'update :

Code : Tout sélectionner

private void Fatigue() //Test
        {
			
	if (Quickslot.instance.CurrentArm.ChargeLourde) // là au lieu de faire un find, je récupère la donné de mon script static et si le bool "chargeLourde" est coché, alors, je lance la suite.
            {
		status.isTired = true;
		Debug.Log("youhou");
            }
            else 
	   {
		status.isTired = false;
	   }

            if (status.isTired == true)
            {
		currentWalkSpeed = Mathf.Lerp(currentWalkSpeed, stats.fatigue,
			Time.deltaTime * stats.smoothWalkSpeed);
            }
		

ça semble fonctionner correctement, et j'espère que cette méthode ne posera pas de problèmes de performances ^^

Merci encore pour ton aide.

Répondre

Revenir vers « (C#) CSharp »