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就會播放消失動畫后並且消失。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM