主要是制作当人物跳起和下落地面的时候,会播放一个小气流的特效,同时增加了在这一过程中的物理碰撞。
1.修改素材参数
在素材文件夹Sprites Assets/7-Objects
下存放了起跳和落地的动画素材。
对上面的素材进行统一的参数处理,还是和前面一下,32像素,点采样和无压缩。如下图所示:
2.制作动画特效
2.1 创建游戏物体并添加动画
创建游戏物体LandFX和JumpFX,并为他们自身添加动画,设置Samples = 20
。让他们俩的Sorting Layer都处于NPC图层。同时希望Player在落地的瞬间能够影响到在环境中的其他物体,使他们在人物落地时发生一些震动的感觉。所以还需要为LandFX添加一个盒型碰撞器,并把LandFX的layer置于Enviroment层。最后把动画都设置成单词播放。
每次下落或者起跳的时候需要获得玩家的坐标,为落地和起跳设置动画以外,还需要设置一些函数,使Player可以访问LandFX和JumpFX,每次将LandFX和JumpFX的坐标调整到跟Player保持一致。
2.2 修改动画与Player之间的相对关系
⚠️但是不能把动画物体LandFX和JumpFX做成Player的子集,虽然这样可以跟着player移动,可他们并不会成为模拟下落或者起跳瞬间出现的特效,比如LandFX就会在player下落以后快速移动时,着陆特效也会跟着一起移动。解决的办法是创建一个集合,把特效和Player放在同级关系如下图。这样挪动PlayerControl就会同时对特效和Player受到影响。
创建一个空游戏物体PlayerControl并reset归零,把特效和Player放在PlayerControl里
,如上图。这样一来,特效LandFx和特效JumpFX与Player之间的坐标就变成了相对坐标。
2.3 通过代码控制消失
动画在落地或者起跳的时候只播放一次,播放后需要消失。通过脚本来控制隐藏游戏物体。
public class JumpFX : MonoBehaviour
{
// 播放完之后关闭动画显示
public void Finish()
{
gameObject.SetActive(false);
}
}
播放完动画之后将游戏物体显示关闭,即在帧动画的最后一帧添加消失的方法Finish。在这里跳跃或者着陆之前启动游戏物体,完成action后就让游戏物体隐藏,同时也节省了资源。
为起跳的动画特效也是同样的添加步骤,在最后一帧添加时间FInish。
3.完善代码PlayerController.cs
首先需要在PlayerController中获得两个动画特效的控制权。
[Header("Jump FX")] // 这句代码是在unity中的分类注释,用于对变量进行分类标记
public GameObject landFX;
public GameObject jumpFX;
当可以进行跳跃的时候,就需要显示JumpFX,当显示特效的时候人物很有可能已经移动开了,我需要得到的是游戏人物在跳跃的瞬间可以得到当时游戏人物的坐标。
在这里特效的坐标相对于人物可能是便宜的,所以在计算坐标时需要在人物的坐标基础之上加上特效的偏移量。-0.45f是我当前的偏移量。
jumpFX.SetActive(true);
// 获得坐标位置,获得人物坐标+自身位移动
jumpFX.transform.position = transform.position + new Vector3(0, -0.45f, 0);
而人物下落的的动画用单独的函数来写,着陆动画player_ground的第一针添加事件挂载LanfFX方法
就可以。
// 在人物落地的第一帧显示落地的特效
public void LandFX()
{
landFX.SetActive(true);
landFX.transform.position = transform.position + new Vector3(0, -0.72f, 0);
}
3.修改刚体参数
需要调整Player刚体的Collision Detection设置为continuous
,确保游戏物体不会有穿墙的效果。
启动游戏前还需要注意一下Player里添加的两个游戏物体参数。
启动游戏可以看到如下图动画,Player已经成功增加了起跳和落地的动画特效。
可以观察到,起跳和落地的气流特效都是当前时刻快速完成的,并且在落地的时候与地面旁边的瓶子发生了物理碰撞。