Photon reste quand même le simple et le plus ouvert que Mirror. Ce qui est bien en plus avec Photon, c'est que tu peux incorporer beaucoup plus facilement tes autres codes ou mécaniques de jeu car la synchronisation entre host et client est beaucoup plus facile à mettre en place
J'ai aucune notion en networking et encore moins dans Unity, tu peux m'expliquer les différences entre les différentes manières de faire? (Et si vous avez un tutoriel a recommander je suis preneur)
J'ai aussi vu que Unity 2021.1 avait des options pour faire du multi direct dans le moteur, ça vaut quoi
Après il y a pas de LTS pour Unity 2021 je sais pas si c'est très important...
Donc si je comprends bien, tu souhaiterais te lancer dans un système multijoueur sur un moteur de jeu que tu ne maîtrise pas ?
Je ne veux pas te faire peur mais ça va être compliqué
Je maîtrise le moteur (du moins a un niveau débutant) mais je voudrais toucher un peu a tout, ne serais-ce que faire un pong multi pour avoir des connaissances minimales.
Je te conseille de commencer par t'intéresser comment créer un FPS ou autre chose parce que il faut quand même bien maîtriser unity pour s'attaquer au multi
Bonjour
Y'en a-t-il qui connaissent bien le logiciel Ink ? https://mammouthnumerique.com/2019/09/18/ink-un-logiciel-decriture-interacti/
J'envisage de l'utiliser pour un projet sur Unity mais je ne trouve pas tant d'infos que ça dessus. J'aimerais notamment savoir si le "jonglage" entre Ink et Unity est vraiment aussi facile qu'on le dit, et si Ink est le logiciel le plus adapté pour mettre en scène des dialogues (sans qu'il n'y ait de choix à faire) entre des personnages ainsi que des phrases qui apparaissent quand on examine un objet par exemple. Si vous pensez qu'un autre logiciel est plus adapté pour cela (et qui peut se combiner avec Unity) , n'hésitez pas à en parler. Et si vous avez de bons tutos pour l'utilisation de Ink avec Unity, je suis prenant. Merci d'avance
Je ne connaissait pas Ink, mais ça a l'air intéressant. Il y a plein de langages dans le même style pour faire des fictions interactives mais à ma connaissance c'est le seul avec un interpréteur pour Unity.
Après c'est conçu pour de la fiction interactive, donc des gros dialogues avec pleins de textes. Si c'est juste pour afficher quelques lignes de textes avec deux trois options quand on intéragit avec un PNJ ou un objet je ne sais pas si c'est le plus adapté. Il existe plusieurs plugins unity qui font ça, dont plusieurs qui vienne avec une interface déjà faite (ce qui ne semble pas être le cas avec Ink).
Bonjour,
Je suis un peu perdu et je ne sais pas comment procéder. J'essaye de faire un jeu de combat avec des cartes.
Les cartes sont par type de classe (guerrier, voleur, mage etc...).
Je voudrais faire un systeme qui permette de mettre aléatoire x cartes guerrier dans le deck du joueur puis x carte voleur dans le deck du joueur puis x carte mage dans le deck du joueur etc...
Le problème c'est que je n'arrive pas car je ne sais pas vraiment comment accéder à l'index des cartes de classe car les classe (guerrier voleur etc...) elles même sont dans un tableau.
Je vous montre ca en image pour être plus claire.
Voici la classe ClassArray
qui avec la classe ClassCards en [Serializable] me permet d'avoir un tableau dans un tableau comme ceci:
Maintenant dans la class PlayerDeck je veux accéder au tableau multidimensionnel pour faire un triage aléatoire des cartes des différentes classes (guerrier voleur etc..).
Voici le script PlayerDeck:
Alors oui les scripts ont du rouges justement je cherche comment accéder par exemple à l'index [0,2] de la class ClassArray depuis le script PlayerDeck.
Je pense qu'il faut un algorithme de type boucle foreach dans la class ClassArray qui puisse stocker tous les index et leur gameObject de chaque classe(guerrier voleur etc..) pour que je puisse y accéder depuis la class PlayerDeck. Mais je ne sais pas vraiment comment procéder.
Si vous avez une solution même autre je suis preneur.
Merci d'avance pour vos réponse ne espérant avoir été assez clair..
Je pense avoir trouver la solution
ClassArray:
Qui donne ce tableau:
Et comment accéder aux cartes de classe(guerrier, voleur etc..) depuis la classe PlayerDeck:
Il y a deux variable classCard(s) une sans "s" et une avec. Je vais modifier le nom pour moins d’ambiguïté.
Me reste plus qu'à faire une loop en y intégrant des nombres aléatoires.
Je partage la solution au cas ou ca en intéresse certains.
Utilise des ScripableObjects pour stocker ce genre de données.
Perso j'aurais renseigné la classe dans un ScriptableObject qui contient les autres données de la carte (nom, image, effets etc.).
En fait la ClasseArray va être unique, il n'y aura qu'une seule instance de cette classe. Elle me permet juste de stocker toutes les cartes de chaque classe (guerrier voleur etc) pour pouvoir ensuite faire des tirages aléatoires de ces cartes. Est-ce judicieux de faire un ScriptableObject pour une seule instance?
Par contre effectivement j'avais fait un ScriptableObject CardData.
Edit: Quel genre de question faut il se poser pour savoir si on utilise des ScriptableObject?
Il faut éviter de stocker une même information à deux endroits. Là tu as déjà la classe des cartes dans ton CardData.
Il faut choisir entre stocker la classe dans CardData ou les cartes dans ClassData (d'ailleurs tu semble utiliser une enum pour les classes, mais utiliser des ScriptableObject serait sans doute mieux).
Stocker dans ClassData permet de dupliquer une classe pour faire des tests avec des listes de cartes différentes. Stocker dans CardData permet d'être sur qu'une carte n'a qu'une seule classe.
Ensuite comme tu as besoin de pouvoir à la fois connaitre la classe d'une carte et la liste de toutes les cartes d'une classe, il sera sans doute nécessaire de dupliquer l'information pendant le runtime. Par exemple si la classe est stockée dans CardData, faire un truc du genre :
public class CardData : ScriptableObject {
[SerializeField] private ClassData _Class;
public ClassData Class => _Class;
public void Awake(){
_Class.Cards.Add(this);
}
}
public class ClassData : ScriptableObject {
[system.nonserialized] public List<CardData> Cards = new List<CardData>();
}
A noter que les ScriptableObject pas référencés dans la scène ne seront pas chargés, il faut donc les mettre dans un dossier Resources et les charger via un script (lors du démarage du jeu).
public class CardLoader {
public void Start(){
textures = Resources.LoadAll("", typeof(CardData));
}
}
Je lis et relis pour essayer de bien comprendre. J'ai appris via internet et je vois des termes un peu inconnu. Du coup j'ai un peu de mal à comprendre.public ClassData Class => _Class;
Que veut dire cette ligne, j'ai déjà vue plusieurs fois ce symbole => mais je n'ai jamais vraiment compris ce qu'il signifiais.
Du coup j'ai un peu de mal à comprendre cette ligne aussi:_Class.Cards.Add(this)
Et première fois que je rencontre ceci:[system.nonserialized]
Je ne comprend pas trop. Je vais aller faire des recherches en attendant ta réponse. En tout cas merci pour ton aide.
public ClassData Class => _Class;
C'est une propriété en lecture seule, c'est exactement la même chose que ça:
public ClassData Class{
get{
return _Class;
}
}
[system.nonserialized]
Ca empêche qu'un attribut soit sérialisé. C'est l'inverse de [SerializeField]
. L'idée étant que la liste des cartes de la classe soit crée automatiquement au lancement du jeu, et non à la main dans l'éditeur ce qui serrait à la fois une perte de temps et un risque d'erreur vu qu'on a déjà cette info dans CardData.
Ok, merci pour les précisions.
Du coup j'en profite mais j'avais lu qu'il fallait toujours mettre les variables en privée pour "l'encapsulation" et de faire des accesseurs si on avait besoin d'accéder à la propriété.
Par exemple cette liste est publique.public class ClassData : ScriptableObject {
[system.nonserialized] public List<CardData> Cards = new List<CardData>();
}
Pourquoi ne pas la mettre en privée? Faire quelque chose comme ca:
public class ClassData : ScriptableObject
{
private List<CardData> cards = new List<CardData>();
public List<CardData> Cards => cards;
}
Est-ce tiré par les cheveux que de tout vouloir mettre en privé?
Avec ton code on peut toujours modifier la liste, donc ça encapsule pas grand chose. La seule chose que ça empêche c'est de déclarer une nouvelle liste, mais ça on peut le faire de façon plus simple comme ça :
public class ClassData : ScriptableObject
{
public readonly List<CardData> Cards = new List<CardData>();
}
Pas besoin de [system.nonserialized]
car les attributs readonly ne sont pas sérialisés de toute façon.
Si tu veux vraiment pousser l'encapsulation à fond, il ne faut pas exposer "Cards" du tout en public, et faire un truc du genre:
public class ClassData : ScriptableObject
{
private List<CardData> Cards = new List<CardData>();
public void AddClassCard(CardData Card){ Cards.Add(Card); }
}
Et si tu veux vraiment que le code soit 100% propre, il faudrait utiliser HashSet à la place de List, histoire qu'on ne puisse pas mettre plusieurs fois la même carte.
Bonsoir, veuillez excuser mon arrivée soudaine dans cette discussion, je suis sur un projet en VR sur Unity, le dev qui m'accompagner à finalement jeter l'éponge juste car "plus envie", si quelqu'un est chaud à me rejoindre dans cette aventure je l'accueille à bras ouverts, sinon mon projet est juste mort, merci d'avance au quelque reponce, j'espère trouver quelqu'un ici
Bonjour,
Quelle est la bonne pratique à faire?
private void Update()
{
if (!playerDeck.DeckIsReady) return;
CheckListSelected();
}
ou inclure le if dans la fonction? Pour moi les deux cas sont la même chose mais je pense qu'il y a surement une subtilité que je ne connais pas.
Le 06 septembre 2021 à 02:29:02 :
Bonjour,Quelle est la bonne pratique à faire?
private void Update() { if (!playerDeck.DeckIsReady) return; CheckListSelected(); }
ou inclure le if dans la fonction? Pour moi les deux cas sont la même chose mais je pense qu'il y a surement une subtilité que je ne connais pas.
Comment ça ? Tu veux savoir si il y a une différence entre
private void Update()
{
if (!playerDeck.DeckIsReady) return;
CheckListSelected();
}
et ça ?
private void Update()
{
if (playerDeck.DeckIsReady)
CheckListSelected();
}
Si c'est la question, pour des raisons de lisibilité je privilégie la première version (par contre en général on retourne à la ligne après le if pour le return), mais les deux sont ok.
Non justement, je veux savoir si la bonne pratique c'est de mettre le if dans la fonction ou à l’extérieur.
Si le if est dans la fonction, l'update rentre dedans, elle voit le return et sort directement de la fonction.
Si le if est à l’extérieur de la fonction l'update ne rentre pas dans la fonction.
Mais en lisant ma phrase juste au dessus, je pense que le if à l'exterieur de la fonction est le bon choix, je pense...
En fait les deux cas fonctionnent, c'est pour ca que je me posait la question.