欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

强化飞机界面

程序员文章站 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);
    }
}