Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
    Alex Prozorov
    @prozoroff

    Чатик по разработке Jackal

    Alex Prozorov
    @prozoroff
    Пример форматирования кода
    public GameObject gameManager;      
        // Use this for initialization 
        void Awake () { 
        if( GameManager.instance == null ) 
            Instantiate( gameManager ); 
    }
    Alex Prozorov
    @prozoroff
    @ilyaleb Привет! Вчера посидел над кодом, думаю клетка поля должна быть одним объектом FieldUnit, и с возможностью открываться (состоянием bool IsOpen и методом void Open()). То есть FieldUnit является оберткой над GameObject с набором методов управления этим GameObject.
    Я могу динамически создавать GameObject, используя префабы из ресурсов. Но не придумал как организовать переворачивание тайла - хранить в FieldUnit 2 GameObject и менять их при переворачивании? Как это лучше организовать? И как тебе вообще такая схема?
    ilyaleb
    @ilyaleb
    Привет. Мне кажется тут нет особой разницы как это делать. Можно понимать наше поле - как поле, покрытое "туманом войны". Перед тем как сходить мы открываем ячейку "тумана" и ходим, потом отрабатывает обработчик столкновения с клеткой и игроку передается некоторое "действие". Либо понимать как единую клетку, при переходе на которую мы будет ее "открывать" и передавать игроку "действие". В плане каких-то фишек, которые могут быть добавлены:
    1. Может быть объект "маяк", который скрывает туман войны в некоторой области. В этом смысле выгоднее оперировать отдельным термином "туман войны".
    1. С другой стороны могут быть объекты, которые могут быть всегда видны. Тогда выгоднее оперировать логикой, что скрытость, это все-таки свойство клетки.
    ilyaleb
    @ilyaleb
    Организовать "двойной" объект не особо сложно. Для этого надо поправить все префабы клеток. Нужно чтобы они содержали в себе 2 объекта: 1 объект - рубашка (берется уже из готового префаба), 2ой объект - клетка.
    P.S. не понял как тут сделать переход на новую строку
    А если мы захотим сделать наше поле более красивым и анимированным, и сделать "туман войны" действительно туманом, то мне кажется логичнее выделить его в отдельную сущность.
    Alex Prozorov
    @prozoroff
    Попробую вечером, выложу то что написал, наверно в отдельную ветку пока)
    Сокрытие клетки мне все же кажется атрибутом FieldUnit, вне зависимости от того как оно будет реализовано внутри FieldUnit - переворачивание карточки с рубашки на лицо, или рассеивание тумана войны, потому что как таковое оно не имеет смысла без самой клетки поля. Ну или хотя бы не на одном логическом уровне с самой клеткой.
    ilyaleb
    @ilyaleb
    @prozoroff Ты еще ничего не выкладывал?
    Alex Prozorov
    @prozoroff
    @ilyaleb неа, никак не доведу до ума
    Alex Prozorov
    @prozoroff
    Сетевая архитектура на Unity http://habrahabr.ru/post/261017/
    @ilyaleb Илюх, ты сталкивался с задачей запустить coroutine последовательно? Как можно callback задать? Я могу перевернуть карточку поля Flip() и передвинуть фигурку игрока Move() и хочется сделать это последовательно, в то же время не смешивая эти методы в один. (В каждом методе вызывается StartCoroutine())
    ilyaleb
    @ilyaleb
    @prozoroff Не сталкивался. Сейчас поискал: http://answers.unity3d.com/questions/207920/callback-from-a-coroutine.html http://answers.unity3d.com/questions/207733/can-coroutines-return-a-value.html Возможно тут что-то поможет.
    Alex Prozorov
    @prozoroff
    Да, я посмотрел эти варианты. Но сегодня меня осенило по дороге на работу, что отрыть карту это все равно отдельный ход)
    ilyaleb
    @ilyaleb
    Не совсем понял тебя. Почему отдельный ход? Ход в моем понятии состоит из открытия карточки и перемещения на клетку пирата, либо просто перемещения пирата, если карточка открыта.
    Alex Prozorov
    @prozoroff
    По-моему в правилах открытие поля считается за отдельный ход
    ilyaleb
    @ilyaleb
    Нет, в правилах как ходить пункт г): если клетка закрыта, открывает ее и выполняет действие.
    Alex Prozorov
    @prozoroff
    Значит попутал, почему-то казалось что так играли
    Alex Prozorov
    @prozoroff

    Запушил в ветку test свои пробы как организовать обработку действий игрока. Пока все не причесано.
    По логике взаимодействия с пользователем разделил юниты на 3 вида:
    1) WaterUnit - никакой логики, всегда открыты, двигаются только корабли
    2) FieldUnit - карточка поля, есть состояние Открыт/Закрыт, по ним ходят и их открывают
    3) MovableUnit - пользователь может двигать этих юнитов
    Не знаю как лучше сделать разделение внутри MovableUnit по типам. Через наследование очень громоздко, возможно ввести поле типа enum Type. Пока тип строковый.
    Действия игроков на игровом поле обрабатывает BoardManager после щелчка по какому-то юниту происходит:

    public void ProcessUnitAction (GameObject objectToSelect){
         //Либо выделить юнита, либо снять выделение, либо сходить уже выбранным
    }

    Когда мы выбрали какого-то юнита и передвигаем его на другое место, то вызывается:

    bool ProcessAction (MovableUnit selectedUnit, Unit targetUnit) { 
             if (selectedUnit.Is ("Ship") && targetUnit is WaterUnit) 
                return Move (selectedUnit, targetUnit); 
             else if (selectedUnit.Is ("Ship") && targetUnit is FieldUnit) { 
                             //вызываем с корабля пирата
                return Move (pirate, targetUnit); 
             } 
             ......
    
            return false; 
    }

    Метод Move вызывает параллельный поток:

    protected bool Move (MovableUnit selectedUnit, Unit targetUnit){ 
            StartCoroutine (selectedUnit.Action (targetUnit)); 
            return true; 
        }

    У каждого MovableUnit есть IEnumerator метод Action который обрабатывает перемещение. Например для перемещения на закрытую клетку будет выглядеть так:

    public IEnumerator Action (Unit targetUnit) { 
        return Enumerator.Concat(Flip (targetUnit), Move (targetUnit), UnselectUnit()); 
    }

    Перевернуть карточку поля, сходить, снять выделение.
    Надо придумать как организовать правила для ходов. Например игрок ходит на клетку болото. Кто должен сказать игроку куда он может сходить с клетки Лошади. Какой-то суперкласс, который хранит текущие состояния всех юнитов и валидирует все действия?

    Oleg
    @Oleg-Mishenkin
    Круто, посмотрим что понаписал там)
    ilyaleb
    @ilyaleb
    Нам бы еще обговорить стиль оформления кода, т.к. я вот привык оформлять иначе. Скобочки в разных местах у нас по-разному получились.
    ilyaleb
    @ilyaleb
    Предлагается принять стиль оформелния кода: http://wiki.unity3d.com/index.php/Csharp_Coding_Guidelines за исключением правила "Do not use a prefix for member variables (, m, s, etc.). If you want to distinguish between local and member variables you should use “this.” in C# and “Me.” in VB.NET". Для именования private переменных класса все же использовать "".
    Alex Prozorov
    @prozoroff

    Методы класса

    public bool Move(){}
    private void AnimateMe(){}

    Поля и свойства класса

    public string name;
    private GameObject _gameObject;

    так?

    ilyaleb
    @ilyaleb
    Да