4.Unity2D 横版 帧事件+攻击判定+冲砍挑飞+更真实的打击

这篇具有很好参考价值的文章主要介绍了4.Unity2D 横版 帧事件+攻击判定+冲砍挑飞+更真实的打击。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

4.Unity2D 横版 帧事件+攻击判定+冲砍挑飞+更真实的打击

总目录

1.攻击碰撞盒的创建

在玩家下面新建两个空物体命名为攻击一和攻击二。然后为两个物体分别添加碰撞盒,根据帧动化来调整碰撞盒位置。并都打开触发器

4.Unity2D 横版 帧事件+攻击判定+冲砍挑飞+更真实的打击

为俩个攻击盒添加触发器事件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class attackTrigger : MonoBehaviour
{
    private Transform player;//获取人物
    private Animator ani;//获取人物动画器
    private AnimatorStateInfo state;//动画状态

    public float atkItemsBack = 1;
    public float atkItemsUp = 1;
    public float playerSpeedInfectBack = 1;
    // Start is called before the first frame update
    void Start()
    {
        player = gameObject.transform.parent;
        ani = player.GetComponent<Animator>();
   
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    public void OnTriggerEnter2D(Collider2D collision)
    {
        //攻击到了物品或敌人产生击退
        if (collision.tag == "items" || collision.tag == "enemy")
        {
            //获取人物与物品位置向量
            Vector3 v = collision.transform.position-player.position ;
            //冻结z轴
            v.z = 0;
            //获取横轴,速度影响击退距离
            float h = Input.GetAxis("Horizontal");
       
            //如果处于动画2,4时额外实施向上的力、速度
            //挑飞
            state = ani.GetCurrentAnimatorStateInfo(0);
            if (state.IsName("attack2") || state.IsName("attack4"))
            {
                v.y += (atkItemsBack * 5*atkItemsUp);
            }
            collision.GetComponent<Rigidbody2D>().velocity=v* atkItemsBack+Vector3.right*h* playerSpeedInfectBack*5;
    
        }


    }
}

 2.帧事件的创建

2.Unity2D 横版 帧动画sprite animation+动画状态机animator+丝滑连击动作_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客Unity2D 横版 帧动画sprite animation+动画状态机animator+丝滑连击动作 为什么设置了attack之后还要设置normalizedTime参数?因为如果设置一个参数的话,你点击攻击按钮会直接跳转到下一个动作。并不能完整的将攻击动作放完,那么就多添加一个。他们参数用来判断行为达到哪个阶段,并通过脚本来控制他们参数在进入因为和退出行为时都设置normalizedTime成零。这样就可以使得你点击攻击按钮动作放完了之后才到下一个动作。.........https://blog.csdn.net/qq_54263076/article/details/125631721?spm=1001.2014.3001.5501

教学链接https://blog.csdn.net/qq_15020543/article/details/83443966?spm=1001.2014.3001.5506

4.Unity2D 横版 帧事件+攻击判定+冲砍挑飞+更真实的打击

4.Unity2D 横版 帧事件+攻击判定+冲砍挑飞+更真实的打击

注意:帧事件的脚本必须添加在有animator组件的物体下,通过帧事件调运脚本里面的函数

在玩家player下加入新脚本 AttackBox

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AttackBox : MonoBehaviour
{
    public float attackMovedis = 1;//攻击移动距离
    private Rigidbody2D rig;//获取刚体
    private Animator ani;//获取动画器
    private AnimatorStateInfo state;//动画状态
    private Transform attack1;//子物体
    private Transform attack2;
    // Start is called before the first frame update
    void Start()
    {
        rig=gameObject.GetComponent<Rigidbody2D>();
        ani = gameObject.GetComponent<Animator>();
        attack1 = transform.Find("attack1");
        attack2 = transform.Find("attack2");
      
    }
    // Update is called once per frame
    void Update()
    {
        
    }
    //帧事件
    public void Attackenemy()
    {
        state = ani.GetCurrentAnimatorStateInfo(0);
        float dir = Input.GetAxisRaw("Horizontal");//按住方向-1 0 1
        float lookatdir = gameObject.transform.localScale.x;//朝向
        //攻击移动
        if(dir == 0) {
            if (state.IsName("attack1") || state.IsName("attack3"))
            {
                rig.velocity = new Vector3(attackMovedis * 5 * lookatdir / Mathf.Abs(lookatdir), 0, 0); //按住方向键大移动-对于动画1,3冲刺动画
            }
            
        }
        else
        {
            rig.velocity = new Vector3(attackMovedis * 10 * dir, 0, 0);//不按方向键小移动
        }

        //激活攻击碰撞盒
        if (state.IsName("attack1") || state.IsName("attack3"))
        {
      
            attack1.gameObject.SetActive(true);
        }
        else if (state.IsName("attack2") || state.IsName("attack4"))
        {
            attack2.gameObject.SetActive(true);
        }
        Invoke("endAttackenemy", 0.05f);//延时调运,关闭碰撞盒
    }
    //结束攻击 因我第2节课设置了连击动画95%到下一动画,所以结束事件应该在最后一帧前面
    public  void endAttackenemy()
    {
        state = ani.GetCurrentAnimatorStateInfo(0);

        //关闭攻击碰撞盒
        if (state.IsName("attack1") || state.IsName("attack3"))
        {
            attack1.gameObject.SetActive(false);
        }
        else if (state.IsName("attack2") || state.IsName("attack4"))
        {
            attack2.gameObject.SetActive(false);
        }

    }
}

在这两个帧事件中,我在关键攻击帧中触发了攻击攻击,在攻击事件中我又增加了角色攻击时微小向前移动和冲刺攻击。然后在 Invoke("endAttackenemy", 0.05f);时间要足够小,不然在endAttackenemy函数中判断状态时会略过这个状态,延时调运,关闭碰撞盒

4.Unity2D 横版 帧事件+攻击判定+冲砍挑飞+更真实的打击.

3.测试 ,新建一个标签为items的物体desk。

为这个物体添加刚体,碰撞盒,标签设置为items(新建)

主角主动攻击思路如下图

4.Unity2D 横版 帧事件+攻击判定+冲砍挑飞+更真实的打击

 

下一篇

5.Unity2D 横版 对象池的创建_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客Unity2D 横版 对象池的创建。对象池的好处是不用频繁的毁坏和创建重复预制体,而是通过激活与非激活来对重复预制体进行管理。增加了游戏的流畅性。https://blog.csdn.net/qq_54263076/article/details/125667394文章来源地址https://www.toymoban.com/news/detail-404105.html

到了这里,关于4.Unity2D 横版 帧事件+攻击判定+冲砍挑飞+更真实的打击的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 10.Unity2D 横版 简单AI 之 敌人随机移动+自动巡逻+障碍物跳跃+悬崖处转身+射线检测

    10.Unity2D 横版 简单AI 之 敌人随机移动+自动巡逻+障碍物跳跃+悬崖处转身+射线检测

    总目录 9.Unity2D 简单AI 之 敌人跳跃条件优化+自动范围内检测敌人发起攻击(索敌)+对象池优化+主角受伤死亡_ζั͡ ั͡雾 ั͡狼 ั͡✾的博客-CSDN博客 Unity2D 简单AI 之 敌人跳跃条件优化+自动范围内检测敌人攻击+敌人二连击。在敌人预制体下,创建空物体EnemyCanAttack,改成不

    2023年04月20日
    浏览(24)
  • Unity2D学习笔记-Tilemap

    Unity2D学习笔记-Tilemap

    tilemap算是接触了几次,但是无论是看视频还是看文章都一知半解,这次把编辑地图的开始步骤搞清楚。 首先要知道tilemap是做什么的。 这里提到的Tilemap其实不止是Tilemap:Tilemap本身是地图编辑器(虽然我更倾向于理解为“场景”,不过编辑地图才是核心)。之前学的印象是,

    2023年04月09日
    浏览(9)
  • Unity2D实现子弹追踪目标

    Unity2D实现子弹追踪目标

    实现子弹追踪目标有很多种方法,首先是一开始就选定了目标的位置,然后按照曲线运动轨迹的方式,持续运动到目标点,不过如果目标移动了,就得将对应的轨迹重新计算一次,另外如果需要设置范围的话更不好做。另一种是锐角追踪,就是在目标进入识别范围后,将子弹

    2024年02月06日
    浏览(11)
  • Unity2D小狐狸教程笔记

    Unity2D小狐狸教程笔记

    下载 https://unity.cn/releases 默认显示方式 window - layout - default SampleScene : Project - 文件目录 Scene -游戏画面 asset store - 素材商店 在asset store下载素材 sunnyland shift + sapace 放大窗口 1.背景导入 每个格子16像素: Pixels Per Unit 16px 2.绘制瓷砖式地图 新建瓦片图层:左上角/右键 2D object

    2024年01月24日
    浏览(15)
  • Unity2d游戏项目--小狐狸

    Unity2d游戏项目--小狐狸

    (一) 在文件夹中找到back图片,并在检查器面板中将back图片的每单位像素数设置为16。 (文件所在地) (面板设置) (二) 将图片拖入到场景中 (一) 生成矩形的瓦片地图 (二) 打开平铺调色板 (三) 新建并命名为map,在原目录新建一个文件夹,用于存放你在这个瓦

    2024年02月03日
    浏览(12)
  • 【Unity2D】角色动画的切换

    【Unity2D】角色动画的切换

    第一种方法是设置一个中间状态,从中间状态向其余各种状态切换,且各状态向其他状态需要设置参数 实现动作转移时右键点击Make Transition即可  实现动画转移需要设置条件 点击一种动画到另一种动画的线 ,然后点击加号添加Condition 比如机器人从向左走切换到向右走的条件

    2024年02月15日
    浏览(9)
  • Unity2D绘制游戏地图

    Unity2D绘制游戏地图

    首先,我们选择我们的地图素材(由于笔者在前段时间已经进行切割,最近才开始整理这一段,所以这个是用的老素材,可能有朋友就会觉得切割前后不一致,但是思路是一样的,大家学习思路即可)  接着,我们找到右上角的Slice进行图片切割,我这边简单介绍一下这个切

    2024年02月08日
    浏览(18)
  • Unity2D控制角色左右移动

    Unity2D控制角色左右移动

    1.在Hierarchy一栏中选中角色; 2.在inspector栏最底端找到Add Component选项并点击; 3.添加Rigidbody2D,合适的collider和new script; 4.将添加的Rigidbody2D拖到new script中;   5.在project栏中找到新添加的C#文件并双击打开(如果还没有编辑代码的工具,推荐Vscode) 6.代码如下: using System.Nu

    2024年02月14日
    浏览(17)
  • Unity2D子弹朝向鼠标位置发射

    Unity2D子弹朝向鼠标位置发射

    废话不多说,先说明一下我使用的变量 float attack_time 用于表示每次攻击的间隙时间 float current_time 攻击时间的冷却 Rigidbody2D body 2D刚体组件 Object bomb 需要发射的物体对象 创建一枚子弹,unity的Instantiate()函数就可以实现,这里需要的三个参数是物体对象(Object),生成位置(Vecto

    2024年02月10日
    浏览(31)
  • Unity2D-使人物翻转的方法

    方法①:使用组件: SpriteRenderer 使用 GetAxis() 和 GetAxisRaw() 没有区别 方法②:使用组件: Transform 情况1:使用 GetAxisRaw() ;没有刹车效果,及翻转过程没有过渡, m o v e F a c t o r moveFactor m o v e F a c t or 取-1,1,0 情况1:使用 GetAxis() ;有刹车效果,及翻转过程有过渡, m o v e F a c t

    2024年02月12日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包