apk download : https://www.taptap.com/app/202356

Video Demo : https://www.bilibili.com/video/BV1vK4y177U6/


ScratchLottery

一款由Unity开发的RTS类型的游戏,游戏的核心玩法为派遣士兵攻占城堡获取胜利。(该玩法思路来源于作者很早之前玩过的一款游戏,名字已经忘记,感谢朋友的试玩,提出了很多好的修改意见)

游戏开发至1.0版本耗时一周左右,开发时的指导思想即为轻美工、轻剧情、强玩法、强操作。游戏英文名暂定为ScratchLottery,因为添加战斗迷雾后,配合上像素风界面,战斗时酷似刮彩票。\o/

代码:https://github.com/Iamttp/Castle

游戏演示

游戏界面







技术分割线,下面的讨论涉及游戏本身所使用的技术。


游戏目录

  • Prefabs文件夹:

包含道路(go)、城堡(house)、不可移动道路(stop)、士兵(Sphere)、雾(fog)、顶部势力图(cube)预制体。

  • Resources文件夹:

包含道路(go)、不可移动道路(stop)、雾(fog)、顶部势力图(cube)纹理。

  • Materials文件夹:

包含道路(go)、不可移动道路(stop)、雾(fog)、城堡(New Material 1)、闪烁城堡(New Material 3)材质。

  • Shaders文件夹:

包含城堡(NewUnlitShader)、闪烁城堡(SelectShader)材质。

  • Scenes文件夹:

包含六大场景

  • Scripts文件夹:

包含六大场景文件夹,里面存放场景对应的C# Script。

关键技术分享

作者刚学Unity,很多效果都是通过直觉(做过GUI程序、OpenGL程序)做出来的,有更好的实现方法欢迎批评指正。游戏虽然表现为2D,但是项目创建时为Unity 3D。

  • 像素风雾效果

首先想到的是在shader里面定义一个Color和一个int变量,
在C#脚本里面初始化一个对应图的二维bool数组表示当前位置是否有雾效果,
在Update里面遍历每一个点,如果为false表示有雾,设置Shader的int变量为1,让Shader的输出颜色为指定的Color(雾颜色),如果为true表示没有雾,设置Shader的int变量为0,让Shader的输出颜色为原本的纹理颜色。

实现时发现比较繁琐,于是采用了第二种方法,用GameObject的SetActive来控制是否开启雾。这种方法简单统一,且便于修改。
还是在C#脚本里面初始化一个对应图的二维bool数组表示当前位置是否有雾效果,在Update里面遍历每一个点,如果为false表示有雾,设置雾的预制体SetActive为true。反之false。

  • 顶部势力图

首先用unity提供的UI控件很难自定义出想要的效果。(应该不能魔改滚动条吧)
而如果直接是在游戏场景中则会发生位置的变化。于是用另一个摄像头在距离很远处,将结果渲染至纹理。
再在主摄像头的UI里面,定义RAW IMAGE显示纹理。

势力图的每个Cube表示一个城堡,通过计算当前城堡数,设置相应的scale。

  • 随机技能

过关后会有随机三个技能提示选项(我的思路来源于崩坏3)。

在一堆技能中做到随机三个,使用洗牌算法在O(N)时间复杂度 O(1)空间复杂度下随机打乱。然后选取前三个就行。

  • 随机地图生成

城堡随机的生成,首先是固定4个势力分布在4个角,保证每个角城堡数相同,for循环城堡数 %4 就行。
生成时,参考八皇后放置算法,设置城堡四周为不可放置,放置城堡过于密集。

因为考虑到地图太小,后放置的城堡放不下,设定一个运行尝试次数,达到次数后,重新加载场景,重新生成。

道路随机的生成,随机选取两个城堡,使用绘制直线方法绘制(用的斜率绘制法,布雷森汉姆直线算法更好),
绘制时为保证不出现道路割裂感,在位置偏移时,多绘制一个转角。

为保证生成的地图质量,检测生成的直线是否存在交叉,存在交叉时,该条道路放弃生成。

在生成后,进行检测,从任一城堡出发,通过DFS遍历,若遍历后城堡数不为总城堡数,则表明存在孤立的城堡,重新加载场景,重新生成。


打包APK网盘链接,欢迎大家批评指正:

链接:https://pan.baidu.com/s/1M2PLkdbvAW-NQ1y-_ZFqBA
提取码:aaaa
复制这段内容后打开百度网盘手机App,操作更方便哦


2020-10-30更新:

WaterFlow

最新2.0版更名为Water Flow。游戏的核心玩法未变,游戏的迷雾由之前的GameObject遮挡改为点光源光照。

具体操作演示: https://www.bilibili.com/video/BV1vK4y177U6/

关键技术分享

  • 音效编辑

游戏的音效使用 Audacity 进行编辑,非常简洁好用的软件,可以使用它录制系统声音或者麦克风声音,然后进行一些诸如截取片段、改变音量等操作。

  • 新版雾效果分享

为每个水滴(士兵)预制体添加了点光源,每个水泡(城堡)预制体也添加了点光源,然后去除全局方向光即非常方便的实现了雾效果。

