Bỏ qua va chạm với một số đối tượng trong các bối cảnh nhất định


14

Tôi đang làm một trò chơi đua xe với những chiếc xe trong Unity. Chiếc xe có một powerup tăng / nitro. Trong khi tăng tốc, tôi sẽ không muốn bị lệch khi va chạm với zombie, nhưng tôi muốn bị lệch khi va chạm với tường.

Mặt khác, tôi không muốn bỏ qua va chạm với zombie, bởi vì tôi vẫn muốn đánh chúng khi va chạm.

Tôi nên xử lý việc này như thế nào? Về cơ bản, những gì tôi muốn là cho chiếc xe không quay khi va chạm với một số đối tượng nhất định.

Câu trả lời:


7

Xem xét thao tác các lớp của bạn trong thời gian chạy.

Kích hoạt / vô hiệu hóa va chạm cho các đối tượng nhất định với toàn bộ các lớp

Vật lý.IgnoreCollisionVật lý.IgnoreLayerCollision cho phép bạn vô hiệu hóa các va chạm giữa hai máy va chạm và giữa hai lớp tương ứng.

Nếu bạn muốn loại trừ một máy va chạm cụ thể khỏi các va chạm, không có cách nào được xây dựng để làm điều đó. Nếu bạn đang sử dụng các cứng nhắc không động học với các trình thu thập không kích hoạt, sẽ luôn có một phản hồi ngay cả khi bạn cố gắng lọc các phản hồi bằng thẻ.

Cách chúng tôi thực hiện điều này trong dự án của chúng tôi là tạo ra một lớp có tên là "Void". Void không va chạm với bất cứ điều gì cả.

Bây giờ bạn có thể tạm thời vô hiệu hóa xung đột của máy va chạm bằng cách đặt lớp của nó thành "Vô hiệu" và bật lại bằng cách khôi phục lớp cũ của nó.

Đây là ý chính:

int oldLayer = -1;
int voidLayer;

void Start()
{
    voidLayer = LayerMask.NameToLayer("Void");
}

void DisableCollider(Collider col)
{
    oldLayer = col.gameObject.layer;
    col.gameObject.layer = voidLayer;
}

void EnableCollider(Collider col)
{
    col.gameObject.layer = oldLayer;
}

Chúng tôi đã làm điều này một cách cụ thể bởi vì việc kích hoạt và vô hiệu hóa các máy va chạm là con của những người cứng nhắc có thể thực sự làm hỏng mọi thứ trong một số trường hợp. Vì vậy, bạn không thể vô hiệu hóa một phần của máy va chạm cứng, nhưng bạn có thể trao đổi một cách đáng tin cậy xung quanh lớp của một trong các bộ phận va chạm ghép.

Bây giờ tình hình cụ thể của bạn

Để giảm va chạm zombie gây ảnh hưởng đến xe của bạn, hãy xem xét việc kích hoạt zombie cứng nhắc của bạn hoặc làm cho khối lượng của chúng rất nhỏ (như float.Epsilon), vì vậy tác động không ảnh hưởng đến động lượng của xe. Khi va chạm, bạn cũng có thể thực hiện chuyển đổi lớp này, để các va chạm tiếp theo không được kích hoạt, ngay cả khi lần đầu tiên tác dụng một lực không đáng kể lên thân xe.

Bạn thậm chí có thể chuyển chúng sang một lớp không va chạm với xe.

Bạn cũng có thể đặt một máy va chạm khác vào zombie được kích hoạt khi chạy qua. Bằng cách này, bạn có thể giả mạo lực tác động OnTrigger Entry. Bạn không thể có được chính xác với nó, nhưng bạn có thể ước chừng nơi các quy tắc liên lạc có thể đủ tốt để ném zombie vào một nơi vui vẻ.

Bạn phải tự hỏi:

  • Tôi có muốn đánh bại lũ thây ma đang chạy xung quanh bằng xe của mình không, hay chúng chỉ nên đóng một phim hoạt hình chết chóc?

  • Tôi có quan tâm nếu vận tốc và tốc độ góc của chiếc xe bị ảnh hưởng theo những cách nhỏ hơn bằng cách đánh zombie không?


1

