yyj469367953 发表于 2015-1-27 17:50

Rpg小游戏制作心得(第二天)

今天我们来实现角色攻击的教程 大家有什么问题还有意见可以来我们蛮牛教育群390835120 来一起讨论本人也是小白所以还有好多要学习的那我们开始吧 上回我们 做了 角色的移动那么攻击也是会用到 动画的切换 所以老样子打开之前的Animator Controller我们把需要攻击的动画添加进来这个有3个3连击的 我之前也发过类似的帖子 大家如有不明白的话也可以看我之前发的帖子   控制动画肯定要有条件 所以 建立 一个int 变量取名叫attack 连线Idle---->attack1int=1   attack1---->attack2   int=2attack2---->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);
      }
    }


}

msdkyun 发表于 2015-5-6 21:46

学习了。。。。

zhaimao2012 发表于 2017-5-5 13:22

很不错

zwpxiaob 发表于 2017-5-5 13:54

楼主是超人

小鬼魂 发表于 2017-5-5 13:28

真心顶

joyhollo 发表于 2017-5-5 13:28

说的非常好

cpper2003 发表于 2017-5-5 13:35

LZ真是人才

﹎ぐ 发表于 2017-6-28 14:43

很不错

chun579 发表于 2017-6-28 15:14

楼主是超人

956766193 发表于 2017-6-28 15:05

好帖就是要顶
页: [1]
查看完整版本: Rpg小游戏制作心得(第二天)