欢迎来到第六部分!重头戏!!!战斗系统。

首先,我们需要裁剪所需的武器图片素材

裁剪之后,点击 Apply。在 Project 面板中,我们把 weapon_0 拖曳到 Hierarchy 面板中 Player 下。使其属于 Player 游戏物件的子物件。然后在 weapon_0 的 Inspector 面板中,增加一个新的 Sorting Layer。

我们调整一下武器的位置。注意,由于武器的父组件是玩家,所以武器的位置是相对于玩家的(也就是说 0, 0 的位置是在玩家正中央)。我们将位置和大小做调整:Position x = 0.064,y = 0.08;Scale x&y = 0.7。然后我们可以运行游戏,当玩家两面走动的时候,武器会随着玩家的朝向变动。

然后我们给 weapon_0 加上 BoxCollider2D,再创建一个 Weapon 脚本,它继承了 Collidable 类,武器也需要检测碰撞。

我们声明几个变量,变量用途都写在注释上了。升级系统需要获取武器的 SpriteRenderer 是因为我们要给其改变不同的武器样式(更换图片)。挥动武器有冷却,还有记录上一次挥动的时间戳,具体原理和文字显示时长一样。

覆盖 Start 函数,让它调用父类的 Start 函数,因为我们也需要获取 BoxCollider 组件,另外我们也需要获取 SpriteRenderer 组件。

覆盖 Update 函数,也需要调用父类的 Update 函数,因为该函数会调用 OnCollide 函数检测碰撞。在 Update 函数里要检测当玩家点击空格键,且 当前时间 - 最后一次挥动时间 大于 冷却时间 时,挥动一次并记录这次挥动的时间点。

写上 Swing 函数,这将会是挥动武器所需要做的操作

using UnityEngine;

public class Weapon : Collidable
{
// 对怪物造成的伤害
public int damagePoint = 1; // 对怪物造成的伤害
public float pushForce = 2.0f; // 击退敌人的力度

// 升级系统
public int weaponLevel = 0;
private SpriteRenderer spriteRenderer;

// 挥动武器
private float cooldown = .5f; // 每 0.5 秒挥动一次
private float lastSwing;

protected override void Start()
{
base.Start();
spriteRenderer = GetComponent<SpriteRenderer>();
}

protected override void Update()
{
base.Update();
// 点击空格攻击
if (Input.GetKeyDown(KeyCode.Space))
{
if (Time.time - lastSwing > cooldown)
{
lastSwing = Time.time;
Swing();
}
}
}

// 挥动武器
private void Swing()
{
Debug.Log("挥动武器");
}
}

现在运行游戏,你会发现控制台会持续输出 Player,这是因为我们的武器位置重叠在了玩家身上,玩家和武器都有碰撞体,所以会触发 OnCollide 函数,输出当前碰撞的物体(也就是玩家)。