unity3d角色攻击+攻击轨迹带演示
PlayerAttackController.cs 是控制角色连招的脚本,上次已经分享过,不过添加了少少东西
PlayerDelegate.cs 是一个单例脚本,控制接受和传递事件的
SwordTrial.cs 是控制攻击的刀的轨迹的
//上面三个脚本绑定到自己的角色类中即可
刀的轨迹还需参照
AssestStore下载的一个刀轨迹的插件
(好像叫MeleeWeapon啥的)
Interpolate.cs和MeleeWeaponTrail.cs 是在AssestStore下载的一个刀轨迹的插件,个人感觉非常不错,简单易用,想看的朋友可以去下来看看,自带了例子的
演示地址:http://www.we-done.net/demo/playerAttackDemo/webplayer.html
using UnityEngine;
using System.Collections;
public delegate void AttackStateDelegate(string name);
public class PlayerAttackController : MonoBehaviour {
//派发改变攻击动画状态的委托
public AttackStateDelegate setAttackState = null;
//记录当前攻击动画;
AnimationClip currentAttack;
//获取人物动画组件;
Animation playerAnimation;
//动画标签;
public enum ActionState
{
Attack_0,
Attack_1,
Attack_2,
Attack_3,
None
}
//记录当前动画标签;
private ActionState actionState = ActionState.None;
/**
* 攻击的逻辑
*/
void AttackLogic(){
if (Input.GetButtonDown("Fire1")){
if (actionState != ActionState.Attack_0 && actionState != ActionState.Attack_1&& actionState != ActionState.Attack_2&& actionState != ActionState.Attack_3) {
actionState = ActionState.Attack_0;
}else if (actionState == ActionState.Attack_0 && playerAnimation[currentAttack.name].time > 1.0f){
actionState = ActionState.Attack_1;
}else if (actionState == ActionState.Attack_1 && playerAnimation[currentAttack.name].time > 1.3f){
actionState = ActionState.Attack_2;
}else if (actionState == ActionState.Attack_2 && playerAnimation[currentAttack.name].time > 0.45f){
actionState = ActionState.Attack_3;
}
}
}
/**
* 攻击套路选择
*/
void Attacks (){
float delayTime =0.0f;
switch (actionState){
case ActionState.Attack_0:
delayTime = -0.1f;
if(setAttackState!=null){
setAttackState("Attack");
}
playerAnimation.CrossFade("Attack", 0.15f);
currentAttack = playerAnimation["Attack"].clip;
break;
case ActionState.Attack_1:
delayTime = -0.1f;
if(setAttackState!=null){
setAttackState("Attack01");
}
playerAnimation.CrossFade("Attack01", 0.15f);
currentAttack = playerAnimation["Attack01"].clip;
break;
case ActionState.Attack_2:
delayTime = -0.1f;
if(setAttackState!=null){
setAttackState("Attack02");
}
playerAnimation.CrossFade("Attack02", 0.05f);
currentAttack = playerAnimation["Attack02"].clip;
break;
case ActionState.Attack_3:
delayTime = -0.1f;
if(setAttackState!=null){
setAttackState("Attack03");
}
playerAnimation.CrossFade("Attack03", 0.15f);
currentAttack = playerAnimation["Attack03"].clip;
break;
case ActionState.None:
if(setAttackState!=null){
setAttackState("None");
}
break;
}
//Switch to default if an animation is almost over
if (playerAnimation[currentAttack.name].time > (playerAnimation[currentAttack.name].length +delayTime)){
actionState = ActionState.None;
currentAttack = playerAnimation["AttackStandy"].clip;
playerAnimation.CrossFade("AttackStandy", 0.5f);
}
}
void Awake(){
//程序开启前,获取人物动画组件;
playerAnimation = GetComponent <Animation>() as Animation;
playerAnimation["Attack"].speed=1.6f;
playerAnimation["Attack01"].speed=1.3f;
playerAnimation["Attack02"].speed=1.2f;
playerAnimation["Attack03"].speed=1.5f;
}
protected void Initialise (){
}
void Start () {
if (playerAnimation.clip) {
currentAttack = playerAnimation.clip;
} else {
currentAttack = playerAnimation["AttackStandy"].clip;
}
}
// Update is called once per frame
void Update () {
if (currentAttack != null){
AttackLogic();
Attacks();
}
}
}
>>相关产品