if (Input.GetMouseButton(0))
{
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitinfo;
if (Physics.Raycast(ray, out hitinfo))
{
print(hitinfo.collider.name);
if (hitinfo.collider.name == this.gameObject.name )
{
if (dir == direction.left)
{
player.GetComponent<gamecontrol>().revolve_in_2D_left();
}
else if (dir == direction.right)
{
player.GetComponent<gamecontrol>().revolve_in_2D_right();
}
}
}
}
}
以上是我寫的一個點擊觸發UI按鈕的腳本,在這之中的ray是我們自己定義的一條射線,後面的函數則是爲其定義,在這裏說一下,定義射線的方法有2種,一種是使用函數ScreenPointToRay(Vector3 startposition);用這個函數定義的是一條起點爲startposition,方向爲攝像機過起點的方向的射線。而後面的RaycastHit類型的變量的作用是的到射線碰撞時所產生的相關信息,包括碰撞的物體的名字,剛體組件,和transform組件。有了這些我們就可以很容易的判斷出射線是否碰撞到了我們的目標物體。還有一種方法是使用函數ViewportPointToRay(Vector3 postion),用這個函數定義的是一條從攝像開始,透過從相機的近裁剪面上的視口POSITION(x,y)座標的一條射線。不過這種方法平時使用的不是很多。
但是這種射線檢測存在一個問題,就是假如當空間內的要求被物體在某些時刻被其他物體阻擋的話,就可能無法檢測到被要求的物體,因爲射線的終點就是被碰撞到的物體,這個時候我們就需要用到一個分層的方法,首先我們可以在layer面板上添加層級,將我們要檢測的物體和不需要檢測的物體放在不同的layer下面,然後我們在使用Physice.Raycast這個函數的時候可以在後面添加一個參數LayerMask型的變量mask,這種重載方法下我們的射線的檢測碰撞的時候就只會檢測改層的物體,而不會受到其他物體的干擾
下面是我的樣例代碼:
void Update () {
if (Input.GetMouseButton(0))
{
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitinfo;
if (Physics.Raycast(ray, out hitinfo,200,mask))
{
print(hitinfo.collider.name);
if (hitinfo.collider.name == this.gameObject.name && (hitinfo.collider.tag == "right_button" || hitinfo.collider.tag == "left_button"))
{
if (dir == direction.left)
{
player.GetComponent<gamecontrol>().revolve_in_2D_left();
}
else if (dir == direction.right)
{
player.GetComponent<gamecontrol>().revolve_in_2D_right();
}
}
}
}
}
下面是一個我自己製作的小遊戲,這個遊戲中的小球是會旋轉的,而控制小球旋轉的是2個我用射線檢測的方法制作的2個UI按鈕,當小球旋轉到一定角度的時候,小球的位置會阻擋攝像機的射線,但是設置分層之後,就沒有了這個問題,小球就不會被射線檢測到