马上注册,加入CGJOY,让你轻松玩转CGJOY。
您需要 登录 才可以下载或查看,没有帐号?立即注册
×
今天我们来实现角色攻击的教程 本人也是小白 所以还有好多要学习的 那我们开始吧 上回我们 做了 角色的移动 那么攻击也是会用到 动画的切换 所以老样子 打开之前的 Animator Controller 我们把需要攻击的动画添加进来 这个有3个 3连击的 我之前也发过类似的帖子 大家如有不明白的话也可以看我之前发的帖子 控制动画肯定要有条件 所以 建立 一个int 变量 取名叫attack 连线Idle---->attack1 int=1 attack1---->attack2 int=2 attack2---->attack3 3个攻击都可以返回idle 状态 返回的那些线的变量 Int=0
然后 我们来用代码控制 - 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);
- }
- }
- }
复制代码
|