Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Уж больно имя узнаваемое.
Можно сделать так, чтобы камера переезжала иногда на новое место со сменой декораций и противников.
почитать в комментариях о своих косяках
Рискую прослыть слоупоком, что такое "кальцифера"?
Меня пугает что это увидят такие же как Вы и завтра уже другие посты затеряются среди подобного контента-кальцефера.
Кстати есть что годное по тебе mvc в unity?
BuildingButtonPrefab
|--- BuildingButtonImage
| \--- BuildingTitleText
\--- ConstructedParticlesclass BuildingButtonsList : MonoBehaviour {
public BuildingButtonPrefab BuildingButtonPrefab;
public void Start () {
foreach (var bType in Game.instance.buildings.list) {
Instantiate(BuildingButtonPrefab, transform);
}
}
}
class BuildingButtonPrefab : MonoBehaviour {
public Button BuildingButtonImage;
public Text BuildingTitleText;
public Particles ConstructedParticles;
private BuildingTypeEnum type;
public void SetBuildingType (BuildingTypeEnum type) {
this.type = type;
text.text = Game.instance.localization.get("Buildings." + type);
}
public void Start () {
Game.instance.onChange += OnSomethingChanged;
Game.instance.onConstructed += OnConstructed;
}
public void OnSomethingChanged() {
var g = Game.instance;
if (!g.tree.IsResearched(type)) {
Button.image = GetGreyImage();
}
else if (g.buildings.IsConstructed(type)) {
Button.image = GetGreyImage();
}
else if (!g.wallet.HasResourcesFor(type)) {
Button.image = GetBlueImage();
}
else {
Button.image = GetGreenImage();
}
}
public void OnConstructed(BuildingTypeEnum type) {
if (type == this.type) {
ConstructedParticles.Launch();
}
}
}public class BuildingButton : MonoBehaviour {
[SerializeField] private Button _button;
[SerializeField] private Text _title;
[SerializeField] private Particles _particles;
public void Listen(Action onClick) { _button.onClick.AddListener(onClick.Invoke); }
public void Unlisten() { _button.onClick.RemoveAllListeners(); }
public void Initialize(string title) { _title.text = title; }
public void Burst() { _particles.Launch(); }
public void SetState(ButtonState state) {
switch (state) {
case ButtonState.Disabled:
_button.interactable = false;
// _button.image = _gray;
break;
case ButtonState.Inactive:
_button.interactable = false;
// _button.image = _blue;
break;
case ButtonState.Active:
_button.interactable = true;
// _button.image = _green;
break;
default:
throw new ArgumentOutOfRangeException("state", state, null);
}
}
}Стараться не использовать MonoBehaviour :).
Как бы это не было смешно, но насколько я знаю, это единственный верный путь, если нужно создать проект с более менее сложной архитектурой в Unity.
Вообще, я руководствуюсь правилом — если это MonoBehaviour то это Вид и он максимально тупой.
По примеру, больно много уже классов, чтобы быстро пояснить… я только один изменю — BuildingButtonPrefab.
BuildingButtonControllerFactory, которая создает BuildingButtonController, которая передает уже все параметры этой нашей BuildingButtonPrefab?BuildingButtonView?BuildingButtonController получает ссылку на BuildingButtonPrefab? И вот смотрите, мне надо создать список кнопок. Ну допустим, это выглядит в новом подходе так:foreach (var bType in game.buildings.list) {
buttons.Add( buildingButtonControllerFactory.Produce(bType) );
}GameObject.Instantiate(BuildingButtonPrefab) в контроллере BuildingButtonController? (простите за каламбур)BuildingButtonController знает в какой трансформ необходимо добавить свой ГеймОбджект?MonoBehaviour? Я сходу не вспомню, что именно, но допустим, если бы Instantiate можно было бы сделать только внутри наследника — тогда как?Мне вот тут подумалось — а что если запилить клон этой игрушки на Godot 3.0 и сравнить с оригиналом на Unity по простоте реализации?
Игра на Unity, с открытым кодом