2016-03-31 2 views
0

J'essaie de faire un jeu où vous faites glisser différents types de sphères et les assembler pour former une figure (sans gravité). Pour faire glisser les objets que j'utilise ce script:Unity 3D OnMouseDrag collision

using UnityEngine; 
using System.Collections; 

public class Test : MonoBehaviour { 

    void OnMouseDrag() 
    { 
     float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z; 
     transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen)); 

    } 

} 

Quand je fais glisser deux sphères eachother ils vont eachother creux. J'ai ajouté un rigibody aux objets, j'ai essayé BEAUCOUP de choses différentes avec, mais rien ne semblait fonctionner. Ils semblent toujours rebondir l'un l'autre OU ils ne se heurtent pas du tout. Toute solution à cela? Imaginez ceci comme une personne qui court vers un mur. La personne ne rebondit pas sur le mur, il s'arrête juste de bouger.

+1

Changer les corps rigides en cinétique? –

+0

@ ŁukaszMotyczka J'ai essayé cela, ils flottaient tous dans les airs. – BelgianWizard

Répondre

5

La raison pour laquelle vous obtenez un comportement étrange (objets se coupant/ignorant les uns les autres) est que vous définissez transform.position directement, plutôt que de manipuler le composant Rigidbody de l'objet. Utilisez Rigidbody.MovePosition() pour prendre également en compte la physique lors du positionnement d'un objet. Maintenant, voir des objets rebondir n'est pas un comportement physique anormal - car lorsque les objets se pincent les uns les autres (comme ils le feront souvent avec votre code), ils exercent une force de répulsion les uns sur les autres (un peu comme la troisième loi de Newton). Si vous souhaitez les geler dès qu'ils se rencontrent, essayez de définir Rigidbody.isKinematic = true dans l'événement OnCollisionEnter().

Apporter tout cela ensemble, votre classe pourrait ressembler à:

public class Test : MonoBehaviour { 

    Rigidbody rb; 

    void Start() 
    { 
     // Store reference to attached Rigidbody 
     rb = GetComponent<Rigidbody>(); 
    } 

    void OnMouseDrag() 
    { 
     float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z; 

     // Move by Rigidbody rather than transform directly 
     rb.MovePosition(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen))); 
    } 

    void OnCollisionEnter(Collision col) 
    { 
     // Freeze on collision 
     rb.isKinematic = true; 
    } 
} 

Hope this helps! Faites moi savoir si vous avez des questions.

+0

Merci beaucoup, je vais essayer quand je rentre à la maison. – BelgianWizard

+0

Faire glisser les objets fonctionne parfaitement, comme avant. Seule la collision ne fonctionne pas du tout. EDIT: Rien n'a vraiment changé. EDIT2: Dans la première seconde quand je les rencontre, ça marche. Immédiatement après cela ils vont dans l'autre – BelgianWizard

+0

@BelgianWizard Est-ce que votre intention est de geler complètement l'objet (c'est-à-dire d'ignorer toute la physique et tout autre déplacement de la souris) après la collision initiale? Ou voulez-vous toujours qu'il soit draggable même après qu'il s'arrête? (Si le cas est le dernier, votre implémentation devra probablement changer de manière significative.) – Serlite