Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

!!! C# Unity - Помогите с инициализацией движения при столкновении с объектом!!!

lala007 Ученик (203), закрыт 3 года назад
Доброго времени суток! Во время создания игры в Unity, я столкнулся с проблемой инициализации движения одного объекта при столкновении с другим. Задумка - объект (голова змеи), идет за курсором мышки, и должен при соприкосновении с другим объектом ("едой") как бы "съесть его", поместив себе в хвост (получается некая змейка). На деле же - при запуске проекта "голова" двигается, но стоит "съесть еду" - выскакивает ошибка - она приложена ниже и два скрипта, которые используются. Прошу не писать вопросов не по теме или кратких непонятных ответов, (таких как - NullReferenceException: Object reference not set to an instance of an object - значит что-то где-то не назначено и т. п.) - это и ежу понятно, что что-то не назначено, не указан путь, но я прошу вас оказать более подробную помощь (в c# я недавно), ткнуть носом туда, куда нужно. Заранее спасибо!

// Ошибка:

NullReferenceException: Object reference not set to an instance of an object Node.Init (UnityEngine.Transform tr) (at Assets/Node.cs:12)
HeadMovement.OnTriggerEnter2D (UnityEngine.Collider2D col) (at Assets/HeadMovement.cs:76)

// Первый скрипт

using UnityEngine;

public class Node : MonoBehaviour
{
Transform parentNode;
Vector3 destinationPoint;
bool inited;

public void Init(Transform tr)
{
parentNode = tr;
destinationPoint = tr.position; // Строка с ошибкой
GetComponent().color = new Color(1.0f, 0.0f, 0.0f);
inited = true;
}

// Update is called once per frame
void FixedUpdate()
{
if (inited)
{
transform.position = transform.position + (destinationPoint - transform.position) * 5f * Time.fixedDeltaTime;
if ((transform.position - destinationPoint).sqrMagnitude < 0.1f)
destinationPoint = parentNode.position;
}

}
}

// Ниже часть скрипта, из которого и было обращение к скрипту выше (скрипт HeadMovement - весь не поместился)

void OnTriggerEnter2D(Collider2D col)
{
if (col.gameObject.CompareTag("Food"))
{
if (lastNode == transform)
col.gameObject.tag = "Head";
else
StartCoroutine(SetTagWithDelay(col.transform));
col.transform.GetComponent().Init(lastNode); // Строчка из ошибки
lastNode = col.transform;
}
if (col.gameObject.tag == "Food")
{
mass += massCoin;
randVec.Set(Random.Range(-99.5f, 99.5f), Random.Range(-99.5f, 99.5f));
col.gameObject.transform.position = randVec;
camSize += 0.005f;
}
}

IEnumerator SetTagWithDelay(Transform tr)
{
yield return new WaitForSeconds(0.5f);
tr.gameObject.tag = "Tale";
yield return null;
}
}
Лучший ответ
Дима Окружко Мастер (1390) 3 года назад
lastNode - в null скатывается. Пропиши Debug.Print этой переменной и отследи её изменение в процессе отладки. Так ты поймёшь на каком моменте она превращается в null.
lala007Ученик (203) 3 года назад
Проверил вашим методом - выходит, что еще до вызова скрипта Node, где фигурирует эта переменная, она действительно равна Null. Можете помочь, как это исправить? Что присвоить, если это нужно??
(p.s. в приложенном фото место ошибки, а переменная lastNode объявлена выше так - Transform lastNode; )
Дима Окружко Мастер (1390) lala007, А как вы инициализируете lastNode? Где объявляете? Или это внутренняя переменная unity? Просто я с unity уже года 2 не работал, могу не помнить. Необходимо отследить процесс инициализации lastnode. Я бы сделал так: Затолкал бы Debug.Log lastnode - в Update(или FixedUpdate). И отследил бы как данная переменная меняется в процессе работы и инициализируется ли вообще.
lala007Ученик (203) 3 года назад
я решил проблему, спасибо, просто я забыл дописать действие к lastNode в Start() - но Debug помогло - спасибки)
Дима Окружко Мастер (1390) lala007, Обращайся)
Остальные ответы
Сергей Шиманский Мудрец (11419) 3 года назад
У тебя lastNode == null, почему - хз, надо дальше разматывать
lala007Ученик (203) 3 года назад
еще одно место, где присутствует LastNode - это "место объявления" - как и все остальные переменные из скрипта HeadMovement (до начала void Start() ). Записана она там следующим образом:
Transform lastNode;

Больше её нет нигде. Вы думаете в этом дело??
Pr0gr4m1st Профи (831) 3 года назад
Судя по всему, ты пытаешь получить позицию не из объекта на сцене, а из ссылки на него, но я не уверен
Похожие вопросы