1. 程式人生 > >Unity3D_(API)射線檢測

Unity3D_(API)射線檢測

 

 

  Unity射線檢測官方文件:  傳送門

 

  一、檢測前方是否有遊戲物體(射線無限長度)

  二、檢測前方是否有遊戲物體(射線長度為1m)

  三、檢測前方遊戲物體碰撞資訊(射線無限長度):

  四、指定檢測碰撞Tag層

 

  2D射線檢測:使用Physics2D.Raycast()

  Raycast()和RaycastAll()區別:Raycast()只檢測當前遊戲物體,RaycastAll()檢測前方所有遊戲物體(返回一個數組)

   

 

  建立一個Cube作為地面,重新命名為Ground

  建立一個Cube作為遊戲玩家(重新命名為Player),遊戲玩家下再新建一個Cube(重新命名為Ray)作為射線發射起點

  建立三個Cube作為目標,用來判斷射線是否檢測到目標

  給Ray新增射線檢測Player.cs指令碼

 

一、檢測前方是否有遊戲物體(射線無限長度):

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

    // Use this for initialization
void Start () { } // Update is called once per frame void Update () { //射線發射的起始位置和方向 Ray ray = new Ray(transform.position+transform.forward, transform.forward); //Raycast()方法判斷射線是否被檢測 bool isCollider = Physics.Raycast(ray); //輸出檢測資訊,只能為True或False
Debug.Log(isCollider); } }
Player.cs

 

        //射線發射的起始位置和方向
        Ray ray = new Ray(transform.position+transform.forward, transform.forward);

        //Raycast()方法判斷射線是否被檢測
        bool isCollider = Physics.Raycast(ray);

        //輸出檢測資訊,只能為True或False
        Debug.Log(isCollider);

 

 

二、檢測前方是否有遊戲物體(射線長度為1m):

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        //射線發射的起始位置和方向
        Ray ray = new Ray(transform.position+transform.forward, transform.forward);

        //Raycast()方法判斷射線是否被檢測
        bool isCollider = Physics.Raycast(ray,1);

        //輸出檢測資訊,只能為True或False
        Debug.Log(isCollider);
    }
}
Player.cs

 

     //射線發射的起始位置和方向
        Ray ray = new Ray(transform.position+transform.forward, transform.forward);

        //Raycast()方法判斷射線是否被檢測
        bool isCollider = Physics.Raycast(ray,1);

        //輸出檢測資訊,只能為True或False
        Debug.Log(isCollider);

 

 

三、檢測前方遊戲物體碰撞資訊(射線無限長度):

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        //射線發射的起始位置和方向
        Ray ray = new Ray(transform.position+transform.forward, transform.forward);

        RaycastHit hit;
        bool isCollider = Physics.Raycast(ray,out hit);

        //輸出是否碰撞到物體
        Debug.Log(isCollider);
        //輸出碰撞物體名字
        Debug.Log(hit.collider);
        //輸出碰撞到物體位置
        Debug.Log(hit.point);
    }
}
Player.cs

 

    //射線發射的起始位置和方向
        Ray ray = new Ray(transform.position+transform.forward, transform.forward);

        RaycastHit hit;
        bool isCollider = Physics.Raycast(ray,out hit);

        //輸出是否碰撞到物體
        Debug.Log(isCollider);
        //輸出碰撞物體名字
        Debug.Log(hit.collider);
        //輸出碰撞到物體位置
        Debug.Log(hit.point);

 

 

四、指定檢測碰撞Tag層

  給Cube-1 新增 Gary1標籤,其它Cube不做改動

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        //射線發射的起始位置和方向
        Ray ray = new Ray(transform.position+transform.forward, transform.forward);

        //需要進行碰撞的Layout層
        bool isCollider = Physics.Raycast(ray,Mathf.Infinity,LayerMask.GetMask("Gary1"));

        //輸出是否碰撞到物體
        Debug.Log(isCollider);
    }
}
Player.cs

 

        //射線發射的起始位置和方向
        Ray ray = new Ray(transform.position+transform.forward, transform.forward);

        //需要進行碰撞的Layout層
        bool isCollider = Physics.Raycast(ray,Mathf.Infinity,LayerMask.GetMask("Gary1"));

        //輸出是否碰撞到物體
        Debug.Log(isCollider);

 

Raycast()和RaycastAll()區別