相關api
1、Ray Camera.main.ScreenPointToRay(Vector3 pos)返回一條射線Ray從攝像機到屏幕指定一個點
2、Ray?Camera.main.ViewportPointToRay(Vector3?pos)返回一條射線Ray從攝像機到視口(視口之外無效)指定一個點
3、Ray射線類
4、RaycastHit光線投射碰撞信息
5、bool?Physics.Raycast(Vector3?origin,?Vector3?direction,?float?distance,?int?layerMask)
當光線投射與任何碰撞器交叉時為真,否則為假。
bool?Physics.Raycast(Ray?ray,?Vector3?direction,?RaycastHit?out?hit,?float?distance,?int?layerMask)
在場景中投下可與所有碰撞器碰撞的一條光線,并返回碰撞的細節信息()。
bool?Physics.Raycast(Ray?ray,?float?distance,?int?layerMask)
當光線投射與任何碰撞器交叉時為真,否則為假。
bool?Physics.Raycast(Vector3?origin,?Vector3?direction,?RaycastHit?out?hit,float?distance,?int?layerMask)
當光線投射與任何碰撞器交叉時為真,否則為假。
注意:如果從一個球型體的內部到外部用光線投射,返回為假。
參數理解:
origin?:在世界坐標中射線的起始點
direction:射線的方向
distance:射線的長度
hit:使用c#中out關鍵字傳入一個空的碰撞信息類,然后碰撞后賦值。可以得到碰撞物體的transform,rigidbody,point等信息。
layerMask:?只選定Layermask層內的碰撞器,其它層內碰撞器忽略。選擇性的碰撞
例子:
1.創建2個Cube其中Cube加一個子Cube做槍嘴
2.接下來創建一個腳本,我這里叫play
3.打開腳本進行編輯
private Ray ray = new Ray();
private RaycastHit hit;
private float length;
private int lay;
創建4個變量,分別是射線 Ray,碰撞信息 hit,射線長度 length,lay:我的理解是碰撞物的一個標記。
接下來在Start初始化這個變量。
void Start () { ? ??
//初始化Hom為給Cube2設置的Layer標記
?? ? lay = LayerMask.GetMask("Hom"); ??
}
接下來在Update添加下面的內容。
void Update () {
//當用戶按下Q
if (Input.GetKey(KeyCode.Q))
{
//設置射線的位置
ray.origin = transform.position;
//設置射線的朝向
ray.direction = transform.forward;
//判斷射線擊中碰撞體
if (Physics.Raycast(ray, out hit, length, lay))
{
//如果是就打印擊中了
Debug.Log("擊中了");
}
}
}
然后將腳本掛在Cube的槍嘴上。
然后將,Cube2的Layer設置為Hom就可以運行了。