Проблемы с клоном Battle city

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Проблемы с клоном Battle city

Сообщение DeZertiR_UA 22 авг 2015, 19:54

Всем привет! Делаю клон небезызвестной старой, но доброй Battle City с денди. Делаю просто ради того, чтобы попрактиковаться. Сам я человек начинающий, потому пытаюсь повторять по видео урокам, в данном случае - https://www.youtube.com/watch?v=sj0rtIS4HHQ.
Проблем практически не возникало, до момента проверки движения. При движении танчик ведет себя странно, как будто срабатывает залипание клавиш. То есть я еду на танке вверх, и нажимаю в этот же момент влево, танк может развернуться на полсекунды влево и сразу повернуться обратно и ехать дальше. Только потом, когда я отпущу вверх, тогда уже танк развернется влево. Или, например, при зажатой кнопке движения, движение танка внезапно прерывается, пока не нажмешь ее еще раз. И прочие такие приколы.
Сначала грешил на анимацию, но, думаю дело не в ней. Вот единственный на данный момент скрипт - скрипт управления танком:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Tank : MonoBehaviour
{
    private int __direction;
    private Vector3 __move;
    public float __speed;
    private Animator __animator;
    private Transform __transform;
    public RuntimeAnimatorController[] controllers;
    private float __lastVert;
    private float __lastHoriz;
    // Use this for initialization
    void Start()
    {
        __transform = transform;
        __animator = GetComponent<Animator>();
        __animator.runtimeAnimatorController = controllers[0];
        __direction = 0;
    }

    // Update is called once per frame
   private void Update()
    {
        float vert = Input.GetAxis("Vertical");
        float horiz = Input.GetAxis("Horizontal");
        if (vert != __lastVert)
        {
            if (vert > 0)
            {
                __direction = 3;
            }
            else if (vert < 0)
            {
                __direction = 0;
            }
            __move = new Vector3(0, vert, 0);
            __lastVert = vert;
        }
        else if (horiz != __lastHoriz)
        {
            if (horiz > 0f)
            {
                __direction = 2;
            }
            else if (horiz < -0f)
            {
                __direction = 1;
            }
            __move = new Vector3(horiz, 0, 0);
            __lastHoriz = horiz;
        }
                 __transform.Translate(__move * __speed * Time.deltaTime);
  }
   
        void FixedUpdate()
        {
            __animator.SetInteger("direction", __direction);
        }
    }


Помогите разобраться) :)
Последний раз редактировалось DeZertiR_UA 23 авг 2015, 20:29, всего редактировалось 1 раз.
Пусть Глубина будет к вам доброй.
DeZertiR_UA
UNец
 
Сообщения: 6
Зарегистрирован: 17 авг 2015, 02:13
  • Сайт

Re: Проблемы с движением танка в клоне Battle city

Сообщение samana 22 авг 2015, 22:12

Тут конечно нужно больше просчётов. Ведь допустим если зажаты клавиша вбок и вверх - куда должен ехать танчик? Или если зажаты влево и вправо, то куда двигаться? Ну и т.п.
Ещё мне кажется лишним изменение аниматора в FixedUpdate так как там нет физики, можно просто в Update (хотя может чего-то не понимаю).
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Проблемы с движением танка в клоне Battle city

Сообщение DeZertiR_UA 23 авг 2015, 02:20

Ещё мне кажется лишним изменение аниматора в FixedUpdate так как там нет физики, можно просто в Update (хотя может чего-то не понимаю).


В видеоуроке сказано, что это сделано на случай, если физика все же будет. На будущее, так сказать. Вы вот написали, и я призадумался. Это же вид сверху. Значит физики не будет?

если зажаты клавиша вбок и вверх - куда должен ехать танчик? Или если зажаты влево и вправо, то куда двигаться? Ну и т.п.

Думаю, тут лучше ориентироваться на оригинал. На удобство. В общем, танк должен сразу переключаться на "новое" направление. То есть, если я зажал вверх, и, не отпуская, нажимаю влево, то танк должен ехать влево. Если я отжал влево, но так и не отпускал вверх, то танк должен ехать вверх.
Пусть Глубина будет к вам доброй.
DeZertiR_UA
UNец
 
Сообщения: 6
Зарегистрирован: 17 авг 2015, 02:13
  • Сайт

Re: Проблемы с движением танка в клоне Battle city

Сообщение samana 23 авг 2015, 10:11

DeZertiR_UA писал(а): В видеоуроке сказано, что это сделано на случай, если физика все же будет. На будущее, так сказать. Вы вот написали, и я призадумался. Это же вид сверху. Значит физики не будет?

Наверно физика всё таки будет для определения столкновений со стенами.
DeZertiR_UA писал(а):То есть, если я зажал вверх, и, не отпуская, нажимаю влево, то танк должен ехать влево. Если я отжал влево, но так и не отпускал вверх, то танк должен ехать вверх.

Да, я тоже так думаю. Наверно для реализации такой задумки, придётся заносить клавиши в массив при нажатии, и убирать их из массива при отжатии. А направление танка брать из последнего элемента массива (то-есть последней нажатой клавиши). Но может это костыль, надо подумать.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Проблемы с движением танка в клоне Battle city

Сообщение samana 23 авг 2015, 12:54

Мне было интересно попробовать реализовать свой придуманный костыль. Конечно не буду утверждать, что это правильный подход, но это работает.
Здесь танк будет ехать в том направлении, куда указывает последняя нажатая стрелочка (управление только стрелками)
Вы можете конечно не использовать мой код, но вдруг.

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

public class Tank : MonoBehaviour
{
    public float speed = 1f;
    public RuntimeAnimatorController controllers;

    // массив с текущими нажатымы клавишами (стрелочками)
    private List<KeyCode> _keysDown = new List<KeyCode>();
    // словарь направлений для аниматора
    private Dictionary<KeyCode, int> _keyDirection = new Dictionary<KeyCode, int>();
    // словарь осей, где каждой стрелочке на клавиатуре соответствует нужное число
    private Dictionary<KeyCode, int> _axixDirection = new Dictionary<KeyCode, int>();

    private int _direction = 3;
    private Vector3 _move = new Vector3();

    private Transform _transform;
    private Animator _animator;


    void Start()
    {
        _transform = GetComponent<Transform>();
        _animator = GetComponent<Animator>();
        _animator.runtimeAnimatorController = controllers[0];
        _direction=3;

        // назначаем, какой клавише - какое направление для аниматора
        // !!! возможно здесь нужно будет изменить числа местами
        _keyDirection.Add(KeyCode.DownArrow, 0);
        _keyDirection.Add(KeyCode.LeftArrow, 1);
        _keyDirection.Add(KeyCode.RightArrow, 2);
        _keyDirection.Add(KeyCode.UpArrow, 3);

        // назначаем, какой оси соответствует каждая стрелочка
        _axixDirection.Add(KeyCode.LeftArrow, -1);
        _axixDirection.Add(KeyCode.RightArrow, 1);
        _axixDirection.Add(KeyCode.UpArrow, 1);
        _axixDirection.Add(KeyCode.DownArrow, -1);
    }

   
    void Update()
    {
        // если нажата любая стрелка, то заносим эту
        // клавишу в массив
        if (Input.GetKeyDown(KeyCode.LeftArrow))
            _keysDown.Add(KeyCode.LeftArrow);

        if (Input.GetKeyDown(KeyCode.RightArrow))
            _keysDown.Add(KeyCode.RightArrow);

        if (Input.GetKeyDown(KeyCode.UpArrow))
            _keysDown.Add(KeyCode.UpArrow);

        if (Input.GetKeyDown(KeyCode.DownArrow))
            _keysDown.Add(KeyCode.DownArrow);

        // изначалько танчик никуда не двигается
        int h = 0;
        int v = 0;

        // но если какая нибудь стрелка нажата,
        // то двигаем танчик в том направлении, куда
        // указывает последняя зажатая стрелочка
        if (_keysDown.Count != 0)
        {
            _direction = _keyDirection [_keysDown [_keysDown.Count - 1]];

            KeyCode lastkey = _keysDown [_keysDown.Count - 1];

            if (lastkey == KeyCode.RightArrow || lastkey == KeyCode.LeftArrow)
                h = _axixDirection [lastkey];

            if (lastkey == KeyCode.UpArrow || lastkey == KeyCode.DownArrow)
                v = _axixDirection [lastkey];
        }

        _move.x = h;
        _move.y = v;

        _transform.Translate(_move * speed * Time.deltaTime);


    }

    void FixedUpdate()
    {
        _animator.SetInteger("direction", _direction);
    }


