物理引擎就是遊戲中模擬真是的物理效果。如兩個物體發生碰撞,物體自由落體等。在unity中使用的是NVIDIA的physX,它渲染的遊戲畫面很逼真。post
剛體this
剛體是一個很很中要的組件。spa
默認狀況下,新創的物體是不具有物理效果的,而剛體組件可以給物體加入一些常見的物理屬性。比方說:質量。摩擦力。碰撞等。code
假設對象加入了剛體組件。那麼它將感應物理引擎中的一切物理效果。component
簡單的使用下orm
首先穿件一個遊戲對象,接着在hierarchy視圖中選擇建立的遊戲對象。而後在unity導航菜單條中選擇component——physics——rigidbody就能夠。如下將建立3個立方體。將其放置在凌空地面上。對象
並給當中的一個立方體加入剛體。執行後發現紅色的立方體感應了物理效果,掉下來了。而其它的兩個依然停留在原地。blog
剛體的屬性:遊戲
mass:質量。數值越大物體下落越快,儘可能不超過10,否則會顯得不真實。ip
drag:阻力。數值越大物體速度減慢就越快。
angular drag:角阻力。數值越大自轉速度減慢就越快。
use gravity:是否使用重力。
is kinematic:是否受物理影響。
interpolate:設置圖像差值。
collision detection:碰撞監測。
constrains:凍結,中止某個軸向感應物理引擎的效果
freeze position:凍結X軸。Y軸,Z軸,方向。
freeze rotation:凍結X軸。Y軸。Z軸,旋轉。
物理管理器
在物理管理器中,可以設置整個項目所有的物理效果。比方說重力。反彈力,速度等。
在菜單導航欄中。選擇edit——project setting——physics就能夠打開physics manager。
例如如下圖:
gravity:重力,默認下物體受Y軸向下的重力爲9.8 N,可改動三個軸的受力方向。
default material:默認物理材質。
bounce threshold:反彈值。
sleep velocity:睡眠速度,當速度低於睡眠速度時,它保持精巧狀態。
sleep angular velocity:睡眠角速度,當角速度低於睡眠速度時。自身不旋轉。
max angular velocity:最大角速度。
min penetration for penalty:用於物體與物體之間碰撞後最小穿透力。
solver iteration count:迭代數量,默認值爲7.
raycasts hit triggers:是否啓動命中觸發器。
layer collision matrix:圖層碰撞矩陣。
力
剛體組件可以受力的做用,比方給剛體一個向X軸的力,那麼剛體將沿着X軸向前運動。unity中力的方式有兩種:普通的力,需要設定力的方向和大小。目標位置力。需要設置目標點的位置,該物體將朝向這個目標位置施加力。
接下來作一個樣例來講明。共放置兩個球對象。點擊普通力後,小球像被踢了一腳。
點擊位置力。小球將被施加一個朝向目標的力。
代碼:
using UnityEngine; using System.Collections; public class Script_06_02 : MonoBehaviour { //施加普通力的對象 GameObject addFrceObj = null; //施加目標位置力的對象 GameObject addPosObj = null; //目標對象 GameObject cubeObj = null; // Use this for initialization void Start () { //獲取施加普通力的對象 addFrceObj = GameObject.Find("Sphere0"); //獲取施加目標位置力的對象 addPosObj = GameObject.Find("Sphere1"); //獲取目標對象 cubeObj= GameObject.Find("Cube"); } void OnGUI() { if(GUILayout.Button("普通力",GUILayout.Height(50))) { //施加一個力。X軸方向力度爲1000,Y軸方向力度爲1000 addFrceObj.rigidbody.AddForce (1000, 0, 1000); } if(GUILayout.Button("位置力",GUILayout.Height(50))) { //施加一個位置力。物體將會朝向這個位置發力移動。力的模式爲衝擊力。Vector3 force = cubeObj.transform.position - addPosObj.transform.position; addPosObj.rigidbody.AddForceAtPosition(force,addPosObj.transform.position,ForceMode.Impulse); } } }