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

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

お知らせのブログ

カッタデー

日本勝ちましたね!!

まさか勝つとは思わなかったので、21時過ぎに帰宅したらリードしていてビックリ。一夜漬けみたいなチーム作りで三戦全敗を予想していました。御免なさい(土下座)。

 

デキタデー

この勢いに任せて、というわけではありませんが、当初の計画ではとうの昔にリリースを終えているはずのCutiteCircuitのアップデート、長い苦労の末ようやく完成しました!パチ!パチ!

 

f:id:Karvan:20180328195705p:plain

f:id:Karvan:20180326204448p:plain

 

 3月の末に初版をリリースしてから思いのほか日数を要しましたが、一応これで完成です。バグは随時改修するとして、これ以上の大きな変更や追加はないと思います。まぁ、容量が100MBギリギリなのでこれ以上増やせない、というのが正直なところなんですが。

 

今回のバージョンの主な変更点は

  • 4ステージを追加、これで全16ステージに。
  • イベントを追加、ちょっとしたストーリー仕立てになります。
  • ポーズ処理を追加。
  • 全体的に難易度を簡単に。
  • 全ステージクリアでエンディングが表示されます。

こんなところでしょうか。難易度を下げたことで遊びやくなったと思います。

 

残りはiOS版のリリース!あとひと頑張りです!!

 

 

UnityでAndroidビルドエラー解消までの道のり(Unity2018編)

私以外にはどうでもいいことですが

Twitterでフォローしているアカウントを整理しました。
ゲーム製作者を中心に300近くフォローしていたんですが、TLで追えなくなって来たのでガッツリ減らしました。


個人的にログを溜め込んでいるのって消化しないといけないTODOを溜め込んでいるような気がして落ち着かないので、小まめにTLをチェックして消化しているのですが、いい加減疲れました。フォローされていた方、ごめんなさい。悪意はありません。ただ疲れただけです。


4桁以上フォローしている人ってどうしているんだろう?ちょっと時間を空けるとわんさかログが溜まっているような気がする。

 

そんなことをいいながらも

ログを溜め込むのは嫌い、とは言いながらゲーム制作の方は作業を溜め込んでいて、CutieCircuitのアップデート版もGW明けにリース予定→5月末にリリース予定→6月上旬にリリース予定・・・と延ばし延ばしになっている現状ですが、え、ちょっと待って、これには訳があるんだけど(よくある女子ツイート風に)

 

先週のうちには作業を終えていて、後はビルドするのみとなっていたのですが、このビルドが中々通らない、四苦八苦しながら約5日を費やし、昨日ようやくビルドができるようになったので今回はそのお話

 

Unity2018でビルドエラー

UnityのプロダクトをAndroid端末で動かそうとするとビルド作業が必要です。
このビルドを行うための環境づくりも面倒なのですが、それはそれとして、もっと面倒なのがビルドエラーの対応

 

エラーメッセージは英語なのでGoogle先生に翻訳してもらいながら作業になるし、対処方法を検索してもドンピシャの解決法が見つかるとも限らない。しかも英語のページが多いし。


まぁ、代表的な解決方法は日本語のブログでも幾つか記事に纏められていて、大抵の方はそちらを参照すれば解決するかと思います。

 

  • Andoridビルドエラーについてのまとめ

nn-hokuson.hatenablog.com

 

 

上のリンクでもあるように代表的な対処方法とすれば

 

  • SDKのファイルパスを確認する: UnityのメニューからPreferences→External Toolsを選択してAndroidのSDKに表示されているパスが正しいか確認する。

 

  • toolsフォルダを更新する:/Users/ユーザ名/Library/Android/sdkフォルダの中にあるのtoolsフォルダをr25.2.5-windows.zipをダウンロードして置換する。

 

私の場合はそれを試しても全くダメ。まさにお手上げ状態でした。

 

 ビルドエラー解消までの道のり

表示されるビルドエラーは以下の内容

Failed to re-package resources

 

CommandInvokationFailure: Failed to re-package resources. See the Console for details. C:\Users\***\AppData\Local\Android\sdk\build-tools\27.0.1\aapt.exe package -auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “C:/Users/***/AppData/Local/Android/sdk\platforms\android-27\android.jar” -F bin/resources.ap_