同时为了表示敌方水泡是否被查看(被查看的话显示水滴数等),需要定义一个二维 float 矩阵,每次 Update 将矩阵的值减小。当减小到一定值时,表示无法查看。而在我方水泡、水滴周围的矩阵的值将设定为一个初始值表示可以查看。

  • 水波纹设计

为符合整体主题设计了水波纹,思想为在片段着色器里面对纹理坐标采样时的进行偏移。百度水波纹有这方面的实现。也可以参考我github里面的实现。

  • 自定义地图编辑

实现要实现地图数据的保存,采用了SQLite保存,为保证保存速度,采用批量插入。
需要注意的是在Android平台下,SQLite的批量插入格式为:

insert into 表名(列名1,列名2)
select  值1,值2
union all
select 值1,值2

区别于

insert into 表名(列名1,列名2)
values  (值1,值2),(值1,值2)

并且一次最多500条数据。

开源一个简单的RTS游戏(Unity)相关推荐

  1. Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏

    Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏 即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的.实际上,Unity在2013年发布 ...

  2. unity编写一个简单的小游戏

    unity编写一个简单的小游戏 简易fly bird的制作 关于flybird 场景的搭建和素材的导入 使用素材搭建game和scene 制作柱体 bird的script column的sprite ...

  3. Unity入门——实现一个简单的跑酷游戏(资源预制)

    Unity入门--实现一个简单的跑酷游戏 资源预制 一款跑酷游戏,需要大量重复的场景资源,比如道路.障碍物等,无论是从游戏体验的角度还是运行效率的角度考虑,都不应该全部事先摆好,而是应该由代码随机生成 ...

  4. unity入门——实现一个简单的跑酷游戏(人物控制)

    unity入门--实现一个简单的跑酷游戏 场景搭建 将人物放置于世界坐标的(0,0.1,0),初始道路放置于人物脚下,坐标设置为(0,0,0),水面初始位置设置为(0,-2,-100),可以自行调整, ...

  5. golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)

    此文写在golang游戏开发学习笔记-创建一个能自由探索的3D世界之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里我们要创建一个简单的2D游戏场景以及配套的人物,并实现人物运动和碰撞检测功能 ...

  6. python和java的格斗动画_Unity3D一个简单的对打游戏

    我发现没有动画想做什么都不行噢~~~,这个动画还是一个大侠给我的,网上找了很多bip动作文件,但是转成FBX格式不行,好像是版本不一样的缘故.后来为了做进度条我之前学了一下EZGUI,但是没有得到想要 ...

  7. 如何使用cocos2d-x 3.0来做一个简单的iphone游戏教程(第一部分)

    游戏截图: cocos2d-x 是一个支持多平台的开源框架,用于构建游戏.应用程序和其他图形界面交互应用.Cocos2d-x项目可以很容易地建立和运行在iOS,Android的三星Bada,黑莓Bla ...

  8. python编写赛车游戏单机版_使用Python中OrderedDict模拟一个简单的竞速游戏排名

    上一篇,我们梳理了Python中关于字典排序的一些常用方法(杂乱无章的数据结构如何进行排序,简明讲述Python字典排序那些事).其中,我们讲到了Python的collections模块中的Order ...

  9. pygame做一个简单的打字游戏

    pygame做一个简单的打字游戏 1.基本代码 下面的代码完成了每一秒在界面的顶部随机生成一个新的字母 # -*- coding=utf-8 -*- import pygame from pygame ...

最新文章

  1. Java的新项目学成在线笔记-day10(一)
  2. php socket传递cookie,PHP Websocket在测试中验证用户(传递会话cookie)
  3. 《C++ Primer第五版》第一章-------IO机制和注释缩进
  4. python文件编译_编译Python文件
  5. [react] react16的reconciliation和commit分别是什么?
  6. textmate bundle for jquery
  7. c mysql bulk,MySqlBulkLoader批量上传遇到的问题和解决方法
  8. python 同步event对象
  9. Linux 切换到 root 用户后没有颜色
  10. 常见Windows硬件故障
  11. 辨异 —— Python 的深拷贝与浅拷贝
  12. android应用安全——数据安全
  13. java rxtx串口读写_Win7环境下Java串口数据读写(RXTX)
  14. 一个IT农民工分享互联网巨头公司面试流程
  15. uniapp-小程序与H5压缩图片上传
  16. 一位大佬对学习哲理的思考
  17. JavaScript使用url字符串拼接传递参数,截取参数
  18. Code Snippets Library
  19. 用 HealthKit 来开发一个健身 App
  20. awk 字符串转时间戳

热门文章

  1. 互联网办公地点搬迁(北上深杭)
  2. ConcurrentHashMap的扩容方法transfer源码详解
  3. 职称计算机ppt2003注意,【资格考试】职称计算机_PPT2003ppt模版课件.ppt
  4. Java出现问题: The public type **** must be defined in its own file
  5. Ae 效果快速参考:风格化
  6. I2 2021-02-20-002-知学网
  7. 一文读懂WiFi网络摄像机参数设置的含义
  8. GBU810-ASEMI整流桥GBU810
  9. python的字符串、列表、元组、字典、集合
  10. require import