SelectHero
和HeroItem
还没有分离出View和Controller的逻辑,先分离出来。
SelectHeroController
不要把它和SelectedHeroController
搞混了,这里主要分离的是SelectHero
的逻辑
1 2 3 4 5 6 7 8 9 10 11 12
| using UnityEngine;
public class SelectHeroController : ControllerBase { protected override void InitChild() { foreach (Transform trans in transform) { trans.gameObject.AddComponent<HeroItemController>(); } } }
|
SelectHero
修改SelectHero
,让它继承ViewBase
1 2 3 4 5 6 7 8 9 10 11 12
| using UnityEngine;
public class SelectHero : ViewBase { protected override void InitChild() { foreach (Transform trans in transform) { trans.gameObject.AddComponent<HeroItem>(); } } }
|
HeroItemController
遇到类型转换的逻辑,放在try……catch块中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| using UnityEngine.UI; using System; using UnityEngine;
public class HeroItemController : ControllerBase { private Hero _hero; protected override void InitChild() { string heroName = GetComponent<Image>().sprite.name; try { _hero = (Hero)Enum.Parse(typeof(Hero), heroName); } catch (Exception e) { Debug.LogError(e); } GetComponent<Button>().onClick.AddListener(Selected); } private void Selected() { GameStateModel.Instance.SelectedHero = _hero; } }
|
HeroItem
修改HeroItem
的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System;
public class HeroItem : ViewBase { private Color defaultColor = Color.gray; private Color selectedColor = Color.white; private float tweenTime = 0.3f; private Image image; private Hero _hero;
protected override void InitChild() { image = GetComponent<Image>(); string heroName = image.sprite.name; try { _hero = (Hero)Enum.Parse(typeof(Hero), heroName); } catch (Exception e) { Debug.LogError(e); } Unselected(); } public override void UpdateFun() { bool isSelected = GameStateModel.Instance.SelectedHero == _hero; if (isSelected) { Selected(); } else { Unselected(); } } void Selected() { image.DOKill(); image.DOColor(selectedColor, tweenTime); } public void Unselected() { image.DOKill(); image.DOColor(defaultColor, tweenTime); } }
|
Enums
这是一个通用枚举的合集,把Enums
文件放在Const文件夹中。在其中声明Hero
枚举,我们每个英雄就用对应的图片名称来表示
1 2 3 4 5 6
| public enum Hero { player_0, player_1, player_2, }
|
这里使用图片名称作为枚举类型是为了让选中的英雄和图片素材一一对应。
正常情况下,每一个英雄图片是动态加载的,每一个HeroItem
对应的英雄都在代码中确定了,这里因为是简单案例,简化了其中的操作,英雄图片不再动态加载,而是提前在UI中指定好了,所以需要英雄枚举和图片名称一致,方便知道选中的到底是哪一个英雄。
在GameStateModel
中添加当前选中的英雄的枚举的变量。
1 2 3 4 5
| public class GameStateModel : NormalSingleton<GameStateModel> { public Hero SelectedHero { get; set; } }
|