一、前言

前段时间和对象玩《找你妹》这个小游戏的时候,玩得难分高低,玩了几次之后,就想了一下该游戏的实现原理。

想想实现挺简单的,就按照自己的思路仿一个出来,顺便熟悉整个开发流程,整理一些基本的知识点,总结一下开发经验。

二、实现思路

首先,初始化到界面里的每个图片(Item)都有一个数据(Data),数据里面存储着对应的一个或者多个类型,做对应的判断。

然后,给玩家提示当前需要选择的类型,让玩家选择对应的Item,判断选择的Item是否满足需求,如果Data里面有对应的类型,则满足条件。

三、实现细节

1、初始化数据

读取配置表里面的配置,随机取一些配置,实例化Data对象,将数据存储下来(我没有配多少配置,所以从配置表里面随机一定的配置出来)。以Data中的类型为key,Data为value,添加类型和数据到字典,用于快速查找当前所有类型,当Data数据增删市维护该字典,得出类型和类型对应的数量。

2、查找类型和数量

在以类型为Key,Data为Value的数据字典中随机一个Key,该Key对应的类型就是当前游戏需要查找的类型,对应的数量就是需要查找的数量。

3、实例化Item

循环列表中的数据,为每个data初始化一个Item,Item根据配置表初始化数据,加载图片、监听事件、添加事件等。

4、分发事件

玩家点击Item,分发玩家选择事件,判断是否满足条件。

5、游戏结束

倒计时结束、选择完所有目标类型游戏结束,显示结束界面。

四、实现基础

1、计时器(TimerManager)

简单的实现了一下Timer的功能,在Unity的Update里面更新计时器,主要为实现倒计时,或者过一段事件执行某个函数功能。

 /// <summary>/// 添加定时器/// </summary>/// <param name="call">回调函数</param>/// <param name="delay">延迟时间</param>/// <param name="once">是否只执行一次</param>public static void AddTimer(float delay, Action call, bool once = false, bool ignoreScale = true, int customParam = 0){Timer timer = new Timer(call, delay, once, ignoreScale, customParam);timer.Reset(_getTime);_timerList.Add(timer);}/// <summary>/// 移出定时器/// </summary>q/// <param name="call">回调函数</param>public static void RemoveTimer(Action call){for (int i = _timerList.Count - 1; i >= 0; i--){if (_timerList[i] != null && _timerList[i].Call == call){_timerList[i] = null;}}}/// <summary>/// 更新/// </summary>public static void Update(){for (int i = _timerList.Count - 1; i >= 0; i--){if (_timerList[i] == null){_timerList.RemoveAt(i);continue;}if (_timerList[i].IsReset(_getTime)){if (_timerList[i].Call != null)_timerList[i].Call();if (_timerList[i] == null){_timerList.RemoveAt(i);continue;}if (_timerList[i].Once)_timerList[i] = null;else_timerList[i].Reset(_getTime);}}}

2、事件系统(EventManager)

利用观察者模式实现的事件系统,初始化对象的时候监听事件,销毁对象的时候移除事件。使用简单方便,减少代码耦合性。之前的博客写了事件系统的实现,这里就不写了。

3、配置表(ConfigManager)

配置表是读取的Json,之前写的那个不满足字段为List的需求,自己扩展又了一点点。excel转Json是用的网上在线工具,转成Json之后再复制到Txt文本中(可以找工具,再写Bat命令)。

public bool GetField<T>(ref List<T> field, string name, FieldNotFound fail = null){if (IsObject){int index = keys.IndexOf(name);if (index >= 0){string _value = list[index].str;field = new List<T>();var _temp = _value.Split('+');for (int i = 0; i < _temp.Length; i++){if (string.IsNullOrEmpty(_temp[i])){continue;}field.Add(GameUtils.EnumParse<T>(_temp[i]));}return true;}}if (fail != null) fail.Invoke(name);return false;}

4、UI(UIManager)

GameObject的显隐,未实现加载逻辑。

五、总结

总的来说,游戏实现得很粗糙,在网上随便下了点图,自己配了几个配置表,而且只实现了基本功能。未添加音乐,选错之后惩罚,各分辨率的适配,资源的加载,网络通信。(还可以扩展,在Data里面存其他子Data数据,加载对应图片在Item下,丰富类型列表。)

excel转json的代码也没有做,在网上找的在线工具处理的: excel转json

六、代码

CSDN资源

Git资源

【实战案例】Unity从零开始开发初级案例 - 找你妹相关推荐

  1. 提速 10 倍 Go 语言开发实战内容, 从零开始开发

    在当今流行的编程语言中,Go 语言独树一帜,因为其简单易学.性能强劲且原生支持并发的特点,深受开发者的青睐.Go 语言在技术 上的关注度也在逐年上升.Go语言也逐渐成为进入大厂的通行证. 不时的有人问 ...

  2. unity应用开发实战案例_Unity开发实战游戏教学案例分享

    进行项目实战是快速入门或提升Unity开发的关键.Asset Store资源商店中,有大量完整项目模板和教学案例,帮助您通过项目实战,让你体会到Unity开发的成就感. 本文我们为大家准备了三款实战游 ...

  3. 视频教程-微信小程序开发【初级篇 / 附案例】-微信开发

    微信小程序开发[初级篇 / 附案例] 北风网讲师!瓢城Web俱乐部创始人,教学总监! 李炎恢 ¥129.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程, ...

  4. siki学院unity初级案例炸弹人取空位置点的Bug

    问题描述:   在学习Unity初级案例炸弹人时,当取地图上的空位置点时,出现InitMap(2,2)取值不正确的情况.   程序获取的空位置点数   空位置图如下:   从图中可以看出空位置点数应为 ...

  5. Unity UGUI开发设计及案例讲解

    Unity--UGUI开发设计及案例讲解 1. Unity4.6跟以前的版本的最大区别首先在于在层级视图中点鼠标右键时出现的弹出菜单上,它把以前许多的菜单项进行了归类,比如cube sphere ca ...

  6. 开发android项目实战,Android 项目实战:手机安全卫士开发案例解析

    Android 项目实战:手机安全卫士开发案例解析 作 者:王家林,王家俊,王家虎 出版时间:2013 丛编项:移动互联应用开发系列 内容简介 本书通过对一款手机安全卫士开发案例的详细解析,讲解了一个 ...

  7. 《精通引动APP测试实战:技术、工具和案例》---Android 开发环境搭建

    文章目录 一,环境搭建 1)Java环境(JDK) 2)Eclipse 开发工具 3)Android SDK 二,SDK和AVD的配置 1)SDK和AVD 2)Android SDK Manager下 ...

  8. [.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现...

    原文:[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现 一.引言 在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证 ...

  9. 精通移动App测试实战:技术、工具和案例

    本文是根据书籍<精通移动App测试实战:技术.工具和案例>进行学习记录,方便后期查阅,感谢书籍作者提供的学习机会. 目录 第1章 Android系统基础内容介绍 1.6创建模拟器 第2章J ...

最新文章

  1. UILable在Autolayout模式下面自动调节字体大小
  2. 编写高度可维护javascript代码的几点关键性原则
  3. 2020蓝桥杯省赛---java---B---6(分类计数)
  4. 你是菜鸡是有原因的 谈谈提问的艺术
  5. Davinci DM6446 Codec Engine双核通信环境的搭建
  6. springMVC 返回json乱码问题
  7. JSK-118 输出格式练习【入门】
  8. 为什么要重载方法?方法重载如何应用?
  9. Code Style of Mangata
  10. Android中ListView的使用步骤
  11. 手机3D建模初现端倪,预计今年市场规模将达1.45亿美元
  12. 小猫跳圈-第12届蓝桥杯Scratch省赛3真题第1题
  13. 各种文件后缀名与打开方式大全
  14. 北森{“message“:“un-authorized“}
  15. hadoop环境新手安装教程
  16. Matplotlib学习之subplots函数
  17. 信捷触摸屏通讯示例1
  18. ASO优化优缺点各是什么?带你学会常见的优化手段
  19. Matlab中的傅里叶级数展开函数
  20. Python中str和repr的区别

热门文章

  1. 移远云服务QuecCloud正式发布,一站式为全球客户提供创新有效的解决方案
  2. 读书|《第七感》:权力、财富与这个世界的生存法则
  3. Interpreter(解释器)与complier(编译器)的区别
  4. 一种基于双MCU协同的多功能押解脚环
  5. photoshop2020入门笔记(二)
  6. linux中重定向命令,LINUX 重定向命令
  7. SQL 将一张表的数据复制到另一张表
  8. python串口发送数据_第六课python来写串口助手-串口发送数据
  9. matlab同名端相反变压器,读懂变压器的同名端和异名端
  10. 二分图最大匹配的应用