弹药补给和消失、角色摄像机弹药转身
弹药补给实现攻击一个敌人时,有20%的概率不增加子弹,80%的概率增加1~3枚子弹。
直接修改KillEnemyCommand就可以了
1234567891011121314151617using FrameWorkDesign;using UnityEngine;//namespace ShootingEditor2D{ public class KillEnemyCommand : AbstractCommand { protected override void OnExecute() { this.GetSystem<IStatSystem>().KillCount.Value++; var randomIndex = Random.Range(0, 100);// if(randomIndex < 80)// this.GetSystem<IGunSystem>().CurrentG ...
弹药限制实现
枪械系统实现因为游戏设计时就有枪械切换的功能,这就需要设计枪械系统。通过枪械系统可以查询当前主角使用的是哪把枪,以及这把枪有多少枚子弹。
先创建一个GunInfo,用于记录某类枪子弹数量,未来可以增加枪械名字,类型等信息。
在System文件夹中新建一个GunSystem文件夹,在其中新建GunInfo
123456789using FrameWorkDesign;namespace ShootingEditor2D{ public class GunInfo { public BindableProperty<int> AmmoNum; }}
也是在GunSystem文件夹内,新建IGunSystem
12345678910111213141516171819202122232425using FrameWorkDesign;namespace ShootingEditor2D{ interface IGunSystem : ISystem { Gun ...
开始和结束界面实现、RectHelper
开始界面先新建一个Scene,命名为GameStart,在其中新建一个空对象,命名为UI。
在ViewController——UI文件夹中新建UIGameStart脚本,挂载在UI上。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748using System;using UnityEngine;using UnityEngine.SceneManagement;namespace ShootingEditor2D{ public class UIGameStart : MonoBehaviour { private readonly Lazy<GUIStyle> mLableStyle = new Lazy<GUIStyle>(() => { return new GUIStyle(GUI.skin.label) ...
XML关卡制定和解析
XML关卡文件制定我们的场景有如下元素:
Player
Enemy
Ground
NextLevel
如果我们想用文件描述场景中的元素,我们先要记录的就是它们的位置和名称信息。
先确定一个XML元素,并使用Level作为根节点,如下
1234<?xml version="1.0" encoding="UTF-8" ?><Level> <LevelItem name="Player" x="0" y="0"></Level>
在Project窗口的Assets文件夹下创建LevelFile文件夹,在其中新建一个xml文件,命名为LevelFileTest
1234567891011<?xml version="1.0" encoding="utf-8" ?><Level> <LevelItem name="Player" x="0&quo ...
摄像机跟随实现与v0.0.3版本规划
摄像机跟随实现在Gameplay文件夹内新建CameraController脚本
1234567891011121314151617181920212223242526272829303132using UnityEngine;public class CameraController : MonoBehaviour{ Transform mPlayerTrans; Vector3 velocity = Vector3.zero; void Update() { if (!mPlayerTrans) { var playerGameObj = GameObject.FindGameObjectWithTag("Player"); if (playerGameObj) { mPlayerTrans = playerGameObj.transform; & ...
掉血和通关实现
掉血实现在Command文件夹中新建HurtPlayerCommand
1234567891011121314151617using FrameWorkDesign;namespace ShootingEditor2D{ public class HurtPlayerCommand : AbstractCommand { private readonly int mHurt; public HurtPlayerCommand(int hurt = 1) { mHurt = hurt; } protected override void OnExecute() { this.GetModel<IPlayerModel>().HP.Value -= mHurt; } }}
在ViewController文件夹中新建AttackPlayer脚 ...
Lazy类简单介绍
简介从net 4.0开始,C#开始支持延迟初始化,通过Lazy关键字,我们可以声明某个对象为仅仅当第一次使用的时候,再初始化,如果一直没有调用,那就不初始化,省去了一部分不必要的开销,提升了效率,同时Lazy是天生线程安全的
应用场景
对象创建成本高且程序可能不会使用它。
例如,假定内存中有具有 Orders 属性的 Customer 对象,该对象包含大量 Order 对象,初始化这些对象需要数据库连接。 如果用户 永远不要求显示 Orders 或在计算中使用该数据,则无需使用系统内存或计算周期来创建它。 通过使用 Lazy 来声明 Orders 对象用 于迟缓初始化,可以避免在不使用该对象时浪费系统资源。
对象创建成本高,且希望将其创建推迟到其他高成本操作完成后。
例如,假定程序在启动时加载多个对象实例,但是只需立即加载其中一部分。 可以通过推迟初始化不需要的对象,直到创建所需对 象,提升程序的启动性能。
基本用法方式一:使用默认的构造函数12345678910111213141516171819202122232425262728293031using Sy ...
统计系统(StatSystem)简单实现
我们在v0.0.2规划中有:
统计系统:统计击杀敌人的数量
主角的Model:主角的生命值信息
主角碰到敌人就掉血
关卡中的通关功能(终点)
摄像机跟随主角功能
我们这里先实现统计系统和主角的Model
在ShootingEditor2D中引入框架首先整理一下之前的脚本文件,我们在Scripts文件夹中新建ViewController、Model、System、Command文件夹,并把之前的脚本都放入ViewController文件夹里面
上面截图中还没有创建Command文件夹,注意创建
然后在Script文件夹内新建脚本,命名为ShootingEditor2D,作为引入框架的主脚本
12345678910111213using FrameWorkDesign;namespace ShootingEditor2D{ public class ShootingEditor2D : Architecture<ShootingEditor2D> { protected override void Init() ...
v0.0.1版本归档和v0.0.2版本规划
目前我们规划的功能都算做完了,如下
初期阶段:机制打磨
核心玩法:3C实现
角色
主角
左右移动 √
跳跃 √
射击开枪 √
敌人
被子弹击中后消失 √
按键输入
左右移动 √
跳跃 √
射击开枪 √
镜头
固定视角 √
量产阶段:游戏内容生产
发布阶段:测试
v0.0.1归档我们把这个版本称作v0.0.1版本,我们把版本信息记录到一个txt文件里,
我们在项目的本地工程文件内新建一个TXT文件,并命名为“已完成”
在其中输入:
v0.0.2版本规划游戏的核心操控部分我们已经完成了,接着我们来分析一下从游戏设计角度上来讲这套游戏有哪些可以加的部分。
主角的枪可以更换,比如手枪、冲锋枪、步枪、狙击枪、火箭筒、霰弹枪等,不同的枪配有不同的子弹,不同的子弹射击轨迹、范围、攻击力等应该是不同的。
主角本身可以增加二段跳、攀墙、冲刺等
主角需要有一定的血量值、弹药量等。
敌人需要有生命,等生命归零才会死亡消失。还可以拿起武器,进行一些近战或者远程的攻击,这样我们就需要设计敌人AI,应用状态机或者行为树。
敌人还要有掉落设定,掉落一些弹药补给、药品等 ...
开枪射击和敌人消失
枪械原型给Player添加一个Sprite——Square子对象,命名为Gun,将Scale-X设为0.5,Scale-Y设为0.1,Position-X设为0.5,颜色设为黑色
接下来给Gun添加一个Sprite——Square子对象,命名为Bullet,将Scale-X设为0.2,Position-X设为0.4,颜色设为橙色。并且给子弹挂载BoxCollider2D和Rigidbody2D,并将其Rigidbody的Gravity Scale设为0。
设置开枪脚本在Scripts文件夹新建Bullet脚本,并挂载在Bullet上。
12345678910111213141516171819using UnityEngine;namespace ShootingEditor2D{ public class Bullet : MonoBehaviour { private Rigidbody2D m_Rigidbody; private void Awake() { m_Rig ...