Мой Raycast2D регистрируется, если смотреть в одну сторону, но при движении в другом направлении ничто не «ударило». - PullRequest
1 голос
/ 16 апреля 2019

Я только что исправил ошибку и обнаружил ошибку, которую, похоже, не могу понять.Мой 2D персонаж атакует и в конце анимации вызывает функцию DealDamage ().Проблема в том, что когда мой игрок направлен вправо и атакует врага справа, он работает отлично.Когда он смотрит налево, его как будто врага там нет, и «нечего» поразить.Я проверил, и Raycast возвращает ноль, поэтому он даже не регистрирует врага.Я использовал DrawRaycast, и Raycast явно поражает врага.Я не знаю, что делать.

public void DealDamage()
     {
         if (facingRight == true && weaponReach < 0)
         {
             weaponReach *= -1;
         }
         else if (facingRight == false && weaponReach > 0)
         {
             weaponReach *= -1;
         }

         RaycastHit2D hit = Physics2D.Raycast(origin.position, new Vector2(weaponReach, 0), weaponReach, whoIsEnemy);
         if (hit.transform.gameObject.layer == 12)
         {
             EnemyHealth EnemHealth = hit.transform.gameObject.GetComponent<EnemyHealth>();
             EnemHealth.TakeDamage(attackDamage);
         }
     }

Когда я делаю Raycasthit2D следующий код, все волшебно работает отлично.Проблема в том, что расстояние не ограничено, и я определенно не хочу, чтобы игрок ударил врага за милю.

 RaycastHit2D hit = Physics2D.Raycast(origin.position, new Vector2(weaponReach, 0), weaponReach, whoIsEnemy);

Я ожидаю, что обе стороны будут работать идеально и одинаково.

1 Ответ

0 голосов
/ 16 апреля 2019

Я бы сказал, что проблема в том, что когда вы смотрите влево, вы передаете отрицательное значение weaponReach как distance в видеопередачу.В этом случае он просто будет использовать 0, поскольку расстояние не может быть отрицательным.


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

// for the direction you actually only
// need a normalized vector either
// pointing right or left 
var direction = Vector2.right * (facingRight ? 1 : -1);

Это сокращенная форма написания

var distance = new Vector2(1, 0);
if(facingRight)
{
    // Actually you could ofcourse also 
    // completely skip that case
    direction *= 1;
}
else
{
    direction *= -1;
}

И затем в лучевой передаче всегда передается положительное weaponReach как расстояние, но либо положительное, либо отрицательное direction

RaycastHit2D hit = Physics2D.Raycast(origin.position, direction, weaponReach, whoIsEnemy);

// You then should always check
if(hit != null)
{
    ...
}

Кстати, ваш чек

if (hit.transform.gameObject.layer == 12)

не является избыточным, поскольку вы уже применили лучевую передачу только на определенной маске слоя whoIsEnemy?

...