Làm cách nào tôi có thể ngăn các cơ thể cứng nhắc di chuyển qua nhau bằng vật lý tích hợp của Unity?


8

Tôi đang cố gắng tạo ra một trò chơi trong đó các vật thể có thể được kéo, nhưng tôi gặp rắc rối với vật lý. Với những cơ thể cứng nhắc có khối lượng tương tự nhau, đôi khi chúng đẩy nhau khi bị kéo và gây ra những chuyển động không mong muốn. Đây là một bản demo .

Tôi muốn làm điều này chỉ bằng vật lý tích hợp của Unity 3D .

Trong bản demo, bạn có thể sử dụng chuột để nhấp và kéo các đối tượng. Các xi lanh đều có các máy va chạm hộp và khối lượng 10000. Chúng cũng có các ràng buộc khác nhau tùy thuộc vào hướng của chúng (không ai có thể xoay và tất cả đều bị ràng buộc theo x hoặc y). Hình cầu có khối lượng bằng 1, một máy va chạm hình cầu và ràng buộc az.

Các hình cầu và hình trụ tương tác tốt. Tuy nhiên, kéo các hình trụ qua nhau gây ra giao lộ. Tôi không muốn cái này!

Các hình trụ có nội suy được đặt thành 'Nội suy' và phát hiện va chạm được đặt thành 'Liên tục'. Tôi đã ném tập lệnh 'DontGoThroughThings' lên tất cả các trụ, nhưng dường như nó không làm gì cả. Đối với việc thiết lập vận tốc của các vật cứng, tôi đã sử dụng cả hai dòng sau với kết quả cơ bản giống nhau:

rb.AddForce(speed * diff * Time.deltaTime - rb.velocity, ForceMode.VelocityChange);
//rb.velocity = speed * diff * Time.deltaTime;

Không viết mã phát hiện va chạm của riêng tôi, tôi hết ý tưởng. Có một thiết lập đơn giản hoặc một cái gì đó tôi đã bỏ lỡ?

Với bối cảnh được giải thích, đây là một câu hỏi chính xác hơn: "Làm thế nào tôi có thể khiến các hình trụ trong bản demo của mình không di chuyển qua nhau?"


Liệu việc giảm khối lượng của xi lanh có làm nên sự khác biệt?
MGB

Không, nó sẽ khiến họ đi qua dễ dàng hơn tôi nghĩ. Ngoài ra nếu khối lượng tương tự như hình cầu, hình cầu cũng sẽ bắt đầu đi qua các hình trụ.
Jeff

Điều gì làm cho bạn nghĩ rằng điều này? Đó là khi tỷ lệ khối lượng lớn hơn mà động cơ vật lý gặp nhiều rắc rối hơn với độ chính xác.
MGB

Bởi vì tôi đã thử nó: PI có thể tải lên bản demo trong đó tất cả số lượng được đặt thành 1 nếu bạn muốn.
Jeff

Một điều tôi nghĩ là nó có thể là do cách tôi thay đổi vận tốc. Thay vào đó, tôi sẽ cố gắng thay đổi để ép buộc
Jeff

Câu trả lời:


2

Không cần nhìn vào dự án / mã của bạn, tôi muốn đề xuất điều này:

private bool _mouseOverObject = false;

void Update(){
    if(_mouseOverObject && Input.GetMouseDown(0){
        rigidbody.isKinematic = false; //Let Unity Physics affect the item.
    } else {
        rigidbody.isKinematic = true; //Let it affect other physics but not be affected itself
    }
}

void OnMouseOver(){
    _mouseOverObject = true;
}

void OnMouseExit(){
    _mouseOverObject = false;
}

Nó sẽ cho phép bạn hạn chế vật lý nhưng trong phạm vi và động cơ vật lý của Unity. Bạn có thể lắc lư theo kịch bản để làm cho nó chỉ khóa một đối tượng cần di chuyển, nhưng điều này sẽ giúp bạn bắt đầu.


0

Bạn muốn thiết lập phát hiện va chạm Continuous Dynamiccho các đối tượng chuyển động nhanh. Continuousđược sử dụng cho các đối tượng chuyển động tĩnh hoặc chậm mà Continuous Dynamiccác đối tượng va chạm với nhau. Xem ở đây .

(Hãy nhớ rằng phát hiện va chạm liên tục là tốn kém, vì vậy hãy sử dụng nó một cách tiết kiệm)


Tôi nhận được kết quả tương tự khi tôi đặt từng hình trụ thành Động liên tục. Đó có phải ý của bạn?
Jeff
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.