unity游戏设计之背包系统

这次任务是模仿上图的样子,制作一个类似的背包系统。
上面的链接为:http://www.tasharen.com/ngui/exampleX.html
我们的目标是:
1.实现背包系统的UI界面
2.实现物品的移动
最后的效果:

界面没有网页上的效果好啦,但是基本实现了背包系统。
下面是步骤:

首先构建如上所示的背包的基础结构。
参考课程的例子,利用canvas实现背包系统的框架,包含canvas,camera。
首先新建一张canvas,设置render mode,render camera, UI scale mode,match。
新建一个camera 并设置 render camera。

然后在canvas里面新建一个canvas,用于存储装备栏与背包栏。
然后我们在做具体实现背包的格子。
再刚才新建的canvas下,创建两个panel,并且命名为backpack与wear。分别用于存放装备与背包物品。然后分别添加Grid Layout Group的component, 以实现添加元素的自动对齐。
背包中的格子我全部使用image实现。然后可以添加一些text。

下面我们需要添加一个背景和人物。
背景直接在百度上找了一张图,人物在asset store上下载了一个卡通战士的model。
添加背景我们首先创建一个空对象,将main camera添加进去,然后再里面添加一个空对象,并命名为background,给他添加sprite render 的 component。

然后将我们的想要的背景图片直接拖入asset中,unity会将他自动生成sprite格式,素材的右边会多出一个小的播放按钮一样的图示就可以了。

然后将其拖入sprite render中的sprite,material选择sprite default。我之前没有改成default会有错误产生。

这样子再修改修改图片大小什么的就差不多了。
然后是人物,就在asset store上下载了一个人物,然后拖入。调整一个位置与大小。
这里还要注意我们需要调整一下摄像机。一个负责看UI,一个看背景等其他。
我们只需要调整culling mask这个参数,里面可以勾选显示的部分。然后就是这样子了。

