学习游戏制作记录(技能系统)7.24
1.技能系统概念
首先让我们了解一下游戏的技能本质是什么,以投掷剑为例子,当玩家使用这个技能时,首先会播放玩家的动画,随后通过技能脚本创建一个剑的对象,当剑回收时会再次调用脚本,让它朝向玩家飞来并销毁自己,所以我们可以创建一个技能管理器,将我们所有的技能脚本放在这个管理器中。
2.创建玩家管理器
创建PlayerManage脚本:
public static PlayerManage instance;//单例模式,使用单例模式可以使我们更加方便的找到玩家的组件
public Player player;//只需初始化一次,不需要我们反复用GameObject.Find来寻找玩家组件
public void Awake()
{
if (instance != null)//确保我们只有一个实例
{
Destroy(instance.gameobject);
}
else
{
instance = this;
}
}
修改SkeletonBattleState脚本:
player =PlayerManage.instance.player.transform;//可以直接获取Player信息
在SkeletonGroundedState脚本中也做同样的修改
创建一个空对象PlayerManage并挂载PlayerManage脚本,指定Player的对象,这样我们就实现了玩家管理器
3.创建技能管理器
创建Skill脚本(所有技能的父类):
[SerializeField] private float cooldown;
private float coolDownTime;//每个技能都有的冷却时间
protected virtual void Update()
{
coolDownTime -= Time.deltaTime;
}
public virtual bool CanbeUsed()//判断是否可以使用技能
{
if(coolDownTime<0)
{
UseSkill();
coolDownTime = cooldown;
return true;
}
else
{
Debug.Log("i am in cooldown");
return false;
}
}
public virtual void UseSkill()//使用技能
{
}
创建Dash_Skill脚本:
public class Dash_Skill : Skill//继承
{
public override void UseSkill()
{
base.UseSkill();
Debug.Log("i am clone");//这里仅作调试,具体我们想实现一个冲刺后留下一个可以攻击敌人的幻影
}
}
创建SkillManage脚本:
public static SkillManage instance;//同样单例模式
public Dash_Skill dash { get; private set; }//获取冲刺克隆技能
public void Awake()
{
if(instance != null)
{
Destroy(instance);
}
else
{
instance = this;
}
}
private void Start()
{
dash = GetComponent<Dash_Skill>();
}
}
Player脚本:
我们可以删除这里定义的冲刺冷却时间
修改:
public void CheckForDashInput()
{
if(isWallDetected())
{
return;
}
if(Input.GetKeyDown(KeyCode.LeftShift)&&SkillManage.instance.dash.CanbeUsed())//这里调用CanbeUsed即可
{
dashDir = Input.GetAxisRaw("Horizontal");
if(dashDir==0)
{
dashDir = facingDir;
}
stateMachine.ChangeState(dashState);
}
}
演示: