已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
My First RPG Game 总结二 背包栏打开点击的时候也会触发主角移动,解决办法 csharp view plain copy 在 CODE 上查看代码片派生到我的代码片 if (Input.GetMouseButtonDown(0) private void OnMouseOver() if (Input.GetMouseButtonDown(0) ShowQuest(); /显示任务框 void ShowQuest() questTween.gameObject.SetActive(true); questTween.PlayForward(); 如果让任务框的动画倒回去播放,也即让任务框退回去消失,questTween,PlayReverse() ; 如果一个物体不能添加 c#脚本,检查下该脚本的类名写错没 下面是背包系统的制作: 首先物品种类的分析: 创建 txt 文件,放入所有物品信息: 1001,小瓶血药,icon-potion1,Drug,50,0,50,60 1002,大瓶血药,icon-potion2,Drug,100,0,70,100 1003,蓝药,icon-potion3,Drug,0,100,60,80 我们发现,当物品种类是药品的时候才会有 4,5,也即加血量和加魔法值,我们可以通过物 品 id 得到一条信息,该信息可以得到该物品的名称,类型,价格等等,所以用字典的方式, key 为 id,value 为 ObjectInfo 集合来标识 csharp view plain copy 在 CODE 上查看代码片派生到我的代码片 public class ObjectsInfo : MonoBehaviour public static ObjectsInfo _instance; private Dictionary objectInfoDict = new Dictionary(); 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(,); ObjectInfo info = new ObjectInfo(); int id = int.Parse(proArray0); string name = proArray1; string icon_name = proArray2; string str_type = proArray3; 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 = id; = name; info.icon_name = icon_name; info.type = pe; if (type = ObjectType.Drug) int hp = int.Parse(proArray4); int mp = int.Parse(proArray5); int price_sell = int.Parse(proArray6); int price_buy = int.Parse(proArray7); info.hp = hp; info.mp = mp; info.price_buy = price_buy; info.price_sell = price_sell; objectInfoDict.Add(id, info);/添加到字典中,id 为 key,可以很方便的根据 id 查找到这个物品信息 /id /名称 /icon 名称 /类型(药品 drug) /加血量值 /加魔法值 /出售价 /购买 public enum ObjectType Drug, Equip, Mat /该集合保存了物品的所有信息 public class ObjectInfo public int id; public string name; public string icon_name;/这个名称是存储在图集中的名称 public ObjectType type; public int hp; public int mp; public int price_sell; public int price_buy; 注意上面的这个脚本定义了 2 个类 ObjectInfo 和 ObjectsInfo,看清楚 给背包物品添加可拖拽功能:给物品添加脚本,让它继承 UIDragDropItem,这个应该是 NGUI 的一个类,而且由于物品要和鼠标拖拽交互,需要给他添加 box collider,这是游戏 里发现可以对物品进行拖拽了,给物品和背包的格子添加 tag 来区分,给每个格子都添加 box collider,这里注意的是物品,格子,背包全部添加了 box collider,给物品添加这样的 脚本,当拖拽结束的时候如果下面是格子,就会打印出格子的 tag csharp view plain copy 在 CODE 上查看代码片派生到我的代码片 public class Inventory_item : UIDragDropItem protected override void OnDragDropRelease(GameObject surface) base.OnDragDropRelease(surface); if (face != null) Debug.Log(surface.tag); 这里特别注意的是,自己在调试的时候,发现什么都不打印,一直空指针,弄了 TMD 3 小 时才发现,给格子的 box collider 的范围要设置合理才能行,如果太小就空指针,妈了个 bb 的 Inventory_item 中代码如下: csharp view plain copy 在 CODE 上查看代码片派生到我的代码片 private void Awake() sprite = GetComponent(); 首先给 item 传进 id 的时候得到物品的信息,我们要显示出该 item 的图片,所以拿到 UISprite 添加 2 个方法: csharp view plain copy 在 CODE 上查看代码片派生到我的代码片 public void SetId(int id) /根据 ObjectInfo 的 id 拿到该 id 的物品所有信息 ObjectInfo info = ObjectsInfo._instance.GetObjectInfoById(id); sprite.spriteName = info.icon_name; csharp view plain copy 在 CODE 上查看代码片派生到我的代码片 public void SetIconName(string icon_name) sprite.spriteName = icon_name; 给格子的右下角添加物品的个数,放一个 UI label,并把它隐藏 在 Bag_Grid 中添加脚本 Inventory_item_Grid 脚本 csharp view plain copy 在 CODE 上查看代码片派生到我的代码片 public class Inventory_item_Grid : MonoBehaviour public int id = 0; private int num = 0; private UILabel numLabel; private Inventory_item item; private ObjectInfo info; private void Start() numLabel = GetComponentInChildren(); /物品拖过去的时候让物品初始化个数为 1 public void SetId(int id,int num=1) this.id = id;/这行容易忽略,当拖动了已有的物品要把拖动的 id 和 grid 的 id 判断 是否相等 info = ObjectsInfo._instance.GetObjectInfoById(id); /这里容易犯错不是 getComponent看清父子关系 item = this.GetComponentInChildren(); item.SetIconName(info.icon_name); /不是 numLabel.Setactive 看清楚 numLabel.gameObject.SetActive(true); this.num = num; numLabel.text = num.ToString(); /让物品的数量加一 public void PlusNumber(int num = 1) this.num += num; /注意是 this.num.ToString()可不是 num.ToString numLabel.text = this.num.ToString(); /清空格子 public void ClearInfo() id = 0; info = null; num = 0; numLabel.gameObject.SetActive(false); 对于 ShowInventory 脚本添加给背包 bag,当人物拾取一个物品,遍历所有格子 csharp view plain copy 在 CODE 上查看代码片派生到我的代码片 public class ShowInventory : MonoBehaviour public static ShowInventory _instance; private TweenPosition tween; private int coinCount = 1000; public UILabel coinNumber; /在这里创建 list 保存所以格子,把所有格子拖动到这里 public List list = new List(); /这里把物品的 prefab 拖动到这里, Inventory_item 时物品的脚本,看清楚 public Inventory_item item; private void Awake() _instance = this; private void Start() tween = GetComponent(); public void Show() tween.PlayForward(); public void Off() tween.PlayReverse(); private void Update() /暂时用键盘的 X 来代表拿到了随机的一个药品 if(Input.GetKeyDown(KeyCode.X) GetId(Random.Range(1001,1004); /拾取到 id 物品,添加到物品栏 public void GetId(int id) /如果拿到了物品的 id 就要实例化一个 inventory_item 添加到物品栏里面,但是物 品栏不知道哪个空着,所以要遍历一下 /物品栏看看哪个空着,当然有两种情况,首先看看所有物品栏里面有没有已经 有该物品的格子,如果有,就让它数量+1 /如果没有,就实例化该物体 Inventory_item_Grid grid=null; foreach (Inventory_item_Grid temp in list) if (temp.id=id) grid = temp; break; if (grid!=null) /数量加一即可 grid.PlusNumber(); else /实例化物品 item foreach (Inventory_item_Grid temp in list) if (temp.id = 0) grid = temp; /记得要 break 跳出循环,否则会得到最后一个格子 break; /如果格子全部都有物品,那么 grid 就为 null,这个判断也得加上 if (grid!=null) /注意在这里是实例化 NGUI 的控件,所以要用 NGUI 的接口, NGUITools.AddChild 方法中第一个参数是添加的 /物品的父类,这里的父类是第几个格子,所以是 grid.gameObject 第二 个参数是添加的实例物品,在最上面 public /该物品,拖动过来就行 /这里犯的错误是第二个错误不是 item,而是 item.gameObject,item 是那 个物品的脚本 GameObject go = NGUITools.AddChild(grid.gameObject,item.gameObject); go.transform.localPosition = Vector3.zero; grid.SetId(id); 这样的话当在游戏中一直按 x 来添加物品,那么物品的效果如下; 实际中在取得 UI Label 显示物品数量的时候 GetComponentInChildren一直取不到, 这是因为我们已经把他隐藏了,通过 getComponent 方式拿不到隐藏的 Gameobject,那么我 们不隐藏,在该显示的时候让 label.enabled=true,在该清空物品的时候 false 即可 另外说明的是在测试 bug 的时候,要看哪个 Gameobject 有没有取到,如果是 private,可以 改成 public 在 play 模式下可以查看有没有获取到 如果物品的数量被物品的图片挡住了,修改 Depth 即可 this.transform.parent 的使用: 作用在克隆的时候,因为克隆出来的物体为了位置的统一和管理的统一,你要把他们放到 同一个父体里面,也就是直接设置 clone.transform.parent=某个对象。这样克隆出来的对象 直接就放到“某个对象”里面了 下面来讲解这样的效果: csharp view plain copy 在 CODE 上查看代码片派生到我的代码片 protected override void OnDragDropRelease(GameObject surface) base.OnDragDropRelease(surface); if (ce != null) / print(surface.tag); /下面进行拖拽功能,分为三种,当把物品拖拽到没有物品的格子,把图片和 数量移动到其他格子,当把物品拖拽到已有物品 /的格子,那么进行交换,当把物品拖拽到原来的格子,不变 if (surface.tag=Tags.bag) transform.localPosition = Vector3.zero; else if (surface.tag = Tags.grid) /分为拖到其他格子和拖到自己格子 if (surface=transform.parent.gameObject)/移动到了当前格子 transform.localPosition = Vector3.zero; else/移动到其他格子 /获取父物体的 Gameobject 采用 this.transform.parent.gameObject 的方 式 Inventory_item_Grid newGrid =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 呼吸训练课件
- 胆囊肿瘤的护理
- 雨课堂学堂在线学堂云《财务一点通( 哈工)》单元测试考核答案
- 2026年广日股份研究院校园招聘历年真题汇编带答案解析
- 浙江国企招聘-2025杭州电力设备制造有限公司招聘70人历年真题汇编附答案解析
- 2026江苏省招标中心有限公司校园招聘历年真题汇编带答案解析
- 2026年质量员之设备安装质量专业管理实务考试题库含完整答案(考点梳理)
- 2025中能建数字科技集团有限公司专业人才社会招聘32人参考题库带答案解析
- 浙江国企招聘-2025年丽水云和县云采工程咨询有限公司公开招聘市场化用工工作人员17人备考题库含答案解析(必刷)
- 2025年西安市北方医院招聘(14人)备考公基题库带答案解析
- 2025年生态环境执法大练兵比武竞赛理论考试题库(含答案)
- 家用空调维修培训
- 2025年湖南省长沙市生地会考试卷附带长郡月亮岛中学生地会考及答案
- 江西省稳派智慧上进2025-2026学年高二上学期11月期中语文试卷及答案
- DGTJ08-2048-2024 民用建筑电气防火设计标准
- 2025江西抚州市5家市属国有企业招聘51人笔试考试备考试题及答案解析
- (2025年)(完整版)中药材及中药饮片培训试题附答案
- 2025年智能城市大数据中心建设方案
- 灯展招商方案合同范本
- 2025年天津市公务员录用考试《行测》真题及答案解析(回忆版)
- “人工智能+医疗”:未来世界的医疗变革
评论
0/150
提交评论