Unity横版2D游戏学习实例(05)- 物理材质&物品收集&动画事件

一、修改角色物理材质

在角色跳起碰到障碍物时,如果一直按着左方向键或右方向键挨着障碍物,就会一直贴在障碍物上不会掉下来。
这是因为障碍物和角色都有默认的摩擦力系数,当持续按方向键给角色施加力会对障碍物产生很大挤压力进而产生很大的摩擦力。
于是我们可以修改角色的物理材质(包括摩擦力和弹性系数),来减小或消除这个摩擦力。

 

1. 首先在Project -> Asset中创建文件夹 Materials存放物理材质


2.右键Create -> 2D -> Physics Material 2D创建一个2D的物理材质,命名为PlayerMaterial。


3.修改摩擦力Friction为0


4.添加到角色的刚体Rigidbody2D上

这样就解决了角色会贴在障碍物上的bug

 

二、添加收集物

1.打开SunnyLand -> artwork -> Sprites -> Items -> cherry,随便选择一个拖拽到sence窗控制中


2.在Hierarchy中建立一个空对象命名为Collections,把刚添加的cherry放在Collections下方便管理


3.给收集物cherry添加一个2D圆形碰撞体Circle Collider 2D


4.调整收集物cherry碰撞体到一个合适的大小

 

三、给收集物cherry添加动画(创建动画和动画切换详细步骤参考04章节)

1. 在Project -> Asset -> Animation 添加收集物分类文件夹Collections

2. 在Animation窗口创建cherry的动画放在Collections文件夹中,并添加上动画帧

3.同样,在SunnyLand -> artwork -> Sprites -> Fx -> item-feedback 找到物品消失时的动画,添加到cheery上。

4.设置动画切换

Parameters:isCollected(类型Trigger)

 

四、添加碰撞关系和触发的代码

1.添加一个新的Layer命名为Collection,并设置给收集物cherry。(详细方法参考02节)

2. 打开收集物cherry碰撞体的触发器Trigger(Trigger效果:a.取消碰撞效果,即角色不会被它阻拦。  b. 触发Trigger相关的回调方法)


3. 在Scripts下新建一个文件Collections存放收集物相关脚本,并创建一个C#脚本命名为Cherry

挂载到cherry上(Inspector窗口中)


4.添加代码

using UnityEngine;

public class Cheery : MonoBehaviour
{
    private Animator anim;//cherry的动画器
    private int playerLayerID;//角色的Layer的ID
    private int isCollectedID;//状态机参数ID

    void Start()
    {
        anim = GetComponent<Animator>();
        playerLayerID = LayerMask.NameToLayer("Player");
        isCollectedID = Animator.StringToHash("isCollected");
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        //如果角色碰到cherry,触发消失动画
        if (collision.gameObject.layer == playerLayerID)
        {
            anim.SetTrigger(isCollectedID);
        }
    }

    public void Collceted()
    {
        //销毁(Destroy)收集物
        Destroy(gameObject);
    }
}

注意:如果cherry没有触发消失动画而是角色直接穿过去,这种情况是忘记设置角色Layer为Player层,添加上去就行了

 
五、 添加动画事件(Animation Events)

这时角色碰撞cherry时,cherry已经能出现消失动画了,但是cherry并没有消失,这是因为我们没有把它销毁(Destroy)或禁用(Active)。
在上面的代码中,已经写上了销毁的部分Collected(),为什么不放在判断碰撞的if (collision.gameObject.layer == playerLayerID)中呢?
实际上,如果销毁放在碰撞判断中,那么角色一碰到cherry,cherry就会消失,不会播发消失的动画了。我们希望cherry在播放完消失动画后才触发消失。
所以我们需要把销毁行为放在消失动画的后面。

1. 打开cherry消失动画,点击下图红框中的图标(AddEvent),添加一个事件并拖拽到消失动画后面。

2.点击这个事件,在它的Inspector窗口中选中Collected()方法

到此,当我们再次运行游戏时,操作角色触碰cherry,cherry就会播放消失动画后并且消失。

posted @ 2022-01-01 22:43  rkmao  阅读(891)  评论(2编辑  收藏  举报