@MavShieldt

Почему не изменяется переменная в скрипте?

Есть два скрипта: Route.cs и Point.cs.
Route.cs цепляется к префабам с траекторией движения игрового объекта, состоящего из отдельных точек, на которые цепляются скрипты Point.cs и BoxCollider2D. Его задача - выдавать другому GameObject'у координаты точки, к которой необходимо стремиться.
Route.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Route : MonoBehaviour
{
    [SerializeField] private GameObject[] points;
    private int active_point = 0;
    private GameObject[] test;

    public Vector2 Target_cors()
    {
        if (!points[active_point].GetComponent<Point>().get_act())
        {
            print("Ehm?");
            if (active_point + 1 == points.Length)
            {
                return new Vector2(512, 251); // для объекта движения это будет означать его уничтожение
            }
            active_point++;
        }
        return points[active_point].transform.position;
    }
}


Point.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Point : MonoBehaviour
{

    public bool active;

    private void Start()
    {
        active = true;
    }

    public void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Enemy"))
        {
            active = false;
        }
    }

    public bool get_act()
    {
        return active;
    }
}


Проблема такова: Route.cs просто не видит изменений в Point.cs, нацепленном на, собственно, точку. В инспекторе (да и внутри скрипта Point.cs, если вызывать print'ы переменной active в Update() на Point'е, и даже если вызывать её через get_act() внутри Point.cs) спокойно видно, как переменная active становится false при сближении с ней. Но Route.cs продолжает получать из точки состояние active, какие манипуляции с кодом не проводи в Point.cs.
С чем это связано и как это можно починить? Грешу на какую-нибудь работу массивов или то, как работает GetComponent, но не уверен и не знаю как исправить.

Заранее благодарен за помощь.
  • Вопрос задан
  • 140 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Farawa
в вашем коде расписано так, как будто Route у каждого врага свой и исходя из этого могу предложить такую реализацию:
[SerializeField] private Queue<GameObject> points;

    public Vector2 GetTargetPosition()
    {
        if (points.Count == 0)
        {
            //destroy;
        }
        var point = points.Dequeue();
        return point.transform.position;
    }

получается у врага нужно прописать:
если достиг точки, то запросить следующую.
не проверял, но должно работать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы