强化飞机界面
程序员文章站
2022-04-01 09:44:11
...
(旧)ViewBase.cs
《UI管理》中的脚本,因UI面板上的某些子物体也有挂载ViewBase的需求,现增加、修改以下功能:
1、缓存挂载ViewBase脚本的子界面
2、增加初始化子界面的方法InitSubView(),在Init()函数中进行调用。
3、由于继承ViewBase的脚本需要重写Init()函数,而又必须初始化子界面,为了避免在重写Init()函数时又要调用初始化子界面的方法,取消Init()函数的virtual属性,增加抽象方法InitChild(),在Init()方法中调用并强制继承ViewBase的子类实现该方法,以此代替Init()函数的重写。
4、在Show()和Back()方法中对缓存的子界面也进行Show()和Back()操作。
private HashSet<ViewBase> _views;
protected abstract void InitChild();
private void InitSubView()
{
_views = new HashSet<ViewBase>();
ViewBase view = null;
foreach(Transform trans in transform)
{
view = trans.GetComponent<ViewBase>();
if(view != null)
_views.Add(view);
}
}
public void Init()
{
InitChild();
InitSubView();
foreach(ViewBase view in _views)
view.Init();
}
public virtual void Show()
{
gameObject.SetActive(true);
foreach(ViewBase view in _views)
view.Show();
}
public virtual void Back()
{
foreach (ViewBase view in _views)
view.Back();
gameObject.SetActive(false);
}
StrengthenView.cs
给子物体挂上同样继承自ViewBase的SwitchPlayer脚本
[BindPrefab(Paths.STRENGTHEN_VIEW)]
public class StrengthenView : ViewBase
{
protected override void InitChild()
{
Util.Get("Switchplayer").go.AddComponent<SwitchPlayer>();
}
}
(旧)ILoader.cs
《Unity加载模块笔记》、《读取器与协程管理》中的脚本
现增加加载图片或其他资源的方法的接口
T Load<T>(string path) where T : UnityEngine.Object;
T[] LoadAll<T>(string path) where T : UnityEngine.Object;
(旧)ResourceLoader.cs
《Unity加载模块笔记》、《读取器与协程管理》中的脚本
现实现加载图片或其他资源的方法
using Object = UnityEngine.Object
public T Load<T>(string path) where T : Object
{
T sprite = Resources.Load<T>(path);
if(sprite == null)
{
Debug.LogError("未找到对应资源,路径:" + path);
return null;
}
return sprite;
}
public T[] LoadAll<T>(string path) where T : Object
{
T[] sprites = Resources.LoadAll<T>(path);
if(sprites == null || sprites.Length == 0)
{
Debug.LogError("当前路径下未找到对应资源,路径:" + path);
return null;
}
return sprites;
}
SwitchPlayer.cs
using System.Collections.Generic;
using UnityEngine;
public class SwitchPlayer : ViewBase
{
private int _id;
private Dictionary<int, List<Sprite>> _planeSprites;
protected override void InitChild()
{
Util.Get("Left").AddListener(()=>Switch(ref _id,-1));
Util.Get("Right").AddListener(() => Switch(ref _id,1));
LoadSprite();
}
private void Switch(ref int id, int direction)
{
UpdateId(ref id, direction);
UpdateSprite(id);
}
private void UpdateId(ref int id, int direction)
{
int min = 0;
int max = _planeSprites.Count;
id += direction;
id = id < 0 ? 0 : id >= max ? max - 1 : id;
}
private void UpdateSprite(int id)
{
int level = DataMgr.Single.Get<int>(DataKeys.LEVEL);
Util.Get("Icon").SetSprite(_planeSprites[id][level]);
}
private void LoadSprite()
{
_planeSprites = new Dictionary<int, List<Sprite>>();
Sprite[] sprites = LoadMgr.Single.LoadAll<Sprite>(Paths.PLAYER_PICTURE_FOLDER);
foreach(Sprite sprite in sprites)
{
string[] idData = sprite.name.Split('_');
int playerId = int.Parse(idData[0]);
if(!_planeSprites.ContainsKey(playerId))
{
_planeSprites[playerId] = new List<Sprite>();
}
_plaeSprites[playerId].Add(sprite);
}
}
public override void Show()
{
_id = DataMge.Single.Get<int>(DataKeys.PLANE_ID);
UpdateSprite(_id);
}
}
上一篇: 资源规范工具之导入图片名称规范工具
下一篇: CUDA图像处理 | 模板匹配