Aide scripting pour plateforme parent

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Aide scripting pour plateforme parent

Message par Nemo67 » 07 Août 2017 13:59

Hello,

Dans mon projet il y a un FirstPersonController qui peut sauter sur des plateformes qui effectuent une rotation sur l'axe x grâce à un petit script.

Les plateformes utilisent un mesh colider et la caméra est sur le FirstPersonController (rigid body + gravity). Le problème est que lorsque les plateformes tournent, le FirstPersonController ne suit pas le mouvement et tombe... :o

Comment faire pour lui faire suivre le mouvement de l'objet ? Je pense que ça à voir avec le concept d'objet enfant (le controller) et parent (la plateforme) ? Sachant aussi que le controller devra continuer à pouvoir avancer sur la platforme mais n'être plus solidaire de l'ensemble en cas de saut.

Quelles intructions utiliser en C# ? Merci d'avance de votre aide.
Si qq à un exemple de script type pour ce genre de situation je suis preneur...

Avatar de l’utilisateur
Aiyor
Messages : 24
Inscription : 14 Juin 2017 12:08

Re: Aide scripting pour plateforme parent

Message par Aiyor » 07 Août 2017 14:06

Je pense qu'il faut que tu mettes le collider de ta plateforme en "Trigger", puis que tu utilises la fonction OnTriggerEnter pour définir par script que ton personnage devient enfant de ta plateforme et OntriggerExit pour supprimer le lien de parenté...
La fonction a utiliser est celle-ci : https://docs.unity3d.com/ScriptReferenc ... arent.html

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: Aide scripting pour plateforme parent

Message par Nemo67 » 19 Août 2017 18:07

Merci pour le conseil. J'ai enfin pu me remettre à mon projet.
J'ai cherché sur le net et je pense que l'article qui se rapproche le plus de ce que je veux faire est celui ci :

https://www.reddit.com/r/Unity3D/commen ... _rotating/

Voici le bout de code qu'il faudrait que je mette sur ma plateforme qui tourne (d'après ce que j'ai compris) :

Code : Tout sélectionner

void OnTriggerEnter(Collider other)
{
    if (other.tag == "Player")
    {
        other.gameObject.transform.parent.SetParent(transform, true);
    }
}
void OnTriggerExit(Collider other)
{
    if (other.tag == "Player")
    {
        other.gameObject.transform.parent.SetParent(null, true);
    }
}
Mais ce bout de code semble hors de son contexte, il doit manquer des trucs car lorsque je l'implante dans un scripte vide dans la partie Update, ca ne fonctionne pas...(le compilateur ne veux pas de "void" ici) :? Le "Player" c'est le fpscontroller je pense ?

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: Aide scripting pour plateforme parent

Message par Greg » 20 Août 2017 10:04

Coucou,

ben le bout de code à l'air bon mais il ne faut pas le mettre dans un update...

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            other.gameObject.transform.parent.SetParent(transform, true);
        }
    }
    void OnTriggerExit(Collider other)
    {
        if (other.tag == "Player")
        {
            other.gameObject.transform.parent.SetParent(null, true);
        }
    }
    }
}
Les "OnTrigger" sont des 'events' un peu comme ici sauf qu'ils ne sont pas déclenchés par une routine mais par une condition...

:merci:
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: Aide scripting pour plateforme parent

Message par Nemo67 » 20 Août 2017 11:00

J'ai changé le scripte sur la plateforme en rotation, je n'ai plus d'erreur de compilation, mais ça ne fonctionne pas.

Lorsque je fais comme Aiyor m'a expliqué plus haut "Is Trigger" coché sur la platforme mon fpscontroller passe directe à travers.
Lorsque j'encoche le "Is Trigger" le fpscontroller est de nouveau sur la plateforme en rotation mais ne tourne pas avec...

Dans le bout de code :

Code : Tout sélectionner

(other.tag == "Player")
"Player" c'est quoi ? Je suppose le nom de notre fpscontroller ? la où est attaché la main camera ?

Avatar de l’utilisateur
Aiyor
Messages : 24
Inscription : 14 Juin 2017 12:08

Re: Aide scripting pour plateforme parent

Message par Aiyor » 20 Août 2017 17:26

Nemo67 a écrit :
20 Août 2017 11:00
Lorsque je fais comme Aiyor m'a expliqué plus haut "Is Trigger" coché sur la platforme mon fpscontroller passe directe à travers.
Lorsque j'encoche le "Is Trigger" le fpscontroller est de nouveau sur la plateforme en rotation mais ne tourne pas avec...
Oui excuse moi c'est parce qu'il faut créer un Empty avec un collider en IsTrigger et l'arranger pour qu'il soit peu plus grand en hauteur de ta plateforme, tu met ensuit ta plateforme enfant de cet Empty (tu peux renommer ton Empty en "plateforme" et ta plateforme en "gfx" par exemple. Tu met ton script sur le niveau le plus haut dans l'arbo, donc sur ton Empty...

Dans mon screen, tu dois le mettre sur "PlateformeTournante" le script :

Image

Image

Nemo67 a écrit :
20 Août 2017 11:00
Dans le bout de code :

Code : Tout sélectionner

(other.tag == "Player")
"Player" c'est quoi ? Je suppose le nom de notre fpscontroller ? la où est attaché la main camera ?
C'est un "tag", tu peux retrouver ça dans l'inspector en haut . Par défaut, ton personnage, doit avoir "Untagged", tu lui colle "Player" pour que ça marche, c'est un tag par défault, il existera déjà. Mais si jamais il n'y ai pas, tu peux le créer (en, bas de la barre de défilement des tag, tu as "Add Tag")

Image



Edit :

Il faut modifier légèrement le script par contre :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
  Transform gfx;

    private void Start()
    {
        gfx = transform.Find("GFX").GetComponent<Transform>();
    }
    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            other.gameObject.transform.SetParent(gfx, true);
        }
    }
    void OnTriggerExit(Collider other)
    {
        if (other.tag == "Player")
        {
            other.gameObject.transform.SetParent(null, true);
        }
    }
}

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: Aide scripting pour plateforme parent

Message par Nemo67 » 27 Août 2017 10:27

Merci Aiyor. J'ai enfin eu un peu de temps pour tester.
Malheureusement le résultat n'est pas ce que j’attendais :pleur4: .

Des que mon Player rencontre l'empty avec le Trigger il est propulsé dans le ciel !!!
J'ai essayé en enlevant le scripte de rotation de la plateforme ; en principe il devrait pouvoir marcher dessus normalement mais la aussi le Player est éjecté en l'air (l'axe des y est sans cesse incrémenté j'ai l’impression).

Une question déjà par rapport à la rotation de la plateforme. Le scripte est juste à mettre sur le parent je pense ?
Dans ton scripte il n'y a pas d'Update c'est normal ?

Edit : j'ai refais une petite scène a partir de 0 en faisant abstraction de mon projet principal.
Ca fonctionne mieux. Le player saute sur la plateforme qui devient bien son parent. Le seul souci c'est qu'en sautant sur une autre plateforme ou sur le sol la camera fait n'importe quoi. Dans le lien que j'ai indiqué en début de post en anglais la personne a eu le même problème. Apparemment il faut injecter qq chose dans le fpscontroller au niveau du scipte de mouvement de la souris.

Pour revenir a mon problème j'ai fais l'acquisition de l'asset suivant qui est en fonction dans mon projet principal :
https://www.assetstore.unity3d.com/en/#!/content/79436:
Je pense qu'il y a surement un conflit avec les scriptes utilisés...ça va être coton pour faire fonctionner les 2 principes :roll:

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: Aide scripting pour plateforme parent

Message par Greg » 28 Août 2017 20:56

Pour les questions, oui le script de Aiyor est à mettre sur une plateforme avec enfant gfx comme sur le screenshot mais tu as du piger... et il faut minimiser les appels dans les Updates...

Nemo67 a écrit :
27 Août 2017 10:27
Le seul souci c'est qu'en sautant sur une autre plateforme ou sur le sol la camera fait n'importe quoi.
N'importe quoi... mais encore? Le player (fpscontroller) se 'déparente' bien?
Nemo67 a écrit :
27 Août 2017 10:27
Pour revenir a mon problème j'ai fais l'acquisition de l'asset suivant... ça va être coton pour faire fonctionner les 2 principes
euh... non le problème du post est le parentage d'une plateforme. Pour une compatibilté de l'asset, il faut ouvrir un autre post. Mais c'est spécifique et sans l'asset il ne sera pas toujours possible de répondre...

:merci:
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

Répondre

Revenir vers « Scripting »