Unity Raycast2D проблема, когда персонаж сидит на углу - PullRequest
1 голос
/ 01 апреля 2019

Привет, у меня проблема с Raycast2D. Когда персонаж, сидящий на платформе, как на изображении, Raycast2D не работает. Я пробовал Raycast и RaycastAll оба. Как я могу определить платформу под персонажем, когда он на углу?

https://imgur.com/z7VMRq5

    if(Input.GetMouseButton(0))
    {
        RaycastHit2D[] hit = Physics2D.RaycastAll(transform.position, -Vector2.up, 2f, layerMask);
        if(hit[0].collider != null)
        {
            Destroy(hit[0].collider.gameObject);
        }
    }

1 Ответ

1 голос
/ 01 апреля 2019

1) Использовать несколько Raycast

В вашем коде игра обнаруживает платформу только в том случае, если над ней стоит центр вашего игрока. Чтобы постоянно обнаруживать платформу, вы должны использовать две лучевые трансляции в границах коллайдера вашего персонажа.

void Update()
{
    // Cast the rays
    castRays(transform.localScale.x / 2f);
}

private void castRays(float distanceFromCenter)
{
    // Return if the ray on the left hit something
    if(castRay(new Vector2(-distanceFromCenter, 0f) == true) { return; }
    // Return if the ray on the right hit something
    else if(castRay(new Vector2(distanceFromCenter, 0f) == true) { return; }
}


private bool castRay(Vector2 offset)
{
    RaycastHit2D hit; // Stores the result of the raycast

    // Cast the ray and store the result in hit
    hit = Physics2D.Raycast(transform.position + offset, -Vector2.up, 2f, layerMask);

    // If the ray hit a collider...
    if(hit.collider != null)
    {
        // Destroy it
        Destroy(hit.collider.gameObject);

        // Return true      
        return true;
    }

    // Else, return false
    return false;
}

Необязательно: Луч можно повторно включить в центр, если есть платформы меньше проигрывателя или для обеспечения безопасности.

2) Использовать триггер

Поместите BoxCollider2D у ног персонажа и установите для isTrigger значение true. Когда он входит в другой коллайдер, он вызывает «OnTriggerEnter2D».

void OnTriggerEnter2D(Collider2D other)
{
    Destroy(other.gameObject);
}
...