unity 滑鼠點選按鈕更改為方向鍵

2021-09-25 10:25:39 字數 3733 閱讀 8900

有些移動端不支援觸點,但是可以使用方向鍵的,這時候有些除了要支援方向鍵操作外,按鈕的選擇等也需要進行更改,維持,經過無數實驗,最終定了乙個比較方便使用,盡量少的更改源**和原本架構的基礎上的控制器

該控制器思路:

將掛載的介面(該介面)下的所有按鈕(或者toggle)進行持有,存入二維的鍊錶,表示按鈕對映到二維座標軸下的座標,並允許使用者指定該介面預設選擇的按鈕,當按下方向鍵時進行相應的切換,當按下確定鍵時觸發按鈕綁的事件,該控制器的有點在於不需要對按鈕介面做過多操作,只要持有即可。

注意:1,該控制器控制的是當前介面的所有按鈕,當按鈕隱藏或者未啟用時,是無法選取 的,當按方向鍵會跳過該按鈕

2 ,其次,要掛載在介面上,即不能掛載在某一介面的某乙個部分上。

3,a 介面彈窗b介面時,要講a介面的控制器關掉,呼叫控制器的endctr()方法,

4,a,b介面進行切換,如a顯示到隱藏,b隱藏到顯示不需要進行額外操作。

5 ,a,b共存,b為當前控制介面,關閉b時,要呼叫a 的resetartctr方法。

接下來上**:

控制器

public eventsystem system;

public bool startctr;//開始控制

public bool loop;//是否迴圈選取

public showtype selecttype;//選中型別

//---------------------------------------展示位選中框時---------------------------------

public image image;//展示背景

//----------------------------------------展示為放大時-------------------------------------

public float zoomsize = 1.3f;//放大尺寸

public int defaulthor, defaultver;//預設索引

public int movedir=1;//當五可選物件 切換方向 1:向上 -1:向下

public listallselectables;//當前所有可選物件

private int cur_hor, cur_ver, lastindex;//當前索引

private selectableobj curselect;//當前選中

private bool finding;//是否正在查詢按鈕

public onclickesc onclickesc;

public bool dely = true;

void onenable()

}if (dely)

else

setdefault();}}

void ondisable()

//開始控制

public void restartctr()

else

setdefault();

}//結束控制

public void endctr()

//設定預設按鈕

private void setdefault()

//選中按鈕

private void setselect()

else

debug.log("current selected gameobject : " + system.firstselectedgameobject);

break;

default:

break;

}finding = false;

lastindex = -1;

}ienumerator setbutton()

//還原當前選中的

private void resetselect()

curselect = null;

}// update is called once per frame

void update()

else if (input.getkeydown(keycode.rightarrow))

else if (input.getkeydown(keycode.downarrow))

else if (input.getkeydown(keycode.leftarrow))}}

if ((input.getkeydown(keycode.return) || input.getkeydown(keycode.joystickbutton0)))

else if (input .getkeydown (keycode.escape))}}

}//向上查詢

public void findver(int dir)

else

}else if (cur_ver == allselectables.count - 1 && dir == 1)

else

}else

cur_hor = mathf.clamp(cur_hor, 0, allselectables[cur_ver].selectables.count - 1);

selectableobj obj = allselectables[cur_ver].selectables[cur_hor];

if (!obj.selectobj.interactable || !obj.selectobj.gameobject.activeinhierarchy || !obj.selectobj.enabled)

}else

}//向下查詢

public void findhor(int dir)

else

}else if (cur_hor == allselectables[cur_ver].selectables.count - 1 && dir == 1)

else

}else

selectableobj obj = allselectables[cur_ver].selectables[cur_hor];

if (!obj.selectobj.interactable || !obj.selectobj.gameobject.activeinhierarchy || !obj.selectobj.enabled || lastindex == cur_hor)

}else

}private bool getinhor(int id)

else

}return false;

}public void onclick()

}if (curselect !=null&&(!curselect .selectobj.interactable || !curselect.selectobj.gameobject.activeinhierarchy || !curselect.selectobj.enabled))

}

公共類等

//可選物件型別

public enum selecttype

//可選物件

[serializable]

public class selectableobj

//每一排

[serializable]

public class rowinfo

//展示型別

public enum showtype

[serializable]

public class onclickesc : unityevent

**不多,結構簡單易懂使用例項就不放了!

獲取滑鼠點選事件

設定觸控模式 node settouchmode cc.touch mode one by one 單點觸控 或者 node settouchmode cc.touch mode all at once 多點觸控 是否啟用觸控 預設值 false node settouchenabled true ...

模擬滑鼠點選事件

今天上12306購票,可被氣得不輕,首先登陸人數受到了限制,其次買到票還有個排隊等待神馬的,先不說裡頭有沒有貓膩,電腦直接操作的,需要等待30分鐘以上嗎?神馬查詢語言要執行30分鐘才能得到個結果出來?贊同網上的言論 相比較而言,之前的搶票更能接受一些 上面是tackbar,用於隨時調整點選的時間間隔...

MFC模擬滑鼠點選

mfc 工程 把以下 放到你想要響應的函式裡面就行 cpoint pt getcursorpos pt 獲取滑鼠在螢幕的當前位置 setcursorpos 100,200 移動到某點座標 mouse event mouseeventf rightdown,0,0,0,0 點下右鍵 mouse eve...