
ゼロからのUnity(9)
入力について学んでみよう
つい先日、iOS向けのUnityアプリをリリースすべくApp Storeに申請を行いました。しかし、「iCloudのバックアップデータが多すぎる」という理由でリジェクト(却下)されてしまいました。
バックアップするようにした覚えが無かったので、セーブデータ周りの処理を全て見直して再申請したのですが、またリジェクト。
セーブデータの他にサーバから追加コンテンツをダウンロードする機能もあったのですが、この処理はUnityのWWWクラスに任せていましたのでバックアップされないはず。
原因が全く思い当たりません。
頭を抱えながら色々調べていたところ、なんとUnityのバージョン 5.3.2f1 から 5.3.4f1 までの間、WWWクラスでダウンロードしたファイルがiCloudにバックアップされてしまう不具合があったようです。
下手をすると数ギガバイトのコンテンツデータがiCloudに保存されてしまうことになり、これではリジェクトされて当然です・・・。
幸いなことに、Unityは頻繁に不具合修正のパッチリリースが行われています。
開発中に「コレどう考えてもおかしいぞ」となったら、パッチが出ていないかチェックしましょう。
http://unity3d.com/jp/unity/qa/patch-releases
さて、前置きが長くなってしまいました。
今回はゲームの操作、つまりはユーザの入力を扱うための基本的な仕組みについて学んでいきましょう。
(賀好 昭仁)
■Unityの入力設定を確認してみよう
Unityにはキー入力の設定画面がありますので、まずはそこを確認してみましょう。
メニューから
Edit->Project Settings->Input
を開きます。
InspectorにInputの設定画面が表示されました。
ここではキーボード、マウス、ジョイスティックなどによる入力が設定可能です。
Axisの中に項目がズラッと並んでいますので、試しにJumpの項目の詳細を開いてみましょう。
Jumpの項目は上下2つありますので、今回は上にある方を開いてみます。
(デフォルトの状態では、上はキーボード向けの設定、下はジョイスティック向けの設定になっています。)
沢山の項目がある中で、Nameが「Jump」、Positive Buttonが「space」となっていますね。
これを心に留めておきつつ、前回までで作成したスクリプト Hiyoko.cs の29行目を見てみましょう。
こちらは
Input.GetButtonDown("Jump")
となっています。
この処理は「Jump」のボタンが押されたかどうかをチェックします。
先ほどの設定画面を思い出してみますと、「Jump」の項目に「space」がひも付けられていました。
つまりは「Jump」=「space」キーが押されたかどうかをチェックすることになります。
キーボードやジョイスティックで操作するゲームを作る場合は、こちらの設定を活用することになります。
ひも付けのためのボタン名などは公式マニュアルに詳しく記載されていますので、目を通しておきましょう。
http://docs.unity3d.com/ja/current/Manual/ConventionalGameInput.html
■スクリプトで入力を取得してみよう
設定がざっくりとわかったところで、次は入力の取得方法について詳しく見ていきましょう。
■キー入力とマウス操作を取得する
前項でも少し触れましたが、Inputクラスを使うことで様々な入力内容を取得することができます。
具体的には、Input.GetKeyDown()やInput.GetMouseButtonDown()など、Inputクラスのメソッドで取得可能です。
このあたりの処理はシンプルで、かつ下記の公式マニュアルにも記載されていますので、解説は省略します。
http://docs.unity3d.com/ja/current/ScriptReference/Input.html
■タッチを取得する
スマホゲームでは、キーボードやマウスではなくタッチでの操作が主流です。
そしてUnityはマルチタッチ入力に対応しています。
Input.touches には、今現在タッチしている指の本数分だけタッチ情報が格納されています。これを利用することでタッチ、フリック、ピンチインなどの各種操作を判別可能です。
タッチ情報のデータ構造は、公式マニュアルに記載されています。
http://docs.unity3d.com/ja/current/ScriptReference/Touch.html
ポイントとなるプロパティはfingerId・phase・positionです。
fingerIdはその名の通り指を表すIDで、タッチ開始から離すまでの間は同じIDが割り当てられます。
phaseにはタッチの状態(タッチ開始・移動・指を離した)が入っています。
そしてpositionにはタッチ座標が格納されていますので、これらを使うことで様々な制御が可能になります。
以前Input.touchesを使ってタップやフリックを検知するスクリプトを書いたことがありましたので、参考にしてみてください。
(ちょっと長いので、Gistにアップしました)
https://gist.github.com/akako/d784782831e05edf49e84236505657fb
余談
Unityでスマホアプリの開発を行う場合、開発中はPCでマウスを使ってデバッグすることが多いかと思います。
マウス操作とタッチ操作では入力の取得方法が異なりますが、マウス操作を「1本指でのタッチ」と見なすように実装すればPC/スマホどちらでも同じように操作できて便利です。
(前述のフリック検知スクリプトは、この形にしてみました)
■フリックを使ってみる
折角ですので、上記スクリプトを使ってひよこちゃんに新たなアクションを付けてみましょう。
まずはHiyoko.csを下記のように変更します。
using UnityEngine;
using System.Collections;
public class Hiyoko : MonoBehaviour
{
// ジェスチャー検知スクリプト
public TouchGestureDetector touchGestureDetector;
// 操作可能フラグ
private bool isControllable = true;
private void Start()
{
// ジェスチャー検知時のコールバック処理
touchGestureDetector.onGestureDetected.AddListener((gesture, touchInfo) =>
{
var rigidbody = GetComponent<Rigidbody2D>();
switch (gesture)
{
case TouchGestureDetector.Gesture.FlickLeftToRight:
// 左から右にフリックしたとき
rigidbody.AddForce(Vector2.right * 250f + Vector2.up * 120f);
break;
case TouchGestureDetector.Gesture. FlickRightToLeft:
// 右から左にフリックしたとき
rigidbody.AddForce(Vector2.left * 250f + Vector2.up * 120f);
break;
}
});
}
private void Update()
{
if (!isControllable)
{
return;
}
var rigidbody = GetComponent<Rigidbody2D>();
if (Input.GetAxis("Horizontal") < 0)
{
rigidbody.velocity = new Vector2(-1f, rigidbody.velocity.y);
}
else if (Input.GetAxis("Horizontal") > 0)
{
rigidbody.velocity = new Vector2(1f, rigidbody.velocity.y);
}
else
{
// 左右キーを入力していない時、勝手に静止してしまうのでコメントアウト
//rigidbody.velocity = new Vector2(0f, rigidbody.velocity.y);
}
if (Input.GetButtonDown("Jump"))
{
rigidbody.AddForce(new Vector2(0f, 250f));
}
}
// 以降は変更無しのため省略
続いて、TouchGestureDetector.csをひよこちゃんにアタッチし、TouchGestureDetectorのhitCheckプロパティのチェックを外します。
hitCheckが付いた状態だとひよこちゃんの上でフリックしないと反応しませんが、hitCheckを外すと画面のどこでフリックしても反応するようになります。
最後に、HiyokoのTouch Gesture DetectorプロパティにTouchGestureDetectorをドラッグしてひも付けます。
これでひよこちゃんが新しいアクション「Bボタンダッシュ中じゃないのにBボタンダッシュ中のジャンプに匹敵する大ジャンプ」を覚えました。
ゲームを実行し、マウスで画面をフリックしてみましょう。
ひよこちゃんがピョーンと「Bボ(略)ジャンプ」するようになりましたね。
動画
https://youtu.be/HLYgpwy8PSw
■まとめ
今回はちょっとカタい内容でしたが、キーやタッチ入力の取得は大抵のゲームで使うことになるかと思います。
(あえて物理的な入力を使わずに音声で操作する、とかも面白いですけどね)
頑張ればタッチジェスチャなども判定可能ですので、工夫次第では「指で魔法陣を描いて魔法発動!」といったことも可能になります。
また、今回は基礎を勉強&スクリプトを手作りしましたが、Standard AssetやAsset Storeには入力関連のAssetが沢山あります。
既成品で事足りる場合も多いかと思いますので、色々探してみると良いでしょう。
さて、ゼロからのUnityも次回でいよいよ最終回となります。
次回はシーンの遷移とアプリのビルドについて学んでいきましょう。
qnoteスマホアプリ開発チーム技術主任。PHP・Android・iOS・Unityなど複数のプラットフォームでの開発を行う。
しばしば7匹の先輩猫社員たちにイスを占領される。