Передача параметров экземпляру класса Unity 3d C#

Программирование на Юнити.

Передача параметров экземпляру класса Unity 3d C#

Сообщение julia_rubik 11 фев 2019, 00:20

Добрый вечер. Я новичок. В общем, необходимо создать префаб двери, в который требуется передавать параметры, такие как: смещение оси вращения двери (влево или вправо), угол и скорость вращения двери. Ситуация обстоит следующим образом: 1. Созданы два префаба в папке Resourses: тело двери DoorBody и пустышка DoorController, относительно который будет происходить смещение оси вращения тела двери. 2.Создан пустой объект PrefabController, на который помещен скрипт CreatePrefab, в котором создаются экземпляры класса Door (в нем находятся все необходимые методы, поля и конструктор, через который создаются экземпляры). 3. Через экземпляр класса, благодаря конструктору, подгружаются на сцену два префаба (пустышки и тела двери), затем, через переданный параметр, смещается пустышка на половину ширины двери влево или вправо(метод A()), затем тело двери становится дочерней относительно пустышки (метод S()). Это все прекрасно срабатывает, т.е., путем двух этих методов мы имеем единый префаб со смещенной в нужную нам сторону осью вращения. Далее, в методе Update() есть два метода: Open() и Close(), в которых, собственно, и происходит ошибка: нулевая ссылка на объект, т.е., видимо, параметры, которые мы передаем через экземпляры класса CreatePrefab, благодаря конструктору Door() , передаются не совсем должным образом. Пожалуйста, помогите разобраться.

Синтаксис:
Используется csharp

public class _Door : MonoBehaviour {

    private GameObject DoorController;

    private GameObject DoorBody;

    private float rotation;

    private float speed;

    private bool left;

    public bool isOpen;

    public _Door (bool left, float rotation = 120, float speed = 5)
    {
        this.rotation = rotation;
        this.speed = speed;
        this.left = left;
        this.DoorController = Instantiate(Resources.Load("DoorController", typeof(GameObject))) as GameObject;
        this.DoorBody = Instantiate(Resources.Load("DoorBody", typeof(GameObject))) as GameObject;
    }
   
    public void A()
    {
        Movement(); //сдвиг оси вращения
    }

    public void S()
    {
        SetParent();
    }

    public void Update ()
    {
        if (isOpen)
        {
            Open();
        }
        else
        {
            Close();
        }
        }

    public void Movement()
    {
        if (left)
        {
            LeftShift();
        }
        else
        {
            RightShift();
        }
    }

    void LeftShift() //сдвиг пустышки влево
    {
        float width = DoorBody.transform.localScale.z / 2;
        DoorController.transform.position = new Vector3(DoorController.transform.position.x, DoorController.transform.position.y, DoorController.transform.position.z - width);
    }

    void RightShift() //сдвиг пустышки вправо
    {
        float width = DoorBody.transform.localScale.z / 2;
        DoorController.transform.position = new Vector3(DoorController.transform.position.x, DoorController.transform.position.y, DoorController.transform.position.z + width);
    }

    void Open()
    {
        DoorController.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(transform.rotation.x, rotation, transform.rotation.z), speed * Time.deltaTime);
    }

    void Close ()
    {
        DoorController.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(transform.rotation.x, 0, transform.rotation.z), speed * Time.deltaTime);
    }

    void SetParent()
    {
        DoorBody.transform.parent = DoorController.transform;
    }

}






public class _CreatePrefab : MonoBehaviour {
   
    void Start ()
    {
        _Door d = new _Door(true);  //экземпляр класса Door
        d.A();
        d.S();
        d.Update();   //ошибка происходит здесь и следующий экземпляр не создаётся
        _Door o = new _Door(false);
        o.A();
        o.S();
        o.Update();
    }

}

 
julia_rubik
UNец
 
Сообщения: 1
Зарегистрирован: 10 фев 2019, 23:41

Re: Передача параметров экземпляру класса Unity 3d C#

Сообщение Woolf 11 фев 2019, 04:27

на сцену два префаба (пустышки и тела двери), затем, через переданный параметр, смещается пустышка на половину ширины двери влево или вправо(метод A()), затем тело двери становится дочерней относительно пустышки (метод S())

А зачем такие сложности? Неужели сразу нельзя в префаб положить уже полностью настроенную дверь, после инстанирования префаба взять с него, опять таки, уже настроенный в префабе компонент двери и работать с ним, как хотите? И это.. Вижу у вас конструктор в наследнике от монобеха, так делать нельзя. Классы-наследники монобеха создаются не через new а через AddComponent. Если вы хотите проинициализировать поля, то делайте это в Awake, которая вызовется сразу после создания компонента. Или в Start, которая вызовется перед первым Update для этого компонента.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5