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

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

走るキャラクターに土煙を付けたい

最強寒波とやらで極寒の中、健気にエナジードリンクのサンプルを配布しているお姉さんがいたので、「くそ寒いから要らないけど貰ってあげよう、可哀そうだし、家に持って帰って飲もう」と思って、鼻の下が伸びないように注意しながらお姉さんに近寄っていったのですが、そのお姉さんが「ありがとうございます。」とか言いながら、プシュッと蓋を開けて渡したわけです。

ここで飲めと?

とりあえず、雪が舞う中 でエナジードリンク飲んでも体は暖かくならないことは分かりました。

 

さて、移動するキャラクターが土煙を巻き上げて走っているように見せたい場合、キャラクターの足元に煙のパーティクルを出す方法があるみたいです。

 

tsubakit1.hateblo.jp

車やバイクとか高速で移動する物体だとこの表現で十分なのですが、一般的な人型のキャラクターにこれを付けるとちょっとオーバーかな?と思えたり。みんなアラレちゃんになるし。

 

できれば一定間隔で土煙が巻き上がる感じの表現にしたい。

f:id:Karvan:20180112222527g:plain 

こんな感じで。

 

なので、その方法を模索してみまた。

 

まず、土煙のパーティクル本体に以下のスクリプトを設定して、パーティクル再生後に一定期間で消滅するようにします。

 

public class Dust_AutoDestructShuriken : MonoBehaviour {
    // 生存時間
    float lifeTime;

    public void OnCheckOn()
    {
        // パーティクルの開始
        ParticleSystem myParticleSys = this.GetComponent<ParticleSystem>();
        myParticleSys.Play();

        // アクティブ監視処理実行
        StartCoroutine("CheckIfAlive");
    }

    IEnumerator CheckIfAlive()
    {
        while (true)
        {
            yield return new WaitForSeconds(lifeTime);
            if (!GetComponent<ParticleSystem>().IsAlive(true))
            {
                GameObject.Destroy(this.gameObject);
            }
        }
    }
}

 

次に、上記スクリプトを設定したパーティクルオブジェクトが一定間隔で生成されるように、走るキャラクターオブジェクト側に以下のスクリプトを設定。

Update関数で一定時間間隔でパーティクルオブジェクトが生成されます。 

 

    // タイムアウト時間
    float timeOut;

  // 土煙のパーティクルオブジェクト
  BackDustPrefab void Update () { timeElapsed -= Time.deltaTime; // タイムアウト発生時 if (timeElapsed <= 0) { // 走行時の砂埃エフェクト生成 RunEffectCreate(); timeElapsed = timeOut; } } /// <summary> /// 走行時の砂埃エフェクト生成 /// </summary> public void RunEffectCreate() { // エフェクトオブジェクトの生成 GameObject crObj = Instantiate(BackDustPrefab, Vector3.zero, Quaternion.identity, this.transform.parent); crObj.transform.localPosition = this.transform.localPosition; // エフェクトの実行 Dust_AutoDestructShuriken crPar = crObj.GetComponent<Dust_AutoDestructShuriken>(); crPar.OnCheckOn(); }

 

ここで気を付けるのは生成するパーティクルオブジェクトがキャラクターオブジェクトの子オブジェクトにはならないようにすること。

子オブジェクトにするとキャラクターにくっ付いて一緒に移動してしまいます。

 

 これを実際のゲーム画面(開発中)で動かしてみるとこんな感じ。

 

f:id:Karvan:20180112222623g:plain 

 

ハイ、そこ!オナラしてる、とか言わない!

iTweenのValueToを使ったアニメ動作

前回の記事の訂正

前回、Crunch圧縮の定義を外す手順で、
 「Use Crunch Compression」のチェックボックスをチェック⇒チェックを外す
と書きましたが、そのあとに
 Unityの再起動をする
という手順が必要でした。再起動しないと設定が有効にならないみたいです。

ここから本題

ゲーム中の演出で、下のような

f:id:Karvan:20180106002945g:plain

アイコンが徐々に現れるアニメを作ろうとした場合、

アイコンのImage(上の場合は矢印のImage)のImageTypeをFilledにしてFillAmountの値をUpdate関数内で徐々に大きくしていくのが一般的かと思いますが、それをiTweenのValueToを使って実現しようというお話。

まずはValueToを実行する関数

    GameObject TargetTweenObj;        // アニメ動作させたいゲームオブジェクト

    /// <summary>
    /// 矢印アニメ動作開始
    /// </summary>
    private void TweenAnimationStart()
    {
        // ValueToの開始
        Hashtable hash = new Hashtable(){
            {"from", 0.0f},
            {"to", 1.0f},
            {"time", 1.0f},
            {"delay", 0.0f},
            {"easeType",iTween.EaseType.linear},
            {"loopType",iTween.LoopType.loop},
            {"onupdate", "OnUpdateArrow"},
            {"onupdatetarget", gameObject},
        };
        iTween.ValueTo(gameObject, hash);
    }


ValueToを実行すると"onupdate"で指定した関数に"from"から"To"まで徐々に変化させた値が引数として渡されてくるので、それを使ってfillAmountの値を変更します。

    /// <summary>
    /// iTweenによるValueToのコールバック
    /// </summary>
    /// <param name="nextValue"></param>
    void OnUpdateArrow(float nextValue)
    {
        // 矢印オブジェクトのImage取得
        Image TargetImage = TargetTweenObj.GetComponent<Image>();

        // 矢印オブジェクトのfillAmount更新 
        TargetImage.fillAmount = nextValue;
    }


今回はValueToの"loopType"にloopを指定しているので、ループを止める場合には以下の関数をコールします。

    /// <summary>
    /// 矢印アニメ動作停止
    /// </summary>
    private void TweenAnimationStop()
    {
        iTween.Stop(this.gameObject);

        Image TargetImage = TargetTweenObj.GetComponent<Image>();
        TargetImage.fillAmount = 1.0f;
    }


で、これを実際のゲーム画面(開発中)で使用してみるとこんな感じ
iTweenを使用するとアニメの動作時間やループの設定等が簡単に行えるので以外と有用な方法かと思います。

f:id:Karvan:20180106005413g:plain

Unity2017.3にアップデートしたら困った事態になった話

12月になってUnity2017.3.0f3がリリースされたのでアップデートはしたものの、暫く実機(Android端末)テストはしてませんでした。

 

で。久しぶりに、ってかアップデートしてからは初めてプロジェクトをビルドして実機で動かしてみると困った問題が発生

 

スプライトが表示されない

 

PCではきちんと表示されているのにAndroidで動かしてみるとスプライトが表示されない、ビルド時にエラーは出てないし、実機でエラーログを出力するようにしても特にエラーが発生しているわけではないみたい。う~ん、困った・・・

 

色々調べていると表示されないスプライトは決まっていることが判明、InspectorのOverride for Androidの設定で圧縮形式にETC2を指定していたスプライトが駄目っぽい。

 

ならばと他の形式に変えてApplyボタンを押してみると今度はconsole上に

Assertion failed: TLS Allocator ALLOC_TEMP_THREAD...

と表示されてエラーとなった。

 

ん~。。。どうにもならん。。。

 

仕方ないのでグーグル翻訳先生の手を借りながらUnityのフォーラムを漁ってみるとそれらしき答えが、どうやらUnity2017.3.0f3から「Crunch圧縮」がデフォルトで有効になっているのでそれを外す必要があるみたい。

 

Crunch圧縮」・・・どこ?

 

QuaritySettingsにはないし、当該のスプライトのInspectorには

f:id:Karvan:20171230230106p:plain

 

ないし・・・(。´・ω・)ん?・・・・あった!!

 

f:id:Karvan:20171230225534p:plain

 

Defaultタブにありました。

表示上ではチェックされてないけどUnity内部ではデフォルトで有効になっているらしい。なので、このチェックを有効⇒無効とした後にApplyボタンを押してスプライトを変更する。

これで再度プロジェクトをビルドして実機で動かしてみると・・・

 

表示されたーーーー!!!

 

( ´Д`)=3 フゥ・・・

 

アップデートされたからといってホイホイ手を出すと痛い目を見る、という話でした。

ゲームアプリ開発振り返り(3)

これまでの概要

  1. ゲームエンジンのUnityを使ってゲームを作ろうと思い立つ
  2. だがしかし、想定したゲームはちっとも完成しない
  3. でも、ゲームを完成させた!という体験は味わってみたい
  4. なので、簡単に作れそうなゲームを作ってみることに
  5. 簡単なゲーム=アセットストアで売られているゲームの改変
  6. アセットストアを探して見つけ出したのがこのゲーム

The Rings

 


The Rings - Unity Game Template

 

ここらは続き

"IndieGame Developer"とかいう横文字の称号に憧れる私は困難な道(オリジナルゲーム製作)の角を曲がって隣の芝生的に青く見える道(完成ゲームのカスタマイズ)へと舵をきったのですが、だからといって見境なくそこらの完成ゲームに手を出すなんてことはしません。それなりの吟味はするんです。「歩く道を間違えるのは愚者ではない、選択を誤まるのが愚者の性だ」とは古代ギリシャの哲学者アンティステネスの言葉だったりするのはウソですが、とにかく道は変えても選択は誤まらないようにしたい。

 

アセットストアには様々な「完成プロジェクト」が並んでいます。アクションゲームからPRG、FPS、果てはMMOのテンプレートまでもあります。ただ、今回はできるだけサクッと楽につくりたいのでジャンルとしてはパズルゲームを選択しました。

 

 このゲーム、動画見えてもらえれば分かると思いますが、3マッチパズルゲームとなっています。
ルールは単純で

 

  •  縦、横、斜めに同じ色のリングが3つ並べば得点(リングは消える)
  • 一つの置き場所(=Pivot)には大・中・小のリングが一つずつ置ける
  • リングの置き場所が無くなったらゲームオーバー

 

これだけです。私はアセットストアでこのゲームのプレイ動画を見て

 

  • 素材はこのまま使えそう
  • ルールが単純なのでソースは改造しやすそう
  • 単純だけど意外と中毒性がありそう

 

といった感想をもち、このゲームをカスタマイズの対象にしました。

お値段も10$とお手ごろで、これなら日ごろお小遣い不足に悩むお父さんも嫁、子供に気兼ねなく手を出せます、いや、家族いないけど。


 ただ、タイトルを変えただけで「オリジナルゲームです」と言い切れる胆力は私にはないので、パズルのルール等を変更して何かしらのオリジナル機能を作り込むことは必要です。

 

 例えば、時間とともに盤面(Pivotの場所)が変更されるとか、リングをPivotへ設置するのに制限時間を設けるとか、パズドラっぽく戦闘要素を付け加えるとか等々、まぁ想像するだけなら簡単ですから、ええ、想像するだけなら。


とりあえず時間の掛かりそうな機能は購入後に精査するとして、直ぐにでも実現可能なカスタマイズを決定しました。

  1. 3×3の盤面を4×4にする
  2. 得点条件(同じ色が3つ並ぶ)を「同じ大きさで同じ色が3つ並ぶ」に変える
  3. リングの大きさが変化するようにする

 

「リングの大きさが変化する」とは、例えば一つのPivotに大・中・小のリングが置かれていて小リングが消えた場合、残りのリングは大→中、中→小に変化する、といった仕様です。


なぜこんな仕様にしたのかといえば、これによって連鎖が実現できるから

f:id:Karvan:20171223004112p:plain

f:id:Karvan:20171223004227p:plain

 

ぷよぷよ等でもそうですが、パズルゲームにとって「連鎖」は非常に重要な要素になっています。一回の操作で次々に得点が加算されていく時の爽快感はパズルゲームのハイライトの1つだと言ってもよいと思います。

 

元のゲームではリングの大きさに関係なく同じ色が3つ並べば得点、というルールで、かつリングの大きさが変わらないので連鎖は起こりませんが、得点条件に「大きさ」の要素を加える&リングの大きさが変化するという、ちょっとした仕様を変更するだけで「連鎖」という機能が実現します。ちょっとの工夫でこの美味さ。(by 神田川) とはこのことです。

 

ここまで構想を巡らせて、アセットストアの「購入」ボタンを押した私。
ダウンロードしたソースコードを眺めながら先ほど決めた「ちょっとした仕様変更」についてどうしようかと考えるわけです。「ちょっとした仕様変更」なのでパッパッパッと実現するはずです。ええ、そのときは忘れていたんです。「ちょっとした仕様変更」というワードは営業の人間や上司がよく使うワードだってことを、、、「ちょっとした仕様変更だから週明けには納品できるでしょ」とか、「え?仕様変更ちょっとなのに5日もかかるの?それは土日も含んで?」とか、よく平気な顔して言えたもんだな、おい、とか、ええ、、、


ソースコードを眺めて一時間後の私が出した答えは

 

こりゃ、一から作ったほうが早いな

 

続く・・・

 

ゲームアプリ開発振り返り(2)

三つ子の魂百まで、とはよく言ったもので・・・

前回のおさらい

一年前の五月、ゴールデンウィークという貴重な連休期間を全てゲームに費やすという無駄な行為に罪悪感を覚えた僕は、とりあえず建設的なことをしようと得意のプログラミング技術を生かしてゲームアプリを製作することを決心したがそれから早一年が過ぎ、夏を迎えてもちっとも完成しないプロジェクトに焦燥感を感じ始め、次第に沸き起こる倦怠感とむなしさと恋しさとせつなさと心強さとでどうしたもんかと頭を抱えて、ああ、そういえば中学校のころに担任から「お前は集中力がない、飽きっぽい、三日坊主だ」と散々な評価を受けたなとか、それはきっと僕があの担任のことを影で「しめ鯖」と呼んでいたことがバレたせいだなとか、そんなことを思い返して悶々として、うん、わざわざここまで読んでくれてありがとう、ってな感じで完成の目処が見えない状態になった僕。

 

前回からの続き

全然、完成しない!

 

当初の予定ではとっくの昔に完成してリリースして一儲けして会社辞めて独立して新進気鋭のクリエイター!とかで雑誌などに取り上げられてモテモテになって・・・とかなるはずでしたが、

第一段階すら超えられない現状。

 


イベント処理、UIのデザイン、キャラクターの操作等々で増え続けるコーディング量、それに比例して増加するバグ、終わらないテストプレイ、減らない体重、太くなるウエスト、いやいや、体重・ウエスト関係ない、とくかくどうしたものか・・・

 

  このままゲームが完成せずに、いわゆる「エターナる」※状態になってしまうことだけは避けたい。

  • でも完成は遠い
  • このままでは先細りしてしまう
  • 終わらないコーディング、減らないバグ、増える体重、だから、体重・ウエスト関係ない
  • どうしたらモチベーションを保てるのか
  • そうだ!簡単なゲームを作って成功体験を味わってみよう


世間ではこういうのを三日坊主とか言うそうですが聞こえません。とりあえず、終わりそうないプロジェクトは横において、軽く作れそうなゲームを作ってみよう。と思ったわけです。

  •  簡単なゲームを作ってリリースしてみる
  • 成功体験を味わう
  • モチベーションがあがる
  • 本来つくるべきゲームが完成する

完璧な計画!

これが普通の会社なら上司から鈍器で殴られそうですが、なにぶん個人開発なので文句を人は誰もいません。

あ!ここで「そんなに簡単に作れるゲームなんてあるか!」と突っ込んだ方、チッチッチ(人差し指を左右に振って)、それがあるんです。

 

私がゲームエンジンとして使っているUnityではアセットストアというゲーム開発に必要な素材が大量に売られているサイトがあります。
その中には3Dモデルやゲーム音楽などと並んで「完成プロジェクト」というものがあります。

 

これは文字通り「そのままでもゲームとして遊べるアセット(素材)」となっています。
なので、これを購入して中で使われている3Dモデルやスプライトを他のものに入れ替えて、タイトルをオリジナルのものにすれば見事ゲームの出来上がり!となるわけです。なんて素晴らしい!

 

早速私は仕事の合間縫って上司の目を盗んで業務時間にも関わらずアセットストアをあさり、一つの「完成プロジェクト」に目をつけました。

 

それが

 

続く・・・

 

 

■補足
※エターナる:はてなキーワードより
RPGツクールなどのゲーム製作を途中で放棄すること。またはその状態。 語源は、ゲームの作成のためにグラフィッカー等を大々的に募集したものの、製作は遅々として進まず、最終的にはWEBページを閉鎖し投げ出してしまい、ツクール界に伝説を残した「エターナルファンタジー」というゲームの名前から。

ゲームアプリ開発振り返り(1)

振り返れば幾年月

「そうだゲームを作ろう!」そう思ったのは去年の五月。

ゴールデンウィーク最終日、連休の全てをMinecraftの家作りに費やして、気づけば窓から差し込む夕陽で真っ赤に染まった部屋の中で、突然そんな考えが頭をよぎりました。

 

平日は一社会人として社会の荒波にもまれながら働いている私ですが、休日となるとほぼニート
必要に迫られない限り自室から外へ足を踏み出すなんてほとんどなく、金も体力も使わずにただただ時間だけをだらだらと消費して、連休中に発した言葉といえば、コンビニ店員からの「(お弁当を)暖めますか?」の質問に「いいえ」と返した言葉だけ。すいません、生きててホントすいません。ってか、あのコンビニ店員はどうしてあんな高いところからお釣りを落とすのか、私だって手ぐらい洗ってますよ。

 

、、、というわけで、何かゲームを作ろうと思い立ったわけですが、さすがに一からは作れないのでGameEngineとしてUnityを使ってゲームを作ることにしました。

 

unity3d.com

なぜUnityなのかといえば

  • iOS, Android等の複数のプラットフォームに対応している。
  • 2D,3Dどちらでも作れる
  • 無料版がある(年間売り上げ10万ドル以下)
  • 関連書籍、学習サイトが豊富

などの理由が挙げられますが、なによりも私を惹きつけたのは

 

  • アセットストアにより多種多様な素材を購入できる

 

という点にあります。
プログラムはそこそこ出来るものの、猫を描こうが熊を描こうが兎を描こうが何を描いてもドラえもんになってしまう私にとって、アセットストアに並んでいる数々の3Dモデルやテクスチャはありがたい存在です。
これを使えばゲームを作れる!
アセットストアを眺めながら私はそう思いました。そして・・・

 

素材(3Dモデル、音楽)等はアセットストアで買えばいい
→あとはプログラムを書くだけ
→まぁ、初めてUnityを触るし、勉強も含めて半年もあればゲーム一本ぐらいは作れるだろう。

 

という考えに到りました。ええ、甘かったです。劇甘まです。もし、こんな見積を営業や上司が出してきたら、ありとあらゆる罵詈雑言を浴びせかけ(心の中で)、「こんな未熟な見積りを作成し、申し訳ありません」と目の前で土下座させ(心の中で)、「今回ばかりはなにとぞご容赦のほどを」と私の靴先でも舐めさせなければ(心の中で)、気のすまないような甘い見積でした。

 

それから一年と二ヶ月たった猛暑の7月。利きの悪くなったエアコンの排気音と年代物のディスプレイの澱んだ光が充満する部屋の中、私は一人叫んでいました(心の中で)

 

全然、完成しない!

 

 続く・・・

 

ちょっと解説

Unityには「アセットストア」と呼ばれる、ゲーム製作に必要な素材(アセット)を購入することが出来るサービスがあります。
有料の物から無料の物まで、スプライト、3Dモデル、シェーダー、音楽等々の多種多様なものが並べられているので

  • プログラムはできるが絵は描けない
  • デザインはできるがプログラムは分からない
  • とにかく楽して開発したい

等々の問題を解決できる手段となります。
商用利用も認められているものが殆どなので、実際に流通しているゲームアプリの中にもアセットストアで購入したであろう素材(アセット)が使われているものがあります。

 

「アセットストアを利用したいけど数が多すぎて、どれを使えばよいのか分からないよ。」
という方には、おすすめのアセットや、セール品となっているアセットを紹介しているサイトがあるので一度訪れてみてはいかがでしょうか?

 

assetsale.hateblo.jp

www.asset.techmatome.com

始まったよ!

去年の5月より密かにUnityを使ってゲームを作り始めたのですが、そのゲームの宣伝もかねてブログを開設することにしました!!

 

・・・いや、まだゲームは完成してないんですけどね。

これまでの経緯とか、技術的に分かった事とか書いていきたいな、と思っています。

 

◇プライバシーポリシー

●個人情報の利用目的

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

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

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

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

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

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

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

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

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

●免責事項

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

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

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

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

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

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