بدست اوردن مختصات گوشه های باکس کُلایدر "box colider" در یونیتی

بسم الله الرحمن الرحیم

بدست اوردن مختصات گوشه های باکس کلایدر برای من که خیلی کاربرد داشته امیدوارم بدرد شما هم بخوره .

کلایدر سه بعدی BoxColider

اگر از box colider سه بعدی استفاده می کنید کافیه از این کد استفاده کنید(البته کد ها داخل سایت ویرگول بخاطر اندازه یکم نامرتب نشون داده میشن)

این کد به صورت نوشتاری در زیر این عکس موجود است
این کد به صورت نوشتاری در زیر این عکس موجود است


کد زیر یک گیم ابجکت میگرد و مختصات هر هشت گوشه باکس کلایدر چسبیده به گیم ابجکت را در قالب یک اریه از وکتور3 "vector3" بر میگرداند.

 public static Vector3[] GetColiderCorners(GameObject obj)
        {
            if (obj.transform.GetComponent<BoxCollider>() != null)
            {
                Vector3[] vertices = new Vector3[8];
                BoxCollider b = obj.GetComponent<BoxCollider>();
                vertices[0] = obj.transform.TransformPoint(b.center + new Vector3(-b.size.x, -b.size.y, -b.size.z) * 0.5f);
                vertices[1] = obj.transform.TransformPoint(b.center + new Vector3(b.size.x, -b.size.y, -b.size.z)  * 0.5f);
                vertices[2] = obj.transform.TransformPoint(b.center + new Vector3(b.size.x, -b.size.y, b.size.z)   * 0.5f);
                vertices[3] = obj.transform.TransformPoint(b.center + new Vector3(-b.size.x, -b.size.y, b.size.z)  * 0.5f);
                vertices[4] = obj.transform.TransformPoint(b.center + new Vector3(-b.size.x, b.size.y, -b.size.z)  * 0.5f);
                vertices[5] = obj.transform.TransformPoint(b.center + new Vector3(b.size.x, b.size.y, -b.size.z)   * 0.5f);
                vertices[6] = obj.transform.TransformPoint(b.center + new Vector3(b.size.x, b.size.y, b.size.z) * 0.5f);
                vertices[7] = obj.transform.TransformPoint(b.center + new Vector3(-b.size.x, b.size.y, b.size.z) * 0.5f);
                return vertices;
            }
            Debug.LogError(&quotgame objcet should have boxcolider&quot);
            return null;
        }

کلایدر دوبعدی BoxColider2D

اما برای گرفت مختصات گوشه های باکس کلایدر دو بعدی از کد زیر استفاده کنید

    public static Vector3[] GetColiderCorners2D(GameObject obj)
        {
            Vector3[] corners = new Vector3[4];
            if (obj.transform.GetComponent<BoxCollider2D>() != null)
            {
                BoxCollider2D b = obj.transform.GetComponent<BoxCollider2D>();
                corners[0] = obj.transform.TransformPoint(b.offset + new Vector2(b.size.x, b.size.y) * 0.5f); // right up
                corners[1] = obj.transform.TransformPoint(b.offset + new Vector2(-b.size.x, b.size.y) * 0.5f); // left up
                corners[2] = obj.transform.TransformPoint(b.offset + new Vector2(b.size.x, -b.size.y) * 0.5f); // right down
                corners[3] = obj.transform.TransformPoint(b.offset + new Vector2(-b.size.x, -b.size.y) * 0.5f); // left down
                return corners;
            }
            Debug.LogError(&quotgame object should have box colider 2d&quot);
            return null;
        }

دستور TransformPoint در یونیتی چیست؟

در کد های بالا به مراتب از دستور transformpoint استفاده شده است. اما این دستور چکاری می کند.

این دستور بر روی vector 3 اجرا می شود و یک vector 3 میگرید و ان مختصات را بر اساس مختصات اول اعمال می کند.

Vector3 TransformPoint(Vector3 position);

مثلا اگر دو ابجکت به اسم a و b داشته باشید و بخواهید ابجکت b دو واحد بالای ابجکت a برود باشد از این دستور استفاده می کنیم


public class ExampleClass : MonoBehaviour
{
    public GameObject someObject;
    public Vector3 thePosition;

    void Start()
    {
   // سمت راست ابجکت فعلی یک ابجکت به وجود می اورد
        thePosition = transform.TransformPoint(Vector3.right * 2);
        Instantiate(someObject, thePosition, someObject.transform.rotation);
    }
}