以下、数十行のエラーログ

 

うーん、分からん。。。とりあえず、build-tools云々といっているからbuild-toolsのバージョンを下げてみることに。


Android Studio を立ち上げて、SDK Managerからbuild-toolsに26.0.3を選択し、逆に27.0.1のチェックはずしてOKを押す。


更新が完了するとbuild-tools配下に26.0.3が作られて27.0.1が消えている。よし、これでどうだ!!

Failed to re-package resources

CommandInvokationFailure: Failed to re-package resources.

以下、略

 

うーん。。。だめだったか。。。ならば、もう一つバージョンを下げてみよう。今度は25.0.3をインストール。さあ、これで!!

CommandInvokationFailure: Unable to merge android manifests. See the Console for more details.

stderr[
]
mp\StagingArea\AndroidManifest-main.xml:18, C:\Unity\***\Temp\StagingArea\android-libraries\android.arch.lifecycle.runtime-1.0.0\AndroidManifest.xml:3] Main manifest has <uses-sdk android:targetSdkVersion='25'> but library uses targetSdkVersion='26'

 おお、エラーが変わった!これは前進しているということか!(←大きな勘違い)


AndroidManifest.xmlのバージョン指定を書き換えればいいのか!(←無駄です)


やっとこれで解決する!!(←しません)

Failed to re-package resources

CommandInvokationFailure: Failed to re-package resources.

 

以下、略

 

ヽ(  ̄д ̄;)ノ オテアゲー

 

ここから迷走が始まり。

  •  ビルドシステムをGradleに変更する(←状況変わらず)
  •  SDKのbuild-toolsを最新(28.0.1)に更新する(←状況変わらず)
  •  ならばとUnity2017をUnity2018へバージョンアップさせる。(←丸一日掛かった)
  •  UnityIAPを入れなおす。(←なんとなく)
  •  VisualStudioを2017へバージョンアップさせる(←そうしないとUnity2018では怒られる)
  •  FIFA18のワールドカップモードで日本を準優勝させる(←現実逃避)

 

 何をやっても状況は変わらず袋小路から抜け出せない。このままではアプリはリリースできない→せっかくロゴを依頼して作ってもらったのに水の泡になる→ロゴ製作者の方に顔向けできない→ゲーム開発者として終了、とまで追い詰められたのですが、ふと思い立って、別の作りかけのアプリをビルドしてみることに。

これまではずっとCutieCircuitだけをビルドしていたので、他のアプリではどうなるか試してみようと思ったんです。そうしたら。。。

 

ビルドが通った!APKが作成された!

 

ということは、ビルドが通らない原因はAndroidの環境ではなくCutieCircuitプロダクト固有の原因、ということになります。

なので、もう一度エラーメッセージを見直してみると、先ほどから「以下、略」で省略していた箇所にヒントがありました。

stderr[
D:\work\unity\Cutie Circuit\Cutie Circuit\Temp\StagingArea\android-libraries\com.android.support.support-compat-26.1.0\res\layout\notification_action.xml:17: note: removing attribute http://schemas.android.com/apk/res/android:paddingStart from <LinearLayout>
D:\work\unity\Cutie Circuit\Cutie Circuit\Temp\StagingArea\android-libraries\com.android.support.support-compat-26.1.0\res\layout\notification_action.xml:32: note: removing attribute http://schemas.android.com/apk/res/android:paddingStart from <TextView>

D:\work\unity\Cutie Circuit\Cutie Circuit\Temp\StagingArea\android-libraries\com.android.support.support-compat-26.1.0\res\layout-v16\notification_template_custom_big.xml:32: note: removing attribute http://schemas.android.com/apk/res/android:layout_marginStart from <LinearLayout>
D:\work\unity\Cutie Circuit\Cutie Circuit\Temp\StagingArea\android-libraries\com.android.support.suppor<message truncated

 

Tempに展開されたcom.android.support.supportについてのエラーとなっていますが、このフォルダ自体はAssets/Pulgins/Andorid配下にあるcom.android.support.support-***.aar

ファイルが解凍されて展開されているみたい。

なので、Assets/Pulgins/Andorid配下の中を確認すると

f:id:Karvan:20180613004044j:plain

 不自然に日付が古いaarファイルが幾つかあります。

さらにそれらの中を確認するとcom.android.support.support-***.aarのファイルとダブっているように見える。ならばと、この古いaarファイルを削除してみると。。。

 

ビルドが通った!APKが作成された!

 ___                             ム  i
 「 ヒ_i〉                            ゝ 〈
 ト ノ                           iニ(()
 i  {              ____           |  ヽ
 i  i           /__,  , ‐-\           i   }
 |   i         /(●)   ( ● )\       {、  λ
 ト-┤.      /    (__人__)    \    ,ノ  ̄ ,!
 i   ゝ、_     |     ´ ̄`       | ,. ‘´ハ   ,!
. ヽ、    `` 、,__\              /” \  ヽ/
   \ノ ノ   ハ ̄r/:::r―–―/::7   ノ    /
       ヽ.      ヽ::〈; . ‘::. :’ |::/   /   ,. ”
        `ー 、    \ヽ::. ;:::|/     r’”
     / ̄二二二二二二二二二二二二二二二二ヽ
     | 答 |     コ ロ ン ビ ア  │|
     \_二二二二二二二二二二二二二二二二ノ

 この対応で正しいのか?

 Pulgins配下のaarファイルは私が意図的にインストールしたものではないため、おそらく何かのアセットをインストールした際に入ったものだと思います。なので、このファイル削除が正しい対応なのかはわかりません。


ただ、現状ではアプリの動作に支障はないみたいなので、これでAndroid端末での動作確認を進めようと思います。

 

まぁ、とりあえずビルドが通ったので後はリリースするだけだと思うでしょ?ただ、現状ではAPKのサイズが190Mbyteあるんです。

うわっ・・・私のアプリサイズ、大きすぎ(よく見かける広告風に)

 

100Mbyteの壁再びかぁ・・・・

 

DoTweenのDOPathを使ったキャラクター移動

最近の愚痴というか・・・

 ここ最近の働き手不足は深刻なようで、行く先々のコンビニで店員がネパール人だったり中国人だったりと、いったいここはどこの国の店だろう?と思うような事態になってきて、そういう海外の方が店員だったりすると、肉まんとかチキンとかちょっとした口頭での注文が頼みづらいなー、とか思ったり。

 

私の滑舌が悪い所為もあるのでしょうが、何度も「ナンデスカ?」と聞かれるとちょっと心が折れる。
この前とか、チーズバーガーをレジに持っていったらネパール人らしき店員が温めずにそのまま袋に入れようとしたので「温めてください」とお願いしたら「What?」とか言われたし。ああ、ごめんなさい、ごめんなさい、英語できない私が悪いんです。そのまま食べます。

 

別にコンビニ店員の国籍が豊かになるのには反対しませんが、日本人の店員という選択肢がないという状態は不便に感じますね。

 

で、今回の話

 

unityでキャラクターを動作させる方法は色々あると思いますが、キャラクターの移動経路があらかじめ決まっている場合はDoTweenの経路移動機能(DoPath/DOLocalPath)を使うと便利です。

 

DOPath/DOLocalPathとはその名前の通り、オブジェクトを指定された位置へ順番に移動させるというもので、位置を表すVector3の配列を渡して使用します。

DOPathと DOLocalPathの違いは座標の指定を絶対座標にするか、ローカル座標にするかの違いですが、性能的にはローカル座標を使用したほうが良いみたいです。

 

下の例だと、targetのオブジェクトをローカル座標(1, 2, 2)→(8, 0, 4)→(5, 4, 10)の順に2.0秒掛けて移動させます。最後の引数のPathType.CatmullRomは移動タイプ=曲線を指定しており、各ポイント滑らかな曲線を描いて移動します。

 

Vector3 paths = new {
new Vector3(1, 2, 2),
new Vector3(8, 0, 4),
new Vector3(5, 4, 10)
}

Tweener tween = target.DOLocalPath(paths, 2.0f, PathType.CatmullRom);

 

このDOPathの何が便利なのかというと、用意されているオプションが使いやすい。

例えば、

 

Tweener tween = target.DOLocalPath(paths, 2.0f, PathType.CatmullRom).SetOptions(true);

 

と指定するとpathsで指定した最後の位置まで移動したら、最初の位置まで自動的に戻ってくれます。

 

CutieCircuitでの使用例

CutieCircuitでは色々な箇所でDOLocalPathを使用していますが、代表的なのはメニュー画面でプレイヤーのキャラクターが机の周りをグルグル歩き回る動作。

 

f:id:Karvan:20180606000348g:plain

 

これはまずキャラクタを移動させるポイントを決めます。

f:id:Karvan:20180605233517p:plain

 

次にこのポイントの位置をVector3の配列に編集し、DOLocalPathに渡します。

    /// <summary>
    /// 通常経路移動開始
    /// </summary>
    public void Start_NormalPathMove()
    {
        Vector3[] MovePath = new Vector3[NormalPath.Length];

        for (int iCnt = 0; iCnt < NormalPath.Length; iCnt++)
        {
            MovePath[iCnt] = argPointArray[iCnt].transform.localPosition;
        }

        nowPathTween = AvatorObject.transform.DOLocalPath(MovePath, 8.0f, PathType.CatmullRom)
                                                        .SetOptions(true)
                                                        .SetEase(Ease.Linear)
                                                        .SetLookAt(0.05f, Vector3.forward)
                                                        .SetLoops(-1);

    }

 

ここで上記のようにSetOptionsにtrueを設定すると元の位置まで戻ってくれるので、後は繰り返し回数を指定するSetLoopに-1=無限回を渡すとキャラクターが机の周りを廻り続けてくれます。

 

ただし、このままではキャラクターは進行方向を向いてくれないのでLookAtオプションを使用しています。


LookAtオプションでは特定の値や特定をオブジェクトを指定することで、Pathを使って移動している間、オブジェクトの向き(Z方向=前方)を移動方向へ向せることができます。

 

.SetLookAt (0.05f, Vector3.forward)

 

ここで第一引数の0.05fという数字ですが、これは指定した方向を0.05秒だけ先読みした形で向かせることを指定しています。

これによってスムーズな方向転換が可能になり、より違和感のない走行に見せることができます。

 

ここら辺の話は以下のリンクに詳しく書かれています。

www.shibuya24.info

 

毎度の進捗報告

あっという間に気がづけば6月です。リリースするよ、もうすぐ完成するよー、とか言いながらWindowsUpdate並みに終らなかったCutieCirtuitのアップデートですが、ここに来てようやく完了しました(と思う)。これからiOS版のビルド作業に入って、アップルストアの審査→リリース、という手順になります。Android版は出来上がっているので近々リリースします(希望)。

 

まぁ、アップデート作業が終れば一息つけるので、前々から欲しかったSwitchを購入してゼルダの伝説でも楽しもうかな、と思っていたのですが、なにせiOS版リリースのためにMacBookを購入したり、使い切れないアセットを購入したりで散財したのにCutieCirtuitの売り上げは0円という、自虐ネタにもならない赤字を計上しているのでしばらくは手が出せそうにありません。ギャフン。

 

 

Cutie Circuitで使用しているアセットの紹介

歯の定期健診にいったら・・・

歯科の受付の女性がとても可愛くて、やべぇ、毎週でも通いたい!と思ったものの、歯石取りの痛さに心折られて、やっぱりもう二度と通いたくない気分になる、そんな日々をタラタラと過ごしている今日この頃ですが、CutieCircuitのバージョンアップ作業はようやく終わりが見えてきました。(そんな気がする)

 

大きなバグがなかったり、アプリサイズが100メガの壁を越えたりしなければ近々にでもリリースできるかと思います。(そんな気がする)

 

なので今回は、リリース前のまとめとして、CutieCircuitで使用しているUnityのアセットを紹介したいと思います。
決してネタ切れとか、他に書くことが思いつかなかったとか、受付でお金を払うときにその女性が私に向かって微笑んでいたとか、そんな気がする、きっと・・・これが恋・・・(両手挙げてジャンプ)とか、そんな訳ではありません。

 

CutieCircuitで使用しているアセット

使用アセットを全ては紹介しきれないので、ジャンル別に主なものを紹介したいと思います。

 

完成プロジェクト

The Rings

CutieCircuitのベースになったプロジェクト、とはいえ、ほぼ作り変えたので使っているのは素材だけです。残念ながら現在アセットストアでは売られていないようです。

 

3Dモデル

Yippy Kawaii

このアセットを購入してCutieCircuitのコンセプトを決めました。プレイヤーのキャラクターに使用しています。
作者のSYURINのモデルはどれも可愛く、ほぼ全ての敵キャラがSYURINのモデルです。

 

Fantasy Kingdom Pack

ファンタジー系の素材モデルが全てそろっているアセット。建物系、インテリア系のモデルが何種類もあり、全てを把握しきれないぐらい。サンプルシーンもそのままゲームで使えるぐらい素晴らしい。

 

Cubes Package

土や芝生、溶岩などいろんなブロック素材があります。形も完全な立方体と角が丸い立方体の二種類あり、作りたい物によって使い分けることができます。各ステージのコースは、ほぼこのアセットを使って作りました。

 

Tween系

iTween

ボタンやテキストなどのUIのTweenアニメーションに使っています。From系の動作が超便利

 

DoTween

3Dモデル等のTweenアニメーションにはこちらを使用。iTweenより動作が速い。Sequenceを使えばアニメーションを連続して再生できたりして汎用性が高い。有料のプロ版もあります。

 

シェーダー

Curved World

平面の地形を球体のように湾曲させて描画するシェーダー。斜め上からの視点はどうしても奥行きが出ないんですが、このシェーダーで奥行きのある画面を作れます。ゲームのメイン画面には全てこのシェーダーを使用しています。

 

パーティクル・エフェクト

Epic Toon FX

魔法系の綺麗なパーティクル集。種類も豊富で色違いも多数。

 

Fantasic Cartoon FX

カートゥーンっぽいパーティクル集。火山ステージでの吹き上げる竜巻とかはこのアセットを使っています。

 

CameraPlay

  指定したカメラに対してエフェクを掛けるアセット。フラッシュやらノイズやら、ちょっとしたエフェクトを一行で書くことができます。

 

UI

Cartoon UI#2

丸みのあるUI(ボタン、ウィンドウ)が詰まったアセット。色合いも可愛いのでCutieCircuitのコンセプトにピッタリでした。

 

80 Fantasy Skill Icons

各ステータスのアイコンにはこのアセットを使っています。スキル系のアイコンはハードでカッコいいタイプの物が多い中、これは可愛くて重宝しました。

 

音楽

Fun in the Sun

ゲーム音楽は明るいポジティブなものにしたかったのでこれを採用。音楽系のアセットは他にも多数購入したのですが、このアセットが一番採用率が高かった。

 

Game Music Pack - SUITE

音楽系アセットでは定番中の定番。日本人作家さんなので日本人の趣向に合う音楽が多数。ボーカロイドの楽曲もあり、CutieCircuitでも使わせてもらっています。

 

他にもファイル系のアセットとかアニメーション系のアセットとか色々使用していますが、今回はこの辺で。

 

進捗報告

ほぼ毎週のように、もうすぐ出来る!、もうすぐリリース!、とか言っている気がしますが、本当にあとちょっとで完成です(そんな気がする)
MacBookも購入済みなのでiOS版も合わせてリリースできると思います(そんな気がする)。

 

ただ、MacBook全然使ってないとか、開発者登録を未だしてないとか、そもそもWindowsで開発しているUnityプロジェクトをMacBookに移してちゃんと動くんだっけ?とか不安要素も含みつつの作業なので、どこかで躓くかもしれません。


なにせこれがiOS版リリースは初めてなので、すんなりリリースまで漕ぎ着けるのか分かりません、調べるといろいろ手順が多くて作業は単純じゃないようです、そう、可愛いあの子と仲良くなるきっかけつかみたい、だけど、単純じゃないの、きっと・・・これが恋・・・(両手挙げてジャンプ)、みたいな感じで。

 

取り合えず頑張ります。

 

 

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にする必要があります。

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

 

◇プライバシーポリシー

●個人情報の利用目的

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

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

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

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

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

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

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

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

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

●免責事項

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

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

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

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

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

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