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

  • 相关阅读:
    IXmlSerializable With WCFData Transfer in Service Contracts
    Difference Between XmlSerialization and BinarySerialization
    Using XmlSerializer (using Attributes like XmlElement , XmlAttribute etc ) Data Transfer in Service Contracts
    Introducing XML Serialization
    Version Tolerant Serialization
    Which binding is bestWCF Bindings
    Data Transfer in Service Contracts
    DataContract KnownTypeData Transfer in Service Contracts
    Using the Message ClassData Transfer in Service Contracts
    DataContract POCO SupportData Transfer in Service Contracts
  • 原文地址:https://www.cnblogs.com/pwc1996/p/5425230.html
Copyright © 2011-2022 走看看