总目录
1.攻击碰撞盒的创建
在玩家下面新建两个空物体命名为攻击一和攻击二。然后为两个物体分别添加碰撞盒,根据帧动化来调整碰撞盒位置。并都打开触发器
为俩个攻击盒添加触发器事件
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
注意:帧事件的脚本必须添加在有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函数中判断状态时会略过这个状态,延时调运,关闭碰撞盒
.
3.测试 ,新建一个标签为items的物体desk。
为这个物体添加刚体,碰撞盒,标签设置为items(新建)
主角主动攻击思路如下图
下一篇文章来源:https://www.toymoban.com/news/detail-404105.html
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模板网!