1. 程式人生 > >關於Unity中的道具拾取(專題六)

關於Unity中的道具拾取(專題六)

pla lan date 適合 transform player 依然 特效 unit

原理就是把道具做成觸發器,觸發器就是當我們有碰撞發生的時候,只會檢測碰撞,而不會有任何改變物理運動狀態的過程。

觸發器非常適合道具拾取,因為它不會改變原本運動物體的任何物理屬性,但是依然會檢測碰撞,響應物理事件。

道具拾取實例

1.創建Unity項目和文件目錄,保存場景

2.導入金幣模型資源rc_fx_obj_04_mod.FBX和obj_04_tex.png,設置材質球的shader為Lagacy Shaders---->Diffuse,顏色設置為255,255,255,255

3.創建一個平面Plane(拉長Z軸100倍)和一個膠囊體Capsule,創建一個空節點prop,把金幣模型放在prop節點下作為子節點,如下圖所示擺好各個節點的位置

技術分享

4.給金幣節點prop添加一個矩形碰撞器組件Box Collider,點擊Edit Collider,手動調整碰撞器的區域,之後勾選碰撞器組件的Is Trigger設置為觸發器,註意兩個物體之間必須有一個是剛體才會發生碰撞檢測,所以給膠囊體Capsule添加Rigidbody組件,不使用重力

技術分享

5.編輯右上角的層,添加兩個層,分別為player和prop,設置膠囊體Capsule為player層,節點prop為prop層

技術分享

6.打開物理引擎設置Edit---->Project Settings---->Physics,設置層的碰撞矩陣,只有player層和prop層會發生碰撞檢測

技術分享

7.腳本方面,一般根據碰撞產生的結果而定,比如玩家碰到金幣,金幣的數值加到玩家節點上,所以玩家需要掛一個腳本來處理這個碰撞檢測事件,而金幣碰到玩家,刪除自己,所以金幣也需要掛載一個腳本來處理碰撞檢測事件

8.創建兩個腳本prop和recv_prop,prop掛載在prop節點下,recv_prop掛載在膠囊體Capsule下

 打開prop.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class prop : MonoBehaviour {

    public
int prop_type; // 道具的類型,不同的道具可以設置不同的類型 // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnTriggerEnter(Collider c)//這裏的c指的都是撞我的節點,不是自己 { Debug.Log("道具說:" + c.gameObject.name + c.gameObject.layer); if (c.gameObject.layer == 8)// 是player層的節點撞的我, 可以在這裏寫一些播放特效的代碼 { GameObject.Destroy(this.gameObject); } } }

打開recv_prop.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class recv_prop : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }

    void OnTriggerEnter(Collider c)//這裏的c指的都是撞我的節點,不是自己
    {
        Debug.Log("玩家說:" + c.gameObject.name + c.gameObject.layer);
        if (c.gameObject.layer == 9)//是prop層的節點撞的我
        {
            prop p = c.GetComponent<prop>();//獲得撞我的節點的prop組件
            switch(p.prop_type)//判斷道具類型
            {
                case 1:
                        Debug.Log("你撿到了金幣!分數加1!");//不同的道具做不同的處理
                    break;
            }
        }
    }
}

9.再創建一個腳本控制膠囊體Capsule自己往Z軸正方向運動,掛載一個腳本move都節點Capsule下

打開move.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour {
    private float speed = 5.0f;//移動的速度
    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        float s = this.speed * Time.deltaTime;//每秒移動的距離,單位米
        this.transform.Translate(0, 0, s);//移動
    }
}

10.運行結果

技術分享

總結
(1) 做好道具,將道具的碰撞器設置為trigger模式,只檢車碰撞,不改變運動
(2) 玩家也加上碰撞器,玩家還要有一個剛體,否則沒有辦法觸發碰撞;
(3) 玩家和道具,進行分組,做好碰撞矩陣的設置;
(4) 編寫碰撞的響應函數,OnTriggerEnter(Collider c), OnTriggerExit, OnTriggerStay; 判斷當前碰的是那個類型的物體,gameObjct.layer;
(5) 每一個道具,都可以掛同一個腳本,然後,裏面帶上道具的類型;
(6) 玩家拾取到道具,獲得道具的類型,並處理我們的遊戲邏輯;
(7) 將道具,做成預制體,結合地圖,或者是生成位置,在指定位置放置道具;

關於Unity中的道具拾取(專題六)