#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