Во время создания игры в 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; <b>// Строка с ошибкой</b>
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)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class HeadMovement : MonoBehaviour
{
Vector2 mousePosition;
private float quo;
private float delta;
public float mass;
private Vector2 randVec;
private Vector3 vecScale;
private float camSize;
private int massCoin;
public Camera camer;
Transform lastNode;
[SerializeField]
GameObject foodPrefab;
// Start is called before the first frame update
void Start()
{
mass = 10;
delta = 5;
vecScale.Set(1, 1, 1);
delta = 16 * Mathf.Pow(20, -Mathf.Log(2, 01.1f)) * Mathf.Pow(mass, Mathf.Log(2, 0.1f));
camSize = 4;
massCoin = 5;
}
// Update is called once per frame
void Update()
{
delta = 16 * Mathf.Pow(20, -Mathf.Log(2, 0.1f)) * Mathf.Pow(mass, Mathf.Log(2, 0.1f));
mousePosition = Input.mousePosition;
mousePosition = Camera.main.ScreenToWorldPoint(mousePosition);
mousePosition -= (Vector2)transform.position;
quo = Mathf.Sqrt(mousePosition.x * mousePosition.x + mousePosition.y * mousePosition.y)/ (delta/2);
mousePosition /= quo;
transform.Translate(mousePosition * Time.deltaTime);
vecScale.Set((mass/ 200 + 0.95f), (mass/ 200 + 0.95f), 1);
transform.localScale = vecScale;
mass -= 0.0000002f * mass * mass;
if (camer.orthographicSize > camSize)
{
if (camer.orthographicSize - 1 > camSize)
{
camer.orthographicSize = camSize;
}
else{
camer.orthographicSize -= 0.0001f;
}
}
else if (camer.orthographicSize < camSize)
{
if (camer.orthographicSize + 1 < camSize)
{
camer.orthographicSize = camSize;
}
else{
camer.orthographicSize += 0.0001f;
}
}
}
void OnTriggerEnter2D(Collider2D col)
{
if (col.gameObject.CompareTag("Food"))
{
if (lastNode == transform)
col.gameObject.tag = "Head";
else
StartCoroutine(SetTagWithDelay(col.transform));
col.transform.GetComponent<Node>().Init(lastNode); <b>// строчка-обращение к скрипту Node</b>
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;
}
}