Unity——射線系統

Unity射線系統

Demo展示

UI+Physical射線測試:

12123123

FPS自定義射線測試:

UGUI射線工具

實現功能,滑鼠點擊UI,返回滑鼠點擊的UI對象;

需要使用到滑鼠點擊事件-PointerEventData;

關鍵API:EventSystem.current.RaycastAll();

參數為滑鼠點擊事件,和接受射線返回結果集合;

public static GameObject RaycastUI()
{
    if (EventSystem.current == null)
        return null;
    //滑鼠點擊事件
    PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
    //設置滑鼠位置
    pointerEventData.position = Input.mousePosition;
    //射線檢測返回結果
    List<RaycastResult> results = new List<RaycastResult>();
    //檢測UI
    EventSystem.current.RaycastAll(pointerEventData, results);
    
    //返回最上層ui
    if (results.Count > 0)
        return results[0].gameObject;
    else
        return null;
}

Physcial射線工具

從攝像機發射射線,方向為,攝像機——滑鼠位置;

可以獲取射線碰撞到的3D物品的大部分資訊:

可以活著hit.collider;意味著可以獲取碰撞點的位置,物體等資訊;

用來做滑鼠點擊地面控制人物位移;

public static GameObject RaycastPhysical()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    bool isHit = Physics.Raycast((Ray) ray, out hit);
   
    if (isHit)
    {
        Debug.Log(hit.collider.name);
        return hit.collider.gameObject; //檢測到碰撞,就把檢測到的點記錄下來
    }

    return null;
}

測試程式碼:

public class Test : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            GameObject temp = RayCastTool.RaycastUI();
  
            if (temp.CompareTag("Pic"))
            {
                temp.GetComponent<Image>().color = Color.red;
            }
        }

        if (Input.GetMouseButtonUp(1))
        {
            GameObject temp = RayCastTool.RaycastPhysical();
            
            temp.GetComponent<Renderer>().material.color = Color.red;
        }
    }
}

FPS射線測試

自定義射線的起始點Origin,方向,以及射線長度;

獲取射線碰撞點的位置物體資訊;

用來做第三人稱FPS的射擊判定,或者RPG遠程技能判定;

第一人稱FPS,射線起始點和方向,替換成相機——螢幕中心瞄準心;

public class TestRayCast : MonoBehaviour
{
    private Transform player;
    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player").transform;
    }
    
    void Update()
    {
        Ray ray = new Ray(player.position, player.forward);
        RaycastHit hit;
        bool isHit = Physics.Raycast((Ray) ray, out hit,10);

        Debug.DrawRay(player.position, player.forward*10, Color.blue);
        if (isHit)
        {
            if (hit.collider.CompareTag("Enemy"))
                hit.collider.GetComponent<Renderer>().material.color = Color.red;
        }
    }
}
Tags: