• Jeux Vidéo
  • Toi aussi deviens indéveloppeur [Unity/UE4 pour platformers 2D osef]

hichlibedis
hichanbis

Hello, je me prends la tête pour mettre en place la même camera que Lost Odyssey.


Ici par exemple entre 06:49 et 07:40 la caméra bouge tout le temps et automatiquement en fonction de la position du joueur.
On fait comment ça sous Unity? Zone gavée de triggers qui déclenchent des coroutine de lerp de camera?
Animation de caméra basée sur la position?

J'ai du mal à imaginer que les devs aient codé un trigger tous les 3 pas...

Edit: Apparemment il faut mettre la caméra sur rail via une "Spline". Ca parle à quelqu'un?

Edit par hichanbis (15 Nov 2016)

Singe-Gobelin
Sage-Goblin

hichanbis - 15 Nov 2016

Une spline c'est une courbe (courbe de bézier, b-spline, nurbs ou autre).
Je connais pas unity, mais en gros tu dessines une courbe (commence par une droite ça sera plus simple), et tu places ta caméra sur ta courbe (je sais pas si tu manipules une matrices ou des coordonnées bien que ça change pas grand chose). Et en fonction du temps ou bien de la position de ton personnage tu mets à jour les coordonnées de ta caméra par rapport à ta courbe.

L'IA de la nuit dernière
y a-t-il qqun pour rebrancher le cerveau de binouz
Binouz

.O. - 15 Nov 2016

Elle est trop cool la prez de la gdc j'avais jamais vu smiley115

L'IA de la nuit dernière
hichlibedis
hichanbis

Merci à vous.
En creusant un peu cette histoire de spline j'ai trouvé un asset qui fait exactement ce que je veux.

https://www.assetstore.unity3d.com/en/#!/content/617
http://support.jasperstocker.com/camera … mera-demo/

La démo c'est vraiment ce que je veux implémenter et l'asset a une GUI pas dégueu pour faire ça assez facilement.

J'ai réussi à me faire une petite anim de caméra rapidement avec Hermite Spline Controller hier soir, c'est cool mais par contre impossible de mettre le follow en relation avec la position d'un objet de la scene.

Du coup j'ai voulu coder moi-même le truc de positionner la cam sur le point le plus proche de la spline en fonction du joueur sur la map mais j'ai rien trouvé sur les forums unity pour une fois feelsbad
Et faire ça avec une animation ça me paraît encore plus compliqué...

Donc bon pour 30 euros on va pas faire la pince je crois (ça devrait être de base dans unity mais bon).

Edit par hichanbis (16 Nov 2016)

Invité(e)
Profil_supprime

hichanbis - 16 Nov 2016

Une

que j'avais trouvé intéressante à l'époque smiley8

Edit par Milka-aux-noisettes (16 Nov 2016)

y a-t-il qqun pour rebrancher le cerveau de binouz
Binouz
hichanbis a écrit :

(ça devrait être de base dans unity mais bon).

Ca c'est tout le business de Unity smiley12 "ça devrait être de base". En tout cas le plugin que t'as trouvé est connu et à mon avis ça te simplifiera carrément la vie smiley1

Profil_supprime - 16 Nov 2016

Très sympa aussi ! En vrai je me suis jamais trop intéressé au sujet car j'ai eu l'occaz de bosser que sur de la caméra fixe, ou de la cut scene, ou maintenant de la VR ou j'ai plus ce problème, mais ptin c'est un boulot monstrueux.

Edit par Binouz (17 Nov 2016)

hichlibedis
hichanbis

Oé pas mal la vidéo de God Of War, on voit effectivement que leur système sur rail c'est une anim de camera mappée à la position du joueur. Exactement ce dont parlait Tim.
Le problème de bosser avec une longue animation c'est que c'est plus chiant à ajuster si je veux changer quelque chose. Et contrairement à une spline j'ai pas de possibilité de connecter deux animations. Enfin je visualise le degré de complexité vs ma productivité avec l'asset camera path animator et y a pas photo.

Merci pour votre aide en tout cas. C'est clair pour moi maintenant.

Edit: Je persiste à dire que les splines, et d'une manière générale tout ce qui est lié aux cinématiques devrait être intégré à Unity.

Edit par hichanbis (17 Nov 2016)

Mon père est un pigeon
DarkAnother

Vous savez ce que ça vaut les formations sur Udemy ? Y'a des promos de dingue jusque demain !

hichlibedis
hichanbis

DarkAnother - 17 Nov 2016

https://www.udemy.com/unity-5-technique … s-quickly/

Oh god l'accent du mec, David Cage dans les cordes

Perso je préfère bosser sur mon jeu et apprendre en rencontrant les problèmes au fur et à mesure.
Y a plein de tutos gratuit partout sur tous les sujets, la difficulté consiste souvent à savoir ce qu'on cherche en fait, une fois qu'on a le mot clé c'est vraiment la fête.

Edit par hichanbis (17 Nov 2016)

y a-t-il qqun pour rebrancher le cerveau de binouz
Binouz

DarkAnother - 17 Nov 2016

Bah euh, la course Unity qu'à link Hichanbis ça a l'air d'être de l'arnaque, en mode "téléchargez le plugin qui fait tout tout seul, regardez ! Vous allez faire un village entier en appuyant sur un bouton !"

Pas sur que ça te forme à grand chose smiley3 Effectivement le mieux c'est d'avoir une idée et de creuser. Y a aussi Unity Learn qui est gratos et qui fait tout le tour des bases d'Unity. Donc bon ça m'a pas l'air d'être une affaire en or ce truc...

Edit par Binouz (17 Nov 2016)

J'ai pas fini ma crise d'ado
TrinitronGO
L'IA de la nuit dernière
hichlibedis
hichanbis

Je me cherche un pc portable gamer pour coder dans de meilleures conditions que mon canapé du salon et ma table basse qui font mal au dos. Mais du coup j'hésite entre 15 et 17 pouces.

15 pouces c'est gérable pour faire du Unity ou faut vraiment du 17 qui pèse une tonne ?
J'ai entendu dire qu'un 17 chauffe généralement moins qu'un 15...

Je risque d'avoir quelques déplacements réguliers à partir de la rentrée d'où la question de la portabilité.

Edit par hichanbis (16 May 2017)

Je travaille chez l'Euromaster du JV
nanarcorp

prends un 15 et tu branches en hdmi un écran 24" et terminado

hichlibedis
hichanbis

nanarcorp - 16 May 2017

J'avoue c'est peut-être le meilleur des deux mondes en fait.

hichlibedis
hichanbis

Hola, j'ai un problème d'accès concurrent à une méthode qui me rend dingue.
En donjon quand un ennemi entre dans le périmètre du joueur il peut déclencher une attaque et demander l'avantage.
L'ennemi peut en faire de même.
Le problème c'est que de temps en temps les deux appels ont lieu pile en même temps (même frame je suppose) et je ne parviens pas à empecher que le deuxieme demandeur de l'avantage ne l'obtienne pas.

Mon code simplifié coté Ennemi

void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
           TransitionManager.Instance.GetAdvantage(Advantage.Enemy);
        }
    }

Coté player:

void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Enemy")
        {
           TransitionManager.Instance.GetAdvantage(Advantage.Player);
        }
    }

Et maintenant le code du Manager qui donne l'avantage (advantageGiven est initialisé à false évidemment):

public void GetAdvantage(Advantage advantage)
    {
        if (advantageGiven)
            return;
        
        advantageGiven = true;
        this.advantage = advantage;
        advantageGiven = false; //edit: j'avais oublié cette instruction de reset qui a l'air d'être le coeur du souci
    }

Normalement la partie   

if (advantageGiven)  return;

devrait assurer que le deuxième arrivé ne puisse pas récupérer l'avantage.
En pratique il y arrive quand même de temps en temps.
Help unityrama!

Edit par hichanbis (25 May 2017)

L'IA de la nuit dernière

hichanbis - 25 May 2017

J'ai l'impression que les deux se déclenchent en même temps, puisque les deux ont un OnTriggerEnter qui détecte l'entrée de l'autre.
Si t'utilises Debug.Log() tu peux voir combien de fois est appelé GetAdvantage (et éventuellement, qui l'appelle ?)

hichlibedis
hichanbis

.O. - 25 May 2017

Oui c'est bien mon problème !
Les deux appellent la méthode en même temps mais je veux ne donner l'avantage qu'une fois. D'où mon boolean.

Edit: ok le debug me montre que les deux méthodes sont bien appelés quasi en même temps. C'est l'instruction advantageGiven = false; qui fout la merde.
Si je l'enlève je n'ai plus le souci.

Je dois trouver un moyen de reset le boolean plus tard et pas immédiatement après avoir donné l'avantage dans la même méthode.
Edit: Voila maintenant c'est bon.
Je remets la variable à false bien plus tard (quand le combat est loadé) et c'est nickel.

Edit par hichanbis (25 May 2017)

hichlibedis
hichanbis

Bonjour Unityrama, I need help svp:

Durant mon combat au tour par tour, si le perso doit faire une attaque, je veux que le perso:
- Court vers la cible (anim 1)
- Attaque (anim2)
- Fasse un petit saut pour revenir à sa position (anim3)

a la jrpg quoi.
Sans trop m'y connaitre en animation, j'ai réussi à le faire avec un truc assez euh...pourri.

En gros mon script:

transform.LookAt(target.transform);

//Déclenche l'anim de course (qui elle même déclenche la suivante etc)
anim.SetTrigger("Attack");

//le perso bouge en même temps que l'anim de course
yield return StartCoroutine(MoveOverSpeed(gameObject, target.transform.position, 10f));

// ici je mets une vieille attente en dur c'est laid mais ça permet de pas revenir en arrière avant la fin de l'attaque
yield return new WaitForSeconds(1.2f);

//le perso rentre en même temps que l'anim de saut
yield return StartCoroutine(MoveOverSeconds(gameObject, initPos, 1f));

Et mon enchainement d'animations:cbsGmzN.png
Attack est mal nommé en fait c'est "Run" hein.


Y a une façon moins dégueulasse artisanale de faire ça?
Des animations events?
Des anims root motion qui font vraiment bouger le perso c'est mieux?
Je fais comment pour éviter le wait en dur?

Edit par hichanbis (05 Jun 2017)

Fiché HS
Britney

Disgaea 6 by Hichanbis smiley18

J'ai envie de t'aider mais j'y connais rien... smiley2

Invité(e)
profil_supprime

Essaye de faire un shadowmapping sur tes shadders asymétriques. Après tu peux overtrader les facecube 3d pour avoir un lissage métrique mais tu risques de rendre le tout clockless ce qui doit être ta dernière envie...

Edit par Lucien Brémart (05 Jun 2017)

Tingle tingle kooloo limpah
KamiOngaku
1994 : la fin du jeu vidéo.
Tchiko

profil_supprime - 05 Jun 2017
Un peu Peach tout ça.
Pour la peine je le ressors.

Invité(e)
profil_supprime

Peach est MIA dans la réalité virtuelle feelsbad

mmppprrrrfffffchier

Je ne connais pas super bien Unity, mais en cherchant rapidement j'ai trouvé ça : https://docs.unity3d.com/Manual/animedi … vents.html, j'ai l'impression que ça pourrait résoudre ton problème

Pour éviter le wait en dur dégueulasse, l'idéal serait effectivement que tu puisses faire un truc du genre

OnSwingAnimationFinished()
{
    StartAnimation(BackwardJump);
    MoveToPosition(pos);
    etc
}
et comme ça pour chacune de tes étapes d'animation

L'autre solution est effectivement que l'animation gère directement elle-même le déplacement du personnage, mais ce n'est pas forcément souhaitable, par exemple si tu as envie de gérer finement les déplacements par toi-même dans le code.

Sinon, je ne sais pas si le moteur d'animation d'Unity le permet, mais une autre solution pas mal serait d'utiliser des animations paramétrées (en gros, tu lances une animation de saut avec en paramètre la position de départ et la position d'arrivée, et le moteur se démerde pour jouer l'anim en faisant coller ça à tes contraintes).

Voilà, c'est un peu en vrac, j'espère que ça t'aidera...

hichlibedis
hichanbis

mmppprrrrfffffchier - 06 Jun 2017

Hello en fait c'est bon j'ai passé la journée la dessus (entre autres trucs) et j'ai un truc un peu propre ou j'attends la fin de l'animation dans une boucle while. Je copie colle le code quand je serai sur l'ordi.
...ou pas en fait je pense que ça n'intéresse personne smiley1

Merci pour l'aide en tout cas.

Edit par hichanbis (06 Jun 2017)

hichlibedis
hichanbis

Bonjour les amis je pète un cable sur un gros problème de noob.

Avec ma caméra je fais un lookAt vers un gameObject (mon player).
Sauf que du coup la caméra regarde les pieds (vu que le player a une position 5, 0, 5 ça me paraît normal)
Alors j'essaye un petit truc tout bête dans mon script de camera:

Vector3 playerPos = battleManager.GetCurrentPlayer().transform.position.;
Vector3 offset = new Vector3(0f, 1.5f, 0f);
transform.LookAt(playerPos + offset);

Et ça ne marche pas du tout. La caméra continue de regarder les pieds.
Je suis pas très bon en offset mais là ça me laisse perplexe.

Edit: OK ca marche j'avais juste laissé trainer un autre truc ailleurs dans le code qui bougeait la cam.

Edit par hichanbis (09 Jun 2017)

L'IA de la nuit dernière

hichanbis - 09 Jun 2017

