---

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
Nevermind
Messages : 1
Inscription : 20 Sep 2020 20:16

---

Message par Nevermind » 20 Sep 2020 20:58

[deleted]
Dernière édition par Nevermind le 25 Sep 2020 16:44, édité 2 fois.

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

Re: [DB-AL] - Accéder à un Vector3 qui est Serialized à partir d'un autre script

Message par jmhoubre » 21 Sep 2020 00:17

Bonsoir,

je l'écris assez souvent, ce n'est pas parce que cela bloque vers la ligne 100, que l'erreur ne vient pas d'ailleurs. Prends donc l'habitude de publier la totalité des scripts, afin de faciliter le travail des autres.

Un truc bizarre
La classe de ton script 1 est CharacterBase, et ton accès au Vector3 dans le script 2 est Character.Base.SummonPosition. Il n'y a rien qui te choque ?

Et il n'y a pas d'erreur ? Sans blagues....

Le problème
Essaie ce petit script, attaché à un empty, dans un nouveau projet, scène par défaut :

Code : Tout sélectionner

using UnityEngine;

public class Attack : MonoBehaviour {

	[SerializeField] private float test = 0f;
	public float Test { get; set; }

	void Start () {
		print ("Partie privée : " + test);
		print ("Partie publique : " + Test);
	}
}
Dans l'inspecteur, met 3.14 dans la variable Test, et lance le jeu. Qu'obtiens-tu ? Normalement la privée s'affiche bien, à 3.14, mais la publique est à 0. Cette méthode ne fonctionne pas : [SerializeField] et les propriétés ne sont pas directement compatibles.

Solution possible
Supprimer la propriété (qui au passage, pose problème et n'a pas été publiée), et rendre publique la variable :

Code : Tout sélectionner

public class CharacterBase : ScriptableObject {
	public Vector3 summonPosition;
}
Modifier en conséquence le script 2 :

Code : Tout sélectionner

public class Attack : MonoBehaviour {
	private Vector3 attackPos;

	[SerializeField] private CharacterBase characterBase = null;

	void Start () {
		attackPos = characterBase.summonPosition;
		print (attackPos);
	}
}
Pourquoi ça ne marche pas ?
Honnêtement, je ne suis pas un pro des propriétés, parce que ce sont des méthodes déguisées, que j'ai lu dans le livre de Poudlard que l'accès à une propriété est plus long qu'aux données stockées et que j'en éprouve peu le besoin. Il y a probablement une façon correcte d'écrire ce que tu veux faire, mais la solution au-dessus fonctionne. Si tu as un besoin supplémentaire, il faut l'exprimer.
Je vais regarder si une explication existe.
Dernière édition par jmhoubre le 21 Sep 2020 00:50, édité 2 fois.

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

Re: [DB-AL] - Accéder à un Vector3 qui est Serialized à partir d'un autre script

Message par jmhoubre » 21 Sep 2020 00:48

Re,

si j'ai bien compris ton souhait, tu veux utiliser une propriété "privative" dans le scriptable object, et l'utiliser dans un second script ?
J'ai trouvé ceci dans la doc Microsoft, ce qui donne les 2 scripts suivants, et cela fonctionne (on peut fixer la position dans l'inspecteur, et la récupérer depuis un autre script, mais pas l'écrire.

Code : Tout sélectionner

public class Attack : MonoBehaviour {

	[SerializeField] CharacterBase characterBase = null;

	void Start () {
		print ("Vector3 : " + characterBase.SummonPosition);
		
		// Si on décommente la ligne suivante, erreur car la propriété est set en private.
		// characterBase.SummonPosition = Vector3.zero;
	}
}
Et le scriptable object, avec son attribute particulier :

Code : Tout sélectionner

public class CharacterBase : ScriptableObject {

	[field: SerializeField] public Vector3 SummonPosition { get; private set; }
	
}

Répondre

Revenir vers « (C#) CSharp »