zoukankan      html  css  js  c++  java
  • Unity3D使用NGUI实现简单背包功能

    前话

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


    准备工作

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

    背包
    package

    背包格子
    cell

    物品
    ogj


    简单背包功能实现

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

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

    要注意的是:

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

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

    02

    03

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

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

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

    打开并编辑脚本:

    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;
            }
    
        }
    
    }
    

    第三步,测试

    test

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

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

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


    拓展

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

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

    2.捡取物品到背包中

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

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

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

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

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


    源码

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

  • 相关阅读:
    window10-jmeter安装
    软件开发模型
    软件测试的原则和流程
    手机APP测试
    优秀的软件测试工程师
    自动化测试
    测试用例
    软件测试功能分类
    ios-prefix文件最全
    催收策略及催收评分卡搭建
  • 原文地址:https://www.cnblogs.com/pwc1996/p/5425230.html
Copyright © 2011-2022 走看看