Code Monkey home page Code Monkey logo

turretagent's Issues

经济系统

Enemy掉落

  • 初始运输兵: 2$
  • 跑得快的运输兵: 3$
  • 血厚、跑得慢的运输兵: 4$
  • 步兵: 4$
  • 鬼火射手: 6$
  • 霰弹枪手: 8$
  • 坦克: 20$
  • 自爆步兵: 50$(50血,自爆不掉钱)

武器与消耗品价格

  • 步枪:50$
  • 机关枪:70$
  • 地雷*1:10$
  • 火箭筒*5:30$
  • 回5点HP:30$

炮塔价格:

  • 基础炮塔: 30$/40$ 升级cost:10$->15$->20$...
  • 霰弹炮塔: 50$/65$ 升级cost:15$->20$->25$...
  • AOE炮塔: 70$/100$ 升级cost:20$->25$->30$...
  • 减速炮塔: 50$/70$ 升级cost: 15$->20$->35$...

初始条件:

  • mission 1: 基础炮塔*1,初始0$,商店不开放
  • mission 2: 霰弹炮塔*1,初始40$
  • mission 3: AOE炮塔*1,初始40$
  • mission 4: 基础炮塔*1,霰弹炮塔*1,初始40$
  • mission 5: 减速炮塔*1,基础炮塔*1,初始40$
  • mission 6: AOE炮塔*1,霰弹炮塔*1,初始40$
  • 最终boss: 基础炮塔*1、霰弹炮塔*1、AOE炮塔*1,初始60$

Final Game TODO List

平衡性调整及完善

  • 第一关
  • 第二关
  • 第三关
  • 第四关
  • 商店价格和初始金额调整

bug修复

  • AOE塔
  • 减速塔
  • 重新加入商店

New

  • BGM
  • 音量控制菜单
  • 自爆敌人
  • 商店加入回血医疗包
  • 商店道具售卖数量上限(现在要么只能买一次,要么无限买)
  • 第五关
  • Final Boss
    • 漏兵不扣血
    • boss定期发射大伤害激光
    • 其他攻击模式(待定)
  • LevelScene加入剧情简介

Prototype TODO List

Hero - Ian WIP

  • Assets
  • Use mouse to control gun direction and shooting
  • WASD movement
  • Deploy and undeploy turret

Turret - ZRJ

  • Assets
  • Gun rotate
  • Auto shooting

Enemy

  • Assets
  • Move in a fixed route - SY
  • Shoot

新TODO LIST

BUG

  • 多塔时的炮塔拾取/放置系统
  • AOE塔不完善
  • 玩家可以走到地图外
  • ALPHA第二个关的敌人行走似乎有问题

測玩反馈

  • 敌人子弹速度太快
  • 介绍塔和武器
  • 介绍游戏目标玩法
  • 地图太小(玩家等太大了)
  • 平衡问题(我们应该留时间自己測玩)
  • UI:可以显示进度条,剩余敌人数量
  • UI: 塔的攻击范围显示
  • 游戏开始前让玩家放塔,准备好后开始

更多的炮塔和敌人种类

见:#102

商店系统

商店实现建议单独的场景设计UI,根据gamemanager的当前关卡来补能买的兵

  • UI设计
    • 该关卡地图预览
    • 该关卡模式介绍(防御或攻击)
    • 该关卡敌人预览,每个敌人可以点击看介绍(包括能力介绍和HP、伤害、攻速等等)
    • 该关卡能买的塔的预览,同样点击介绍
    • 该关卡能买的道具预览,同样点击介绍
    • 故事背景可以考虑干脆在这里讲一小段
  • 功能类设计
    • 储存每个关卡的初始现金(钱可以是跟升级用的分开或干脆用同一个,同一个的话省事,分开的话要实现蛮多接口的)
    • 储存每个关卡能买的道具种类与数量
    • 设计道具价格
    • 已购买的道具信息传到PlayerItemBehavior
    • 已购买的塔需要设计某种方式传到地图(可以是先在玩家道具栏上,或是固定初始生成位置(后者较简单))

关卡设计

  • 第一关转为教程,增加提示等等
  • 每一关铺一下背景故事设定
  • 每一关难度平衡

游戏体验

  • WinUI进入下一关选项
  • 暂停退出菜单

TODO: 一个完整的关卡

  • 地图中有:—— 蔡沐祯WIP

    • 两条通道,引导玩家一条用塔封锁,一条自己开枪
    • 一个完整的背景图
  • 敌人生成:

    • 大量运输兵,夹杂少量会对玩家开枪的步兵
    • 前期均匀分布在两个通道
    • 最后一波集中在一个通道,引导玩家搬塔

更多的炮塔和敌人种类

目前有的炮塔种类 (越下面实现越麻烦)

  • 基础炮塔,单发单体伤害
  • AOE炮塔(电磁线圈),半径内群体AOE伤害,表现效果待完善
  • 三发霰弹炮塔,目前仅有shoot脚本和prefab完成,未debug与实装测试
  • 阻击塔,无限范围
  • 火箭塔,类似玩家的火箭
  • 喷火塔,持续锥形AOE
  • DEBUFF塔,给伤害的敌人减速/减伤害/伤害加成
  • 电磁干扰塔,停止范围内敌人一段时间
  • BUFF塔,AOE给周围的塔+伤害/保护/攻速/范围

目前敌人种类

  • 运输兵
  • 步枪兵
  • 鬼火射手
  • 霰弹枪兵,未调试

敌人种类建议 (越下面实现越麻烦)

  • 运输车:破坏之后生成3-5个运输兵 WIP - IAN
  • 重甲兵:固定减伤害 - 克攻速升级
  • 拆塔兵:专门攻击塔,策略上来说是高优先级目标
  • 炸弹兵:射出的炸弹黏在地上后一定时间爆炸
  • 奶妈:AOE恢复敌人,需要敌人的AOE检测
  • 能量护甲兵:开AOE护甲保护敌人,需要敌人的AOE检测
  • 陷阱兵:射出的子弹被打中的话会被眩晕/减速,这个实现要改PlayerMovementBehavior,稍微麻烦点

第二关改为攻击模式

  • 在铁轨的环中间放置一个敌人基地
  • 胜利条件改为射爆基地
  • 敌人无限生成
  • 基地反击机制

已实现模块documentation

大致描述模块及其接口

Player

PlayerItemBehavior

  • 负责管理切换武器以及左键Fire()
  • 之后商店买到的道具可以用SetItem(ItemBase item, int index)设置
  • 需Editor设置:
  • UIHotkeyBar bar
  • List barItems (暂时、之后在商城从GameManager设置)

PlayerMoveBehavior

  • 管理玩家动画及移动
  • 需Editor设置:
  • Rigidbody2D rb
  • Animator animator
  • Transform anchor - Player的第一个孩子(可以考虑直接用FindComponentInChildren)

PlayerTurretBehavior

  • 管理玩家捡起和放下塔
  • 玩家需要在一定距离内才能捡起塔
  • 已实现合法地区检测,见TurretMoveBehavior
  • 按E键捡起和放下塔,没实现自动丢塔,塔不占Item空间(原因:防止ItemBar满的情况)
  • 需Editor设置:
  • GameObject turret

TODO

  • 玩家在范围内有某种视觉提示可以捡塔

Items

ItemBase

  • 属性:
  • float itemCount
  • Transform firePoint 子弹发射点
  • Sprite Icon
  • 成员函数:
  • void Activate() 切换成该Item时调用
  • void Deactivate() 切换走时调用
  • Sprite getIcon() 返回Icon
  • virtual void Fire() 使用item

WeaponBase : ItemBase

  • 属性:
  • FriendBulletBehavior Bullet
  • float cooldownDuration 攻速
  • 成员函数:
  • Fire() 一定攻速射出子弹

RepairTool : ItemBase

  • 修复工具:有一定数量,在靠近塔后左键开始修塔
  • 每过一段时间(repairTime)塔以repairRate回血
  • 若玩家切换道具或移动则会取消修复
  • 塔满血状态下回保持修复状态,但不会消耗道具

TODO

  • 玩家在范围内有某种视觉提示可以修塔
  • 把修复移到道具栏外 固定槽 (固定槽可以用来提示是否可以使用,并且按R键修塔,试了用左键修塔有点别扭)

UI

UIHotKeyBar (未完成)

  • 目前固定五个槽
  • void SetItemIcon(int index, Sprite Icon): 设置图标
  • void Activate(int index) 激活该槽会有边框视觉效果
  • void Deactivate(int index)
  • void SetItemCount(int index, int count): 设置右下角显示剩余数量

TODO

  • void StartCooldDown(float time, int index) 道具冷却视觉效果
  • void SetItemCount(int index, int count): 设置右下角显示剩余数量

重叠效果

  • RenderBehavior:大致**根据y值设置z值,把这个script放在每个需要重叠的物体上

Resources素材说明

Resource文件说明

Resources

1、Enemy

包含不同种类敌人

Enemy、enemy06:运输兵,只移动,不射击

enemy02、enemy03、enemy04:步兵,移动并射击

artillery:炮兵,射击CD长,射出的子弹威力大,子弹飞行速度慢

fly_enemy:飞行兵,血条厚

sword_enemy:起错文件名了~在被塔检测到的时候射出光线,让炮塔停止攻击一秒

enemy07、enemy08:刀剑兵,近距离攻击,只攻击塔

2、Environment

2.1Bg01

一种风格的地图素材

2.2Bg02

另一种风格的地图素材

3、Font

两种字体素材

4、goods

物品:待扩充

金币、钻石、雷达、绿币

5、Prefabs

预制件,尚未整理

6、Sprites

枪+玩家,尚未整理

7、Weapon

7.1、attach-to-body

不知道干啥的,万一能用上呢x

7.2、bullet effects

子弹效果

7.3、cursors

主人公武器射击准星,不同武器不同准星

7.4、shoot12

与文件"weapon12"武器与子弹效果一一对应

7.5、turret

含有多个文件夹,共有五种炮塔以及对应炮筒,炮弹可从子弹效果里获取

7.6、base

基地

7.7、explosion

爆炸效果,敌人摧毁/炮塔被毁/玩家死亡效果,可能需要再找不同爆炸效果用以区分爆炸对象

8、hero_death

英雄死亡图片:可作为game over提示框弹出时的图片

第一关、第二关修改方案

全局修改

Turret修改:

  1. 基础Turret冷却时间调整为1s。

第一关

初始道具

手枪,地雷2,RPG1

初始炮塔

基础Turret

敌人

时间 path1 path2
0s 运输兵*1
5s 运输兵*1
10s 运输兵*1 运输兵*1
15s 运输兵*3
25s 运输兵*5
40s 运输兵*7
50s 运输兵*2 步枪*1 运输兵*2 步枪*1

第二关

基地血量:400

玩家血量:30

道具

MP5、RPG*5、地雷*3

炮塔

  • 基础炮塔*2
  • 电磁线圈(一定半径AOE伤害)*1

敌人

初始

时间 标准路径 短路(不绕圈)
0s 运输兵20 步兵3
30s 运输兵10 步兵10
60s 运输兵10 鬼火射手5
90s 霰弹枪手*5
120s 步兵*10 运输兵*10
150s

循环

时间 标准路径 短路
0s 步兵15 鬼火射手10 运输兵*10 运输兵5 步兵3
50s

EnemyManager的生成系统处理

生成的数组从套娃变成一维数组,每个数组有四个值:
path: 路径名称
spawn: 敌人序列(aaabaaa,每个字母代表不同种类)
interval: 生成时间间隔
starttime: 开始生成时间

初始化:读取数组,将其转化为
(path,enemy,time)的以time升序的生成序列。

生成:每次Update检测序列前端的生成时间是否<=timestamp。

清光敌人之后的时间加速:如果当前敌人的Hashset为空,则timestamp增加速度加快。

Beta TODO List

  • 游戏Pause/Resume
  • Fix带枪的敌人的动画
  • 击杀敌人能得到一定数目的金钱(剧情和Image上不一定是金币,可以是电力之类的)
    • 结算统一放在HPBehavior里
  • 一次性RPG、地雷道具
  • TurretUpgrade接口
    • List<[string,float]> UpgradeOptions(): 返回一个(升级名称,升级cost)的list
    • bool Upgrade(int index): 升级第i个选项,返回值为升级成功
  • 实现基本Turret的TurretUpgradeBehavior
  • FriendManager,管理当前所有Turret和友军单位(暂未实现)
    • GetClosestTurret: 返回最近的Turret
  • 角色持有扳手按右键打开升级UI 站在塔下按T打开升级菜单 WIP - IAN
    • 适配TurretUpdate接口
  • 扳手指向的Turret可视化
    • 人物坐标+扳手朝向的transform.forward*一个数,获取该点的坐标最近的扳手,判断其与人物距离是否小于一定值,激活TurretShineBehavior
  • 开局之前的商店,可以选择炮塔与一次性道具
  • 道具栏中的收纳好的炮塔,允许开局后部署
  • 更多炮塔种类
    • 三发炮塔:同时向瞄准方向和左右一定角度打出三发子弹
    • 真·炮塔:AOE伤害
    • 想到的可以再往上加
  • 更多敌人种类
    • 三发步兵:同时打出三发子弹
    • 鬼火射手:朝Hero打出追踪的鬼火,移动缓慢,一段时间后消失
    • 自爆卡车:打死后自爆,对范围内的炮塔和Hero造成AOE伤害
    • 想到的可以再往上加
  • 更多武器种类
    • 手枪
    • AK:射速++,伤害+
    • MP5:射速++++,伤害-
  • 道具栏
    • void StartCooldDown(float time, int index) 道具冷却视觉效果 暂时不做了 时间性价比不高
    • void SetItemCount(int index, int count): 设置右下角显示剩余数量
  • 重叠效果 在Project Settings/Graphics/Camera Settings 把Transperancy Mode改成Custom Axis, Transparency Sort Axis改成 X:0 Y:1 Z:0)

