NullReferenceException, при этом работает...
Добавлено: 30 апр 2023, 22:34
Решил после большого (почти год) переыва вернуться к разработке одного старого симулятора автомобиля, но на сей раз решил перенести на андроид. В итоге переноса сломал почти всё в проекта и большую часть пришлось переделывать. Но вот я никак не пойму логику ошибки в этом коде:
Дабы сильно не морочить голову с интеративом, я решил просто продублировать вызов, выполянемый при интерактиве. Это работает, но при каждом нажатии UI кнопки действия в консоли я вижу сообщение:
NullReferenceException: Object reference not set to an instance of an object
Interaction.Use () (at Assets/Scripts/Interaction/Interaction.cs:44)
Строка 44 это как раз строка "hit.collider.GetComponent<Item>().Interaction();". Опять же скажу, что код работает более чем прекрасно, но консоль не даёт покоя.
Я как вариант пробовал вместо:
...такой вариант:
В таком случае ошибка уходила, но появлялась новая проблема: эффект памяти. При помощи данного интерактива я открываю и закрываю двери/ворота, сажусь в машину, завожу её, включаю светотехнику и прочее. Но с данным эффектом памяти я могу не сесть в машину, т.к. оно запомнит, что последний объект был выходом из машины и при любой попытке сесть я тут же выхожу обратно. Так же могу включить свет в гараже и вместе с этим машина заглохнет или включится какой-нибудь поворотник. А ещё у меня покраска реализована через этот же интерактив и часто бывало, что при закрывании двери машины она меняла цвет и в итоге после хлопка краснела. И при всём этом это лишь дублёр действия с клавиши на клавиатуре, а при нажатии на клавиши это же действие выполняется без каких-либо проблем и эффектов памяти...
В целом это не столь критично, столько любопытно понять, почему же происходит этот эфффект памяти или как ещё можно убрать эту ошибку...
Синтаксис:
Используется csharp
public class Interaction : MonoBehaviour
{
public Image indicator;
public Text messageText;
RaycastHit hit;
public KeyCode control = KeyCode.E;
public float RayDist = 1.0f;
void Update()
{
if (Physics.Raycast(transform.position, transform.forward, out hit, RayDist))
{
if (hit.collider.tag == "Item")
{
indicator.enabled = true;
messageText.text = hit.collider.GetComponent<Item>().messageText;
if (Input.GetKeyDown(control))
{
hit.collider.GetComponent<Item>().Interaction();
}
}
else
{
indicator.enabled = false;
messageText.text = "";
}
}
}
private void OnDrawGizmos()
{
Gizmos.color = Color.white;
Gizmos.DrawRay(transform.position, transform.forward * RayDist);
}
public void Use()
{
hit.collider.GetComponent<Item>().Interaction();
}
}
{
public Image indicator;
public Text messageText;
RaycastHit hit;
public KeyCode control = KeyCode.E;
public float RayDist = 1.0f;
void Update()
{
if (Physics.Raycast(transform.position, transform.forward, out hit, RayDist))
{
if (hit.collider.tag == "Item")
{
indicator.enabled = true;
messageText.text = hit.collider.GetComponent<Item>().messageText;
if (Input.GetKeyDown(control))
{
hit.collider.GetComponent<Item>().Interaction();
}
}
else
{
indicator.enabled = false;
messageText.text = "";
}
}
}
private void OnDrawGizmos()
{
Gizmos.color = Color.white;
Gizmos.DrawRay(transform.position, transform.forward * RayDist);
}
public void Use()
{
hit.collider.GetComponent<Item>().Interaction();
}
}
Дабы сильно не морочить голову с интеративом, я решил просто продублировать вызов, выполянемый при интерактиве. Это работает, но при каждом нажатии UI кнопки действия в консоли я вижу сообщение:
NullReferenceException: Object reference not set to an instance of an object
Interaction.Use () (at Assets/Scripts/Interaction/Interaction.cs:44)
Строка 44 это как раз строка "hit.collider.GetComponent<Item>().Interaction();". Опять же скажу, что код работает более чем прекрасно, но консоль не даёт покоя.
Я как вариант пробовал вместо:
Синтаксис:
Используется csharp
public void Use()
{
hit.collider.GetComponent<Item>().Interaction();
}
{
hit.collider.GetComponent<Item>().Interaction();
}
Синтаксис:
Используется csharp
public void Use()
{
if (hit.collider.tag == "Item")
{
hit.collider.GetComponent<Item>().Interaction();
}
}
{
if (hit.collider.tag == "Item")
{
hit.collider.GetComponent<Item>().Interaction();
}
}
В целом это не столь критично, столько любопытно понять, почему же происходит этот эфффект памяти или как ещё можно убрать эту ошибку...