目的はプレイヤーをマウス操作とWASDのキーボタンだけで操作する
Windowsのマウスボタンには、普通、右、左、中央(スクロールボタン)があります。
プレイヤーを操作する時に、マウスの動きだけで操作をしてしまうと思う通りに動かせない(慣れの問題もありそうだけど)という泥沼にはまりました。
今回は、右、中央、左のどのボタンを押しっぱなしにしても検知することが出来るスクリプトの書き方を考えてみます。
Unityの公式サイトなどを参考にして、つまりマウスがドラッグ(マウスボタンを押しっぱなしに)されている時の情報だけを取得したいと思って探してみました。
ドラッグ情報だけが取得出来れば、後の情報はいらない訳ですから、もし『マウスがドラッグされていたら実行』し、そうでないときは『実行しない』をシンプルに目指したいと思います。
※ここでいう『実行』とは、マウスが向いている方向にプレイヤーを移動させるという事です。
なので目標は、以下の通りです。
1)グローバルで受け取れるマウスの状態を取得できるようにすること。
2)出来るだけ見通しの良いシンプルなスクリプトとして実装できる事
3)出来れば条件式に変数1個で判断できるようにしたい(例)if(push)
4)using UnityEngine;の宣言だけで済めばベスト!
探していたら、見つけました。 OnGUIで取得できそうです。
Unityスクリプトリファレンス
参考URL ➡ https://docs.unity3d.com/ja/2019.4/ScriptReference/EventType.html
今回関係がありそうなEventTypeで取れそうなマウスイベントは以下の3つに絞りこみました。
『ドラッグしていたらpush(変数)にtrue』を、『そうでなければpush(変数)false』をと考えれば、必要なのは、EventType.MouseDragだけで済みそうだと考えました。なので以下で使用するのは『ドラッグ情報』だけでやってみたいと思います。
今回、使えそうな情報は以下の3つ
- EventType.MouseUp(マウスアップ)
- EventType.MouseDown(マウスダウン)
- EventType.MouseDrag(ドラッグ)
Unityのリファレンスを参考にして書き直したら以下の書き方だけで行けるのではないかと思いました
if (m_Event.type == EventType.MouseDrag)
push = true;
else
push = false;
シンプルです!(ただしうまく動作してくれればの話ですが)
bool でpush(0,1)をグローバルで使用するためには、頭にpublish宣言をしておけば良さそうだという事もわかりました。(間違っているかも?)
あとはUpdate内で if(push)で判断すれば、動作しそうな気がします。
完成したのが以下の[push.cs]スクリプトです。
以下のC# Scriptを 地面オブジェクト「Graound(Cube)」か何かに充ててプレイボタンを押してみます。pushの中身は Degub.Log(push)で取り出してみます。
push.cs
public class Push : MonoBehaviour {
public bool push = false;
public void OnGUI(){Event m_Event = Event.current;if (m_Event.type == EventType.MouseDrag){push = true;}else{push = false;}} //OnGUid
} //Class Push
あとは、動作させたいオブジェクトに充てた(AddCompornent)スクリプトから以下のように読み出せれば成功です。
void Update(){
if (push){
Debug.Log("ドラッグ中");
}
}
上手く動作したら、WebGLで動作確認したものを載せます!
やってみました。
確かにドラッグ情報は取得できたのですが・・・・。
マウスを動かしている最中も、trueとfalseが切り替わってしまいます。
これは自分がイメージしていた状態とはちょっと違っている気がしました。
ドラッグが取得できたあとは、マウスボタンが離されるまでというのも考えたのですが、スマートではないような気がしました。
なので、次はマウスボタンが押されたら(mouseDown)ドラッグが発生し、マウスボタンを離したら(mouseUp)ドラッグが中止されるという方法に挑戦してみようと思います。
結果は、次回のブログで・・・。
コメント