TODO: 血条系统

  • 血条Prefab - SY WIP
    1. 外边缘为黑色长方形框,中间从左到右填充红色;
    2. void Set(float x) : 设置血条长度比例为x。(x in [0,1])
    3. 颜色设置
  • 敌人血条 - EnemyHPBehavior
  • 炮塔血条 - TurretHPBehavior
  • 玩家血条 - PlayerHPBehavior
  • 基地血条 - GameManager.sTheGlobalBehavior.mBaseHP

重构目标

系统大致分为以下几个模块

  • 商店 TODO Rough Game Demo可先不做
  • 升级 TODO Rough Game Demo可先不做
  • 英雄
  • 敌人
  • 路径
  • 炮塔
  • 道具
  • 武器
  • HP

GameManager

  • ItemManager 道具栏
  • EnemyManager 敌人列表、自动生成新敌人
  • PathManager 路径管理
  • Hero 主角的reference
  • TurretManager TODO 炮塔管理
  • 方法:
    • GameFail 游戏失败,结束本关

道具

武器、修复、搬运炮塔、道具等操作模式全部由切换道具实现

添加道具:扳手,允许修复

所有可以成为道具的东西需要实现Item接口:

interface Item{
   int getNumber();
   Image getIcon();
   bool Activate(); // 切换到这个道具时的函数入口,返回结果为是否切换成功
   bool Deactivate(); // 从这个道具切换走时的函数入口,返回结果为是否切换成功(如果是炮台放在不合法位置可能切换失败)
}

子弹

所有子弹需要实现Bullet接口:

interface Bullet{
    float getDmg(GameObject o);
    void onHit(GameObject o); // 击中有效目标时的函数入口
    void onKill(GameObject o); // 杀死有效目标时的函数入口
}

BulletInterface->BaseBullet->FriendBullet、EnemyBullet
特效子弹(例如,不一定实现,霰弹枪子弹的伤害衰减,护甲敌人的伤害减免)可以通过override getDmg函数实现。

敌人

  • PathBehavior 沿路径前进,到达路径终点扣除GameManager中基地血量

    • mPathName 路径名
    • mSpeed 前进速度
    • mCost 扣除基地血量
  • EnemyHPBehavior 血量与碰撞检测

    • 碰撞检测是否为敌人方的子弹并扣血,如果血量为零调用Bullet的onKill()函数;然后调用onHit()函数;
    • 每次Update检测血量是否<0,小于0则调用onDestroy方法进行结算并销毁对象;
    • BloodBar 血条的reference(每次update更新血条)
  • ShootPlayerBehavior 射击玩家

    • BulletPrefab
    • Cooldown
    • DetectRange 目光范围
    • ShootPoint 射击点

所有Enemy对象在生成和销毁时必须在EnemyManager进行注册。生成注册在PathBehehavior 中,销毁注册有两个入口,在PathBehavior和EnemyHPBehavior中。

炮塔

  • ShootBehavior
    • BulletPrefab
    • ShootRange
    • Cooldown
  • TurretHPBehavior
    • MaxHP
    • 碰撞检测,敌人子弹扣血,扣完血时损坏,禁用ShootBehavior,如果可能的话更换贴图

英雄

  • PlayerMoveBehavior [v]

    • WASD移动,贴图朝向鼠标
  • PlayerHPBehavior

    • 碰撞检测,扣除HP
    • 如果HP<0,调用GameManager中的GameFail结束游戏

对不同道具的支持:
采用多个Behavior的模式,在不同Item的Activate函数中启用相关behavior。

  • PlayerShootBehavior [v]

    • weapon 当前武器
    • 切换到武器时激活,并切换weapon
    • 检测到左键按下调用weapon.Fire()
    • 武器切换走时disable掉武器object并禁用这个behavior(Item interface的Deactivate函数中实现)
  • PlayerBombBehavior

    • 待定
  • PlayerRepairBehavior [v]

    • 添加扳手道具
    • 左键修复
  • PlayerTurretBehavior [v]

    • 搬运炮台
    • 切换走时自动丢下炮台
    • 左键扔到视角位置

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.