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

前话

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

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


准备工作

  1. 新建一个工程PackageDemo
  2. 导入NGUI包(最新版3.9.8版的正版89刀)
  3. 准备好图片素材,使用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

打开并编辑脚本:

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

    }

}

第三步,测试

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

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

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


拓展

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

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

2.捡取物品到背包中

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

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

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

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

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


源码

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

时间: 2024-12-23 01:29:01

Unity3D使用NGUI实现简单背包功能的相关文章

NGUI实现一个背包功能

界面布局是这样的,一个400*400的背景,然后在其上是16张小图片,每个小图片格子可以用来放置拾取的物品.有两个预制体,一个是可放置的小格子,一个是拾取的物品(包含一个此物品有多少的Label). 如下图: 需要的脚本: using UnityEngine; using System.Collections; //ci此脚本挂在背景上 public class SknapBg : MonoBehaviour { public GameObject[] cells; //可捡起物品所能移动的框格

Unity3D在NGUI中使用mask

过程是这样的:最近一直想做一个头像的mask效果,后来发现原来unity的mask需要用shader来写,网上找了不少资料,也能实现,不过大多数都是用render texture作为相机投影的texture.然后把这个相机的图像作为一个material,然后在ngui中创建一个texture,把这个material赋给texture.怎么说呢,这种方式虽然也能实现,但是必须要创建一个相机,对于一个大型项目来说有点不切实际.一个头像加个mask多简单的一件事,肯定有更好的办法. 最终还是找到了一种

List<T>和NGUI BetterList简单比较

List<T>在Unity安装目录下的..\Unity\Editor\Data\Mono\lib\mono\micro\mscorlib.dll 自备反编译工具,这里用的是ILSpy BetterList不支持任何集合接口,功能简单,扩展功能只有一个排序.排序用的是冒泡. List<T>就不多介绍了.都懂得,其内部排序调用Array的排序,用的归并. 先开门见山,放上测试结果.1是BetterList,2是List<T>.都是万级别的Add和Remove操作测试.的确是

Unity3d 网络编程(三)(Unity3d内建网络简单服务器的建立)

使用Unity3d的内建网络搭建一个简单的服务器,使用本机当主机,创建一个客户端连接到本机, 我使用的NGUI作为主界面,服务器代码: string ipAddress = "127.0.0.1"; int port = 23000; string msg = ""; public UILabel lbl; // Use this for initialization void Start () { } // Update is called once per fr

Unity3d中SendMessage 用法简单笔记

Unity3d中SendMessage 用法简单笔记 Message相关有3条指令:SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的ScriptBroadcastMessage ("函数名",参数,SendMessageOptions)  //自身和子Object的ScriptSendMessageUpwards ("函数名",参数,SendMessageOptions)  //自

[转]微信公众平台开发(四) 简单回复功能开发

本文转自:http://www.cnblogs.com/mchina/p/3155072.html 一.简介 微信公众平台可以根据用户发送的信息进行判断,然后给出对应的回复,具有良好的交互性.下文将模拟简单的回复功能,根据这个案例,开发者也可以基本理解微信交互的原理,进行更深层次的开发. 二.思路分析 用户发送过来的文本信息,我们可以提取关键字,通过简单的 if...elseif...else... 实现. 关键代码如下: if($keyword=="你好"){ $contentStr

Shell 实现简单计算器功能

Shell 实现简单计算器功能,脚本如下: [[email protected] scripts]# cat jisuan.sh #!/bin/bash print_usage(){     printf $"USAGE:$0 NUM1 {+|-|*|/} NUM2\n"     exit 1 } #判断传入的参数是不是3个 if [ $# -ne 3 ]   then     print_usage fi firstnum=$1 secondnum=$3 op=$2 #对传入的参数进

简单 验证码 功能

在贴代码之前首先简述一下验证验证码原理:随机获取验证码的值,把这个值存到session中,其作用可想而知就是要拿来跟前台数据作比较,通过Graphics将值进行模糊处理之后传到前台页面展示. 1 package com.skss.util; 2 3 4 import java.awt.Color; 5 import java.awt.Font; 6 import java.awt.Graphics; 7 import java.awt.image.BufferedImage; 8 import

启动程序实现很简单的功能在屏幕中央 ;打印一行字符串(汇编+c+red hat linux实现)

编程:启动程序实现很简单的功能在屏幕中央 ;打印一行字符串(汇编+c+red hat linux实现) 汇编语言编写: boot.asm启动程序代码: ;我们的启动程序实现很简单的功能在屏幕中央 ;打印一行字符串 org 07c00h   ;org指令明确告诉编译器我程序开始地址是07c00h,而不是 ;原来的00000 ;int汇编指令 int 10h mov ax,cs mov es,ax mov bp,msgstr  ;es:bp  ;指向的内容就是我们要显示的 字符串的地址 mov cx