今天我们来实现角色攻击的教程 大家有什么问题还有意见可以来我们蛮牛教育群390835120 来一起讨论 本人也是小白 所以还有好多要学习的 那我们开始吧 上回我们 做了 角色的移动 那么攻击也是会用到 动画的切换 所以老样子 打开之前的 Animator Controller 我们把需要攻击的动画添加进来 这个有3个 3连击的 我之前也发过类似的帖子 大家如有不明白的话也可以看我之前发的帖子 控制动画肯定要有条件 所以 建立 一个int 变量 取名叫attack 连线Idle---->attack1 int=1 attack1---->attack2 int=2 attack2---->attack3 3个攻击都可以返回idle 状态 返回的那些线的变量 Int=0
然后 我们来用代码控制
[code=csharp]using UnityEngine;
using System.Collections;
public class PlayMove : MonoBehaviour {
private Animator anim;
private NavMeshAgent nav;
private LayerMask mask = -1;
private AnimatorStateInfo animSta;
RaycastHit hit;
private const string IdleState = "Sword-Idle";
private const string Attack1State = "Sword-Attack1";
private const string Attack2State = "Sword-Attack2";
private const string Attack3State = "Sword-AttackCritical";
private int HitCount = 0;
void Start () {
anim = gameObject.GetComponent<Animator>();
nav=gameObject.GetComponent<NavMeshAgent>();
anim.SetBool("move", false);
mask = LayerMask.GetMask("ground");
}
void Update () {
if (Input.GetMouseButtonDown(0))
{
move();
}
distance();
//获取动画信息
animSta = anim.GetCurrentAnimatorStateInfo(0);
if(Input.GetKey(KeyCode.A)){
attack();
}
if (!animSta.IsName(IdleState) && animSta.normalizedTime > 1.0f)
{
anim.SetInteger("attack", 0);
HitCount = 0;
}
}
void attack()
{ //如果动画名字为 IdleState的值 攻击次数为0 动画时间大于0.5 播放attack1动画
if (animSta.IsName(IdleState) && HitCount == 0 && animSta.normalizedTime > 0.50f)
{
anim.SetInteger("attack", 1);
HitCount = 1;
}
else //如果动画名字为 IdleState的值 攻击次数为1 动画时间大于0.65 播放attack2动画
if (animSta.IsName(Attack1State) && HitCount == 1 && animSta.normalizedTime > 0.65f)
{
anim.SetInteger("attack", 2);
HitCount = 2;
}
else //如果动画名字为 IdleState的值 攻击次数为2 动画时间大于0.7 播放attack2动画
if (animSta.IsName(Attack2State) && HitCount == 2 && animSta.normalizedTime > 0.70f)
{
anim.SetInteger("attack", 3);
HitCount = 3;
}
}
void move()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit,100,mask))
{
nav.SetDestination(hit.point);
anim.SetBool("move", true);
}
}
void distance()
{
if ((transform.position - hit.point).sqrMagnitude<0.1f)
{
anim.SetBool("move", false);
}
}
}
[/code]
|