許昌知名網(wǎng)站建設(shè)價(jià)格重慶發(fā)布的最新消息今天
一: 連招思路
首先人物角色上有三個(gè)攻擊實(shí)例對(duì)象 Damage,每一個(gè)damage定義了攻擊的傷害值,攻擊距離,觸發(fā)器名稱(chēng),傷害的發(fā)起者,攻擊持續(xù)時(shí)間,攻擊重置時(shí)間,傷害的碰撞框大小等字段:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[System.Serializable]
public class Damage
{/// <summary>/// 觸發(fā)動(dòng)畫(huà)觸發(fā)器名稱(chēng)/// </summary>public string animationTrigger = "";/// <summary>/// 組合攻擊傷害/// </summary>public int damage = 0;/// <summary>/// 傷害的攻擊者/// </summary>public GameObject inflictor;/// <summary>/// 組合攻擊持續(xù)時(shí)間/// </summary>public float duration = 1f;/// <summary>/// 連擊重置時(shí)間 超過(guò)這個(gè)時(shí)間如果沒(méi)有收到連擊序列 連擊將會(huì)被取消/// </summary>public float comboResetTime = .5f;[Space(10)][Header("hit collider settings")]public float collSize;public float collDistance;public float collHeight;}
當(dāng)按下某一個(gè)鍵位的時(shí)候,播放對(duì)應(yīng)索引的攻擊,如果在攻擊時(shí)間后再次收到了攻擊鍵位的按下就認(rèn)為是連擊狀態(tài),這時(shí)候繼續(xù)播放攻擊動(dòng)作。
二: 代碼實(shí)現(xiàn)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerCombat : MonoBehaviour
{// 主角的攻擊組合public Damage[] attackCombo;// 主角的最后一次攻擊類(lèi)型public Damage lastAttack;// 記錄最后一次攻擊時(shí)間public float lastAttackTime;public PlayerController playerController;public CharactorState charactorState;// 最近一次攻擊的索引public int attackIndex = 0;// 是否是連擊狀態(tài)public bool continueAttackCombo;void Awake(){playerController = GetComponent<PlayerController>();charactorState = GetComponent<CharactorState>();}public void combatEvent(){Debug.LogWarning("state is " + charactorState.curState);if (charactorState.curState != UnitState.ATTACK){// 是否在攻擊窗口內(nèi)bool insideComboWindow = (lastAttack != null && (Time.time < (lastAttackTime + lastAttack.duration + lastAttack.comboResetTime)));if (insideComboWindow && !continueAttackCombo && attackIndex < attackCombo.Length - 1){// 繼續(xù)攻擊attackIndex++;}else{// 重置攻擊attackIndex = 0;}doAttack(attackCombo[attackIndex], UnitState.ATTACK);}if (charactorState.curState == UnitState.ATTACK && !continueAttackCombo && playerController.pc.isGround){if (attackIndex < attackCombo.Length - 1){// 已經(jīng)處于攻擊狀態(tài),且不是連續(xù)攻擊 將連續(xù)攻擊狀態(tài)打開(kāi)continueAttackCombo = true;return;}}}public void doAttack(Damage damage, UnitState state){Debug.Log("animationTrigger is " + damage.animationTrigger);if (damage.animationTrigger == "attack3"){Debug.Log("attack3");}lastAttackTime = Time.time;lastAttack = damage;lastAttack.inflictor = this.gameObject;charactorState.SetState(state);playerController.playerAnimation.setTrigger(damage.animationTrigger);Invoke("Ready", damage.duration);}public void Ready(){Debug.LogWarning("Ready");if (continueAttackCombo){// 重置是否繼續(xù)連招動(dòng)作 因?yàn)檫@個(gè)時(shí)候玩家沒(méi)有觸發(fā)攻擊動(dòng)作continueAttackCombo = false;if (attackIndex < attackCombo.Length - 1){attackIndex++;}else{attackIndex = 0;}Debug.LogWarning("連招" + attackCombo[attackIndex].animationTrigger);if (attackCombo[attackIndex] != null && attackCombo[attackIndex].animationTrigger.Length > 0){doAttack(attackCombo[attackIndex], UnitState.ATTACK);}}// 重置玩家狀態(tài)charactorState.SetState(UnitState.IDLE);}// Update is called once per framevoid Update(){}
}
三:攻擊窗口
如果當(dāng)前主角的狀態(tài)不是攻擊狀態(tài),檢查是否在攻擊時(shí)間窗口內(nèi),如果在攻擊時(shí)間窗口內(nèi)就進(jìn)行攻擊索引的累加,否則攻擊索引從0開(kāi)始
if (charactorState.curState != UnitState.ATTACK){// 是否在攻擊窗口內(nèi)bool insideComboWindow = (lastAttack != null && (Time.time < (lastAttackTime + lastAttack.duration + lastAttack.comboResetTime)));if (insideComboWindow && !continueAttackCombo && attackIndex < attackCombo.Length - 1){// 繼續(xù)攻擊attackIndex++;}else{// 重置攻擊attackIndex = 0;}doAttack(attackCombo[attackIndex], UnitState.ATTACK);}if (charactorState.curState == UnitState.ATTACK && !continueAttackCombo && playerController.pc.isGround){if (attackIndex < attackCombo.Length - 1){// 已經(jīng)處于攻擊狀態(tài),且不是連續(xù)攻擊 將連續(xù)攻擊狀態(tài)打開(kāi)continueAttackCombo = true;return;}}