修改Enemy的Prefab

双击Enemy的Prefab,进入Prefab的编辑界面,为了让AI行动,我们要添加一些检测点。

给Enemy对象添加子节点,分别命名为WallCheck、FallCheck、GroundCheck,让这些子节点全都挂载Circle Collider 2D和Trigger 2D Check。同时将Trigger 2D Check的Target Layer设为Default,将Circle Collider 2D的Trigger开启,Radius设为0.01.

将这三个子节点调整到合适的位置。

调整到合适位置

添加Enemy脚本

在ViewController的GamePlay文件夹中添加Enemy脚本,并将此脚本挂载在Enemy的Prefab上,注意在Prefab模式下挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using UnityEngine;

namespace ShootingEditor2D
{

public class Enemy : MonoBehaviour
{
private Trigger2DCheck mWallCheck;
private Trigger2DCheck mFallCheck;
private Trigger2DCheck mGroundCheck;

private Rigidbody2D mRigidbody2D;

private void Awake()
{
mWallCheck = transform.Find("WallCheck").GetComponent<Trigger2DCheck>();
mFallCheck = transform.Find("FallCheck").GetComponent<Trigger2DCheck>();
mGroundCheck = transform.Find("GroundCheck").GetComponent<Trigger2DCheck>();

mRigidbody2D = GetComponent<Rigidbody2D>();
}

private void FixedUpdate()
{
var scaleX = transform.localScale.x;

if (mGroundCheck.Triggered && mFallCheck.Triggered && !mWallCheck.Triggered)
{
mRigidbody2D.velocity = new Vector2(5 * scaleX, mRigidbody2D.velocity.y);
}
else
{
var localScale = transform.localScale;
localScale.x = -localScale.x;
transform.localScale = localScale;
}
}
}
}

v0.0.3版本归档

v0.0.3 关卡编辑及器初步 与 游戏达成闭环

  • 关卡编辑器

    • 手写存储文件格式制定 √

    • 解析并运行手写的存储文件 √

  • 游戏

    • 增加开始界面和失败界面形成“闭环” √
    • 增加弹药限制,初始为3发 √
    • 攻击一个敌人20%无弹药补给,80%给1~3弹药补给 √
    • 怪物增加移动 √
    • 改善细节
      • 子弹穿透敌人修复 √
      • 主角转身 √
      • 摄像机跟随反转和平滑 √
      • 子弹反方向问题修复 √

打开之前归档用的TXT文件,将此归档内容放在里面即可

v0.0.4版本规划

在写关卡编辑器的时候,没有使用任何架构相关的代码

LevelPlayer脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Xml;
using UnityEngine;

namespace ShootingEditor2D
{
public class LevelPlayer : MonoBehaviour
{
public TextAsset levelFile;
void Start()
{
var xml = levelFile.text;
var document = new XmlDocument();
document.LoadXml(xml);

var levelNode = document.SelectSingleNode("Level");

foreach (XmlElement levelItemNode in levelNode.ChildNodes)
{
var ItemArrtibutes = levelItemNode.Attributes;
var levelItemName = ItemArrtibutes["name"].Value;
var levelItemX = int.Parse(ItemArrtibutes["x"].Value);
var levelItemY = int.Parse(ItemArrtibutes["y"].Value);

var levelItemPrefab = Resources.Load<GameObject>(levelItemName);
var levelItemGameobject = Instantiate(levelItemPrefab, transform);
levelItemGameobject.transform.position = new Vector3(levelItemX, levelItemY, 0);
}
}

}
}

目前的前期研究阶段,功能实现是优先目的,等功能还可以了,就可以把功能实现的代码拆分到架构中管理起来。这也是架构的一种使用方式。

架构的使用方式目前有三种,如下:

  • 边迭代边增加模块、功能,我们设计游戏的核心部分就是这么做的。
  • 先实现功能,再把功能最后拆分到架构中(重构)管理起来接着迭代。
  • 先使用纸上设计,然后再编码实现。

在v0.0.4版本中,将着重使用第三种方式,重点纸上设计,然后统一编码实现。

  • 游戏部分的功能全部在纸上设计完成,然后再编码实现。
  • 编辑器部分的功能全部在纸上设计完成,然后再编码实现。

我们自己充当游戏设计策划,准备一些新的功能需求

v0.0.4版本规划

枪械系统:

  • 手枪
  • 冲锋枪
  • 步枪
  • 狙击枪
  • 火箭筒
  • 霰弹枪
  • 不同的枪配有不同的子弹,不同的子弹有不同的射击轨迹、范围、攻击力

主角能力:

  • 二段跳
  • 攀墙
  • 冲刺

主角数值:

  • 血量
  • 弹药量

敌人:

  • 生命值
  • 开枪的远程敌人
  • 掉落弹药补给、回血

关卡:

  • 可破坏物
  • 陷阱
  • 机关
  • 回血道具
  • 最大生命+1
  • 终点
  • 起始点
  • 补给站

对话系统

  • 角色设置剧情

系统

  • 存档系统
  • 关卡编辑系统
  • 对话系统
  • 统计系统
  • 成就系统
  • 背包系统
  • 主角的Model

功能非常多,我们可以一口气把这些功能设计完,然后逐步代码实现。

纸上设计并不是天生就能做出很完善的设计,这个和编程是一样的,都需要大量的练习。在不断的练习之后,设计和编程能力都会得到提高。