Unity 3D 集成開發環境作爲一個優秀的遊戲開發平臺,提供了出色的管理模式,即物理管理器(Physics Manager)。
物理管理器管理項目中物理效果的參數,如物體的重力、反彈力、速度和角速度等。
在 Unity 3D 中執行 Edit→Project Settings→Physics 命令可以打開物理管理器,如下圖所示。
可以根據需要通過調整物理管理器中的參數來改變遊戲中的物理效果,具體參數如下表所示。
參 數 | 含 義 | 功 能 |
---|---|---|
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,如下圖所示。
步驟 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 按鈕進行測試,效果如下圖所示。