接着实现背包拖放的功能。在subcanvas里面新建一个对象树,然后新建image来表示物品,存放我们需要的物品。source image中放的是从网络上找来的图片素材来表示装备。
最后一步,实现物品的拖放我们主要是依靠代码实现的,这里我们需要继承IBeginDragHandler, IDragHandler, IEndDragHandler这三个接口,使用Unity自带的Event Trigger检测物品拖放的操作。
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class drag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
private Transform transform_;
private RectTransform rectTransform_;
private CanvasGroup canvasG_;
public Vector3 rootPosition;
private GameObject lastE = null;
private Color lastEcolor;
private Color hcolor = Color.cyan; void Start()
{
transform_ = this.transform;
rectTransform_ = this.transform as RectTransform;
canvasG_ = GetComponent<CanvasGroup>();
rootPosition = transform_.position;
//originalPosition = new Vector3(0, 0, 0);
}
void Update()
{
} public void OnBeginDrag(PointerEventData eventData)
{
canvasG_.blocksRaycasts = false;//event trigger忽略自身
lastE = eventData.pointerEnter;
lastEcolor = lastE.GetComponent<Image>().color;
rootPosition = transform_.position;//拖拽前记录起始位置
gameObject.transform.SetAsLastSibling();//保证当前操作的对象能够优先渲染,即不会被其它对象遮挡住
}
public void OnDrag(PointerEventData eventData)
{
Vector3 globalMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform_, eventData.position, eventData.pressEventCamera, out globalMousePos))
{
rectTransform_.position = globalMousePos;
}
GameObject curEnter = eventData.pointerEnter;
bool inItemGrid = EnterItemGrid(curEnter);
if (inItemGrid)
{
Image img = curEnter.GetComponent<Image>();
lastE.GetComponent<Image>().color = lastEcolor;
if (lastE != curEnter)
{
lastE.GetComponent<Image>().color = lastEcolor;
lastE = curEnter;//记录当前物品格子以供下一帧调用
}
//当前格子设置高亮
img.color = hcolor;
}
}
public void OnEndDrag(PointerEventData eventData)
{
GameObject curEnter = eventData.pointerEnter;
//拖拽到的空区域中(如包裹外),恢复原位
if (curEnter == null)
{
transform_.position = rootPosition;
}
else
{
//移动至物品格子上
if (curEnter.name == "Image")
{
transform_.position = curEnter.transform.position;
rootPosition = transform_.position;
curEnter.GetComponent<Image>().color = lastEcolor;//当前格子恢复正常颜色
}
else
{
//移动至包裹中的其它物品上
if (curEnter.name == eventData.pointerDrag.name && curEnter != eventData.pointerDrag)
{
Vector3 targetPostion = curEnter.transform.position;
curEnter.transform.position = rootPosition;
transform_.position = targetPostion;
rootPosition = transform_.position;
}
else//拖拽至其它对象上面(包裹上的其它区域)
{
transform_.position = rootPosition;
}
}
}
lastE.GetComponent<Image>().color = lastEcolor;//上一帧的格子恢复正常颜色
canvasG_.blocksRaycasts = true;//确保event trigger下次能检测到当前对象
}
bool EnterItemGrid(GameObject Obj)
{
if (Obj == null)
{
return false;
}
return Obj.name == "Image";
}
}
unity游戏设计之背包系统的更多相关文章
- Unity游戏设计与实现 南梦宫一线程序员的开发实例
图灵程序设计丛书 Unity游戏设计与实现:南梦宫一线程序员的开发实例(修订版) 加藤政树 (作者) 罗水东 (译者) c# 游戏 unity <内容提要>本书的作者是日本知 ...
- unity游戏设计与实现 --读书笔记(一)
1, 游戏入门的一些知识点,游戏对象GameObject(角色), 组件Compoent(角色的功能),资源Asset(美术素材呵呵音频等的数据),场景Scene(用以放置各个角色,负责展示画面), ...
- [Unity 游戏设计的元素]
1.核心游戏机制 2.主题 3.功能集合 4.可能的附加功能 5.备用主题创意
- Unity大中华区主办 第二届Unity 游戏及应用大赛 实力派精品手游盘点
Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎.包含如今时 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新
本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...
- 工作流程,编程,调试,性能:Unity游戏开发者应该学习的20个改进技巧
Unity 是一个备受欢迎的游戏开发平台.它的功能令人印象深刻,同时也迎合了不同的游戏开发需求.游戏开发者可以使用 Unity 创建任何类型的游戏,从世界级的 RPG 游戏到最流行的增强现实游戏 Po ...
- 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher
一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...
- unity游戏开发之entitas框架
框架介绍 entitas是一个超快.超轻量的c# Entity-Component-System (ECS)框架,专门为Unity引擎设计.提供内部缓存和高速的组件访问,经过精心设计,可以在垃圾收集环 ...
- Unity优化方向——优化Unity游戏中的脚本(译)
原文地址:https://unity3d.com/cn/learn/tutorials/topics/performance-optimization/optimizing-scripts-unity ...
随机推荐
- .NET Framework 各版本区别(简介)
本文通过在网络资料整理而得. .NET Framework1.1 1.自带了对mobile asp.net控件的支持.(在1.0版本是以附加功能实现) 2.加入了ASP.NET应用程序的代码安全访问功 ...
- 深入浅出数据结构C语言版(1)——什么是数据结构及算法
在很多数据结构相关的书籍,尤其是中文书籍中,常常把数据结构与算法"混合"起来讲,导致很多人初学时对于"数据结构"这个词的意思把握不准,从而降低了学习兴趣和学习信 ...
- Zeppelin interperter 模式设置总结
如有错漏,望请指正,不胜感激. 参考:[zeppelin官网]:https://zeppelin.apache.org/docs/latest/interpreter/spark.html#inter ...
- impress.js初体验
概述 如果你已经厌烦了使用PowerPoint制作PPT,那么impress.js是一个非常好的选择,用它做的PPT更加直观,效果也非常的不错.装X是需要一定代价的,不过如果你是个前端爱好者那么一切就 ...
- Redis数据迁移方案
场景 Redis实例A ---> Redis实例B,整库全量迁移 方案一: mac环境 brew install npm npm install redis-dump -g 针对RedisA: ...
- Linux常用命令整理
1.常用命令:cd 进入 ls(list)查看当前目录下的文件 pwd 查看目录的路径 who an i 查看当前用户 clear 清除屏幕 2.绝对路径:从根目录开始\ 相对路径:上一层.下一层 ...
- (转)Java线程面试题 Top 50
原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末 ...
- 转接口IC GM7150BN/ GM7150BC:CVBS转BT656芯片 低功耗NTSC/PAL 视频解码器
1 概述 GM7150 是一款9 位视频输入预处理芯片,该芯片采用CMOS 工艺,通过I2C 总线与PC 或DSP 相连构成应用系统. 它内部包含1 个模拟处理通道,能实现CVBS.S-V ...
- laravel安装插件laravel-ide-helper
1.插件位置laravel-ide-helper https://github.com/barryvdh/laravel-ide-helper 2.首先改变镜像源为国内的镜像源 P { margin- ...
- 告别S! S! H!秒杀终端工具——FastLogin快捷登录
题记:自从接触到"跳板机"的概念后,一直就被烦不胜烦的机器名,ip地址,用户名,密码折腾的死去活来,心说能有个小精灵随时帮我输入那些重复的登录信息就好了.我见过最挫的方式就是用记事 ...