前话

在许多类型游戏中我们经常会使用到背包,利用背包来设置相应角色属性,多了背包也会让游戏增色拓展不少。
那在Unity3D游戏开发中该如何编写背包系统呢?因为有高人开发了NGUI插件,因此我们进行简单编写代码设置即可实现一个简单的背包功能了。


准备工作

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

背包

Unity 引入自定义aar unity自定义package_Unity 引入自定义aar

背包格子

Unity 引入自定义aar unity自定义package_游戏_02

物品

Unity 引入自定义aar unity自定义package_ide_03


简单背包功能实现

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

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

Unity 引入自定义aar unity自定义package_ide_04

要注意的是:

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

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

Unity 引入自定义aar unity自定义package_ide_05

Unity 引入自定义aar unity自定义package_拖拽_06

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

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

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

Unity 引入自定义aar unity自定义package_Unity 引入自定义aar_07

打开并编辑脚本:

  1. 令MyDragAndDrop继承UIDragDropItem
  2. 重写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;
        }

    }

}

第三步,测试

Unity 引入自定义aar unity自定义package_ide_08

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

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

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


拓展

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

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

2.捡取物品到背包中

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

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

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

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

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


源码

链接:http://pan.baidu.com/s/1dF0kSlN 密码:zamk