как перенести изменяющееся значение переменной из одного класса в другой?

Рейтинг: 0Ответов: 1Опубликовано: 03.08.2023

У меня есть два класса. В первом классе есть одна переменная, значение которой нужно передать в другой класс. Это получается сделать, но когда значение переменной в первом классе изменяется, во втором переданное значение остаётся таким же, как и до изменения. Сразу скажу: объединить два класса в один нельзя. Как мне реализовать то, что бы когда значение переменной изменялось в первом классе, оно соответственно изменялось во втором?

Вот код: Первый класс:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class right_box : MonoBehaviour
{
   
    public bool right_box_ = true;
    private Rigidbody2D rb;

    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }



    private void OnTriggerStay2D(Collider2D col) //Функция входа в область 
    {
        if (col.CompareTag("JumpZone"))
        {
            right_box_ = true;
        }
    }

    private void OnTriggerExit2D(Collider2D col) //Функция выхода из области 
    {
        if (col.CompareTag("JumpZone") == true)
        {
            right_box_ = false;

        }
    }
}

И второй:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : Entity
{
    [SerializeField] private float speed = 10.0f;
    private Vector3 dir;
    private Vector2 direct;

    right_box right_box_c = new right_box(); //создание объектов на основе класса right_box

    private void Awake()
    {        
        sprite = GetComponentInChildren<SpriteRenderer>();
        rb = GetComponent<Rigidbody2D>();
    }

    private Rigidbody2D rb;
    private SpriteRenderer sprite;

    private void Start()
    {
        direct.x = 0.001f;
    }

    private void Update()
    
    {
        Vector3 dir = transform.right * Input.GetAxis("Horizontal");
        sprite.flipX = dir.x < 0.0f;
        Move();
        bool right = right_box_c.right_box_; //получение переменных из класса
        if (right == true)
        {
            Debug.Log("правый");
        }
        if (right == false) {
            direct *= -1;
        } 
    }

    private void Move() //функция бега монстра
    {
        transform.Translate(direct);
    }
}

Попытался изъясниться как можно понятнее.

Ответы

▲ 1Принят

Если вы хотите, чтобы просто менялось, то это одно.

Если вы хотите, чтобы другие объекты получали извещение, что отслеживаемое значение изменилось, и вызывался какой-то метод, это другое. Подозреваю, что нужно именно это.

Если всё-таки нужно первое, то решение очень простое. Не нужно плодить копии и потом их синхронизировать. Просто читайте оригинальную переменную.

По вашему коду. Проблема может быть в том, что вы думаете, что right_box_ у вас меняется, но на самом деле оно не меняется. Вы создаёте объект класса right_box внутри Enemy, но доступа к нему нет. Поэтому right_box_ там в принципе поменяться не может. Скорее всего оно где-то меняется, но не в Enemy.right_box_c.

Если решить проблему с доступом к right_box_c, то всё должно работать при периодическом вызове Update, так как там читается значение right_box_ из right_box_c. (То есть ваш вопрос в принципе не имеет отношения к вашему коду, неудачная формулировка.) Но проблема опять же в том, что в показанном коде доступа к Update нет.