共计 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 查找到这个物品信息
}
}
- 设计背包界面
为了在鼠标挪动到面板点击时角色不挪动,增加 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;}
正文完