2016-03-31 40 views
0

Farklı tipteki küreleri sürüklediğiniz ve bir şekil oluşturmak için bir araya getirdiğiniz bir oyun yapmaya çalışıyorum (herhangi bir yer çekimi olmadan). Ben birbirinden iki küre sürüklemek onlar birbirinden çukur gittiğinizdeUnity 3D OnMouseDrag çarpışması

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)); 

    } 

} 

: Nesneleri sürükleyerek için bu komut dosyasını kullanabilirsiniz. Nesnelere bir ritüel ekledim, onunla çok farklı şeyler denedim, ama hiçbir işe yaramadı. Her zaman birbirlerinden uzaklaşırlar VEYA hiç çatışmazlar. Buna herhangi bir tahammül mü? Bunu bir duvara koşan bir insan gibi düşünün. Kişi duvara sıçramaz, sadece hareket etmeyi bırakır.

+1

Sert antikorları kinetik olarak mı değiştirdiniz? –

+0

@ ŁukaszMotyczka Bunu denedim, havada yüzüyorlardı. – BelgianWizard

cevap

5

Bazı garip davranışlar elde etmenin (birbirini izleyen nesneler/nesneler görmezden gelme) nedeni, nesnenin Rigidbody bileşenini işlemek yerine, doğrudan transform.position ayarlıyor olmanızdır. Bir nesneyi konumlandırırken fiziği de hesaba katmak için Rigidbody.MovePosition() kullanın.

Şimdi, nesnelerin birbirini takip ettiğini görmek, anormal bir fizik davranışı değildir - çünkü nesnelerin birbirine yapıştığı zaman (kodunuzla sık sık yapacakları gibi), birbirleri üzerine bir itme kuvveti uygularlar. Newton'un üçüncü yasası gibi). Çakışan en kısa sürede onları dondurmak isterseniz, OnCollisionEnter() etkinliğine Rigidbody.isKinematic = true ayarlamayı deneyin.

hep birlikte bu getiren sınıf gibi görünebilir:

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; 
    } 
} 

Umut bu yardımcı olur! Herhangi bir sorunuz olursa haberim olsun.

+0

Teşekkür ederim, eve döndüğümde bunu deneyeceğim. – BelgianWizard

+0

Nesneleri sürüklemek, tıpkı daha önce olduğu gibi mükemmel çalışır. Sadece çarpışma hiç işe yaramıyor. DÜZENLEME: Gerçekten hiçbir şey değişmedi. EDIT2: İlk saniyede onları çarptığımda işe yarıyor. Bundan sonra onlar birbirinin içine girerler – BelgianWizard

+0

@BelgianWizard İlk çarpışmadan sonra nesneyi tamamen dondurmak (yani, tüm fizikleri ve başka bir fare sürüklemeyi) niyetiniz nedir? Yoksa durduktan sonra bile sürüklenmesini istiyor musunuz? (Eğer durum ikincisiyse, uygulamanız muhtemelen önemli ölçüde değişecektir.) – Serlite