Code Monkey home page Code Monkey logo

turretagent's Introduction

turretagent's People

Contributors

fanyone avatar mengqi97 avatar ruyerz avatar spicytomatoes avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

turretagent's Issues

更多的炮塔和敌人种类

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

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

目前敌人种类

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

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

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

EnemyManager的生成系统处理

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

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

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

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

新TODO LIST

BUG

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

測玩反馈

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

更多的炮塔和敌人种类

见:#102

商店系统

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

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

关卡设计

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

游戏体验

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

经济系统

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加入剧情简介

已实现模块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放在每个需要重叠的物体上

重构目标

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

  • 商店 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]

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

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提示框弹出时的图片

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

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: 一个完整的关卡

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

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

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

第一关、第二关修改方案

全局修改

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

TODO: 血条系统

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

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.