---
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
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
Re: [DB-AL] - Accéder à un Vector3 qui est Serialized à partir d'un autre script
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 :
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 :
Modifier en conséquence le script 2 :
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.
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);
}
}
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;
}
Code : Tout sélectionner
public class Attack : MonoBehaviour {
private Vector3 attackPos;
[SerializeField] private CharacterBase characterBase = null;
void Start () {
attackPos = characterBase.summonPosition;
print (attackPos);
}
}
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.
Re: [DB-AL] - Accéder à un Vector3 qui est Serialized à partir d'un autre script
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.
Et le scriptable object, avec son attribute particulier :
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;
}
}
Code : Tout sélectionner
public class CharacterBase : ScriptableObject {
[field: SerializeField] public Vector3 SummonPosition { get; private set; }
}