ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

Unityスクリプト / 入力編(1/2)

f:id:covory10101101276:20180420130851j:plain

キューケンホフ公園 - オランダ

みなさんこんにちは🌚

ミッチ・アルバムの作品を勉強中のブルーノです。人間が決められた原子の組成でこの記憶も感情もあるのなら私が今ここに存在している確率でもう一度この私でいつか蘇ることができるのではないかと思うんですがどうでしょう?

 

さて今回は、あらゆる機器からの入力を受け取る方法について書いていきます。

我々が機械に物理的に意思を伝える方法としてはマウスやキーボード、タッチなど様々なものがあり、自分が作るゲームやアプリを使うデバイスが持つ入力装置からの入力を受け取れるようにしなければなりません。Unityでどうやってそれを行うのかを見ていきます。前編はマウス・キーボード・タッチの超基本的な入力についてです。

 

マウス入力

まず、全ての入力はUnityEngine.Inputクラスに内包されています。

UnityEnigine.Inputクラス

public sealed class Input

マウスカーソルの座標はmousePositionプロパティです。

mousePositionプロパティ

public static Vector3 mousePosition { get; }

 ゲーム画面の左下隅を(0, 0)としてマウスカーソルの座標をピクセル単位で返します。Vector3なのでx, y, zは横・高さ・奥行きがありますが奥行きのzの値は常に0です。

例を見てみましょう

f:id:covory10101101276:20180420142431p:plain

OnGUIメソッドから現在の座標を入力してみました。GUI.Label関数の引数の文章は""を入れてstring型にしないと直接Input.mousepositionプロパティの値(float型)を入れることはできないんですね。いやstring型にしないといけないのはわかってるけどこんな簡単でいいのか😃

f:id:covory10101101276:20180420142435p:plain

このスクショをとるときの最後の地点が限りなく左下でした笑

 

マウスボタン

マウスのボタンが押されているかはGetMouseBottun()メソッドから得ます。

GetMouseBottun()メソッド

public static bool GetMouseBottun(int button);

buttonパラメータにはそれぞれ左ボタン0, 右ボタン1,真ん中のボタン2のいずれかが入ります。指定したボタンが押されていればtrue,そうでなければfalseを返します。

例を書いてみます。

f:id:covory10101101276:20180420180227p:plain

16行目でvar rに、マウスが押されていれば10を、そうでなければ1を代入し、次の17行目でY軸の回転量にそれを代入します。

f:id:covory10101101276:20180420180359p:plain

マウスを押した時と通常時で回るスピードが変わる!

ところでこれだと、Update()メソッドに記述すると押された時のフレーム全てにtrueを返してしまうので決定ボタンとかの時は変な反応になってしまいますね。そこで「押してない→押してる」や「押してる→押してない」の時だけ反応するメソッドもあります。それが以下の二つです

GetMouseBottunDown()メソッド

public static bool GetMouseBottunDown(int button);

GetMouseBottunUp()メソッド

public static bool GetMouseBottunUp(int button);

Downの方は押された瞬間のみtrueを返し、Upは話された瞬間のみtrueを返します。どちらも戻り値はtrueです。

 

キーボード入力

キーボードのキーが押されているかはGetKey()メソッドを使用します。 

GetKey()メソッド

public static bool GetKey(KeyCode Key)

public static bool GetKey(String name)

KeyCodeとは列挙型の変数で、中には全てのキーに対応した変数があります。そしてそれは文字通り標準的なキーボードのキー名を入れると出てきます。例えばスペースキーならSpace, AならAといった感じです。string型のnameパラメータはその文字を小文字で表します。今の例ならスペースは"space"、Aなら"a"といった感じです。

例を見てみましょう。

f:id:covory10101101276:20180420182043p:plain

さっきとほぼ同じですが、17行目がスラッシュ(Slash, / )キーを押された時、に変わっています。

 

f:id:covory10101101276:20180420182140p:plain

結果も同じですね。

当然マウスの時と同じように「押してない→押してる」や「押してる→押してない」の時だけ反応するメソッドも存在します。

GetKeyDown()メソッド

public static bool GetKeyDown(KeyCode Key);

public static bool GetKeyDown(string name);

GetMouseBottunUp()メソッド

public static bool GetKeyUp(KeyCode Key);

public static bool GetKeyDown(string name);

 

マルチタッチ

