Raycast ничего не достигает

#c# #unity3d

#c# #unity-игровой движок

Вопрос:

Raycast даже не выдает, Debug.Log("it hit something в то время как Debug.DrawRay создает границу между противником и игроком.

Враг, который использует следующий скрипт, находится на уровне «Игнорировать Raycast», а игрок, которого он пытается поразить, находится на уровне «По умолчанию».

 void FixedUpdate() {
    RaycastHit hit;
    Vector2 diff = PlayerMovement.playerTransform.position - transform.position;
    Ray raycastToPlayer = new Ray(transform.position, diff);
    Debug.Log(raycastToPlayer);
    Debug.DrawRay(transform.position, diff, Color.white, 0.01f, true);
    if (Physics.Raycast(raycastToPlayer, out hit)) {
        Debug.Log("it hit something");
        if (hit.collider != null) {
            Debug.Log(hit.collider.gameObject.name);
            if (hit.transform.tag == "Player"){
                float rotZ = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
                transform.rotation = Quaternion.Euler(0f, 0f, rotZ);
            }
        }
    }
}
  

Комментарии:

1. Попробуйте определить максимальное расстояние для вашего Physics.Raycast

2. Normalize ваш diff

Ответ №1:

Вы используете Vector2 позиции, поэтому я предполагаю, что ваша игра в 2D. Если это так, я полагаю, вам нужно использовать 2D-версии Physics классов (смотрите ЗДЕСЬ):

 void FixedUpdate() {

    Vector2 diff = (PlayerMovement.playerTransform.position - transform.position).Normalized;
    RaycastHit2D hit = Physics2D.Raycast(transform.position, diff);

    Debug.DrawRay(transform.position, diff, Color.white, 0.01f, true);

    if (hit.collider != null) {
        Debug.Log("Raycast hit: "   hit.collider.gameObject.name);
        if (hit.transform.tag == "Player") {
            float rotZ = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
            transform.rotation = Quaternion.Euler(0f, 0f, rotZ);
        }
    }
}
  

Комментарии:

1. Большое спасибо, я совершенно упустил из виду, что пытался использовать 3D-версию вместо 2d-версии. Глупая ошибка, на которую я потратил слишком много времени

Ответ №2:

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

https://docs.unity3d.com/ScriptReference/Ray.html

Но в вашем коде вы передаете Vector2. Если это 2D-игра, вам следует использовать другой конструктор:

https://docs.unity3d.com/ScriptReference/Ray2D-ctor.html

Помимо этого, и как они уже указали вам в комментариях, вам нужно будет сдать экзамен по физике.Raycast параметр maxDistance для луча:

  • ray Начальная точка и направление луча.
  • hitInfo Если возвращается значение true, hitInfo будет содержать дополнительную информацию о том, где был поврежден коллайдер. (Смотрите также: RaycastHit).
  • maxDistance Максимальное расстояние, которое луч должен проверять на наличие столкновений.

И если вы хотите использовать слои, потребуется дополнительный paremeter:

  • LayerMask Маска слоя, которая используется для выборочного игнорирования коллайдеров при отбрасывании луча.

https://docs.unity3d.com/ScriptReference/Physics .Raycast.html