您的位置:首页 > 移动开发 > Unity3D

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

2016-04-23 15:32 579 查看

前话

在许多类型游戏中我们经常会使用到背包,利用背包来设置相应角色属性,多了背包也会让游戏增色拓展不少。

那在Unity3D游戏开发中该如何编写背包系统呢?因为有高人开发了NGUI插件,因此我们进行简单编写代码设置即可实现一个简单的背包功能了。

准备工作

新建一个工程PackageDemo

导入NGUI包(最新版3.9.8版的正版89刀)

准备好图片素材,使用NGUI将其打包成图集

背包



背包格子



物品



简单背包功能实现

第一步,添加NGUI控件,使用素材

项目目录以及场景列表如下:



要注意的是:

Package、Cell和Obj都是NGUI的Sprite控件

Cell01-Cell09都设置了名为“Cell”的tag

UI Root设置了名为“UIRoot”的tag

Package、Cell和Obj都添加了Box Collider组件

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





添加在脚本使Package可以被拖拽移动。

第三步,给Obj添加自定义脚本MyDragAndDrop

直接在Obj的属性面板add component添加脚本 MyDragAndDrop.cs



打开并编辑脚本:

令MyDragAndDrop继承UIDragDropItem

重写OnDragDropRelease方法

更改后的MyDragAndDrop脚本代码如下:

using UnityEngine;

public class MyDragAndDrop : UIDragDropItem {

//该方法用于获取拖拽的物体释放拖拽时,该物体所碰撞的对象
//所以我们前面需要给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;
}

}

}


第三步,测试



到这里简单例子也就完成了。

可以看到,到我拖拽Obj在每个Cell的边缘时,Obj都会自动移至碰撞的Cell内,类似吸附功能。

上面的简单例子实现了物体被背包吸附装入的功能,通过检测Cell的子物体增加相应逻辑就可以实现背包和角色属性关联。

拓展

1.背包内物品栏的物品交换相互位置

给所有物品设置tag为 “Obj” ,如果物品拖拽释放时碰撞获取的对象tag为“Obj”,就设置交换物品的父级对象。

2.捡取物品到背包中

一般捡取得物品到背包其排序都是从左到右,从上到下填入空的物品栏中。

实现方式是将所有物品栏对象装载到GameObject的数组中。

通过循环判断物品栏是否有子对象,也就是判断物品栏的子列表数值是否大于0

若小于或等于0,就将物品的父对象设置为该物品栏,然后设置其相对父对象坐标为0

还有很多实现大家自由发挥吧

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息