原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

Unityでコルーチンが復帰しない場合の対処について

NHKにて

 今朝のニュースでBitsummitの様子が流れてましたね。有名どころ?な開発者の方々がインタビューされていて、「ああ、このゲームはこの人が作っているんだー」とか興味深く拝見させていただきました。

皆さん、受け答えが堂々とされていてハキハキ喋る姿に、滑舌が悪くて喫茶店で碌に注文できない私は尊敬するばかりでした。
 私:「えっと、アメリカンのM(エム)で」
 店員:「L(エル)ですか?」
M(エム)だってば。そんなんばっかり。

 

実は・・・

前々から自作のダサいロゴは一新したかったので、デザイナーの方に頼んでロゴを作ってもらいました。

 

◇プロジェクト(Stab of Bee Project)ロゴ

f:id:Karvan:20180522231639p:plain

Y U C C Aさんに作成していただきました。シンプルでおしゃれ

 

◇アプリタイトル(Cutie Circuit)ロゴ

f:id:Karvan:20180522231838p:plain

mika pinkpaletteさんに作成していただきました。スウィートで可愛い

 

やはり専門の方に頼むと出来が違うなと思いますね。自分じゃ出来ないし。
こちらの細かい要望も取り込んで頂き、本当に感謝致します。

 

どちらも現在制作中のアップデート版でありがたく使用させていただきます。

 

 アップデート版

GW明けにはリリースしたいとか言いながら早二週間が経ちました。気持ち的には早々にリリースしたいのですが、作り込む量が増える=不具合(バグ)が増える、という方程式の呪縛が解けずにバグを書いては消し、書いては消しのI Love Youなので、進捗ペースは牛歩戦術よろしくノロノロとしたものになっています。

 

最近発生したバグの中でも頭を抱えたのが、オブジェクトがinactiveになるとコルーチンは停止するが、その後、オブジェクトがactiveになってもコルーチンは動き出さない(再開しない)、ってやつ。
(注:この動作自体はUnityのバグではなく、この動作仕様を理解せずに作り込んだアプリが不具合になる、という意味です)

 

不具合の詳細

具体的には追加ステージの以下の動作をするオブジェクトを作ったんです。

f:id:Karvan:20180522232730g:plain

ドットが波打つような壁

 

これは立方体のオブジェクトを列単位に順番にDotweenを使ってジャンプさせて、最後の列のジャンプが完了したら一から再開する。という単純なロジックなのですが、最後の列のジャンプが完了するのをコルーチンで待たせています。

 

だが、ジャンプ動作が一回完了したら止まってしまう。という不具合が発生

 

他にも同様なアニメ動作をするオブジェクトを作ったんですが、それらも同様に動作が一回完了したら止まってしまい繰り返してくれない。うーん・・・

 

原因

実はこのオブジェクトはCutieCircuitの中ではPlayerの位置に合わせて場所を移動させて表示します。

 

f:id:Karvan:20180522232841g:plain

こんな感じ。

Playerが横を通ったら一旦非表示にして、Playerの前方に再配置して表示する。

 

この処理のため、オブジェクトがinactiveとactiveの状態を繰り返すのですが、上記で述べたようにactive状態になっても一旦停止したコルーチンは再開しないため、ジャンプが終わる前にinactive状態になると、待ち状態のコルーチンが永遠に待ち状態のままで二度と再開しないという結果になっていました。

 

対処法

別に一回こっきりの動作でもいいかなぁ、とも思ったのですが、それではゲーム画面が余りに寂しい画になるので対処法をGoogle先生に尋ねてみると、以外にあっさりと答えが見つかりました。

 

OnEnableとOnDisableを使う

 

OnEnableメソッドはGameObjectがactiveになった時に呼ばれるイベント関数で、逆にinactiveになった時に呼ばれるイベント関数がOnDisableとなっています。

 

