有些移動端不支援觸點,但是可以使用方向鍵的,這時候有些除了要支援方向鍵操作外,按鈕的選擇等也需要進行更改,維持,經過無數實驗,最終定了乙個比較方便使用,盡量少的更改源**和原本架構的基礎上的控制器
該控制器思路:
將掛載的介面(該介面)下的所有按鈕(或者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...