Sinon plutot que mettre l'offset en dur, tu devrais target un gameobject vide dont le parent serait ton perso.
Du coup tu peux le positionner ou tu veux, meme animer cet offset avec les animations, ca peut s'adapter a un petit ou grand personnage...

hichlibedis
hichanbis

.O. - 09 Jun 2017

Pas con du tout
Au final pour le problème de la taille du perso j'ai fait un truc à base de capsule collider.height mais ton idée est mieux.

Edit par hichanbis (09 Jun 2017)

hichlibedis
hichanbis

Binouz, HEEEEELLLLLPPPPP!:

nbCoroutines = battleAction.targets.Count;
foreach (GameObject target in battleAction.targets.ToList())
    {  
      //nbCoroutines décrémenté à chaque fin d'exec de coroutine TakeDamage
      StartCoroutine(target.GetComponent<BattleScript>().TakeDamage(dmg)); 
    }

   //c'est sensé attendre la fin de toutes les coroutines
    while (nbCoroutines > 0)
      {
          yield return null;
      }

Debug.Log("end wait");

foreach (GameObject target in battleAction.targets.ToList())
    {
    target.GetComponent<BattleScript>().DestroyIfDead();
    }

La méthode DestroyIfDead est exécutée avant le log "end wait". Du coup ben ça détruit l'objet avant la fin de la coroutine TakeDamage (qui attend la fin de l'animation d'impact/mort).
... WHY ?? smiley101

Avant ça je faisais yield return StartCoroutine(TakeDamage(dmg)) du coup ça temporisait bien mais ça faisait tout séquentiellement, y compris le destroy.
Alors que là je veux que mes unités encaissent les dégats en même temps et se détruisent toutes ensuite.
HEEELLLPPP

Edit par hichanbis (12 Jun 2017)

Mon père est un pigeon
DarkAnother

hichanbis - 12 Jun 2017

T'as lâché ton job pour développer ton jeu ou quoi ? smiley115

Non pas que ce soit mal hein

Fier comme un beauf.
Marks

hichanbis - 12 Jun 2017

je connais pas Unity, mais dans ton deuxième bloc, tu peux pas faire un

    while (nbCoroutines > 0)
      {
          yield return null;
      }

pour temporiser de la même façon ?

ça fait longtemps que j'ai pas utilisé de la coroutine mais je sais pas si ça fout pas la merde au niveau ordonnancement dans ton cas

hichlibedis
hichanbis

Marks - 12 Jun 2017

Même résultat smiley28

DarkAnother - 12 Jun 2017

Je suis au bureau là smiley97
Je profite des temps morts pour coder, genre le matin avant 9h30 et entre midi et deux.
Bon ça c'est en théorie, en pratique quand j'ai un bug ça déborde facilement, comme maintenant quoi.

Edit par hichanbis (12 Jun 2017)

hichlibedis
hichanbis

Ok c'était encore un truc de golmon.
Dans ma methode DestroyIfDead je détruisais à chaque fois sans faire de if.
Du coup la première attaque tuait toujours la cible et après ça lançait la deuxième attaque dans le vide et ça crachait des exceptions.

La fatigue caged

y a-t-il qqun pour rebrancher le cerveau de binouz
Binouz

Oups j'étais pas la right in time :p

Ton code avait rien de problèmatique j'aurai pas pu t'aider donc oui ca devait venir d'ailleurs smiley3

hichlibedis
hichanbis

Les cutscenes in game où faut synchroniser les déplacement et anims de plusieurs objets + la caméra + les dialogues textes + le son et le tout de manière séquencée ça serait pas un peu bordélique dans Unity?
Je veux dire faut vraiment tout scripter soi-même à la mano tel un chinois en 2017?

Fiché HS
Britney
L'IA de la nuit dernière

hichanbis - 20 Jun 2017

Il y a la cinematic timeline qui arrive qui va changer tout ca.

hichlibedis
hichanbis

.O. - 20 Jun 2017

Oui juste après avoir posté j'ai Google un peu et je suis tombé sur un tuto

J'ai la 5.6 apparemment j'ai le truc en beta donc je vais tester.

Sinon comment tu gères le séquencement d'événements dans une scène? Genre d'abord une cutscene, ensuite la caméra comme ça et je laisse le joueur bouger puis un truc scripte arrive et ne se reproduira plus jamais etc.
Et surtout comment tu le gères de manière à pouvoir le maintenir ou changer rapidement.
Y a des best practices ou je blinde mon code de conditions ?

Edit par hichanbis (20 Jun 2017)

tl;dr51

