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);
}
}
演示: