关于unity:Unity-游戏黑暗之光笔记第五章-背包系统的实现

33次阅读

共计 3774 个字符,预计需要花费 10 分钟才能阅读完成。

Unity 游戏光明之光笔记
第五章 背包零碎的实
1. 开发性能按钮

留神 Anchors 的地位,能够让图标在窗口变动时放弃绝对地位不会变动

2. 性能按钮的事件的监听
给 FunctionBar 增加脚本别离给按钮增加点击办法监听事件

 public void OnStatusButtonClick() {}
public void OnBagButtonClick() {}
public void OnEquipButtonClick() {}
public void OnSkillButtonClick() {}
public void OnSettingButtonClick() {}

3. 创立物品信息的管理系统
应用 Text 文件存储信息
增加 icon 给 Atals 图集
创立用来治理治理信息的 TXT 文档 OjbectsInfoList

// 对应的信息名称
//ID,游戏名称,icon 名称,类型,hp,mp, 出售价,购买价
1001, 小瓶血药,icon-potion1,Drug,50,0,50,60
1002, 大瓶血药,icon-potion2,Drug,100,0,70,100
1003, 蓝药,icon-potion3,Drug,0,100,60,80

创立 ObjectInfo 脚本治理信息

// 应用单例模式
    void Awake() {
        _instance = this;
        ReadInfo();}
   
// 定义各个物品的性能 
public enum ObjectType {
    Drug,
    Equip,
    Mat
}
// 示意物品的一条信息
public class ObjectInfo {
    public int id;    //id 
    public string name;// 名称
    public string icon_name;// 这个名称是存储在图集中的名称 icon 名称
    public ObjectType type;// 类型(药品 drug)
    public int hp; // 加血量值
    public int mp;// 加魔法值
    public int price_sell;// 出售价
    public int price_buy;// 购买
}

在程序中读取文本,将物品信息读取到内存

应用 TextAcess 类

获取文本文件

public TextAsset objectsInfoListText;

要把获取的字符存到字典要援用新的命名空间

using System.Collections.Generic;
 public static ObjectsInfo _instance;

    private Dictionary<int, ObjectInfo> objectInfoDict = new Dictionary<int, ObjectInfo>();

    public TextAsset objectsInfoListText;

    // 应用单例模式
    void Awake() {
        _instance = this;
        ReadInfo();}

    // 失去信息的办法,从字典里取用
    public ObjectInfo GetObjectInfoById(int id) {
        ObjectInfo info=null;

        objectInfoDict.TryGetValue(id, out info);
        return info;
    }

    void ReadInfo() {
        // 取到文本文件中所有的字符
        string text = objectsInfoListText.text;
        // 依照行去数据,须要拆分数据到数组
        string[] strArray = text.Split('\n');
        foreach (string str in strArray) {string[] proArray = str.Split(',');

            // 实例化 info 存储信息
            ObjectInfo info = new ObjectInfo();
            
            //ID 转换成字符类型
            int id = int.Parse(proArray[0]);
            string name = proArray[1];
            string icon_name = proArray[2];
            string str_type = proArray[3];
            // 获取类型,依据取得的字符串来赋值类型
            ObjectType type = ObjectType.Drug;
            switch (str_type) {
                case "Drug":
                    type = ObjectType.Drug;
                    break;
                case "Equip":
                    type = ObjectType.Equip;
                    break;
                case "Mat":
                    type = ObjectType.Mat;
                    break;
            }
            info.id =  ; info.name = name; info.icon_name = icon_name;
            info.type = type;
            if (type == ObjectType.Drug) {int hp = int.Parse(proArray[4]);
                int mp = int.Parse(proArray[5]);
                int price_sell = int.Parse(proArray[6]);
                int price_buy = int.Parse(proArray[7]);
                info.hp = hp; info.mp = mp;
                info.price_buy = price_buy; info.price_sell = price_sell;
            }

            objectInfoDict.Add(id, info);// 增加到字典中,id 为 key,能够很不便的依据 id 查找到这个物品信息
        }
    }
    
  1. 设计背包界面

为了在鼠标挪动到面板点击时角色不挪动,增加 box collider 组件
5. 创立脚本治理背包物品
创立 Inventory 脚本设置设置单例模式不便调用

    // 设置单例模式
    public static Inventory _instance;
    private TweenPosition tween;
    // 获取背包格子的数组
    public List<InventoryItemGrid> itemGrids = new List<InventoryItemGrid>();
    // 金币的数量
    private int coinCount = 1000;
    // 治理金币的显示
    public UILabel coinNumberLable;
    private void Awake()
    {
        _instance = this;
        tween = this.GetComponent<TweenPosition>();}
    // 播放动画的办法
    public void Show()
    {tween.PlayForward();
    }
    public void Hide()
    {tween.PlayReverse();
    }

单个网格中寄存信息,若要创立 InventoryItemGrid 脚本进行信息的存储,要给网格增加 box Collider 组件

创立 Tag 辨别网格中是否存在物品,给不同的网格制订 Tag

 // 存储物品信息
    public  int id=0;
    // 存储物品信息
    private ObjectInfo info = null;
    // 物品个数
    public int num = 0;

    public UILabel numLabel;

    // Use this for initialization
    void Start () {numLabel = this.GetComponentInChildren<UILabel>();
    }

    // 管制网格的显示办法,默认 num 里为 1,依据 idmunber 显示
    public void SetId(int id, int num = 1) {
        this.id = id;
        info = ObjectsInfo._instance.GetObjectInfoById(id);
        // 获取子物体
        InventoryItem item = this.GetComponentInChildren<InventoryItem>();
        item.SetIconName(info.icon_name);
        // 更新显示
        numLabel.enabled = true;
        this.num = num;
        numLabel.text = num.ToString();}

    public void PlusNumber(int num = 1) {
        this.num += num;
        numLabel.text = this.num.ToString();}

    // 清空 格子存的物品信息
    public void ClearInfo() {
        id = 0;
        info = null;
        num = 0; 
        numLabel.enabled = false;
    }

InventoryItem 脚本

private UISprite sprite;
    private void Awake()
    {base.Awake();
        sprite = this.GetComponent<UISprite>();}

    // 判断鼠标是否 在网格中
    protected override void OnDragDropRelease(GameObject surface)
    {base.OnDragDropRelease(surface);
        if(surface!=null)
        {}}

    public void SetId(int id)
    {ObjectInfo info = ObjectsInfo._instance.GetObjectInfoById(id);
        sprite.spriteName = info.icon_name;
    }
    // 设置名字
    public void SetIconName(string icon_name)
    {sprite.spriteName = icon_name;}

正文完
 0