我正在使用 Unity2D 開發一個專案,目標是能夠參考其他主要腳本以從中獲取資訊。在這種特定情況下,我需要從單獨的腳本中檢測滑鼠指標是否正在接觸對撞機。
通常,我可以創建一個布林值,并在滑鼠懸停時將其設定為 true,在滑鼠退出時將其設定為 false,如下所示:
bool isHovered;
void OnMouseEnter() {
isHovered = true;
}
void OnMouseExit() {
isHovered = false;
}
但是,在腳本中,我不想為每個單獨的腳本執行此操作,而是參考另一個腳本,如下所示:
public GameManager g;
void Update() {
if (g.IsTouchingMouse(gameObject)) { //Code }
}
但這有很多問題。在我的游戲經理課上,我需要這樣的東西
public bool IsTouchingMouse(gameObject g) { return value }
這有多個問題,因為我沒有辦法在另一個腳本上為這些物件注冊 onm ouseEnter 和 onm ouseExit 事件,而且我沒有辦法存盤每個游戲物件的值以確保這將無需手動修改此腳本即可為每個物件作業。
我正在尋找兩件事,#1,如何從腳本中檢測滑鼠懸停在其父母不是那個游戲物件的物件上,二,關于如何創建一個函式以立即回傳此變數有什么想法嗎?
uj5u.com熱心網友回復:
有點煩人,但我在發布幾分鐘后想出了一個解決方案。所以我會在這里分享。
public bool IsTouchingMouse(GameObject g)
{
Vector2 point = Camera.main.ScreenToWorldPoint(Input.mousePosition);
return g.GetComponent<Collider2D>().OverlapPoint(point);
}
這段代碼基本上是在做一個函式,該函式將一個游戲物件作為輸入,根據滑鼠游標在世界空間中的位置創建一個向量2,然后回傳天氣或物件包含的 2D 對撞機是否實際接觸這個虛構的點,變數“點”應該可以與任何 2D 世界空間位置互換。我幾乎把整個問題復雜化了。
uj5u.com熱心網友回復:
找到兩個你喜歡的資源,將它們匯入 Unity 的 Assets 并將它們的 Texture Type 設定為 Cursor
創建一個新腳本并將其掛載到一個空物件上。打開腳本,創建三個 Texture2D 型別的公共變數,回傳 Unity 并將您喜歡的指標圖拖到變數視窗。
設定物件標簽,我們通過自定義標簽來判斷改變哪個指標;所以首先設定物件的標簽。比如地面,我給它加了Ground標簽,墻加了Wall標簽;該列添加了 Cylinder 標記。
撰寫一個更改滑鼠指標的方法,其中更改指標的主要API是Cursor.SetCursor()
void setCursorTexture()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//Define the ray pointed by the mouse in the game window
RaycastHit hitInfo; //Information of ray collision
if (Physics.Raycast(ray, out hitInfo))//Determine whether to hit the object
{
// switch pointer
switch (hitInfo.collider.gameObject.tag)
{
case "Ground":
Cursor.SetCursor(groundCr, new Vector2(16, 16), CursorMode.Auto);
break;
case "Wall":
Cursor.SetCursor(wallCr, new Vector2(16, 16), CursorMode.Auto);
break;
case "Cylinder":
Cursor.SetCursor(CylinderCr, new Vector2(16, 16), CursorMode.Auto);
break;
default:
Cursor.SetCursor(null,Vector2.zero,CursorMode.Auto);
break;
}
}
}
在每幀呼叫的 Update() 方法中實作此方法。
END(你可以去運行程式)謝謝,希望對你有幫助
uj5u.com熱心網友回復:
此方法無一例外地有效。要解決此問題,請嘗試以下方法:
public Collider2D collider; // target Collider
void Update()
{
var mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
if (collider.bounds.IntersectRay(mouseRay)) Debug.Log("Mouse on collider..");
}
對于新的輸入系統?
但是Input.mousePosition
在 Unity 中給出了一個新的系統錯誤。解決這個問題,呼叫滑鼠位置如下圖:
var mousePos = Mouse.current.position.ReadValue();
您還可以檢查if (new input system enabled)
是否處于活動狀態,如下所示:
#if ENABLE_INPUT_SYSTEM
var mousePos = Mouse.current.position.ReadValue();
#else
var mousePos = Input.mousePosition;
#endif
然后跟隨相機光線的方向:
var mouseRay = Camera.main.ScreenPointToRay(mousePos);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/477586.html
上一篇:敵人機器人遠離玩家Unity3D