何為物理射線?
從一個(gè)點(diǎn)往一個(gè)方向,發(fā)射一根無限長(zhǎng)的射線铝条,這根射線與場(chǎng)景中的其余的游戲物體的碰撞體組件相碰撞靖苇,射線即結(jié)束。由于射線可以與物理組件 Collider 相交互班缰,所以“射線”也稱之為“物理射線”贤壁。
射線的創(chuàng)建和顯示
Ray射線類和RaycastHit射線投射碰撞信息類是兩個(gè)最常用的射線工具類。
創(chuàng)建一條射線Ray需要指明射線的起點(diǎn)(origin)和射線的方向(direction)埠忘。這兩個(gè)參數(shù)也是Ray的成員變量脾拆。注意,射線的方向在設(shè)置時(shí)如果未單位化莹妒,Unity 3D會(huì)自動(dòng)進(jìn)行單位歸一化處理名船。
射線Ray的構(gòu)造函數(shù)為 :
public Ray(Vector3 origin, Vector3 direction);
RaycastHit類用于存儲(chǔ)發(fā)射射線后產(chǎn)生的碰撞信息。常用的成員變量如下:
collider與射線發(fā)生碰撞的碰撞器
**distance **從射線起點(diǎn)到射線與碰撞器的交點(diǎn)的距離
normal 射線射入平面的法向量
point 射線與碰撞器交點(diǎn)的坐標(biāo)(Vector3對(duì)象)
Ray中的參數(shù):
origin : 在世界坐標(biāo)中射線的起始點(diǎn)
direction: 射線的方向
distance: 射線的長(zhǎng)度
hit: 使用c#中out關(guān)鍵字傳入一個(gè)空的碰撞信息類旨怠,然后碰撞后賦值渠驼。可以得到碰撞物體的transform,rigidbody,point等信息鉴腻。
layerMask: 只選定Layermask層內(nèi)的碰撞器迷扇,其它層內(nèi)碰撞器忽略。 選擇性的碰撞
Ray Camera.main.ScreenPointToRay(Vector3 pos) 返回一條射線Ray從攝像機(jī)到屏幕指定一個(gè)點(diǎn)
Ray Camera.main.ViewportPointToRay(Vector3 pos) 返回一條射線Ray從攝像機(jī)到視口(視口之外無效)指定一個(gè)點(diǎn)
bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
當(dāng)光線投射與任何碰撞器交叉時(shí)為真爽哎,否則為假蜓席。
bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
在場(chǎng)景中投下可與所有碰撞器碰撞的一條光線,并返回碰撞的細(xì)節(jié)信息()课锌。
bool Physics.Raycast(Ray ray, float distance, int layerMask)
當(dāng)光線投射與任何碰撞器交叉時(shí)為真厨内,否則為假。
bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
當(dāng)光線投射與任何碰撞器交叉時(shí)為真渺贤,否則為假雏胃。(注意:如果從一個(gè)球型體的內(nèi)部到外部用光線投射,返回為假癣亚。)
RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
投射一條光線并返回所有碰撞丑掺,也就是投射光線并返回一個(gè)RaycastHit[]結(jié)構(gòu)體。
void Update ()
{
if(Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//從攝像機(jī)發(fā)出到點(diǎn)擊坐標(biāo)的射線
RaycastHit hitInfo;
if(Physics.Raycast(ray,out hitInfo))
{
Debug.DrawLine(ray.origin,hitInfo.point);
//劃出射線述雾,只有在scene視圖中才能看到
GameObject gameObj = hitInfo.collider.gameObject;
Debug.Log("click object name is " + gameObj.name);
if(gameObj.tag == "boot")
//當(dāng)射線碰撞目標(biāo)為boot類型的物品 街州,執(zhí)行拾取操作
{
Debug.Log("pick up!");
}
}
通過攝像機(jī)創(chuàng)建射線
Camera.main代表 tag 設(shè)為“MainCamera”的攝像機(jī)的 Camera 組件的引用。
m_Camera.ScreenPointToRay(Vector3)
攝像機(jī)組件(對(duì)象)下的一個(gè)方法玻孟。屏幕點(diǎn)轉(zhuǎn)化為射線唆缴,這個(gè)方法會(huì)返回一個(gè) Ray 類型的射線。這個(gè)屏幕點(diǎn)通常寫鼠標(biāo)的點(diǎn)擊位置黍翎,這樣的話面徽,就代表從攝像機(jī)的位置開始,往鼠標(biāo)點(diǎn)擊點(diǎn)這個(gè)方向,發(fā)射一根射線趟紊。