    void OnGUI()
    {
        // здесь ловим событие "отжатия клавиши"
        if (Event.current.type == EventType.KeyUp)
            _keysDown.RemoveAt(_keysDown.LastIndexOf(Event.current.keyCode));

        // это просто для теста, показыается список на экране,
        // текущих зажатых стрелочек
        foreach (KeyCode key in _keysDown)
        {
            GUILayout.Label(key.ToString());
        }

    }
}
 
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Проблемы с движением танка в клоне Battle city

Сообщение DeZertiR_UA 23 авг 2015, 18:20

samana писал(а):Мне было интересно попробовать реализовать свой придуманный костыль. Конечно не буду утверждать, что это правильный подход, но это работает.
Здесь танк будет ехать в том направлении, куда указывает последняя нажатая стрелочка (управление только стрелками)
Вы можете конечно не использовать мой код, но вдруг.

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

public class Tank : MonoBehaviour
{
    public float speed = 1f;
    public RuntimeAnimatorController controllers;

    // массив с текущими нажатымы клавишами &#40;стрелочками&#41;
    private List<KeyCode> _keysDown = new List<KeyCode>&#40;&#41;;
    // словарь направлений для аниматора
    private Dictionary<KeyCode, int> _keyDirection = new Dictionary<KeyCode, int>&#40;&#41;;
    // словарь осей, где каждой стрелочке на клавиатуре соответствует нужное число
    private Dictionary<KeyCode, int> _axixDirection = new Dictionary<KeyCode, int>&#40;&#41;;

    private int _direction = 3;
    private Vector3 _move = new Vector3&#40;&#41;;

    private Transform _transform;
    private Animator _animator;


    void Start&#40;&#41;
    {
        _transform = GetComponent<Transform>&#40;&#41;;
        _animator = GetComponent<Animator>&#40;&#41;;
        _animator.runtimeAnimatorController = controllers[0];
        _direction=3;

        // назначаем, какой клавише - какое направление для аниматора
        // !!! возможно здесь нужно будет изменить числа местами
        _keyDirection.Add&#40;KeyCode.DownArrow, 0&#41;;
        _keyDirection.Add&#40;KeyCode.LeftArrow, 1&#41;;
        _keyDirection.Add&#40;KeyCode.RightArrow, 2&#41;;
        _keyDirection.Add&#40;KeyCode.UpArrow, 3&#41;;

        // назначаем, какой оси соответствует каждая стрелочка
        _axixDirection.Add&#40;KeyCode.LeftArrow, -1&#41;;
        _axixDirection.Add&#40;KeyCode.RightArrow, 1&#41;;
        _axixDirection.Add&#40;KeyCode.UpArrow, 1&#41;;
        _axixDirection.Add&#40;KeyCode.DownArrow, -1&#41;;
    }

   
    void Update&#40;&#41;
    {
        // если нажата любая стрелка, то заносим эту
        // клавишу в массив
        if &#40;Input.GetKeyDown&#40;KeyCode.LeftArrow&#41;&#41;
            _keysDown.Add&#40;KeyCode.LeftArrow&#41;;

        if &#40;Input.GetKeyDown&#40;KeyCode.RightArrow&#41;&#41;
            _keysDown.Add&#40;KeyCode.RightArrow&#41;;

        if &#40;Input.GetKeyDown&#40;KeyCode.UpArrow&#41;&#41;
            _keysDown.Add&#40;KeyCode.UpArrow&#41;;

        if &#40;Input.GetKeyDown&#40;KeyCode.DownArrow&#41;&#41;
            _keysDown.Add&#40;KeyCode.DownArrow&#41;;

        // изначалько танчик никуда не двигается
        int h = 0;
        int v = 0;

        // но если какая нибудь стрелка нажата,
        // то двигаем танчик в том направлении, куда
        // указывает последняя зажатая стрелочка
        if &#40;_keysDown.Count != 0&#41;
        {
            _direction = _keyDirection [_keysDown [_keysDown.Count - 1]];

            KeyCode lastkey = _keysDown [_keysDown.Count - 1];

            if &#40;lastkey == KeyCode.RightArrow || lastkey == KeyCode.LeftArrow&#41;
                h = _axixDirection [lastkey];

            if &#40;lastkey == KeyCode.UpArrow || lastkey == KeyCode.DownArrow&#41;
                v = _axixDirection [lastkey];
        }

        _move.x = h;
        _move.y = v;

        _transform.Translate&#40;_move * speed * Time.deltaTime&#41;;


    }

    void FixedUpdate&#40;&#41;
    {
        _animator.SetInteger&#40;"direction", _direction&#41;;
    }


    void OnGUI&#40;&#41;
    {
        // здесь ловим событие "отжатия клавиши"
        if &#40;Event.current.type == EventType.KeyUp&#41;
            _keysDown.RemoveAt&#40;_keysDown.LastIndexOf&#40;Event.current.keyCode&#41;&#41;;

        // это просто для теста, показыается список на экране,
        // текущих зажатых стрелочек
        foreach &#40;KeyCode key in _keysDown&#41;
        {
            GUILayout.Label&#40;key.ToString&#40;&#41;&#41;;
        }

    }
}
 



Вставил твой скрипт, юнити выдает ошибку
error CS0021: Cannot apply indexing with [ ] to an expression of type `UnityEngine.RuntimeAnimatorController'
Я раньше ее исправлял, меняя строку public RuntimeAnimatorController controllers; на public RuntimeAnimatorController[] controllers;
То есть так же, как на скрипте в видеоуроке. но на этт раз не проканало, ибо пишет
Cannot apply indexing with [ ] to an expression of type `UnityEngine.RuntimeAnimatorController'
Вот скрин полной ошибки в окне юнити http://c2n.me/3mvHjsx

UPD: так только на WASD, на стрелочках все норм. Если я хочу другие клавиши, то мне так же просто добавить из в массив? Иои создать еще один такой же массив но с другими клавишами?
Сам по себе скрипт в плане управления работает замечательно, как раз то, что надо, спасибо большое.
Пусть Глубина будет к вам доброй.
DeZertiR_UA
UNец
 
Сообщения: 6
Зарегистрирован: 17 авг 2015, 02:13
  • Сайт

Re: Проблемы с движением танка в клоне Battle city

Сообщение samana 23 авг 2015, 19:00

О блин, всё таки где-то ошибся, жаль.
DeZertiR_UA писал(а):UPD: так только на WASD, на стрелочках все норм. Если я хочу другие клавиши, то мне так же просто добавить из в массив? Иои создать еще один такой же массив но с другими клавишами?

К сожалению там придётся много добавлять, и в массивы, и в условия.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Проблемы с движением танка в клоне Battle city

Сообщение DeZertiR_UA 23 авг 2015, 19:20

К сожалению там придётся много добавлять, и в массивы, и в условия.

А ведь для юнити и стрелочки и wasd - это стандарт. Есть какая то возможность вместо кнопок-стрелок указать что то вроде ссылки на стандарт?
Пусть Глубина будет к вам доброй.
DeZertiR_UA
UNец
 
Сообщения: 6
Зарегистрирован: 17 авг 2015, 02:13
  • Сайт

Re: Проблемы с движением танка в клоне Battle city

Сообщение samana 23 авг 2015, 20:11

Стандарт для движения есть только оси насколько я знаю, как в уроке (getAxis("Horizontal") и т.п.), но я не смог придумать нужный вам способ для управления танком, используя их.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Проблемы с движением танка в клоне Battle city

Сообщение DeZertiR_UA 23 авг 2015, 20:27

Хорошо, че то буду пробовать. Спасибо, Вы меня очень выручили) Переименую тему, чтобы не разводить кучу, будет в целом по проблемам в этом клоне, а не только по управлению))
Пусть Глубина будет к вам доброй.
DeZertiR_UA
UNец
 
Сообщения: 6
Зарегистрирован: 17 авг 2015, 02:13
  • Сайт

Re: Проблемы с движением танка в клоне Battle city

Сообщение DeZertiR_UA 25 авг 2015, 12:01

А вот теперь такой вопрос. Допустим я хочу сделать так, чтобы можно было играть в танчики эти вдвоем не за одним компом, а по сети. Как это можно реализовать? Не масштабно, просто если чисто вдвоем. Хз, может используя локалку как-нидь? (или ее имитацию через хамачи и тд). Сразу говорю игра большим проектом не планируется, это так, попрактиковаться и просто вспомнить ностальгию, может позалипать не через эмулятор)))
Пусть Глубина будет к вам доброй.
DeZertiR_UA
UNец
 
Сообщения: 6
Зарегистрирован: 17 авг 2015, 02:13
  • Сайт

Re: Проблемы с клоном Battle city

Сообщение gnoblin 25 авг 2015, 20:36

photon cloud скачай из асет стора бесплатно, там пример есть про сантехнмков - вот можешь его изучить и взять за основу
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot] и гости: 29