Точка контакта между OverlapCircle и определенным коллайдером в Unity - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь установить точку соприкосновения коллайдера и OverlapCircleAll для воспроизведения анимации в этой точке.

Это метод, который я использую для атаки.

private IEnumerator BasicAttackBehaviour()
    {
        canAttack = false;
        Collider2D[] enemiesToDamage = Physics2D.OverlapCircleAll(attackPos, attackRange, whatIsEnemy);
        for (int i = 0; i < enemiesToDamage.Length; i++)
        {
            enemiesToDamage[i].GetComponentInParent<Enemy>().TakeDamage(damage);
        }
        PlayAttackAnimation();
        yield return new WaitForSeconds(attackDelay);
        canAttack = true;
    }

И это метод "TakenDamage":

public void TakeDamage(int damage)
    {
        health -= damage;
        GameObject bloodEffect = Instantiate(takenDamageVFX, transform.position, transform.rotation);
    }

Я хочу создать экземпляр эффекта "BloodEffect" VFX на позиции, где поражен враг, а не "transform.position".

This is how it looks like

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Возможно, вы захотите переключиться на CircleCastAll, он даст вам точки контакта в координатах мирового пространства:

https://docs.unity3d.com/ScriptReference/Physics2D.CircleCastAll.html

Вы можете установить параметр расстояния в 0.0f, если вы нене хочу делать движущийся круг и просто один неподвижный круг.

0 голосов
/ 21 марта 2019

Отвечая на мой вопрос и благодарив босса, который решил мой вопрос выше, здесь идет мое исправление на случай, если кому-то понадобится визуализировать пример.

private IEnumerator BasicAttackBehaviour2()
    {
        canAttack = false;
        RaycastHit2D[] raycastHits = Physics2D.CircleCastAll(attackPos, attackRange, directionLookingAt, 0, whatIsEnemies);
        for(int i = 0; i < raycastHits.Length; i++)
        {
            Vector2 pointHitten = raycastHits[i].point;
            raycastHits[i].collider.gameObject.GetComponent<Enemy>().TakeDamage(damage, pointHitten);
        }

        PlayAttackAnimation();
        yield return new WaitForSeconds(attackDelay);
        canAttack = true;
    }

Используя CircleCastAll, я могу получить точкуRaycastHit2D и передать его врагу.

И затем я могу отобразить эффект крови на правильной позиции удара.

public void TakeDamage(int damage, Vector2 pointHitten)
    {
        health -= damage;
        GameObject bloodEffect = Instantiate(takenDamageVFX, pointHitten, transform.rotation);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...