关于角色三连击
今天在蛮牛教育学习群里(390835120)我们讨论了 一个关于三连击的实现方法经过指点 有了想法决定 实验下 小白在这里也拿来跟大家分享下共同学习么嗯 我们来拿这个壮汉实验一下吧 图1 首先 我们要先研究下 他的动作关系 这个角色的动作有idle attack1 attack2attack3 jumprun 那么我们要使用 unity 新动画系统的 Animator Controller 来进行 动画的连接创建一个Animator Controller 把咱用到的动画 都拖进去吧 idle 设为默认动画 然后咱就开始连连看吧 三连击击肯定是idle--->attack1--->attack2--->attack3这个套路 然后这3个攻击到哪攻击一定时间不操作了肯定 就会放回idle 状态所以需要 这么连接图2 连好后 我需要 拿脚本 来控制他们的切换需要 一个变量我们来建立一个attack 个int 变量 给那些线 添加这个变量 Idle 到 attack1 Int 值为 1attack1到 attack2 Int 值为 2Attack2到 attack3 Int 值为 3attack1attack2attack3返回 idle int 都为 0 好了 这样 就可以拿这个变量控制啦 下面开始 写脚本 调用 动画什么的就不说啦直接说重点三连击 核心就是 拿时间判断 你在这段时间内让没让我做出下一个动作那么 怎么获取动画 时间之类的呢 我们可以用 animSta=anim.GetCurrentAnimatorStateInfo (0);来获取动画信息 这样 就可以 用 它里面 的is name判断 现在 哪个动画名下面, 用 normalizedTime 来判断 动画 时间 剩下的 就是条件判断咯代码如下using UnityEngine;
using System.Collections;
public class play_Move : MonoBehaviour {
public float playSpeed=1;
public float rotspeed=1;
public Animator anim;
public AnimatorStateInfo animSta;
private const string IdleState="idle";
private const string Attack1State="attack1";
private const string Attack2State="attack2";
private const string Attack3State="attack3";
private int HitCount=0;
public float jumpli=10;
void Start () {
anim = this.gameObject.GetComponent<Animator> ();
anim.SetBool ("move", false);
anim.SetBool ("attack", false);
anim.SetBool ("attackBack", false);
anim.SetBool ("jump", false);
HitCount=0;
}
void Update () {
move ();
animSta=anim.GetCurrentAnimatorStateInfo (0);
if (!animSta.IsName (IdleState) && animSta.normalizedTime > 1.0f) {
anim.SetInteger("attack",0);
HitCount=0;
}
if (Input.GetMouseButton (0)) {
attack();
}
if (Input.GetKey (KeyCode.Space)) {
anim.SetBool ("jump", true);
} else {
anim.SetBool ("jump",false);
}
}
void move(){
float hor = Input.GetAxis ("Horizontal");
float ver = Input.GetAxis ("Vertical");
transform.Translate (0, 0, ver * playSpeed * Time.deltaTime);
transform.Rotate (0, hor*rotspeed*Time.deltaTime, 0);
if (ver != 0) {
anim.SetBool ("move", true);
} else {
anim.SetBool ("move", false);
}
}
void attack(){
if (animSta.IsName (IdleState) && HitCount == 0 && animSta.normalizedTime > 0.50f) {
anim.SetInteger ("attack", 1);
HitCount = 1;
Debug.Log("cc");
} else
if (animSta.IsName (Attack1State) && HitCount == 1 && animSta.normalizedTime > 0.65f) {
anim.SetInteger ("attack", 2);
HitCount = 2;
} else
if (animSta.IsName (Attack2State) && HitCount == 2 && animSta.normalizedTime > 0.70f) {
anim.SetInteger ("attack", 3);
HitCount = 3;
}
}
}
赞一下,支持
感谢楼主的无私分享! 很不错 顶顶多好 真心顶 难得一见的好帖 说的非常好 很不错 楼主是超人
页:
[1]