查看: 1288|回复: 1
收起左侧

[GUI] Unity3D使用NGUI实现简单背包功能

[复制链接]

[GUI] Unity3D使用NGUI实现简单背包功能[复制链接]

寒愁微别 发表于 2018-1-11 12:01:58 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式 回复:  1 浏览:  1288
前话
在许多类型游戏中我们经常会使用到背包,利用背包来设置相应角色属性,多了背包也会让游戏增色拓展不少。
那在Unity3D游戏开发中该如何编写背包系统呢?因为有高人开发了NGUI插件,因此我们进行简单编写代码设置即可实现一个简单的背包功能了。

准备工作
  • 新建一个工程PackageDemo
  • 导入NGUI包(最新版3.9.8版的正版89刀)
  • 准备好图片素材,使用NGUI将其打包成图集
背包

Unity3D使用NGUI实现简单背包功能

Unity3D使用NGUI实现简单背包功能

背包格子 

Unity3D使用NGUI实现简单背包功能

Unity3D使用NGUI实现简单背包功能

物品 

Unity3D使用NGUI实现简单背包功能

Unity3D使用NGUI实现简单背包功能


简单背包功能实现
第一步,添加NGUI控件,使用素材
项目目录以及场景列表如下:

Unity3D使用NGUI实现简单背包功能

Unity3D使用NGUI实现简单背包功能

要注意的是:
  • Package、Cell和Obj都是NGUI的Sprite控件
  • Cell01-Cell09都设置了名为“Cell”的tag
  • UI Root设置了名为“UIRoot”的tag
  • Package、Cell和Obj都添加了Box Collider组件

第二步,给Package添加NGUI脚本UI Drag Object

Unity3D使用NGUI实现简单背包功能

Unity3D使用NGUI实现简单背包功能

Unity3D使用NGUI实现简单背包功能

Unity3D使用NGUI实现简单背包功能

添加在脚本使Package可以被拖拽移动。
第三步,给Obj添加自定义脚本MyDragAndDrop
直接在Obj的属性面板add component添加脚本 MyDragAndDrop.cs 

Unity3D使用NGUI实现简单背包功能

Unity3D使用NGUI实现简单背包功能

打开并编辑脚本:
  • 令MyDragAndDrop继承UIDragDropItem
  • 重写OnDragDropRelease方法

更改后的MyDragAndDrop脚本代码如下:
[C#] 纯文本查看 复制代码
using UnityEngine;
public>
  
//该方法用于获取拖拽的物体释放拖拽时,该物体所碰撞的对象
  
//所以我们前面需要给Cell和Obj都添加Box Collider
  
protected override void OnDragDropRelease(GameObject surface)
  
{
  
base.OnDragDropRelease(surface);

  
//判断获取碰撞的对象的tag是否为Cell
  
if (surface.tag == "Cell")
  
{
  
//将Obj放到碰撞的Cell的子列表中
  
transform.parent = surface.transform;

  
//设置Obj的相对于Cell的坐标为0
  
transform.localPosition = Vector3.zero;
  
}
  
else
  
{
  
//如果碰撞的对象不是Cell,就将Obj放到tag为UIRoot的对象子列表中,解除Obj和Cell父子关系
  
transform.parent = GameObject.FindGameObjectWithTag("UIRoot").transform;
  
}

  
}

  
}

第三步,测试

Unity3D使用NGUI实现简单背包功能

Unity3D使用NGUI实现简单背包功能

到这里简单例子也就完成了。
  可以看到,到我拖拽Obj在每个Cell的边缘时,Obj都会自动移至碰撞的Cell内,类似吸附功能。
  上面的简单例子实现了物体被背包吸附装入的功能,通过检测Cell的子物体增加相应逻辑就可以实现背包和角色属性关联。

拓展
1.背包内物品栏的物品交换相互位置
  给所有物品设置tag为 “Obj” ,如果物品拖拽释放时碰撞获取的对象tag为“Obj”,就设置交换物品的父级对象。

2.捡取物品到背包中  一般捡取得物品到背包其排序都是从左到右,从上到下填入空的物品栏中。
  实现方式是将所有物品栏对象装载到GameObject的数组中。
  通过循环判断物品栏是否有子对象,也就是判断物品栏的子列表数值是否大于0
  若小于或等于0,就将物品的父对象设置为该物品栏,然后设置其相对父对象坐标为0

还有很多实现大家自由发挥吧转自:https://www.cnblogs.com/pwc1996/p/5425230.html

+1
1280°C
1
  • 花开彼岸_NOPD
过: 他们
因分享而快乐,学习以自强!
花开彼岸_NOPD 发表于 2018-1-12 10:01:16 显示全部楼层
学习了,非常感谢,谢谢分享!
因分享而快乐,学习以自强!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 沪ICP备14023207号-9 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