unity人物攻击类

点击按钮播放人物动画  实现三连击效果

public class PlayerAttack : MonoBehaviour

{
    // Use this for initialization
    private ETCButton normalBtn;
    private ETCButton attackBtn;
    private ETCButton rangeBtn;
    private ETCButton jumpBtn;

    private Animator ani;

    public float attackBValue;
    public float rangeValue;  //范围攻击的攻击力
    public float attackAValue;
    public float combo_2Value;
    public float combo_3Value;
    private void Awake()
    {
        attackBValue = 20;
        rangeValue = 15;

        attackAValue = 18;
        combo_2Value = 10;
        combo_3Value = 10;
        ani = this.GetComponent<Animator>();
    }
    void Start()
    {
        normalBtn = ETCInput.GetControlButton("normalBtn");
        normalBtn.onDown.AddListener(normalBtnDown);
        attackBtn = ETCInput.GetControlButton("attackBtn");
        attackBtn.onDown.AddListener(attackBtnDown);
        rangeBtn = ETCInput.GetControlButton("rangeBtn");
        rangeBtn.onDown.AddListener(rangeBtnDown);

    }

    private void rangeBtnDown()
    {
        if (ani != null)
            ani.SetTrigger("range");
    }

    private void attackBtnDown()
    {
        if (ani != null)
            ani.SetTrigger("attackB");
    }

 

    private void normalBtnDown()
    {

        AnimatorStateInfo stateinfo = ani.GetCurrentAnimatorStateInfo(0);
        if (stateinfo.IsName("Idle"))
        {
            ani.SetTrigger("attackA");
        }  ///AttackA动画播放到一半以上了。  整数部分为播放次数,小数部分为播放的百分比。
        else if (stateinfo.IsName("AttackA") && stateinfo.normalizedTime % 1 > 0.5f)
        {
            ani.SetTrigger("combo_2");
        }
        else if (stateinfo.IsName("Combo_2") && stateinfo.normalizedTime % 1 > 0.5f)
        {
            ani.SetTrigger("combo_3");
        }

    }

    /// <summary>
    /// 动画事件 的回调函数。
    /// </summary>
    public void attackB()
    {
        ///单体攻击、前方、在攻击范围之内的第一个。
        List<GameObject> list = SpawnEnemy.Instance.EnemyList;
      //  GameObject tmp = null;
       // tmp = list[0];  ///距离最小的敌人游戏队形
        foreach (GameObject item in list)
        {
            //判断是不是在前方
            float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
            if (dot > 0)  //前方
            {
                float dis = Vector3.Distance(item.transform.position, this.transform.position);
                if (dis < G.AttackRange) //小于攻击范围
                {
                    //  float d = Vector3.Distance(tmp.transform.position, this.transform.position);
                    //if (dis < d)
                    //{
                    //    tmp = item;
                    //}
                    item.GetComponent<TakeDamage>().damage(attackBValue);
                    break;
                }
            }

        }

       
 
    }

    public void RangeAttack()
    {
        ///范围攻击  前方二米范围内所有敌人
        List<GameObject> list = SpawnEnemy.Instance.EnemyList;
 
        foreach (GameObject item in list)
        {
            //判断是不是在前方
            float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
            if (dot > 0)  //前方
            {
                float dis = Vector3.Distance(item.transform.position, this.transform.position);
                if (dis < G.AttackRange) //小于攻击范围
                {
                    item.GetComponent<TakeDamage>().damage(rangeValue);
                }
            }

        }
    }

    public void Combo_2()
    {
        ///单体,  前方二米范围内所有敌人
        List<GameObject> list = SpawnEnemy.Instance.EnemyList;

        foreach (GameObject item in list)
        {
            //判断是不是在前方
            float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
            if (dot > 0)  //前方
            {
                float dis = Vector3.Distance(item.transform.position, this.transform.position);
                if (dis < G.AttackRange) //小于攻击范围
                {
                    item.GetComponent<TakeDamage>().damage(combo_2Value);
                    break;
                }
            }

        }
    }


    public void Combo_3()
    {
        ///范围攻击  前方二米范围内所有敌人
        List<GameObject> list = SpawnEnemy.Instance.EnemyList;

        foreach (GameObject item in list)
        {
            //判断是不是在前方
            float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
            if (dot > 0)  //前方
            {
                float dis = Vector3.Distance(item.transform.position, this.transform.position);
                if (dis < G.AttackRange) //小于攻击范围
                {
                    item.GetComponent<TakeDamage>().damage(combo_3Value);
                }
            }

        }
    }


    public void AttackA()
    {
        ///单体攻击  前方二米范围内所有敌人
        List<GameObject> list = SpawnEnemy.Instance.EnemyList;

        foreach (GameObject item in list)
        {
            //判断是不是在前方
            float dot = Vector3.Dot(this.transform.forward, (item.transform.position - this.transform.position));
            if (dot > 0)  //前方
            {
                float dis = Vector3.Distance(item.transform.position, this.transform.position);
                if (dis < G.AttackRange) //小于攻击范围
                {
                    item.GetComponent<TakeDamage>().damage(combo_3Value);
                    break;
                }
            }

        }
    }

    // Update is called once per frame
    void Update()
    {

        //AnimatorStateInfo stateinfo = ani.GetCurrentAnimatorStateInfo(0);

        //if (stateinfo.IsName("Idle"))
        //{
        //    print("idle" + stateinfo.normalizedTime); ///
        //}
        //  print(ani.IsInTransition(0));
    }


}
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity是一款流行的游戏引擎,开发一个游戏时,人物攻击行为是必不可少的。在Unity中,人物攻击代码需要通过编写脚本来实现。下面我们将从准备工作、攻击触发检测、攻击效果实现三个方面,详细介绍Unity人物攻击代码的编写方法。 准备工作 在开始编写人物攻击代码之前,我们需要准备一些资源。首先,我们需要一个玩家物体和一个敌人物体。然后,我们需要为玩家和敌人各自创建带有攻击力度的动画。通常是利用骨骼动画跑动时同时播放攻击动画,利用Animator Controller调整动作大小,修改攻击触发范围大小。 攻击触发检测 在准备工作完成后,我们可以开始编写攻击触发代码。在Unity中,可以通过Collider来触发碰撞事件。我们可以将Collider添加到玩家物体或敌人物体中,并使用脚本来实现攻击触发检测。在脚本中,我们需要检测玩家是否处于攻击状态,并通过Collider来检测敌人是否受到了攻击。如果检测到敌人被攻击,则通过脚本实现减去敌人的生命值或者其他其他处理方式。 攻击效果实现 利用Unity中的Primitive Object或者Particle system来制作物理效果,可以实现攻击效果。人物攻击效果可以用闪光特效表现,击杀效果可以用爆炸特效来实现。也可以使用Shader来构建一个很酷的特效。 以上就是Unity人物攻击代码的编写过程。需要不断的尝试和改进,不断地优化效果,才能实现更好的攻击效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值