Page 1 sur 1

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

Publié : 19 Nov 2021 21:39
par Beogus
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?

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

Publié : 20 Nov 2021 01:10
par jmhoubre
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.
	}

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

Publié : 20 Nov 2021 16:50
par Beogus
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)

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

Publié : 20 Nov 2021 19:23
par jmhoubre
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.
}

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

Publié : 20 Nov 2021 21:32
par Beogus
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.

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

Publié : 20 Nov 2021 22:13
par jmhoubre
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.

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

Publié : 20 Nov 2021 23:56
par Beogus
ha, ça prend trop de ressources?

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

Publié : 21 Nov 2021 11:10
par jmhoubre
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.

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

Publié : 21 Nov 2021 16:30
par Beogus
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.