@lala007

C# Unity — Как инициализировать движение при столкновении с объектом?

Во время создания игры в 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;
    }
}
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы