Помощь по структуре проекта

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

Помощь по структуре проекта

Сообщение gate1 02 апр 2012, 12:40

День добрый.
На данный момент делаю ядро своей системы. Суть в том, чтобы получать данные из xml (координаты объекта, тип, различные состояния, команды(атаковать например) и тд), загружать объекты на сцену в зависимости от пришедших данных и выполнять определенные действия над ними.
Сейчас делаю так:
Есть один базовый скрипт в котором будут содержаться общие поля для всех объектов, которые заполняются из xml-ки, а в update методе реализовываю что-то вроде менеджера, который будет опрашивать модуль разбора xml и реализовывать логику работы.
Также есть скрипты для каждого класса объектов которые будут использоваться в системе(отдельный для техники, отдельный для людей, может быть еще в дальнейшем появятся новые объекты), в которых описываю все методы которые будут реализовываться конкретным объектом.
Вот для примера два скрипта Их я вешаю на пустой game object
1. для объекта


На практики сразу уперся в проблему.
Допустим я хочу реализовать следующие, когда объект неподвижен мы отключаем ему систему частиц (дым), а когда двигается включаем.
Ну очевидно необходимо ввести флаг, который бы следил за скоростью объекта и когда он true включаем частицы. Или же например нужно у объекта выставить
Синтаксис:
Используется csharp
Используется csharp  rigidbody.velocity = Vector3.zero;
как мне советовали сделать в этой теме http://unity3d.ru/distribution/viewtopic.php?f=18&t=8132 , для того чтобы объект Rigidbody не подбрасывало, когда он неподвижен
Если мы введем этот флаг конкретно в первом скприпте описывающий объект, то когда он будет true включится дым у всех объектов, следовательно нужно чтобы у каждого объекта был такой флаг, тк разные объекты находятся в разных состояниях(одни движутся одни стоят). Сейчас подумал, скорость же тоже разная будет у всех объектов, так что опять же нет смысла делать это поле одно для всех. Ведь при запуске это поле будет только у пустого объекта на кторый мы повесили скрипты, а у тех объектов, что создаются на лету полей не будет вообще.

Мне видятся пока только два варианта:
1 Первый уже опробовал: создал новый скрипт, в котором завел переменную скорость и повесил его на префаб, тогда действительно, когда объект создается на сцене, у каждого имеется в инспекторе своя переменная скорость. Но если использовать эту скорость для метода Move (из класса описывающий этот объект), то вылазят ошибки(не помню какая, могу уточнить).
2. Сделать класс описывающий объект не наследником от MonoBehaviour, в котором описать этот объект и в конструкторе описать все переменные которые он должен иметь и ссылку на GameObject для их взаимосвязи.
Опять же что-то подобное раньше делал, но вроде бы, тогда у создаваемых объектов все-равно нет в инспекторе этих полей принадлежащих конкретно этому объекту, а есть только у пустого объекта на которые мы вешаем наши скрипты.
Последний раз редактировалось gate1 22 июн 2012, 10:55, всего редактировалось 2 раз(а).
Аватара пользователя
gate1
UNITрон
 
Сообщения: 198
Зарегистрирован: 27 дек 2011, 22:19
Откуда: Минск

Re: Помощь по структуре проекта

Сообщение pod4444 03 апр 2012, 13:28

если у Вас класс TankBehaviour описывает свойства и методы танка, то на каждом танке должен быть экземпляр это класса. У Вас он в сцене один.

на сцене делаем один контроллер, который будет читать Xml, по полученным данным создавать объекты, сохранять ссылки на полученные объекты и потом общаться с ними по надобности.
на каждом объекте висит класс Tank, к нему приходит команда мол двигайся вперед, он и двигается.

вкратце это выглядит так:

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections.Generic;

public class ObjectController : MonoBehaviour
{
    public GameObject[] _prefabObject; // Префабы объектов

    int _objectType;
    string _objectName;
    int _objctID;
    float _objectXPos;
    float _objectYPos;
    float _objectZPos;
    Vector3 _objDirect;
    Vector3 _curPos;
    Dictionary<int, GameObject> _mainObjectArray;
    XMLRead Reader;

    void Awake()
    {
        _mainObjectArray = new Dictionary<int, GameObject>();
        _mainObjectArray.Clear();
        Reader = GetComponent<XMLRead>();
    }

    void Start()
    {
        Reader.MyXMLRead();
    }

    void Update()
    {
        GameObject _tempObject;
        Tank _tempTankClass;

        //--------------------------------------------------------------------------------------
        Reader.MyXMLRead();                                                      // Запускаем считывание xml
        _objDirect = new Vector3(_objectXPos, _objectYPos, _objectZPos);         // Получаем вектор
        //--------------------------------------------------------------------------------------

        if (!_mainObjectArray.ContainsKey(_objctID))
                CreateObject();
        else
        {
            _mainObjectArray.TryGetValue(_objctID, out _tempObject);
            if (_objectType == 1)
            {
                _tempTankClass = _tempObject.GetComponent<Tank>();
                _tempTankClass.TRotate(_objDirect);
                _tempTankClass.TMove(_objDirect);
            }
        }
    }
    void CreateObject()
    {
        GameObject _tempObject = Instantiate(_prefabObject[_objectType], transform.position, Quaternion.identity) as GameObject; //вытягиваем объект на сцену
        _tempObject.name = _objectName + "-" + _objctID;        //присваиваем имя объекту
            _mainObjectArray.Add(_objctID, _tempObject);  //заносим объект в массив
    }
}


Синтаксис:
Используется csharp
public class Tank : MonoBehaviour
{
    public float _tankSpeed = 8f;
    private float tankRotSpeed = 2f;
    public bool _tankStateMove;

    public void TMove(Vector3 target)
    {
        transform.position = Vector3.MoveTowards(transform.position, target, Time.deltaTime * _tankSpeed);     //передвигаем объект
    }

    public void TRotate(Vector3 target)
    {
        Vector3 rotDirection = target - transform.position;
        transform.rotation = Quaternion.Slerp(transform.rotation,Quaternion.LookRotation(rotDirection),Time.deltaTime * tankRotSpeed);
    }
}


А уж теперь, в классе танк, делать и дым и чего угодно.
Хотя я все равно не понимаю зачем изгаляться так с Xml.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Помощь по структуре проекта

Сообщение gate1 03 апр 2012, 18:41

Задача такая есть, данные через файл получать! Может быть через json еще можно попробовать.
То что в сцене должен быть одни скрипт, управляющий я тоже так думаю

"на каждом объекте висит класс Tank, к нему приходит команда мол двигайся вперед, он и двигается. "
Тогда уж не на объекты, а на префабы. Объектов никаких нет на сцене, при запуске, они рантайм создаются.
те по-любому придется на каждый префаб, который у меня в ресурсах, вешать скрипт...
Если префабов будет 100 и это только танков к примеру. Если допустим я все это дело понавешиваю, а потом придется что-то изменить в скрипте, что опять на всех 100 объектах изменять?
Аватара пользователя
gate1
UNITрон
 
Сообщения: 198
Зарегистрирован: 27 дек 2011, 22:19
Откуда: Минск

Re: Помощь по структуре проекта

Сообщение Syberex 03 апр 2012, 20:05

Совет хороший дали :)

А скрипт на созданный ГО из префаба повесить не сложно

newGameObject.AddComponent("ScriptName");
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Помощь по структуре проекта

Сообщение gate1 03 апр 2012, 22:11

ну да действительно, попробую так вешать.
Что вообще скажите о такой структуре?
Последний раз редактировалось gate1 05 апр 2012, 12:39, всего редактировалось 1 раз.
Аватара пользователя
gate1
UNITрон
 
Сообщения: 198
Зарегистрирован: 27 дек 2011, 22:19
Откуда: Минск

Re: Помощь по структуре проекта

Сообщение pod4444 04 апр 2012, 12:22

gate1 писал(а):Задача такая есть, данные через файл получать! Может быть через json еще можно попробовать.
То что в сцене должен быть одни скрипт, управляющий я тоже так думаю

"на каждом объекте висит класс Tank, к нему приходит команда мол двигайся вперед, он и двигается. "
Тогда уж не на объекты, а на префабы. Объектов никаких нет на сцене, при запуске, они рантайм создаются.
те по-любому придется на каждый префаб, который у меня в ресурсах, вешать скрипт...
Если префабов будет 100 и это только танков к примеру. Если допустим я все это дело понавешиваю, а потом придется что-то изменить в скрипте, что опять на всех 100 объектах изменять?

префабы те же объекты, только подготовленные заранее.
что Вы подразумеваете под изменением?
если сделаете какие-то публичные переменные, то они будут видны в инспекторе, соответственно нужно будет их менять на каждом префабе только один раз.

не нравится менять на каждом префабе, загружайте динамические из файлов.
если вы что-то новое допишите в класс Tank, то предыдущие переменные в инспекторе сохраняться.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Помощь по структуре проекта

Сообщение gate1 04 апр 2012, 14:19

del
Последний раз редактировалось gate1 05 апр 2012, 12:39, всего редактировалось 1 раз.
Аватара пользователя
gate1
UNITрон
 
Сообщения: 198
Зарегистрирован: 27 дек 2011, 22:19
Откуда: Минск

Re: Помощь по структуре проекта

Сообщение pod4444 04 апр 2012, 15:55

Если повесить скрипт один раз и изменить, то вешать еще раз не придется.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Помощь по структуре проекта

Сообщение seaman 04 апр 2012, 17:50

вот и придется на всех префабах менять скрипт

:-o
Похоже нужно перенести тему в "Почемучку".
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Помощь по структуре проекта

Сообщение gate1 04 апр 2012, 23:27

сорри face palm
Аватара пользователя
gate1
UNITрон
 
Сообщения: 198
Зарегистрирован: 27 дек 2011, 22:19
Откуда: Минск

Re: Помощь по структуре проекта

Сообщение gate1 10 апр 2012, 00:16

Подскажите такую вещь.
Включаю систему частиц, которая висит на префабе следующим способом
Синтаксис:
Используется csharp
 GameObject.Find("Имя/DrawCall_0044/Smoke").particleEmitter.emit = false;
 

те идет Имя объекта, потом чайлд DrawCall_0044 и чайлд Smoke на котором собственно и висит система частиц
Имя каждый раз генерируется разное. Как его сюда запихнуть?
Пробовал так
Синтаксис:
Используется csharp
   string tmpName = myController._objectName+myController._objctID+"/"+"DrawCall_0044"+"/Smoke";

ругается.
Имя получается путем сложения имени и id
Аватара пользователя
gate1
UNITрон
 
Сообщения: 198
Зарегистрирован: 27 дек 2011, 22:19
Откуда: Минск

Re: Помощь по структуре проекта

Сообщение gate1 10 апр 2012, 10:52

Не пойму в чем дело , не могу получить в скрипте танк переменные из скрипта контроллера. Пишу в методе скрипта танк: getcomponent<Base>()._objcrName; Вызываю этот метот в Base
А он мне object refernce not set to an instance of an object.
Поставил все методы и поля паблик.

upd
Реализовал это дело путем введения параметров. При вызове метода передаю туда имя + id. Все таки интересно почему через геткомпонент ругается?
Аватара пользователя
gate1
UNITрон
 
Сообщения: 198
Зарегистрирован: 27 дек 2011, 22:19
Откуда: Минск

Re: Помощь по структуре проекта

Сообщение pod4444 10 апр 2012, 13:42

gate1 писал(а):Не пойму в чем дело , не могу получить в скрипте танк переменные из скрипта контроллера. Пишу в методе скрипта танк: getcomponent<Base>()._objcrName; Вызываю этот метот в Base
А он мне object refernce not set to an instance of an object.
Поставил все методы и поля паблик.

upd
Реализовал это дело путем введения параметров. При вызове метода передаю туда имя + id. Все таки интересно почему через геткомпонент ругается?

нужно понять что такое ссылочные типы.

тот способ, который у тебя сейчас и есть правильный. Обратное общение из класса Танк с контроллером нежелательно в данном случае.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: Помощь по структуре проекта

Сообщение pod4444 10 апр 2012, 13:48

gate1 писал(а):Подскажите такую вещь.
Включаю систему частиц, которая висит на префабе следующим способом
Синтаксис:
Используется csharp
 GameObject.Find("Имя/DrawCall_0044/Smoke").particleEmitter.emit = false;
 

те идет Имя объекта, потом чайлд DrawCall_0044 и чайлд Smoke на котором собственно и висит система частиц
Имя каждый раз генерируется разное. Как его сюда запихнуть?
Пробовал так
Синтаксис:
Используется csharp
   string tmpName = myController._objectName+myController._objctID+"/"+"DrawCall_0044"+"/Smoke";

ругается.
Имя получается путем сложения имени и id


наверно нужен ToString, но чтобы не парится с этими именами лучше общаться с классом, который описывает префаб. Мол сказать ему выключи на себе дым, он и выключит.

как я знаю у тебя есть массив со всеми объектами на сцене. вот и делай Object.OffSmoke();
опиши этот метод в нужном классе и все.
в методе это сократится до
Синтаксис:
Используется csharp
 Transform.Find("DrawCall_0044/Smoke").particleEmitter.emit = false;
 

никаких тебе динамических имен и блаблабла (transform используется потому что ищет только чайлды)
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт


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

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

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