oRik
04.Июль.2021 07:05:00
#1
Противник (EnemyGolem) перемещается вправо и, при столкновении луча Raycast с платформой по тэгу, он прыгает. При этом всё работает, но если луч ни с чем не сталкивается, то консоль каждый кадр выдаёт ошибку:
“NullReferenceException: Object reference not set to an instance of an object EnemyGolem.Update ()”
Помогите пожалуйста выяснить, что ему не нравится.
Вот код:
[SerializeField] private float speed;
[SerializeField] Rigidbody2D rigidbody;
[SerializeField] private float rayDistance;
[SerializeField] private float jumpForce;
void Start()
{
Physics2D.queriesStartInColliders = false;
}
void Update()
{
transform.Translate(Vector2.right * speed * Time.deltaTime);
RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.localScale.x * Vector2.right, rayDistance);
if (hit.collider.CompareTag("Platform") && hit.collider != null) //ошибка указывает на эту строку
{
rigidbody.velocity = Vector2.up * jumpForce;
}
}
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position, transform.position + transform.localScale.x * Vector3.right * rayDistance);
}
AlexP
(Alex P.)
04.Июль.2021 08:08:23
#2
Например можно добавить вначале hit != null
oRik
04.Июль.2021 09:41:45
#3
Спасибо за ответ. Попробовал. Не помогает. Visual Studio подсказывает, что эта переменная является типа bool и она не может быть равна Null.
Заранее извиняюсь, я немножко чайник, только осваиваю юнити и C#.
AlexP
(Alex P.)
04.Июль.2021 10:46:45
#4
Так а в коде что сейчас?
Я имел в виду
if (hit != null && ...
В a && b
условия проверяются слева направо, и если в a
false
, то значение b
не будет проверяться, соответственно тут не будет попыток обратиться к свойствам null
объекта.
oRik
04.Июль.2021 12:49:28
#5
А, да, сорян. Именно так я и добавил это условие. Ошибка осталась. При этом новое условие подчёркнуто зелёным и выводится вышеупомянутая подсказка. Вот код:
[SerializeField] private float speed;
[SerializeField] Rigidbody2D rigidbody;
[SerializeField] private float rayDistance;
[SerializeField] private float jumpForce;
void Start()
{
Physics2D.queriesStartInColliders = false;
}
void Update()
{
transform.Translate(Vector2.right * speed * Time.deltaTime);
RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.localScale.x * Vector2.right, rayDistance);
if (hit != null && hit.collider.CompareTag("Platform") && hit.collider != null)
{
rigidbody.velocity = Vector2.up * jumpForce;
}
}
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position, transform.position + transform.localScale.x * Vector3.right * rayDistance);
}
AlexP
(Alex P.)
04.Июль.2021 13:08:59
#6
А, да, сам hit
вроде бы не может быть null
.
Так что null
видимо это
oRik:
hit.collider
и надо это
oRik:
hit.collider != null
переместить влево.
oRik
04.Июль.2021 14:11:03
#7
Блин, точно:) Решение настолько простое, что аж стыдно:) Спасибо огромное:) Помогло