首页 > 其他分享 >Unity引擎2D游戏开发,受伤及死亡的逻辑和动画

Unity引擎2D游戏开发,受伤及死亡的逻辑和动画

时间:2023-12-26 16:44:27浏览次数:41  
标签:动画 attackTrans transform 2D Unity position true public

裁切素材制作受伤动画

制作死亡动画

由于没有死亡动画素材,所以直接调整Alpha通道数值,使其逐渐消失

Animations中复制野猪受伤动画,命名为boarDead
image

Animator中拖入boarDead动画
image

点击Add Property,选择Color
image

将最后一帧的Alpha值改为0
image

Animator连接动画逻辑

从Any State连接至这两个创建好的boarDeadboarHurt动画,再将Hurt连接至Exit
image
受伤和死亡可以从任意一个状态切入

boarHurt的连接线,设置为动画完整播放一次后退出
image

野猪受击转换方向

在Enemy中创建一个新的全局变量

public Transform attacker;

创建一个OnTakeDamage()方法,通过攻击者和受击者的X轴差值来判定攻击者在左在右,使野猪掉换方向

public void OnTakeDamage(Transform attackTrans)
{
    attacker = attackTrans;
    if(attackTrans.position.x - transform.position.x > 0)
    {
        transform.localScale = new Vector3(-1, 1, 1);
    }
    if (attackTrans.position.x - transform.position.x < 0)
    {
        transform.localScale = new Vector3(1, 1, 1);
    }
}

野猪受伤被击退

OnTakeDamage()方法中添加一下代码

// 受伤被击退
isHurt = true;
animator.SetTrigger("hurt");
// 记录被攻击的方向
Vector2 dir = new Vector2(transform.position.x - attackTrans.position.x, 0).normalized;
StartCoroutine(OnHurt(dir));

StartCoroutine为启动协程,需要搭配IEnumerator使用

StartCoroutine官方文档:https://docs.unity3d.com/cn/2022.3/ScriptReference/MonoBehaviour.StartCoroutine.html

编写IEnumerator OnHurt()协同程序方法

private IEnumerator OnHurt(Vector2 dir)
{
    // 施加瞬时力
    rb.AddForce(dir * hurtForce, ForceMode2D.Impulse);
    yield return new WaitForSeconds(0.45f);
    isHurt = false;
}

IEnumerator:标记为协同程序,此方法代码会一行一行阻塞顺序执行
yield return:顺序迭代器,可选择等待固定模式后再执行下一步

野猪死亡代码逻辑并销毁

Enemy中创建新的全局变量

public bool isDead;

并创建一个OnDie()方法,将动画的Dead条件以及isDead设置为true

public void OnDie()
{
    animator.SetBool("dead", true);
    isDead = true;
}

编写DestroyAfterDeadAnimation()销毁对象的方法

public void DestroyAfterDeadAnimation()
{
    Destroy(this.gameObject);
}

接着,在Boar对象的Animation窗口,移动到最后一帧,添加一个Animation Event
image

将该Event绑定DestroyAfterDeadAnimation()方法
image

解决销毁后仍有碰撞体积的问题

取消勾选此处的勾,代表Player不与Ignore Raycast层碰撞
image

在Layer中,我们能发现Ignore Raycast层序号为2
image

在Enemy的OnDie()方法中,将Enemy层赋值为2

public void OnDie()
{
    gameObject.layer = 2;
    animator.SetBool("dead", true);
    isDead = true;
}

标签:动画,attackTrans,transform,2D,Unity,position,true,public
From: https://www.cnblogs.com/xinlindeyu/p/17928258.html

相关文章

  • Flutter 页面专场动画
    在不同路由(或界面)之间进行切换的时候,许多设计语言,例如Material设计,都定义了一些标准行为。但有时自定义路由会让app看上去更加的独特。为了更好的完成这一点,PageRouteBuilder提供了一个Animation对象。这个Animation能够通过结合Tween以及Curve对象来自定义路由转换......
  • Unity3D:打造关卡编辑器详解
    前言Unity是一款非常流行的游戏引擎,它提供了丰富的工具和功能,可以让开发者轻松地创建各种类型的游戏。其中,关卡编辑器是一个非常重要的工具,它可以让开发者快速、方便地创建游戏中的关卡。本文将详细介绍如何使用Unity打造一个关卡编辑器,并提供代码实现。对惹,这里有一个游戏开发......
  • Flutter hero动画
    在Flutter中,图像从当前页面转到另一个页面称为hero动画,相同的动作有时也被称为共享元素过渡。hero动画基本结构在不同页面分别使用两个herowidgets,同时使用配对的标签来实现动画Navigator管理含有app页面的堆栈。推送一个页面或弹出一个Navigator堆栈中的页面会......
  • 十九、显示动画-位置改变
    ArkUI中,产生动画的方式是改变属性值且指定动画参数。动画参数包含了如动画的时长、变化规律(即曲线)等参数,当属性值发生变化后,按照动画参数,从原来的状态过渡到新的状态,即形成一个动画。AnimateParam对象说明名称类型描述durationnumber动画持续时间,单位为毫秒。默认值......
  • lottie 动画在 vue 中的使用
    前言最近我所负责的项目中,我采用了动画效果,并开始使用gif来实现。然而,在实践过程中,我发现gif格式的动画在git中出现了明显的锯齿感,这让我非常困扰。为了追求更完美的表现效果,我最终选择了lottie来实现我的动画需求。我深知动画效果的呈现对于用户体验至关重要,因此我非常......
  • Unity Shader学习随笔
    阴影:光源看不到,但相机看得到的地方,就是阴影变体:一个普通的Shader可能会有很多种效果例如一个火焰溶解效果,写在Shader里,但其实在未触发之前我们不需要去计算该效果因此需要在未触发前,将火焰溶解的效果计算关闭这就用到了变体,把火焰溶解的效果计算变成变体无论如何都会被编译......
  • Unity3D 锁帧与垂直同步的不同处详解
    Unity3D是一款强大的游戏开发引擎,而锁帧与垂直同步是其中两个重要的概念。本文将详细解释锁帧与垂直同步的不同之处,并给出相关的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。......
  • Unity3D MVC框架和MVVM框架优缺点详解
    Unity3D是一款非常流行的游戏开发引擎,它为开发者提供了强大的工具和功能,使得开发者能够轻松地创建各种类型的游戏。在Unity3D中,使用模型-视图-控制器(MVC)框架和模型-视图-视图模型(MVVM)框架可以更好地组织和管理游戏的逻辑和界面。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱......
  • 2D triangle area
     *area3.c#include<stdio.h>#defineDET2(a)(a[0][0]*a[1][1]-a[0][1]*a[1][0])#definePOINT2_TYPE(type)structpoint2##type#defineSTRUCT_POINT2(type)\ POINT2_TYPE(type){\ typex;\ typey;\ }#defineAREA_3POINT2_NAME(type)are......
  • Unity引擎2D游戏开发,撞墙判定和等候计时
    撞墙判定将野猪绑定PhysicsCheck脚本,并将GroundLayer选中Ground,调整ButtonOffset到脚边,CheckRadius为0.1,即可判定悬崖physicsCheck脚本中添加一些变量,用于墙壁判定逻辑publicbooltouchLeftWall;publicbooltouchRightWall;publicVector2leftOffset;publicVecto......