C語言中文網 目錄

Unity 3D物理管理器(Physics Manager)

< 上一頁Unity 3D射線 Unity 3D模型與動畫下一頁 >

Unity 3D 集成開發環境作為一個優秀的游戲開發平臺,提供了出色的管理模式,即物理管理器(Physics Manager)。

物理管理器管理項目中物理效果的參數,如物體的重力、反彈力、速度和角速度等。

在 Unity 3D 中執行 Edit→Project Settings→Physics 命令可以打開物理管理器,如下圖所示。

Unity 3D物理管理器

可以根據需要通過調整物理管理器中的參數來改變游戲中的物理效果,具體參數如下表所示。

參 數 含 義 功 能
Gravity 重力 應用于所有剛體,一般僅在 Y 軸起作用
Default Material 默認物理材質 如果一個碰撞體沒有設置物理材質,將采用默認材質
Bounce Threshold 反彈閾值 如果兩個碰撞體的相對速度低于該值,則不會反彈
Sleep Velocity 休眠速度 低于該速度的物體將進人休眠
Sleep Angular Velocity 休眠角速度 低于該角速度的物體將進人休眠
Max Angular Velocity 最大角速度 用于限制剛體角速度,避免旋轉時數值不穩定
Min Penetration For Penalty 最小穿透力 設置在碰撞檢測器將兩個物體分開前,它們可以穿透 多少距離
Solver Iteration Count 迭代次數 決定了關節和連接的計算精度
Raycasts Hit Triggers 射線檢測命中 觸發器 如果啟用此功能,在射線檢測時命中碰撞體會返回一 個命中消息;如果關閉此功能,則不返回命中消息
Layer Collision Matrix 層碰撞矩陣 定義層碰撞檢測系統的行為

綜合案例:迷宮奪寶

案例構思

迷宮奪寶類游戲是常見的游戲類型,玩家在限定的時間內,在迷宮中尋找寶箱從而達到通關的目的。

本項目旨在通過場景虛擬漫游,尋找迷宮中潛藏的寶箱,當靠近寶箱時收集它,實現碰撞檢測功能。

案例設計

本案例在 Unity 3D 內創建一個三維迷宮場景,場景內分散著若干個寶箱,游戲玩家需要在規定的時間內找到寶箱,靠近并收集它,最終通關。

項目實施

1) 搭建迷宮場景

步驟 1):創建新項目,并將場景命名為 migong。

步驟 2):創建游戲對象。執行菜單欄中的 GameObject→3D Object→Plane 命令,創建平面,并賦予材質。

執行 GameObject→3D Object→Cube 命令創建若干個盒子,構成迷宮場景,如下圖所示。

迷宮場景頂視圖

步驟 3):導入模型資源。從 Unity 3D 商店中選擇 3D 模型資源并加載到場景中,將其命名為 treasure,如下圖所示。

加載3D模型資源

步驟 4):將模型資源導入到 Hierarchy 視圖中,如下圖所示。

場景效果圖

步驟 5):執行 Assets→Import Package→Custom Package 命令添加第一人稱資源,如下圖所示。

添加資源

步驟 6):選中第一人稱資源后單擊 Import 按鈕導入該資源,如下圖所示。

導入第一人稱資源

步驟 7):在 Project 視圖中搜索 first person controller,將其添加到 Hierarchy 視圖中,并擺放到平面上合適的位置,如下圖所示。

擺放第一人稱資源

步驟 8):因為第一人稱資源自帶攝像機,因此需要關掉場景中的攝像機。

2) 添加觸發器

步驟 9):選中 treasure,為 treasure 對象添加 Box Collider,并勾選 Is Trigger 屬性,如下圖所示。

添加觸發器

步驟 10):編寫腳本 Triggers.cs,代碼如下。
using UnityEngine;
using System.Collections;
public class Triggers:MonoBehaviour{
    void OnTriggerEnter(Collider other){
        if(other.tag=="Pickup"){
            Destroy(other.gameObject);
        }
    }
}
步驟 11):將 Triggers 腳本鏈接到 first person controller 上。

步驟 12):為 treasure 添加標簽 Pickup。

3) 添加計數功能

步驟 13):修改腳本。
using UnityEngine;
using System.Collections;
public class Triggers:MonoBehaviour{
    public static int temp_Num=0;
    void OnTriggerEnter(Collider other){
        if(other.tag=="Pickup"){
            temp_Num++;
            Destroy(other.gameObject);
        }
    }
    void OnGUI(){
        if(temp_Num==5)
        if(GUI.Button(new Rect(Screen.width/2f, Screen.height/2f, 100, 50),"play again")){
            temp_Num=0;
            Application.LoadLevel("migong");
        }
    }
}
步驟 14):將場景添加到 Build Settings 中,如下圖所示。

項目發布圖

4) 添加計時功能

步驟 15):完善代碼,如下所示。
using UnityEngine;
using System.Collections;
public class Triggers:MonoBehaviour{
    public static int temp_Num=0;
    public int parachuteNum;
    int timer;
    int time_T;
    bool isWin=false;
    bool isLose=false;
    void Start(){
        Time.timeScale=1;
        GameObject[]objs=GameObject.FindGameObjectsWithTag("Pickup");
        parachuteNum=objs.Length;
        time_T=(int)Time.time;
    }
    void Update(){
        timer=20-(int)Time.time+time_T;
        if(temp_Num==parachuteNum&&timer!=0){
            isWin=true;
        }
        if(timer==0&&temp_Num!=parachuteNum){
            isLose=true;
        }
    }
    void OnTriggerEnter(Collider other){
        if(other.tag=="Pickup"){
            temp_Num++;
            Destroy(other.gameObject);
        }
    }
    void OnGUI(){
        GUI.Label(new Rect(0, 0, 100, 50), timer.ToString());
        if(isWin==true||isLose==true){
            Time.timeScale=0;
            if(GUI.Button(new Rect(Screen.width/2f, Screen.height/2f, 100, 50), "play again")){
                isWin=false;
                isLose=false;
                temp_Num=0;
                Application.LoadLevel("migong");
            }
        }
    }
}
步驟 16):單擊 Play 按鈕進行測試,效果如下圖所示。

項目測試效果1

項目測試效果2
< 上一頁Unity 3D射線 Unity 3D模型與動畫下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo