關於Unity中的碰撞檢測和管理(2D)


創建Unity3D項目和Unity2D項目的區別。

1.3D項目有攝像機和太陽光,2D項目只有攝像機

2.3D項目使用的貼圖類型是Texture紋理,2D項目使用的貼圖類型是Sprite 2D/UI

 

 這里我們創建一次2D工程來實現飛機大戰的碰撞檢測

一、2D中的碰撞檢測

1.創建一個Canvas

2.把Canvas節點的Canvas組件中的Render Mode設置為Screen Space-Camera,並把Main Camera節點拖進Render Camera屬性

3.把Canvas節點的Canvas Scaler組件的UI Scale Mode設置為Scale With Screen Size,並把Refernces Resultion設置為和Game視圖分辨率一樣的640X960

4.把地圖貼紙設置為Texture類型,雖然是在2D項目當中,但是如果要做地圖滾動的話,地圖的類型必須是Texture

5,.創建一個Raw Image類型的UI節點放在父節點Canvas下面,把地圖拖進去,節點大小設置為512X1024

6.設置地圖節點的Scale的x為1.25,y也為1.25,覆蓋整個Canvas畫布

7.寫一個腳本掛在sky背景節點下面控制地圖滾動

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class sky : MonoBehaviour {
    RawImage img;
    public float speed = 0.1f;
    // Use this for initialization
    void Start () {
        this.img = this.GetComponent<RawImage>();
    }
    
    // Update is called once per frame
    void Update () {
        Rect r = this.img.uvRect;
        r.y += this.speed * Time.deltaTime;
        this.img.uvRect = r;
    }
}

 

8.創建一個Image類型的名為player的飛機節點在父節點Canvas節點下面,把主角飛機貼圖拖過去,set native size,調整一下節點的大小,128X128

9.給player增加一個Box Collider 2D形狀組件,也叫矩形碰撞器,碰撞器size大小128X128

10.可以給player加一個剛體組件Rigidbody 2D,其實沒必要加剛體,如果加了就設置重力Gravity Scale為0

11創建一個Image類型的名為enemy的敵機節點在父節點Canvas節點下面,把敵機貼圖拖過去,set native size,調整一下節點的大小,128X128

12.給enemy增加一個Box Collider 2D形狀組件,也叫矩形碰撞器,碰撞器size大小128X128

13.可以給enemy加一個剛體組件Rigidbody 2D,其實沒必要加剛體,如果加了就設置重力Gravity Scale為0

14.寫一個腳本掛在enemy敵機節點下面控制敵機運動

using UnityEngine;
using System.Collections;

public class enemy : MonoBehaviour {
    public Vector2 speed = new Vector2(0, -5);
    Rigidbody2D body = null;
    // Use this for initialization
    void Start () {
        this.body = this.GetComponent<Rigidbody2D>();
        this.body.velocity = speed;
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}

 

15.打開物理引擎設置

edit --> ProjectSetting -->Physices 2D;

打開后可以對重力進行設置,形狀碰撞組件默認材質進行設置,還可以設置永遠打開形狀碰撞組件的邊界框以及設置邊界框的顏色

碰撞檢測和剛體組件和碰撞形狀組件都有關系,有時候沒有用到剛體組件Rigidbody 2D,但是一定會用到碰撞形狀組件Box Collider 2D

 

16.碰撞狀態分為3種

a.開始

b.持續

c.結束

當兩個物體發生碰撞,碰撞器會去遍歷碰撞器所掛節點上的所有腳本,然后調用腳本寫的函數。所以我們必須在要發生碰撞的物體節點下面的腳本里面寫這三個碰撞函數

(1)OnCollisionEnter2D(Collision2D c)方法; -->開始碰撞

(2)OnCollisionExit2D(Collision2D c)方法; -->結束碰撞

(3)OnCollisionStay2D(Collision2D c)方法; -->碰撞持續;(一個物體粘着一個物體不分開的時候,大多數是兩個物體碰撞在一起不分開一起運動的狀態),里面的內容貌似只執行一次。

 

設置碰撞節點的Tag

在節點的Inspector視圖的左上角的Tag屬性選擇,可以自定義Tag,有了Tag就可以知道自己碰到的是哪個節點

 

下面的代碼寫在player節點下面掛載的腳本里面

// 碰撞開始
    // Collision2D 碰撞信息
    void OnCollisionEnter2D(Collision2D c) {
        // 獲取了與我們碰撞的節點;
        // 
        if (c.gameObject.tag == "enemy") {
            Debug.Log("OnCollisionEnter2D Contact with enmy!!!");
        }
        
    }
    // 碰撞結束
    void OnCollisionExit2D(Collision2D c) {
          // Debug.Log("OnCollisionExit2D called");
    }

    // 碰撞持續
    void OnCollisionStay2D(Collision2D c) {
          // Debug.Log("OnCollisionStay2D called");
    }
    // end 

 

17.碰撞有兩種類型,上面是碰撞器與碰撞器碰撞,還有一種碰撞是碰撞器與觸發器碰撞

觸發器就是把節點下面的Box Collider 2D碰撞形狀組件的Is Trigger屬性打鈎,打鈎之后,就不會產生碰撞效果,沒有任何的物理運算。但是兩個物體如果發生交互的時候還是會觸發事件,觸發函數,玩家撿金幣就是用到這種碰撞,觸發的函數有下面三個

(1)OnTriggerEnter2D(Collider2D c) -->開始

(2)OnTriggerExit2D(Collider2D c) -->結束

(3)OnTriggerStay2D(Collider2D c) -->持續碰撞

 

設置碰撞節點的Tag

在節點的Inspector視圖的左上角的Tag屬性選擇,可以自定義Tag,有了Tag就可以知道自己碰到的是哪個節點

 

 下面的代碼寫在player節點下面掛載的腳本里面

 void OnTriggerEnter2D(Collider2D c)
    {
        if (c.gameObject.tag == "enemy") {
            Debug.Log("OnTriggerEnter2D called");
        }
    }

    void OnTriggerExit2D(Collider2D c)
    {
        if (c.gameObject.tag == "enemy")
        {
            Debug.Log("OnTriggerEnter2D called");
        }
    }

    void OnTriggerStay2D(Collider2D c)
    {
        if (c.gameObject.tag == "enemy")
        {
            Debug.Log("OnTriggerEnter2D called");
        }
    }

 

18.最后,我們還需要一個碰撞矩陣列表,來表示哪些物體之間需要碰撞,哪些物體不用發生碰撞,比如玩家和玩家不用發生碰撞,玩家和敵機會發生碰撞......這個表一般是在開始的時候就確定的。

而這個矩陣的設置步驟

a.給每個節點設置所在的層(Inspector視圖右上角的layer,可以自定義,更Tag一樣的)

b.打開物理引擎設置edit --> ProjectSetting -->Physices 2D;下面那個三角形的矩陣就是碰撞矩陣,可以打鈎和去鈎,

不打鈎就是不產生碰撞的兩個物體之間不會產生碰撞消息,不管是碰撞器與碰撞器碰撞,還是碰撞器與觸發器碰撞都不會去執行碰撞函數。


免責聲明!

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



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