Tôi có thể sử dụng hai Hộp Va chạm trên cùng một GameObject không?


7

Tôi có hai Hộp Va chạm trên cùng một GameObject. Tôi không muốn các Collision Box được kích hoạt. Tôi muốn các Hộp Va chạm trên GameObject thực tế chứ không phải con của nó.

Ví dụ, nếu tôi muốn kiểm tra một headshot. Lý do của tôi không muốn kích hoạt là một kích hoạt đã được sử dụng. Lý do của tôi không muốn trẻ em là vì sự sạch sẽ. Tôi hiểu có những công việc xung quanh. Tôi đã tự hỏi nếu có một cách tiếp cận trực tiếp hơn.

Khi có va chạm, làm cách nào tôi có thể kiểm tra Collision Box nào bị bắn trúng?


Bạn đã kiểm tra va chạm bằng cách in chưa? Bạn chỉ cần in một cái gì đó trong khối OnCollision Entry ...
Shraddha Patel

Xin chào. Tôi có thể biết tại sao bạn cần biết Collision Box bị tấn công không?
xitnesscomplex

Bạn không nhất thiết cần nhiều máy va chạm. Tùy thuộc vào yêu cầu của bạn là gì, nhiệm vụ có thể được thực hiện với một máy va chạm duy nhất. Bạn có thể cung cấp thêm một số chi tiết?
SanSolo 7/12/2015

Ví dụ, nếu tôi muốn kiểm tra một headshot. Lý do của tôi không muốn kích hoạt là một kích hoạt đã được sử dụng. Lý do của tôi không muốn trẻ em là vì sự sạch sẽ. Tôi hiểu có những công việc xung quanh. Tôi đã tự hỏi nếu có một cách tiếp cận trực tiếp hơn.
Evorlor 7/12/2015

Tôi không nghĩ có một cách tiếp cận trực tiếp. Tôi đang nghĩ về việc lấy Khoảng cách như một công việc xung quanh.
xitnesscomplex

Câu trả lời:


0

Tôi biết một cách để làm điều này, nếu bạn tạo các máy va chạm của mình theo chương trình. Xem mã nguồn sau:

using UnityEngine;
using System.Collections.Generic;

public class MultipleColliders : MonoBehaviour {

    //Enumeration to tell us what a collider is for
    enum ColliderType
    {
        Head,
        Body
    }

    //A quick lookup for our colliders associated with this gameobject
    Dictionary<Collider2D, ColliderType> Colliders;

    void Start () {
        InitColliders ();
    }

    //Programmatically create our colliders
    void InitColliders()
    {       
        Colliders = new Dictionary<Collider2D, ColliderType> ();

        BoxCollider2D boxCollider = transform.gameObject.AddComponent (typeof(BoxCollider2D)) as BoxCollider2D;
        boxCollider.offset = new Vector2 (0, -0.5f);
        boxCollider.size = new Vector3 (0.5f, 1f);
        Colliders.Add (boxCollider, ColliderType.Body);

        CircleCollider2D circleCollider = transform.gameObject.AddComponent (typeof(CircleCollider2D)) as CircleCollider2D;
        circleCollider.offset = new Vector2 (0, 0.5f);
        circleCollider.radius = 0.5f;
        Colliders.Add (circleCollider, ColliderType.Head);
    }

    //Check if our colliders were hit
    void Update () {

        //Raycast mouse cursor when pressed to simulate a hit for our example
        if (Input.GetMouseButtonDown (0)) {

            Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);            
            RaycastHit2D[] hit = Physics2D.RaycastAll (mousePosition, Vector2.zero);

            //lookup our hits to see what was hit
            for (int i = 0; i < hit.Length; i++)
            {
                if (Colliders.ContainsKey(hit[i].collider)) {
                    Debug.Log ( System.Enum.GetName( typeof(ColliderType), Colliders[hit[i].collider]) + " HIT!");              
                }
            }           
        }       
    }
}

Vì vậy, về cơ bản, làm theo cách này, sẽ cung cấp cho bạn các yêu cầu bạn cung cấp. Nó sẽ cho phép một gameobject chứa nhiều colliders mà không cần phải là một đối tượng con.

Nó cũng sẽ có thể cho bạn biết những gì máy va chạm đã bị bắn trúng.

Hãy cho tôi biết nếu bạn có câu hỏi về việc thực hiện này.


Cảm ơn, nhưng việc thêm Colliders theo lập trình sẽ không hiệu quả với tôi.
Evorlor 7/12/2015

3
Trong trường hợp đó, bạn nên sử dụng các đối tượng con. Nếu không, sẽ rất khó để phân biệt từng máy va chạm với nhau. Một tùy chọn khác, có thể là mở rộng lớp máy va chạm và tạo lớp của riêng bạn, trong đó bạn có thể thêm một thuộc tính mới để phân biệt máy va chạm.
jgallant

Hmmm ... tôi chưa bao giờ nghĩ đến việc mở rộng Thành phần Collider. Điều đó có thể không? Tôi thích nó.
Evorlor 7/12/2015

2
Có, tuy nhiên, điều này không dễ dàng, vì bạn sẽ cần phải mở rộng từ Collider2D, và không phải bất kỳ trình thu thập được xác định trước nào. Cá nhân tôi chưa từng làm điều này trước đây, nhưng từ những gì tôi có thể thu thập được, đây không phải là một nhiệm vụ đơn giản.
jgallant

0

Tôi khuyên bạn nên tạo một đối tượng trò chơi trống mà cả cha mẹ đều là đối tượng trò chơi cho toàn bộ kẻ thù và một đối tượng thứ hai cho người đứng đầu. Sau đó, bạn có thể viết một tấm séc dựa trên viên đạn giao với đầu và đi từ đó.

using UnityEngine;
using System.Collections;

public Class BulletScript : MonoBehaviour {

public Transform bullet;
//tag as "Bullet"

void Start(){
  bullet = transform;
}

void OnTriggerEnter (Collider other){
   if (other.gameObject.CompareTag("Head"){
     Debug.Log("Headshot.");
   }

   if (other.gameObject.CompareTag("Enemy"){
      Debug.Log("Not a head shot.");
   }
 }
}

0

Nếu bạn muốn chỉ có một GameObject cho nhân vật của mình, bạn không thể thêm nhiều Colliders cùng loại vào GameObject của mình và vẫn có thể truy cập tất cả chúng trong các tập lệnh của bạn (chỉ có thể truy cập theo thứ tự các thành phần đầu tiên). Tuy nhiên, bạn CÓ THỂ thêm nhiều Colliders loại KHÁC trong khi vẫn duy trì khả năng truy cập. Trong trường hợp của bạn, bạn có thể thêm CapsuleCollider hoặc BoxCollider cho cơ thể và SphereCollider cho đầu. Kịch bản để truy cập các Colliders này sẽ diễn ra như sau:

using UnityEngine;
using System.Collections;

public class BulletScript : MonoBehaviour {

CapsuleCollider bodyCollider; //OR BoxCollider bodyCollider;
SphereCollider headCollider;

void Start () 
{
    bodyCollider = desiredGameObject.GetComponent<CapsuleCollider> (); //OR bodyCollider = gameObject.GetComponent<BoxCollider> ();
    headCollider = desiredGameObject.GetComponent<SphereCollider> ();
}

void OnTriggerEnter (Collider other)
{
    if (other == bodyCollider)
    {
        //This happens when the body is hit
    }
    if (other == headCollider)
    {
        //This happens when the head is hit
    }
}

Kịch bản này sẽ được đính kèm vào dấu đầu dòng của bạn (đảm bảo cũng thêm Trình kích hoạt Trình biên dịch). Phương thức OnTrigger Entry sẽ kiểm tra xem có bất kỳ Trình va chạm nào đã vào Trình kích hoạt trình kích hoạt của viên đạn không. Các câu lệnh if kiểm tra Collider nào đã nhập vào Trình kích hoạt Collider. Giải quyết vấn đề.

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi hoặc đề nghị.


-1

Sau một số nghiên cứu, tôi đã tìm thấy một cách dễ dàng để làm điều này mà không cần bất kỳ cách giải quyết nào.

Khi tạo Colliders, sử dụng các tên khác nhau trong mỗi cái, như đầu, thân, chân, tay. Sau đó, trên phương thức OnCollision Entry, bạn chỉ cần kiểm tra tất cả các điểm liên lạc.

void OnCollisionEnter(Collision col)
{
    foreach (ContactPoint contact in col.contacts)
    {
        Debug.Log(contact.thisCollider.name + " hit " + contact.otherCollider.name);

        if (contact.thisCollider.name == "HitBoxHead") {
            Debug.Log("Head Shot");
        }
    }
}
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.