我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>应用>技术动态>技术应用

unity3d角色攻击+攻击轨迹带演示

文章来源:网络 作者:bonnie 发布时间:2013年09月06日 点击数: 字号:

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();
}

}
}

>>相关产品

  • 立体显示器
  • 立体投影系统
  • 立体拍摄系统
  • 数字头盔/头戴式显示器
  • 立体视频眼镜
  • 液晶快门立体眼镜
  • 手持式立体双目镜
  • 数据手套
  • 3D输入设备
  • 多点触控系统
  • 立体投影系统
  • 动作捕捉系统
  • 位置追踪器
  • 眼动仪
  • 力反馈设备
  • 3D扫描器
  • 3D打印机
  • 虚拟现实软件
    • 暂无资料
    • 暂无资料
    • 暂无资料
    • 暂无资料
    • 暂无资料