IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unity Discussion :

Problème Collider entre objet instancié et Terrain


Sujet :

Unity

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut Problème Collider entre objet instancié et Terrain
    Bonjour, je rencontre un problème de Collider entre deux objets de ma scène.

    Le missile que j' instancie au cours du jeux passe à travers mon terrain.

    Je me suis penché sur plusieurs raisons que j'ai pu retrouvé sur internet.

    1 - Problème de Collider

    J'ai vérifié entre plusieurs Collider, je suis passé en mesh collider, et par la suite je suis repassé en capsule collider qui semble être plus optimisé quand le jeu contient énormément d'objets.


    2 - Problème d'animation

    Je n'ai réalisé aucun test mais d'après certains internautes le problème pourrait venir de l'activation d'animations ?

    J'ai vérifié le collider de mon missile en me déplacant et me mettant sur la trajectoire la collision a bien lieu.

    La seule collision qui ne passe pas est celle de mon missile.



    Nom : 1.png
Affichages : 810
Taille : 64,3 Ko

    Nom : 2.png
Affichages : 783
Taille : 76,8 Ko

    Nom : 3.png
Affichages : 961
Taille : 576,7 Ko

    [ATTACH=CONFIG]200832
    3[/ATTACH]
    Images attachées Images attachées  

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Mes tests me laissent penser qu'il ne s'agit pas de l'animation ...

    Si quelqu’un à une idée à proposer je suis preneur

  3. #3
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Bonjour Quentin,

    Dans ton cas, les animations n'ont rien a voir avec tes histoires de collisions. D'ailleurs j'ai du mal à voir le rapport en fait.
    Pour le reste, malgré tes screenshots, certains points restent à éclaircir.
    - la collision de ton missile avec le terrain est testée comment : Par un test Raycast ou par le biais des callback OnColliderXXX() ?
    - dans le second cas, ton missile possède-t-il un rigidbody alors ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    J'ai effectué mes tests avec OnCollider.

    Un rigidbody est bien présent avec une masse à 1, gravity non utilisé, et en Continious Dynamic.

  5. #5
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Comment le déplacement du missile est t'il effectué ?

    Il ne faut pas le déplacer avec son transform, mais avec une force.

    http://docs.unity3d.com/ScriptRefere....AddForce.html

  6. #6
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Bonjour,

    Pour la détection des collisions, le fait de passer par les transform ne devrait pas poser pas de soucis.
    Donc si le terrain a bien son collider d'activé (se que laisse penser ton screen), que ton missile possède bien le couple rigidbody/collider, tes callback OnCollider devraient détecter la collision.
    Après, on a pas les script que tu utilises.
    Ton missile il fait quoi, il passe à travers le terrain ? (se qui arrive aussi parfois, c'est qu'un objet à vitesse trop élevé passe à travers sans que la détection ai pu se faire, le fait d'être en ContiniusDyn ne réglant pas à 100% ce genre de soucis).

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    En effet il passe à travers le terrain. Je vais essayé de baisser la vitesse et de vérifier pour les transforms.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    using UnityEngine;
    using System.Collections;
     
    public class MissileController3D : MonoBehaviour {
     
        public GameObject childMissileModel, childSmokeGameObject, explosionPrefab, target;
        public float maxSpeed; // Max speed - tweak as needed
        public float kProportionalConst = 0.45f; // Proportional constant - 0f - 1f (set this to tweak performance of missile) lower is more "swingy" higher is more "direct/concise"
        public float fuelAmount = 4.0f;
        public bool usesFuel;
        public bool destroyTargetOnCollision;
     
        private Vector3 desiredVelocity; // our missiles desired velocity
        private Vector3 subValue;
        private Vector3 error;
        private Vector3 currentVelocity;
        private Vector3 sForce; // Steering force - force by which to "steer" the missile in the direction it wants to go.
     
        public Transform missileTransform; // Reference that get's found on missile start, used to rotate the missile sprite, and critical to match up the smoke trail emission to the back of the missile sprite.
     
        // Use this for initialization
        void Start()
        {
            subValue = new Vector3(0, 0, 0);
            error = new Vector3(0, 0, 0);
            currentVelocity = new Vector3(0, 0, 0);
            sForce = new Vector3(0, 0, 0);
        }
     
        void OnTriggerEnter(Collider other)
        {
            if (target != null)
            {
                if (other.gameObject == target)
                {
                    Debug.Log("Target collided.");
     
                    // Do whatever you want to your target GameObject here.
                    if (destroyTargetOnCollision)
                    {
                        Destroy(other.gameObject);
                    }
     
                    // Destroy this missile.
                    GracefullyDestroyMissile(gameObject.transform.position);
                }
            }
        }
     
        public virtual void GracefullyDestroyMissile(Vector3 position)
        {
            // Play hit effect, and create a randomly sized small explosion using the explosion prefab.
            AudioSource.PlayClipAtPoint(GetComponent<AudioSource>().clip, position);
     
            // If we have an explosionPrefab prefab attached, then summon the explosionPrefab at the point where the missile was destroyed.
            if (explosionPrefab != null)
            {
                // Note, you should ideally use Object Pooling rather than instantiation for mass missile use.
                Instantiate(explosionPrefab, transform.position, Quaternion.identity);
            }
     
            // Release the child objects of this missile. (This is done so that the smoke particle effect and gameobject persist, leaving a trail of smoke behind where the missile has travelled.
            transform.DetachChildren();
     
            // Disable the missile renderer (as the sprite sits on a child object of the root missile, in order to have it's rotation handled correctly in conjunction with the smoke trail)
            childMissileModel.GetComponent<Renderer>().enabled = false;
     
            // Stop the smoke trail by setting it's emission rate to 0 until it is destroyed.
            childSmokeGameObject.GetComponent<ParticleSystem>().emissionRate = 0f;
     
            // We want to schedule the left over smoke/child objects for destruction - we don't want them hanging around forever! So we use a simple Invoke with a delay.
            var missileCleanupReference = (MissileCleanup)missileTransform.gameObject.GetComponent(typeof(MissileCleanup));
            missileCleanupReference.ScheduleDestroyLeftovers();
     
            // Destroy the root missile object that was detached from it's children.
            Destroy(gameObject);
        }
     
        // Update is called once per frame
        void Update()
        {
            if (target != null)
            {
                if (usesFuel)
                {
                    // If the missile is set to use fuel, then it will destroy itself once fuel runs out.
                    fuelAmount -= Time.deltaTime;
                    if (fuelAmount <= 0f) GracefullyDestroyMissile(transform.position);
                }
     
                subValue = target.transform.position - transform.position;
     
                // Normalize the subtracted value
                subValue.Normalize();
     
                // Multiply the normalized value by the missile's maxSpeed to get the desired Velocity.
                desiredVelocity = subValue * maxSpeed;
     
                // Calculate missile error
                error = desiredVelocity - currentVelocity;
     
                // The force we apply to minimize our error is our error times our constant called kProportionalConst
                sForce = error * kProportionalConst;
     
                // Assign the current velocity by adding itself to steering force * deltaTime
                currentVelocity = currentVelocity + (sForce * Time.deltaTime);
     
                // Move the missile according to all of the above calculation on the 2D plane
                transform.Translate(new Vector3(currentVelocity.x, currentVelocity.y, currentVelocity.z));
     
                // Handle rotation of the missile model based on where it is headed
                var rotation = Quaternion.LookRotation(target.transform.position - missileTransform.position);
                missileTransform.rotation = (Quaternion.Slerp(missileTransform.rotation, rotation, Time.deltaTime * 4.5f));
            }
            else
            {
                // Destroy the missile if it's target is deleted or destroyed
                AudioSource.PlayClipAtPoint(GetComponent<AudioSource>().clip, gameObject.transform.position);
                GracefullyDestroyMissile(transform.position);
            }
        }
    }

  8. #8
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Pour ce qui est relatif à la physique il faut utiliser FixedUpdate plutôt qu'Update

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    La modification a été effectuée.

    Pour ma fonction OnTriggerEnter je ne rentre jamais en collision, que ce soit avec l'ennemie comme avec la map au final.

    Edit : Ce problème était du au mesh collider, je l'ai remplacé par le boxe collider qui semble plus efficace...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    J'ai partiellement trouvé.

    Le problème vient du modèle attaché à mon prefabs.

    Du coup à l'initialisation du prefabs j'ai rajouté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		colidMissile = childMissileModel.AddComponent <BoxCollider>();
    		rigiMissile = childMissileModel.AddComponent <Rigidbody> ();
    		rigiMissile.useGravity = false;
    Un problème subsiste, les missiles partent bien au début et ensuite ils perdent "la tête" je m'entends qu'ils disposent d'une trajectoire correcte et qu'à un moment donnée ils font n'importes quoi et partent dans le ciel.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/05/2010, 16h48
  2. [N-Tier] Problème transfert d'objets entre les couches
    Par Hajer.B dans le forum Autres
    Réponses: 1
    Dernier message: 30/08/2008, 10h48
  3. problème objets instanciés
    Par polo42 dans le forum Général Python
    Réponses: 3
    Dernier message: 18/06/2007, 15h35
  4. Problème chevauchement entre objets
    Par lesafir dans le forum 2D
    Réponses: 2
    Dernier message: 07/06/2007, 12h46
  5. Problème de cloisonnement entre plusieurs instances
    Par nostub dans le forum Langage
    Réponses: 2
    Dernier message: 05/12/2006, 18h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo