Madware
> тут придется отказываться от инпут манагера в Unity и делать свои костыли,
> этого я бы хотел избегать по мере возможностей, хотя инверсия мыши уже будет
> первым шагом к ним :)
Свой инпут-манагер педалит. Юнитековский просто тихий ужас. Особенно раздражает, что нельзя менять раскладку в рантайме.
Могу поделиться своим, если не пугают конструкции InputManager.GetButton("Forward"). Но он сделан в угоду удобству, а не производительности. В частности поиск через FirstOrDefault.
Dampire
было бы интересно посмотреть
Добавляю кнопки через текстовый конфиг и TryParse. Т.е. если не распарсилось как KeyCode, то пробую как int 0-7, если тоже не прокатило - используется дефолтная версия.
+ InputManager.cs
− Скрыть
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace Game
{
class ButtonMapping
{
public KeyCode button;
public int mouseButton;
public bool mouse;
public string name;
public int nameHash;
public bool state;
public bool prevState;
}
public class InputManager : Presenter<InputManager>
{
private List<ButtonMapping> buttons = new List<ButtonMapping>();
private InputManager(){}
private InputManager(InputManager c) {}
void Update()
{
for (int i = 0; i < instance.buttons.Count; ++i)
{
instance.buttons[i].prevState = instance.buttons[i].state;
if (instance.buttons[i].mouse)
instance.buttons[i].state = Input.GetMouseButton(instance.buttons[i].mouseButton);
else
instance.buttons[i].state = Input.GetKey(instance.buttons[i].button);
}
}
public static int GetHash(string name)
{
return name.GetHashCode();
}
public static int AddButton(string name, KeyCode key)
{
int hash = GetHash(name);
ButtonMapping map = null;
map = instance.buttons.FirstOrDefault((val) => { return val.nameHash == hash; });
if (map == null)
{
map = new ButtonMapping();
instance.buttons.Add(map);
}
map.mouse = false;
map.button = key;
map.nameHash = hash;
map.name = name;
return hash;
}
public static int AddButton(string name, int mouseButton)
{
int hash = GetHash(name);
ButtonMapping map = null;
map = instance.buttons.FirstOrDefault((val) => { return val.nameHash == hash; });
if (map == null)
{
map = new ButtonMapping();
instance.buttons.Add(map);
}
map.mouse = true;
map.mouseButton = mouseButton;
map.nameHash = hash;
map.name = name;
return hash;
}
public static void RemoveButton(string name)
{
instance.buttons.RemoveAll((a) => { return a.name == name; });
}
#region Get Input
public static bool GetButton(int nameHash)
{
ButtonMapping button = null;
button = instance.buttons.FirstOrDefault((val) => { return val.nameHash == nameHash; });
if (button == null)
return false;
else
return button.state;
}
public static bool GetButtonUp(int nameHash)
{
ButtonMapping button = null;
button = instance.buttons.FirstOrDefault((val) => { return val.nameHash == nameHash; });
if (button == null)
return false;
else
return button.prevState && !button.state;
}
public static bool GetButtonDown(int nameHash)
{
ButtonMapping button = null;
button = instance.buttons.FirstOrDefault((val) => { return val.nameHash == nameHash; });
if (button == null)
return false;
else
return !button.prevState && button.state;
}
public static bool GetButton(string name)
{
ButtonMapping button = null;
button = instance.buttons.FirstOrDefault((val) => { return val.name == name; });
if (button == null)
return false;
else
return button.state;
}
public static bool GetButtonUp(string name)
{
ButtonMapping button = null;
button = instance.buttons.FirstOrDefault((val) => { return val.name == name; });
if (button == null)
return false;
else
return button.prevState && !button.state;
}
public static bool GetButtonDown(string name)
{
ButtonMapping button = null;
button = instance.buttons.FirstOrDefault((val) => { return val.name == name; });
if (button == null)
return false;
else
return !button.prevState && button.state;
}
#endregion
}
}
− Скрыть
using UnityEngine;
public class Presenter<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance;
private static object _lock = new object();
private const string _name = "Presenter";
protected static T instance
{
get
{
lock (_lock)
{
if (_instance == null)
{
_instance = FindObjectOfType<T>();
if(_instance == null)
{
GameObject go = GameObject.Find(_name);
if (go == null)
go = new GameObject(_name);
_instance = go.AddComponent<T>();
}
}
return _instance;
}
}
}
}
Dampire
Пока что я ничего не делаю, кроме того что вяло пилю игру про гонки на радиоуправляемых катерах(темы еще нет) и играю в DCS World(много времени жрет сцобако).
Но о синнерсе регулярно задумываюсь, скоро буду рефакторить архитектуру.
Одним инпут манагером не обойдется. Хочу сделать централизованный менеджер AI.
Чарактер контроллер однозначно претерпит сильные изменения. Для пуль и прочих частых штук сделаю пуллинг.
Цилиндрический биллборд будет переписан на вменяемый шейдер, заодно прикручу наконец туман к спрайтам.
Ну и еще кучу фиксов непосредственно касающихся излишне связной архитектуры и говнокода, написанного как временное, но так и оставшегося.
Так же буду устранять полупиратский арт своим пиксель артом(самый медленный этап :D).
Может быть еще пересмотрю сам AI монстров, возможно отбалансю это дело.
Потом думаю подключить снова левел дизайнера для пиления чистовых уровней с учетом окклюжн куллинга и т.д.
Кстати, второй программист ушел таки окончательно, так что я один сейчас на проекте.
Начинаю по-тихоньку ковырять код нашего проекта на конкурс с целью всяческого у него левел апа. Считаем отправной точкой новой жизни проекта сегодняшний день! Тему новую не создаю. Ибо зачем?
Пока проекту не требуется никто, но в дальнейшем нам может понадобиться толковый художник по пикселю. Работа будет за идею, так что всем заранее пугаться.
Свежее обновление - со мной связался один очень талантливый парень, который пилит практически аналогичный проект. Он предложил мне заняться кодом искусственного интеллекта, а так же допилить все остальное уже в его проекте и я согласился.
Меня захантили короч :) Проект пока не афишируем. Скажу только, что будет намного круче.
ништяг) скинь потом хоть пару скринов)
Ma3a
Как только решим приоткрыть завесу тайны, сразу что-нибудь выложим)
А в этом проекте я даже инверсии мыши не дождался... зря высокую оценку на конкурсе ставил :)
Mikle
Ну да, зря :) ну кто знает, я могу и выкатить патчик когда-нибудь, правда не ясно зачем. Поиграешь уже в следующий проект, там и настраиваемое управление будет и инверсия и нормальное быстродействие(очень на это надеюсь :D)
Прошло более 9 месяцев
Рестарту проекта быть!
Дата начала работ по второй итерации: 20 декабря 2016
Для тех кому интересно что с тем проектом в пользу которого закрывал -- не сошлись во мнениях в итоге и разошлись
Уже далеко за 20. Any news? Anybody?
Dampire
Дата начала работ номинальная. Она обозначена за окончанием конкурса. Сейчас я занят оцениванием работ участников, и как только закончу — буду что-то делать по этому проекту
Прошло более 1 года
Верни билд на место (на дропбоксе 404). Я хочу вспомнить все.