Unity——射線系統
Unity射線系統
Demo展示
UI+Physical射線測試:
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;
}
}
}