なので、OnDisableが呼ばれたらコルーチンを停止し、OnEnableが呼ばれたらコルーチンを再開すればいい。

 

    /// <summary>
    /// ウェーブ動作
    /// </summary>
    public void CubeWaveSeq()
    {
    	// ウェーブ動作のIEnumeratorを保持する
        CurrentCor = StartCoroutine(CubeWaveSeqPrc());
    }
    
    /// <summary>
    /// ウェーブ動作(実体)
    /// </summary>
    /// <returns></returns>
    private IEnumerator CubeWaveSeqPrc()
    {

        OnSequence = true;
        CubeSequence = DOTween.Sequence();

        for (int iLoop = ColorWallObjList.Count-1; iLoop >= 0; iLoop--)
        {
            GameObject[] objArray = new GameObject[4];
            objArray = ColorWallObjList[iLoop];

            // 順番にジャンプする
            for (int iCnt = 0; iCnt < 2; iCnt++)
            {
                CubeSequence.Join(
                    objArray[iCnt].transform.DOLocalJump(Vector3.zero, 1.0f, 1, 0.5f)
                                                .SetRelative(true)
                     );
            }
            
            CubeSequence.SetDelay(0.1f);

        }

        CubeSequence.OnComplete(SequenceComp);

        CubeSequence.Play();

        yield return CubeSequence.WaitForStart();

        // Wave完了待ち
        while (OnSequence)
        {
            yield return null;
        }

    }
    /// <summary>
    /// Sequenceの完了コールバック
    /// </summary>
    public void SequenceComp()
    {
        OnSequence = false;
    }
    
    /// <summary>
    /// Active時動作
    /// </summary>
    void OnEnable()
    {
        if (CurrentCor != null)
        {
            StartCoroutine(CurrentCor);
        }
    }

    /// <summary>
    /// InActive時動作
    /// </summary>
    void OnDisable()
    {
        if (CurrentCor != null)
        {
            StopCoroutine(CurrentCor);
        }
    }

 これで待ち状態のコルーチンが終了することができます。

 

進捗報告

ロゴ製作者の方に「エンディングのクレジットにお名前を載せます!!」とか張り切って言っちゃったので完成版がリリースできるように頑張ります。

現在の進捗は

  • 追加ステージ=完成
  • エンディング=完成
  • ストーリー関連のイベント処理=頑張る、頑張るよ・・・

 

 

 

 

 

  • ショップ画面=(∩゚д゚)アーアーきこえなーい

 

 

 

iTweenのFrom系メソッドを使ったアニメーション

 イベント盛り

 インディゲーム界隈ではGW前後に色々とイベントがあったようで、先週は京都でBitsummitが開催されていました。私も出展しなくとも顔を出して最新のゲーム事情を偵察し、あわよくば開発者の方々とお話をしてデベロッパーとしての輪を広げたい、などと思っていたのですが、なにせ今月は自動車税という重税をしのがないといけなかったので参加を断念しました。


 まぁ、元来からの人見知りで初対面の人に声を掛けることはもちろん、自分の携帯にでさえ「OK! Goggle.」なんて言えない小心者なので、たとえ顔を出したとしてもブースの脇に立っている開発者の方を遠巻きに眺めながら、展示しているゲームを一度も触ることなく、そそくさと会場を後にすることになったと思います。


 あ、でもゲーム開発者としては一度はそういうイベントに参加してみたいな、という願望はあります。財源と勇気さえあれば。自動車税高すぎだし。

 

閑話休題

 さて、UnityでTweenアニメーションを実装する方法は色々あるんですが、私の場合、前回の記事でも取り上げたようにUI系の動作にはiTweenを使用しています。

 

 これはDotweenにはないFrom系のメソッドが便利なためで、動作をHashで指定しなくてはいけない面倒を背負ってもFrom系は便利なものに感じています。

 

 例えば、CutieCircuitのタイトル画面

f:id:Karvan:20180515233916g:plain

 これも文字のスライドインにiTweenのMoveFromを使っています。

 

なぜ便利なのか

 このMoveFromがどういうメソッドなのか、というと

 

        オブジェクトを指定した座標から現在の座標へ移動する

 

というもの、現在位置から一旦移動して戻ってくる動作になるので、Unity上で調整した位置から動かさなくても済む、というのが最大の利点になります。
ちなみにiTweenの移動系メソッドとしては他にMoveTo(現在位置から指定位置へ)、MoveBy(現在位置からの相対位置を指定して移動)があります。

 

  説明だけではあまりピンとこないかもしれませんが実際にゲームを作りこんでいくと、この動作仕様は大変ありがたい。


 通常、ボタンやラベルなどのUIは一度表示されるとその位置から動くことは余りありませんが、表示させる際にちょっとしたアニメーションをつけたい場合、このMoveFromを使うと作りこんだゲーム画面(UIの位置)を変更せずにアニメーションが作れちゃう。

 

 例えば、この文字表示とか、

f:id:Karvan:20180515234422j:plain

 

Unity上ではテキストオブジェクトをマスクの範囲に設定しておいて

f:id:Karvan:20180515234726j:plain

 

以下のようにコードを設定すると、文字がスライドインして表示される動作になります。

 

        // "Hint"文言のスライドイン
        Hashtable moveToParam = new Hashtable();
        moveToParam.Add("y", 55.0f);
        moveToParam.Add("islocal", true);
        moveToParam.Add("time", 0.5f);
        moveToParam.Add("easeType", iTween.EaseType.easeInBounce);
        iTween.MoveFrom(SignMessageTitleObj, moveToParam);

        // ヒントのスライドイン
        Hashtable moveToParam2 = new Hashtable();
        moveToParam2.Add("y", 108.0f);
        moveToParam2.Add("islocal", true);
        moveToParam2.Add("time", 0.5f);
        moveToParam2.Add("delay", 0.1f);
        moveToParam2.Add("easeType", iTween.EaseType.easeInBounce);
        moveToParam2.Add("oncomplete", "OutTweenComp");
        moveToParam2.Add("oncompletetarget", gameObject);
        iTween.MoveFrom(SignMessageWordObj, moveToParam2);

 

 

 

f:id:Karvan:20180508234317g:plain

 

これをMoveToなどで実装しようとすると、UIの位置を移動元の位置へ移動させておく必要があるので、後で画面のデザイン変更とかする際に、UIの位置を一旦全部元に戻してデザイン変更→再度、移動元の位置へ移動させる、とか結構不便。

 

UIにはFrom系

  別に固執しているわけではありませんが、ボタンやラベルとかのUIについては最終的な状態(位置や大きさ)が決まっているのでアニメーションにはFrom系のメソッドを使ったほうが実装しやすいと思います。
 
 今回はMoveFromを取り上げましたがiTweenには他にScaleFromやFadeFromなどのメソッドがあります。ScaleFromは使ったアニメはこんな感じ

 

f:id:Karvan:20180516000150g:plain

From系を組み合わせると色々な表現が出来そうですね。

 

近況報告

追加ステージは完成したので現在はエンディングを作成中。GW明けには・・・とかウソだった。

goo.gl

Unityで一時停止処理を実装したい

GWが明けて

GW明けということもあり、きっと色んな職場や学校では期間中にどこへ行っただとか、何々を観てきただとかの話題が飛び交って賑やかなことだと思うのですが、私は静かです。お土産とかもらってばかりだし。

 

休みの間にやったことと言えば、Unityでゲームを作ったり、Unityでゲームを作ったり、Unityでゲームを作ったりしてました。テレビも観ずに部屋に閉じこもってばかりいたので、いつの間にかTOKIOが四人になっていてビックリ、とかそんな状況です。まるでGW中は意識が一時停止していたみたいな間隔。

 

一時停止といえば・・・

CutieCircuitのアップデートで一時停止機能を作ろうと思い色々を調べたのですが、結構面倒くさい。
真っ先に出てくる方法といえばTime.timeScaleを0のする方法ですが、これが意外と使えない。

 

まず、何から何まで止まってしまうので、例えばボタンにクリック時のアニメーションとか設定していても止まってしまう。にも関わらず、Update関数は止まらずに呼ばれるので、Update関数で入力処理やタイマー処理とか実装していたら当然動いてしまう。
(注:FixedUpdate関数は呼ばれなくなります)

 

なのでこの方法はパスするとして、他にないか調べると以下の方法が

  • レンダラ以外のコンポーネントをenable=0にする

ああ、なるほど、面倒くさい

 

面倒くさいのヤダ

といわけで、面倒くさい事はできるだけ避けてきた人生なので、もっと楽に実装できないかとあれこれ考えて、以下の結論に達しました。

 

  1. UI系は止めずに一時停止中は触れないようにする。
  2. タイマー処理はフラグを参照してスキップする。
  3. オブジェクトの動作はDOTweenを一時停止する。

 

要は絶対停止してほしい物だけを止めて、あとはユーザが操作できなければ良い、という思想

 

1.UI系は止めずに一時停止中は触れないようにする。

 これは簡単。ScreenSpace-Overlayの最上位CanvasにRayCast Targetを設定したPanelを全面に表示するだけ。


最前面のPanelにRayCastが飛ぶので、その下にあるボタンやらのUIにはイベントが通知されなくなります。


Canvasを最上位するにはSortOderの値を大きくしてあげれば大丈夫です。

 

2.タイマー処理はフラグを参照してスキップする。

 これも簡単。一時停止フラグみたいな変数を作ってUpdate関数の最上位で参照するだけ。

 

3.オブジェクトの動作はDOTweenを一時停止する

  Cutie CircuitはUI系はiTween、それ以外のオブジェクトはDoTweenで動作させています。


別に一時停止機能の為にそうした訳ではなくて、ただiTweenのMoveFrom系がUIのスライド表示に便利で使っていただけなのですが、使い分けが出来ていたのでDoTweenの一時停止でUI以外は全て止めることができます。

DoTweenって何?って方は以下の記事を参照してください。

qiita.com

DoTweenの一時停止はPauseAll、RestartAllで行うことができますし、timeScaleを0にしても止める事が出来ます。

 

 DOTween.PauseAll();
 DOTween.RestartAll();
 DOTween.timeScale = 0.0f;

 

今回の場合は、TogglePauseAllを使用して実装しました。これは一回呼ぶと停止、二回目呼ぶと再開、という超便利関数。

 

 DOTween.TogglePauseAll();

これを一時停止ボタンのクリック時に呼び出すだけ!めっちゃ楽!

 

で、これらの対応で一時停止の機能を実装するとこんな感じになります。

 

f:id:Karvan:20180508234317g:plain

 

UI系は止まってないので、一時停止を押してもテキストの表示等が行うことが出来ます。

 

注意事項

これで大体想定どおりの動きになったのですが注意事項もあって、DOTweenのPause関数で止める事が出来るのは現在動作中のTweenのみです。例えばコルーチン等でPause関数の呼び出し後にDOTweenを呼ぶとそのtweenは動いてしまいます。

 

追記:

アニメーションを止める場合は各オブジェクトのAnimatorのspeedを0にする必要があります。

ん~、これはこれで結構面倒くさいかも・・・"(-""-)"

 

Cutie Circuit追加ステージ完成!!

やっとここまで

非リア充には辛く長かったGWをほとんど費やしてCutie Circuitの追加ステージが完成しました!!!

 

https://www.youtube.com/edit?o=U&video_id=Zi4SWR1O-Cc

(注意:音が出ます)


Cutie Circuit追加ステージダイジェスト

 

完成間近

これで当初から想定したステージは全て作成したので、後はストーリー関連のイベントとエンディングを作れば完成になります。あー、長かった。

 

正直、現在GooglePlayにリリースしているバージョンは全くダウンロードされていませんが、ロゴも一新して完成版リリースで出直しです。iOS版もリリースするし、あと一歩頑張ります!!

 

 

 

 

 

エンディングかー・・・はて、どうしよう・・・

 

 

MacBookを購入したよ、という話

もうすぐゴールデンウィーク

 来週から大型連休が始まりますね。世の中の方々は旅行やショッピング、遊園地やコンサートなど色々なレジャーを楽しまれるのでしょうね。

私の予定は真っ白ですが、なにか?

IndieGameFestivalのファイナルイベントを目論んでいたので予定を空けていた、とか言わないよ絶対。きっとゲーム制作で時間を潰すことでしょう。

 

GW明けの目標

 何故か勤め先が「5/1,2は有給取得奨励日!!」とか、ありがた迷惑なキャンペーンをぶち込んできたので私一人だけ出勤しますよ、とは言えないよ絶対、的な状況になり一週間丸々ゲーム制作で時間を潰すことができるので、「Cutie Circuit」の追加ステージ諸々もきっと完成することでしょう、きっと、たぶん、できれば。。。

 

予定通りにいけばGW明けには完全版をリリースできるでしょうし、併せてiOS版もリリースしたいと思っています。

 

iOS版をリリースしたい

 なので、iOS版用のビルド環境が必要となるのですが、Unityの場合はプラットフォームの切替ができるため、「Cutie Circuit」についても現在のAndroid用環境からiOS環境に切り替えればデバッグの環境は簡単に整えられます。だがしかし、それをビルドして実機にインストールしようとすると簡単にはいかないらしい。
 
 詳しいことは省きますが、Unityでビルド後にXcodeでビルドして実機に転送する必要があるそうで、XcodeはiOS上で動かす必要があるのでWindowsPCしか持ってない私としては、取るべき選択肢は3つ。

 

  1. Windowsに仮想PCを構築してそこにMacOSXを入れてビルドする
  2. Unity Cloud Buildを利用してiOS用にビルドする
  3. 素直にMacを購入する。

 

で、それぞれを精査すると

  1. 仮想PCを構築→面倒くさい
  2. Unity Cloud Buildを利用→面倒くさい
  3. Macを購入→簡単!

 

というわけで、そうです。ついに購入しました、MacBook Air!!(中古だけど)

f:id:Karvan:20180424233440p:plain

ジャジャン!!Airというほど軽くないけどAir!!

 

これで私も立派なアップル信者です。オープンカフェのテラス席でエスプレッソ飲みながらMacBook開いてやります。横にジョブスの伝記本を置いて英字新聞読んでやりますよ。(読めないけど)

 

MacBookを購入して

 本当はUnity Cloud Buildも検討したのですが、色々調べるとCloud Buildはビルドに時間が掛かるらしいのと、今後のことを考えるとMacが手元にあった方が良いし、と思い切って購入しました。

 

元々iPadは購入していたのでこれをテスト機として使用する場合、PCから直接転送できたほうが便利だし、Unityのプラットフォーム切替には結構な時間を要するので、PC1台で環境を切り替えるよりは2台でAndroid/iOSそれぞれの環境を用意したほうが楽だと思う。

 

なので手元に届いてから早速、環境構築に着手したのですが、なんせMacを購入するのは初めてなので、「感圧式とかなんだよ!反応しないし!半角/全角キーってどこ?コピペってどのキーを押すの?commandってなんだよ!」とかOSの違いに戸惑いの連発。

 

ブツブツ文句を言いながら、なんとかWifiに接続するまでは完了したのですが、問題はその次、UnityをダウンロードしようとUnityのページを開くと・・・

 

f:id:Karvan:20180424233957p:plain

 

あの・・これ以上、下に行かないんですが・・・

 

f:id:Karvan:20180424234244p:plain

 

選べないんだって。下に行かないから。

 

うーん・・・タッチパッドの使い方、間違ってるのかなぁ・・

 

宣伝

「キューティーサーキット ~どうぶつ達と旅にでよう~」Android版のみですが絶賛公開中!!

f:id:Karvan:20180326204307p:plain

goo.gl

 

 

誤解と告白

4月になって・・・


新年度になったということで私の会社でも新入社員の歓迎会が開かれたのですが、社長が初っ端の挨拶で「・・・まぁ、三年後には三割ぐらいが辞ていると思うけどね。」と火の玉直球を新人に投げ込んで笑った。
確かにその通りだけれども。

 

さて・・・

 

「原カバン」という呼称はゲーム製作を始める以前から使用している呼称なのですが、最近では何故かこの呼称を前に出すと、「ああ・・・可愛いですよね。」(ニヤニヤ)的な反応を返されたり。
なんだろう?と不思議に思って、Google先生に「かばん」をキーに尋ねてみると・・・ああ、なるほど。

 

いや、いや、関係ないし。ってか全然知らないし。あっちはひらがなで、こっちはカタカナだし。

 

とか思うものの、アニメとか全然見ない人間なのに、がっつりアニヲタをアピールしているような状態。うーん・・・


大体、世間一般では「ゲームを作っている=アニメ好き」と変換されることが多いようで、先日も会社の後輩に「ゲームアプリを作っている」と言ったら何故か、パ行がやたら多く脳が覚えることを拒否するタイトルのアニメの話を延々とされる、といった理不尽な目にあったりすので、この誤解はなんとか解かないといけない。

 

えー、後輩の○○君、私のメールアドレスに深夜アニメのタイムテーブルを送りつけてくるのは有難いけど迷惑です。お勧めポイントに声優の名前をあげられても分かりません。

 

状況を打破すべく

 

「カバン」という呼称を別の名前に変更することも考えたのですが、このブログのタイトル変えるのは忍びないし、すでにこの名前のGoogleアカウントで開発者登録しているし、で色々面倒くさい。
幸いなことにゲーム開発者としては未だ名が売れてないので、しばらくはこの状態でも大丈夫だとして、対策すべきは後輩の○○君だなと。

 

色々考えて、アニメより別のものが好きなんだ、とアピールすれば彼の熱心な布教活動にも傷つけることなくフェードアウトできると思ったんですよ、ええ、だから思い切って「アニメよりもアイドルが好きかな・・・ハロプロとか・・・」と告白。アニヲタとはちょっとラインの違う趣味を打ち明ければきっと彼もあきらめて・・・

 

「ああ、ハロプロですか~・・・それより欅坂お勧めですよ・・・・」

 

えー、後輩の○○君、長澤ねるは確かに可愛いですが、写真集を貸してとは言ってません。出勤前の私の机に置ないでください。

 

宣伝

そんな感じで状況を打破すべくGooglePlayにアプリをリリースしています。

 

goo.gl

追加ステージ、およびエンディング等は現在作成中でGW明けぐらいにiOS版と供にリリースできたらな、と思っています。

 

今回はUnityの話がなかったな。まぁいいか。

 

Unityでビルド時にCommandInvokationFailure: Unable to convert classes into dex format.エラーが出たときの対処

桜散る・・・

 インディーゲームフェスティバルのTOP20が発表されましたね。
我が「キューティーサーキット」は残念ながら選外となったのですが、選ばれたアプリの中には、インディゲーム界隈で既に話題となっていたタイトルもあったりして、結構な有名どころも応募していたことを知ってビックリ。
みんな狙うところは一緒なんですね。

 

というわけで・・・

 目標としていたコンテストに落選、と大変残念な結果となったわけですが、逆に考えると未完成分のステージの作成やらイベント関連の構築などの「キューティーサーキット」完成版リリースまでの残作業については焦って作業する必要もない訳で、これまでのように深夜までPCの前に噛り付いて時間に追われることもない、と思うとちょっとホッとしたり。

 

その先を曲がったら、きっと星空が広がっている

 

この気持ちでがんばります。

 

さて・・・

 急いては事を仕損じる、と諺にもあるように、何事も焦ってやると失敗しがちで、急ぐときほど落ち着いて行動するべきなんですが、時間に追われてそんなことを言ってられない状況になると、ついつい楽に解決できる方法に流れてしまい、後で大きな後悔をする羽目になったりすることってあります。

 

 「キューティーサーキット」の場合もそうで、Unityで課金処理を実装するのはそんなに難しくないらしいのですが、製作中は余裕を持って調べることができなかったので、より簡単に実装できるアセットを購入して課金処理を作成しました。


 が、つい先日、そのアセットがUpdateしたよ。とUnityからメールが来たので、ホイホイとアセットストアからダウンロードしてアップデートしたらワラワラとエラーがでる。

 

 内容は、クラスが重複しているよ。というエラー。どうやら今回のアップデートで大幅にディレクトリ構成を変えたらしく、スクリプトファイルが上書きされず、以前のスクリプトが残ったままになっている。
 
 ん~、なんじゃそれ、とは思ったものの、仕方なく重複分の古いファイルをポチポチと削除、すると今度は元々使用していたメソッドに対して、そんなメソッドはないよ。見たいなエラーが発生。はぁ?と、どういうこと?と調べると、ディレクトリ構成だけじゃなく、クラス名が丸々変わっていたりするものがある。
 
 いや、いや、ありえんし。どっかの金融系システムじゃあるまいし、3社合同で開発とかしてるわけじゃないんだからi/fの整合ぐらいはちゃんとしろよ。と怒りに震えたのですが、その振り上げた拳を下ろすところはどこにもないので、至ってポーカーフェースのまま静かにソースの修正を実施。時間をかけて修正して、これで大丈夫だと思ってAndroidビルドしてみると
 
 CommandInvokationFailure: Unable to convert classes into dex format.

ゴ━━━━(# ゚Д゚)━━━━ルァ!!

 

plug-inが重複ですか、そうですか。
そうです、上記のエラーがでて、詳細エラーメッセージに java.lang.IllegalArgumentException: already added とか表示される場合は、クラスファイルの多重定義になっています。
ソースレベルでのクラスファイルの重複はビルド以前にconsoleに表示されるので分かるかと思いますが、そうでない場合はPluginsフォルダ内のaar/jarファイルでクラスファイルが重複している可能性があります。
今回の場合は、バージョン違いのaar/jarファイルが重複して存在していたため、上記のエラーとなっていました。
古いaar/jarファイルを削除してスッキリさせましょう。そして、このエラーでGoogle検索してこのブログを開いてここまで読んでくれた方、ご苦労様、ありがとう。焦らずにもっと簡潔に書いてあるブログを探しましょう。

 

そういえば・・・

 はてなブログをPro版に変えたのでドメインを取得しました。これでGoogleアドセンスに申し込める!と思って申し込んだら見事に審査に落ちました。コンテストといい落選続きです。ええ、性格が悪いからですね。

 

最後に宣伝

 ダウンロード数は全く伸びませんが、完成版をリリースする計画は変わりません。iOS版もリリース予定です。がんばります。お子様からお年寄りまで楽しめる内容となっています。とか、プレスリリースしても今のところ全て空振りです。こちらも落選続きです。つまり、性格が悪いからですね。

goo.gl

と、思ったら・・・

Appliv様にレビューを掲載して頂きました。ありがとうございます。

良かった、性格悪くなかった。

android.app-liv.jp

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。