近期热门
粉丝5
关注 0
获赞 0
Rpg小游戏制作心得(第二天)

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

[复制链接]
3001 1 0 0 9年前 举报
今天我们来实现角色攻击的教程 本人也是小白  所以还有好多要学习的
那我们开始吧 上回我们 做了 角色的移动  那么攻击也是会用到 动画的切换
所以老样子  打开之前的  Animator Controller  我们把需要攻击的动画添加进来
这个有3个  3连击的 我之前也发过类似的帖子 大家如有不明白的话也可以看我之前发的帖子   控制动画肯定要有条件 所以 建立 一个int 变量  取名叫attack
连线Idle---->attack1  int=1   attack1---->attack2   int=2  attack2---->attack3
  3个攻击都可以返回idle 状态  返回的那些线的变量  Int=0
1.png

然后 我们来用代码控制
  1. using UnityEngine;
  2. using System.Collections;

  3. public class PlayMove : MonoBehaviour {


  4.     private Animator anim;
  5.     private NavMeshAgent nav;
  6.     private LayerMask mask = -1;
  7.     private AnimatorStateInfo animSta;
  8.     RaycastHit hit;
  9.     private const string IdleState = "Sword-Idle";
  10.     private const string Attack1State = "Sword-Attack1";
  11.     private const string Attack2State = "Sword-Attack2";
  12.     private const string Attack3State = "Sword-AttackCritical";
  13.     private int HitCount = 0;
  14.         void Start () {
  15.         
  16.         anim = gameObject.GetComponent<Animator>();
  17.         nav=gameObject.GetComponent<NavMeshAgent>();
  18.         anim.SetBool("move", false);
  19.         mask = LayerMask.GetMask("ground");
  20.         }
  21.         
  22.         
  23.         void Update () {
  24.         
  25.         if (Input.GetMouseButtonDown(0))
  26.         {
  27.             move();
  28.         }
  29.         distance();
  30.            
  31.            //获取动画信息
  32.         
  33.            animSta = anim.GetCurrentAnimatorStateInfo(0);
  34.         
  35.         if(Input.GetKey(KeyCode.A)){
  36.             attack();

  37.         }
  38.         if (!animSta.IsName(IdleState) && animSta.normalizedTime > 1.0f)
  39.         {
  40.             anim.SetInteger("attack", 0);
  41.             HitCount = 0;
  42.         }
  43.    
  44.    
  45.     }

  46.     void attack()
  47.     {             //如果动画名字为 IdleState的值 攻击次数为0 动画时间大于0.5 播放attack1动画
  48.         if (animSta.IsName(IdleState) && HitCount == 0 && animSta.normalizedTime > 0.50f)
  49.         {
  50.             anim.SetInteger("attack", 1);
  51.             HitCount = 1;
  52.            
  53.         }
  54.         else       //如果动画名字为 IdleState的值 攻击次数为1 动画时间大于0.65 播放attack2动画
  55.             if (animSta.IsName(Attack1State) && HitCount == 1 && animSta.normalizedTime > 0.65f)
  56.             {
  57.                 anim.SetInteger("attack", 2);
  58.                 HitCount = 2;
  59.             }
  60.             else     //如果动画名字为 IdleState的值 攻击次数为2 动画时间大于0.7 播放attack2动画
  61.                 if (animSta.IsName(Attack2State) && HitCount == 2 && animSta.normalizedTime > 0.70f)
  62.                 {
  63.                     anim.SetInteger("attack", 3);
  64.                     HitCount = 3;

  65.                 }
  66.     }

  67.     void move()
  68.     {
  69.         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  70.       
  71.         if (Physics.Raycast(ray, out hit,100,mask))
  72.         {
  73.             nav.SetDestination(hit.point);
  74.             anim.SetBool("move", true);
  75.         }
  76.       
  77.     }
  78.     void distance()
  79.     {
  80.         if ((transform.position - hit.point).sqrMagnitude<0.1f)
  81.         {
  82.             
  83.             anim.SetBool("move", false);
  84.         }
  85.     }


  86. }
复制代码

0
点赞
0
打赏
0
添加到收藏夹

0

点击复制链接

使用微信扫码分享
一次扣10个券
全部评论1
您需要登录后才可以回帖 登录

感謝分享這麼好的資源!
9年前
回复

使用道具 举报

您当前使用的浏览器IE内核版本过低会导致网站显示错误

请使用高速内核浏览器或其他浏览器