Question : je suis un néophyte complet, j'ai juste développé du HTML/CSS donc rien à voir, je maîtrise relativement bien la suite Adobe, pour le fun j'ai installé Unity et je suis actuellement les cours d'Openclassrooms, concrètement des Gameramiens ont ils déjà débuté par ce biais là, et si oui, jusqu'où peut aller la conception en autonomie solo d'un jeu ?

Je compte pas particulièrement faire un truc compliqué, c'est plus pour le délire, mais les possibilités ont l'air nombreuses et intéressantes. Après, je suppose qu'être en nombre réduit augmente le temps de travail et donc le risque de faire un truc osef clone de milles jeux sur le PSN feelsbad

hichlibedis
hichanbis

VV51 - 20 Jun 2017

Connaître la programmation objet me paraît quand même indispensable.
Essaie de te former au C# ou plus facile pour démarrer, au Java, c'est pas bien compliqué.

Fier comme un beauf.
Marks

VV51 - 20 Jun 2017

Avoir des bases de programmation semble quand même être un bon pré-requis.

Je touche pas au dév. de JV mais à voir ce que Hichanbis poste régulièrement, ça touche à tous les secteurs de la programmation (du parallélisme, de la géométrie algorithmique, de la POO...)

hichlibedis
hichanbis

Bon je galère sur un point de UI qui me rend fou et je ne trouve rien sur google.
J'essaie de faire en sorte que si le joueur a choisi une abilité qui attaque toutes les cibles, ça highlight tous les boutons de cibles ennemies.
Une image vaut mieux que 1000 mots:

WiETAOq.jpg

Ici on voit bien que tous les boutons target sont sélectionné/highlighté.

Problème je vois vraiment pas comment higtlighter ou séléctionner plusieurs boutons en même temps dans mon code.

J'ai fait un truc comme ça:

foreach (GameObject target in targets)
        {
            GameObject targetButton = Instantiate(targetButtonTemplate, targetsPanel.transform, false) as GameObject;
            targetButton.transform.Find("TargetName").GetComponent<Text>().text = target.name;
            targetButton.GetComponent<Button>().Select();
         }

Sauf qu'évidemment ça selectionne les boutons un par un donc au final y a que le dernier qui est select.
Et y a juste pas de méthode pour dire Select avec une liste de game objects. Enfin je trouve pas.

Help les amigos.

Edit: ok je crois que je peux feinter en séléctionnant le premier et en désactivant les autres puis en leur donnant une apparence highlighted when disabled

Edit par hichanbis (10 Jul 2017)

Steve
Sander

Vous utilisez le Python pour vos jeux ?
Je dois apprendre le langage, mais pour une autre utilisation (calcul numérique, maths). Si vous connaissez de bons tutos/bouquins smiley29

J'ai pas fini ma crise d'ado
TrinitronGO
hichlibedis
hichanbis

Cinemachine miracle

hichlibedis
hichanbis

Hello les amis, j'ai un souci avec le combo Scriptable Object et serialization (save/load) JSON.

En gros j'ai un SO (Scriptable object) de runtime représentant mon GameProgress qui contient des références vers des instances d'objets divers et variés (classes C# simples et serializables pour la position du joueur, le nom de la scène, ses stats etc).
Je le serialise en JSON (save dans le dossier de sauvegarde Application.persistentDataPath), je ferme Unity puis rouvre, je déserialise (Load le fichier et j'overwrite mon SO GameProgress) => Tout baigne je retrouve bien ma progression.

Maintenant j'ai mis en place un SO AllConditions qui contient une liste de SO Condition qui a un booléen satisfied, ce qui me permet de dire si le joueur a satisfait une condition ou non (je change le bool au runtime quoi).

Le problème:
J'essaye maintenant d'ajouter AllConditions à mon SO GameProgress (dans l'espoir de pouvoir sauvegarder les conditions satisfaites ou non).
Ca marche bien si je reste dans Unity, en gros si je serialise, déserialise on est bon.
Par contre si je serialise, ferme Unity puis le rouvre, et déserialise mon json => toutes mes réferences sont missing.

Et c'est normal, JsonUtility.ToJson serialise une liste de réference vers les SO Condition et ces réferences sont les instances IDs éphèmères qui sont re-générés à chaque session (éditeur ou runtime). Donc en gros I'm fucked.

C'est quoi la solution pour serialiser une référence pérenne vers un SO ?
J'ai cru comprendre que le GUID était une solution mais aucune idée de comment m'en servir au moment du Save ou Load...

Edit par hichanbis (28 Dec 2017)

  • Jeux Vidéo
  • Toi aussi deviens indéveloppeur [Unity/UE4 pour platformers 2D osef]