スマホのタッチはマウス同様座標を取得するポインティングデバイスという種類のうちの一つに入りますが、マウスとは違いスマホでは複数の入力を得ることができ、それをマルチタッチと呼びます。現在画面をタッチしているポイントの数を取得するにはtouchCountプロパティを使います。

touchCountプロパティ

Public static int touchCount { get; }

それぞれのタッチされているポイントの情報を扱いたい場合はGetTouch()メソッドから使います。

GetTouch()メソッド

public static Touch GetTouch(int index);

indexパラメータにはtouchCountプロパティの返した値、つまりタッチされているポイントの数だけ範囲を持つインデックスになります。3本指でタッチしている間はインデックスは最大3になり、最初のポインタのインデックスは0にあたります。

全てのタッチ情報を配列で得たい場合はtouchesプロパティで得られます。

touchesプロパティ

public static Touch[] touches { get; }

 得る情報はUnityEngine.Touch構造体で表されています。

UnityEngine.Touch構造体

public struct Touch

タッチ情報の座標はpositionプロパティから得ることができます。

public Vector2 position { get; }

これもまたマウスの時と同じように左下隅を原点として(横, 縦)の座標を返します。

では実際に書いてみます。

f:id:covory10101101276:20180420195050p:plain

for文のiをインデックスにもつtouch.positionの座標を全て表示します。

GUI.Label()メソッドだけだとインデックスの数を一つ送りにできなかったので別のint型のmで計算しました。

結果は以下のようになります

f:id:covory10101101276:20180420195322p:plain

5本指でスマホに触れながらスクショをとりました。タッチ入力はUnityRemoteというアプリからできるのでそれを使いました。

得られたタッチの開始された瞬間や離された瞬間、現在移動しているかどうかの情報もphaseプロパティを使うことで得ることができます。

phaseプロパティ

public Touchphase phase { get; }

TouchPhaseは列挙型の変数で、中にはそれぞれ

Beganメンバ → タッチされた瞬間

Endedメンバ → 離された瞬間

Movedメンバ → 動いている間

Statinaryメンバ → 停止している間

Canceldメンバ → 何らかの原因でタッチの状態を追跡できなかった場合

が入っています。実際に確かめてみます。

f:id:covory10101101276:20180420202210p:plain

f:id:covory10101101276:20180420202221p:plain

一方の指は動かしながら、もう一方の指は止まった状態でスクショしました。ちゃんと「Moved」と「Stationary」と表示されていますね。

 

タップ

タップ?タッチとどう違う?と一瞬思いますが

タッチ → タッチパネルに触れている

タップ → タッチパネルに短い間隔で押して離す

という違いがあるんですね。このタップの回数はtapCountプロパティで取得できます。

tapCountプロパティ

public int tapCount { get; }

個々のタッチにはそれぞれIDが割り振られ、連続して押されたものなのかどうかを判断できます。そしてその連続でタップされた回数分だけこのプロパティに蓄積されるというわけです。実際に書いてみます

f:id:covory10101101276:20180420201045p:plain

f:id:covory10101101276:20180420201122p:plain

短い間隔でタップするとその指の回数はカウントされていきます。

では最後に、先ほど少し触れたタッチ情報のIDの識別の仕方を学びます。

タッチ情報を格納するTouch構造体はクラス(参照型)ではなく構造体(値型)なのでインスタンス化して識別はできません。そこで、Touch構造体にはfingerIDプロパティというIDが割り振られています。では確かめてみます

f:id:covory10101101276:20180420203049p:plain

f:id:covory10101101276:20180420203100p:plain

一度4本指で画面をタッチし、最初の2本を離したのち、また一本の指で画面に触れました。最初の2本を離してIDナンバー0と1は消えましたが、2と3は残ったままでした。そこで新たに触れるとまたナンバー0が生成されました。確かにそれぞれのタッチに識別番号が割り振られているようですね。

我々が普段何気なく行なっている操作も細分化するとこんなにいっぱい種類があってそれら全てに対応する物が用意されているんですねー🙂

今回はここまでにしておきます。

 

仕事の定義って何でしょう。私は社会的に需要があることと責任が伴うことが条件だと思っています。いや、責任が伴うから社会的に需要が生まれるのか?いずれにせよ、その条件を満たせば趣味も仕事にできるのではないのでしょうか。どうでもいいか笑