Gọi Vật lý.IgnoreCollision trên tất cả các zombie, cũng chuyển qua chức năng đối tượng người chơi, khi xe bắt đầu tăng tốc. Điều này sẽ khiến Unity không phản ứng với bất kỳ va chạm nào giữa người chơi và zombie. Khi chiếc xe đã hoàn thành việc tăng tốc, hãy gọi Physics.IgnoreCollisionlại cho mỗi zombie, chuyển nó vào đối tượng người chơi và falsegây ra phản ứng va chạm để bắt đầu lại.


Nhưng điều đó có nghĩa là họ sẽ không va chạm với bất cứ điều gì khác.
Paul Manta

Tôi sẽ làm một số nghiên cứu thêm. Điều duy nhất tôi có thể nghĩ là: có lẽ bạn có thể bỏ qua vụ va chạm bằng cách trả về false từ OnCollision Entry?
Wackidev

@Wackidev Đây không phải là trường hợp.
Rhys van der Waerden

@Paul Tôi đã chỉnh sửa câu trả lời của mình.
Wackidev

0

Tôi đoán bạn có thể kiểm tra tên của các đối tượng hoặc thêm giá trị tên vào các lớp đối tượng sau đó kiểm tra xem?

bool boosting = false; //need a trigger in the game to set this to true.

function OnCollisionEnter(theCollision : Collision)
{   
    if (boosting == true)
    {
        if(theCollision.gameObject.name == "Zombie")
        {
              Debug.Log("Zombie hit during boost");              
        }
        else if(theCollision.gameObject.name == "Wall")
        {
              Debug.Log("Wall hit during boost");            
        }
    }
    else 
    {
        if(theCollision.gameObject.name == "Zombie")
        {
              Debug.Log("Zombie hit not in boost");              
        }
        else if(theCollision.gameObject.name == "Wall")
        {
              Debug.Log("Wall hit not in boost");                
        }
    }
}

Sau đó, chỉ cần có một biến khác mà bạn có thể sử dụng để kiểm tra tăng và thêm nó vào kiểm tra.

EDIT: đã thêm biến này vào.


Anh ta biết làm thế nào để được thông báo về va chạm; anh ta chỉ không muốn bất kỳ hành động nào được thực hiện như là kết quả. Anh ta muốn vô hiệu hóa phản ứng va chạm tích hợp trong một số trường hợp nhất định.
Wackidev

Chắc chắn bất cứ điều gì xảy ra khi va chạm được kích hoạt đi giữa các dấu ngoặc? Tôi chưa từng sử dụng sự thống nhất trước đây nên tôi không biết nhưng trong cocos2d và XNA đã làm như vậy.
Lewis

Trên thực tế, Unity tự xử lý các va chạm thông qua PhysX. OnCollision Entry chỉ là một phương thức thông báo; nó không được thiết kế để xử lý phản ứng va chạm thực tế.
Wackidev

0

Tôi giả sử bạn đang sử dụng công cụ vật lý để thực hiện 'độ lệch' tự động dựa trên hình dạng / khối lượng khi mọi thứ va chạm với nhau? Nếu đó là trường hợp, sau đó thay đổi khối lượng zombie của bạn thành một giá trị rất nhỏ và chúng sẽ không ảnh hưởng đến chiếc xe.


0

Có hai loại câu trả lời ở đây:

  1. Bỏ qua hoặc vô hiệu hóa va chạm
    • Những giải pháp này sẽ không giải quyết được vấn đề, anh ta muốn zombie bay đi khi bị tấn công.
  2. Thay đổi khối lượng:
    • Đây là một cách tiếp cận tốt. Đừng quên thay đổi quán tính tương ứng.
      • Bạn cũng có thể thay đổi khối lượng xe và quán tính khi tăng tốc (chúng tôi làm điều này để giảm tác động của tất cả các vật thể không động học lên xe khi tăng tốc)
      • Điều này sẽ không ảnh hưởng đến đường hoặc tường giả định rằng đó là động học.

Hi vọng điêu nay co ich!


Hai trong số các câu trả lời hiện có từ sáu năm trước đã đề xuất cách tiếp cận dựa trên khối lượng mà bạn đề xuất ở đây. Có một số chiến lược mới mà bạn muốn thêm?
DMGregory

Tôi xin lỗi, tôi chưa thể upvote và tôi muốn đảm bảo rằng Paul Manta không dẫn dắt lạc lối.
dwuLive
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.