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

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

【Unity】DOOffsetCharを使って文字を円状に配置

衣替え

今年も早いもので衣替えのシーズンとなってきましたが、夏場に購入した制汗シートが未だに消費しきれず、無理に使って風邪をひきそうになった皆さんこんにちは。秋なのに"氷結"タイプとか何の修行だよ。

 

DOTweenPro

さて、以前記事でも紹介しましたが、近頃DOTweenProがアップデートされてTextMeshに対して文字単位にアニメーションを行えるようになりました。

 

www.karvan1230.com

この文字単位のアニメーションには当然ながら平行移動(DOOffsetChar)の機能も含まれているので、これを使用すれば文字を好きな位置へ移動させることが出来ます。

なので、これまでは編集した画像を用意するしかなかった「円状に並んだ文字列」というUIもDOOffsetCharを使えば動的に実装できるかもしない、そう考えたわけです。

 

円状に配置させるには

各文字の円周上の座標は、文字列の中心を原点とすれば簡単に算出することができるので、各文字の位置から円周上の位置への移動ベクトル(オフセット量)を計算できれば文字を円状に配置させることができます。

 

f:id:Karvan:20201006212608p:plain

 

この移動ベクトルは「文字列の中心から円周上の位置へのベクトル」と「文字列の中心から文字の位置へのベクトル」との差分となります。

f:id:Karvan:20201006212646p:plain

 

しかし、「文字列の中心から文字の位置へのベクトル」に関しては正確なベクトルを得るすべは現在のところありません。

最初はGetCharOffsetメソッドで取得できるかと思っていたのですが、これは「各文字の初期位置からのオフセット量」を取得するメソッドらしく、文字列の中心位置からのオフセット量が取得できるわけではありませんでした。

 

よって暫定としてTextMeshのRecttransformからTextMeshの幅を文字数で割ったものを基準として算出します。

f:id:Karvan:20201006212722p:plain

このためTextMeshの幅は文字列が一列で表示できるギリギリの幅を設定しておく必要があります。

まぁ、そのように設定してもフォントによっては各文字の幅は均等でないため、必ずしも正確な「文字列の中心から文字の位置へのベクトル」が算出できるわけではありません。あくまで暫定のベクトルになります。

 

 まぁ、それなりに・・・

実際に実装してみた結果はこんな感じになります。奇麗な円ではありませんが、それなりに表示させることはできました。

f:id:Karvan:20201006213031g:plain

 

ソースはこんな感じ、Y座標最高点を開始位置にして時計回りに配置したかったので円周位置は90度から減算させて計算しています。また、移動に合わせてDORotateCharを使って文字を回転させています。

 

    private List<Vector3> GetCirclePosList(float cirRad, int chNum)
    {
        List<Vector3> retList = new List<Vector3>();

        float radInc = 360.0f / (float)chNum;

        for (int iCnt = 0; iCnt < chNum; iCnt++)
        {
            float curShita = 90.0f - (radInc * iCnt);

            float modx = cirRad * Mathf.Cos(curShita * Mathf.Deg2Rad);
            float mody = cirRad * Mathf.Sin(curShita * Mathf.Deg2Rad);

            retList.Add(new Vector3(modx, mody, 0));
        }

        return retList;
    }

    public void CircleTextAnim()
    {
        RectTransform TargeTextRect = TargeTextMesh.GetComponent<RectTransform>();
        float TextMeshWidh = TargeTextRect.sizeDelta.x;

        DOTweenTMPAnimator tmproAnimator = new DOTweenTMPAnimator(TargeTextMesh);

        int chNum = tmproAnimator.textInfo.characterCount;
        float radInc = 360.0f / (float)chNum;

        List<Vector3> cirOffsetList = GetCirclePosList(CircleRadius, chNum);

        int halfIndex = chNum / 2;
        float wordInt = (TextMeshWidh / 2.0f) / halfIndex;

        for (int i = 0; i < tmproAnimator.textInfo.characterCount; ++i)
        {
            float xOffset = 0.0f;
            if (i <= halfIndex)
            {
                xOffset = -1 * (halfIndex - (i + 0.5f)) * wordInt;
            }
            else
            {
                xOffset = ((i - halfIndex) + 0.5f) * wordInt;
            }

            // X方向のオフセット
            Vector3 currCharOffset = new Vector3(xOffset, 0.0f, 0.0f);

            // 円周位置
            Vector3 cirOffset = cirOffsetList[i];

            // オフセットベクトル取得
            Vector3 modOffset = cirOffset - currCharOffset;

            // 文字単位のオフセット
            tmproAnimator.DOOffsetChar(i, modOffset, 2.0f);

            // 文字単位の回転
            tmproAnimator.DORotateChar(i, new Vector3(0.0f, 0.0f, -1 * radInc * i), 2.0f);
        }
    }

 

ちなみに円状に配置した後にDOOffsetCharでオフセット量にゼロ(=Vector3.zero)を指定すると元の位置へ戻すことができます。DORotateCharも同様にします。

f:id:Karvan:20201006213158g:plain

 


 

【雑記】ハイパーカジュアルできるかな

行楽シーズン

最近は朝夕の空気が肌寒く感じられ、日中も気温が上がらず過ごしやすい季節となってきて正に行楽シーズン到来と言えますが、そんなものとは縁遠く相変わらず週末は自分の部屋に引きこもっている皆さんこんにちは。

先週の四連休は一度だけ繁華街に買い物へ出かけたのですが、何気に立ち寄ったアニメイトが女性だらけでビックリしました。何をそんなに行列を作って買っているのですか?

 

コンテスト

さて、ハイパーカジュアルゲームのパブリッシャー「Voodoo」がランゲームのコンテストを開催しています。

 

■ガイドライン

  • iOSでプロトタイプを提出
  • 新規タイトル
  • ランゲーム
  • 物理ゲーム

■スケジュール

  • 2020/9/3:受付開始
  • 2020/10/12:受付終了
  • 2020/10/29:授賞式

■コンテスト概要ページ、参加登録ページ

Voodoo.io | Voodoo Runner Competition

Voodoo.io | Submit your game

 

物理系のゲームといえば、先ごろ「room5gamejam」向けに「切磋琢磨するしかない!」というゲームを制作していて、これが物理演算を使ったジャンプゲームなので、これをハイパーカジュアルゲーム風にリニューアルして提出しようと思っています。

 

まぁ「room5gamejam」では箸にも棒にも掛からぬような評価だったので期待はしていないのですが、他に良いアイデアが思い浮かばない、かつ、自分的には結構苦労して作成したゲームだったりするので、このままお蔵入りするよりは労をねぎらう意味でも応募するつもりです。

 

 ハイパーカジュアルゲーム風

世間でハイパーカジュアルゲームといえば、シンプルなグラフィックに単純な操作で簡単なルールの短いステージを繰り返し遊ぶ、みたいなイメージです。

通勤通学の時間、ちょっとした空き時間を潰すためのゲームとして作られていて、「軽く遊べる」事が重要です。

 

なので、「切磋琢磨するしかない!」では長い1ステージのゲームだったので、これを短いステージをどんどんクリアしていく形に変えないといけません。

また、自機のキャラクターも単純な形状のものに置き換えて、ステージの構成もフラットなデザインのオブジェクトが並ぶような構成に変更しする必要があります。

 

要は元々の機能をグレードダウンさせるだけなんですが、こういった作業はモチベーションが上がりませんね。

だって作品がどんどん没個性化していくから。まぁ、仕方のない事ですが。

 

現段階ではこんな感じになっています。

f:id:Karvan:20200929223736g:plain

 

 操作系の処理は出来上がっているので、あとはUIやステージの構築管理とバランス調整、BGMは必要ないけどSEは追加したいし、バウンドしたときのパーティクルも用意して、あとは・・・間に合うかな?

 

 

【Unity】ParticleのRenderingModeについて

水泡に帰す

気合を入れてゲーム開発をしていたのに、うっかりシーンをセーブすることを忘れて三時間の苦労が水の泡となった皆さんこんにちは。

また同じ作業を同じ時間だけしなきゃいけないと考えると全くモチベーションが上がりません。

 

あと、Kingdom of AmalurのPS4リマスター版を購入しました。難易度選択が「イージー → ノーマル → 困難 → ベリーハード」なのがツボです。

まぁ、UIの翻訳とロード時間以外は神ゲーなんですがストーリーはちっともわかりません。

 

タイトル画面を修正

そんなこんなで週末はゲーム本編を作るのが億劫になったので、気分転換も兼ねてタイトル画面の変更を行っていました。

変更前はunity1weekに間に合わせるために適当に作ったので非常にシンプルな画面でした。

 

f:id:Karvan:20200915220654p:plain

こんな感じ。白地にタイトル文字だけ

 

これだけは味気ないのでアセットストアから画面全体に光子が散らばるようなパーティクルのアセットを購入。

これをベースにして白の背景に黒い光子が漂うような感じに変更しようと挑んだわけです。

 

f:id:Karvan:20200915220745g:plain

これがベースとなったアセットのパーティクル

 

 パーティクルの色を変える

パーティクルの色変える場合、ParticleSystemのstartColorを変える、加えて、colorOverLifeTimeを使っていれば、そちらも変えればよいだけなので簡単に実装できる、と思ったのですが・・・

 

f:id:Karvan:20200915220915g:plain

んー、全然見えない・・・

試しにパーティクルのTextureの方も色を黒に変更してみても同じ状態で、光子が背景の白に溶け込んで全く見えません。

f:id:Karvan:20200915221201p:plainこの画像を

f:id:Karvan:20200915221224p:plain黒に変更してもダメ

 

調べてみるとParticleのRenderingModeも変更する必要があったようです

 

RenderingMode

RenderingModeとは文字通り3Dモデルのメッシュや2Dのイメージなどをレンダリングするモードの事で、MaterialのShaderの設定にあります。

当該のパーティクルは「Particles/Standard Surface」のシェーダーを使っており、このRenderingModeが「Additive」となっていました。

 

f:id:Karvan:20200915221645p:plain

 ■Additive

マテリアルのピクセルを背景のピクセルへ追加して描画するモードのようで、暗い背景の中で光輝くような表現をしたい場合に使用するため、重ねれば重ねるほど白へ近づくらしい。そりゃ今回のような白背景だと見えなくなるわ。

 

■CutOut

アルファテストによりアルファが「Alpha Cutoff」の値より小さい場所が完全に描画されなくなる。つまり半透明の領域がなくてテクスチャが100%見えるか見えないかのどちらかになる。

穴や細かいギザギザがあるようなものを表示するときに使うらしい。試しに今回のパーティクルをCutOutに変更してみると

 

f:id:Karvan:20200915221912g:plain

なるほど、白か黒か、のような世界になる

 

■Transparent

ガラスみたいな半透明な物質に使用する。背景が透過しながらも光源からのハイライトや反射などは表示されるようなります。

Transparentに変更するとこんな感じです

f:id:Karvan:20200915222029g:plain

パッと見ると問題ないように見えますが、よ~く見るとテクスチャの元画像の枠がうっすら見えます。

 

f:id:Karvan:20200915222140p:plain

画像を拡大するとテクスチャの四角い枠が見えます(キャプチャ画像だと分かりづらいかも・・・)

 

■Fade

こちらも半透明を表現するときに使用しますが、Transparentと違いハイライトや反射などはなく、背景に溶け込むように表示されます。

今回の場合はこのModeを使うのが正解だったようです。

 

f:id:Karvan:20200915222250p:plain

画像を拡大、Transparentと違いテクスチャの枠が見えません

 

タイトル画面完成

というわけで完成したタイトル画面がこちら

f:id:Karvan:20200915222433g:plain

 

なんだかホラーっぽくなりました。全然ホラーゲームじゃないのに・・・(脱出ゲームです)

 

【Unity】DOTweenを使ってTextMeshの文字を動かす

台風

毎年のように発生する数十年に一度の巨大台風が今年もやって来て、窓ガラスに養生テープを張り、食料品の買いだめやらアレコレと準備をしたけど何事もなかった皆さんこんにちは。災害は心配し過ぎるぐらいが丁度いいですね。

 

TextMeshとDOTween

元々DOTween(Pro版のみ)にはTextMeshに対するTweenのメソッドが用意されていましたが、それらはText全体に対するアニメ動作を実装するもので、Textを1文字ずつ個別にアニメーションさせることはできませんでした。

しかし、最近のアップデートで文字個別に対するTweenのメソッドが実装されました。(Pro版のみ)

 

これは従来のTextMeshに対するTweenメソッドが拡張された(追加)というよりは、TextMeshをラップしたクラスを生成し、それに対してTweenを行う方式で実装されています。

このTextMeshをラップするクラスがDOTweenTMPAnimatorクラスです。

 

DOTweenTMPAnimator

前述のようにTextMeshの文字を個別にTweenさせるには、対象となるTextMeshをラップしたDOTweenTMPAnimatorクラスに対してメソッドを発行して行います。

 

TextMeshProUGUI MyTextMesh;

public void OnClick_Color()
{
    MyTextMesh.text = "Stab of Bee Project";

    // DOTweenTMPAnimatorの生成
    DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
    textAnim.DOColorChar(0, Color.red, 2f);
    textAnim.DOColorChar(8, Color.red, 2f).SetDelay(0.3f);
    textAnim.DOColorChar(12, Color.red, 2f).SetDelay(0.6f);
}

 

上のソースの場合、MyTextMeshの0,8,12桁目の文字を赤色に変化させています。
また、順に変化させるためにSetDelayで8,12桁目には遅延が発生するように設定しています。

f:id:Karvan:20200908213720g:plain

 

個別に桁数をせずにforループを使用したい場合はtextInfo.characterCountを使うと文字数が取得できます。
よって、前から順に赤色に変化させたい場合はこんな感じのソースになります。

 

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOColorChar(iCnt, Color.red, 2.0f).SetDelay(0.1f * iCnt);
}

f:id:Karvan:20200908213837g:plain

 

その他のメソッド

色を変えるだけでなく他にも色々なメソッドが用意されています。 

DOTweenの公式のDocumentの「TextMeshPro per-character animation」の項目を見ると

 

  • DOFadeChar
  • DOColorChar
  • DOOffsetChar
  • DORotateChar
  • DOScaleChar
  • DOPunchCharOffset
  • DOPunchCharRotation
  • DOPunchCharScale
  • DOShakeCharOffsetadeOut
  • DOShakeCharRotation
  • DOShakeCharScale
  • SkewSpanX
  • SkewSpanYwRight
  • ResetVerticesShift
  • SetCharColor
  • SetCharOffset
  • SetCharRotation
  • SetCharScale
  • ShiftCharVerticeshtShift
  • SkewCharX
  • SkewCharY

これだけのメソッドがあります。代表的なものを紹介すると

 

■DOOffsetChar

文字のOffset値を変えることで文字を平行移動させることができます。
例えば文字を順に上へ移動させる場合は

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOOffsetChar(iCnt, Vector3.up * 30.0f, 1.0f).SetDelay(0.1f * iCnt);
}

f:id:Karvan:20200908214716g:plain

他にも、Rotate(回転)、Scale(拡大縮小)など通常GameObjectに対するTweenと同じ様なメソッドもあります。

 

 ■DOPunchCharOffset

ゲーム内のUIとして使用するならPuch系のメソッドの方が使い勝手が良いかと思います。

Puch系とは同じアニメ動作を減衰しながら繰り返してくれる動作で、最後には開始位置に戻ってきて来れます。

先程のDOOffsetCharをDOPunchCharOffsetに変えた場合

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOPunchCharOffset(iCnt, Vector3.up * 30.0f, 1.0f, 1).SetDelay(0.1f * iCnt);
}

f:id:Karvan:20200908215057g:plain

第四引数は振動回数を指定します(未設定の場合は10)。

 

 ■DOPunchCharRotation

回転させる場合はDOPunchCharRotationを使います。

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOPunchCharRotation(iCnt, Vector3.up * 90.0f, 2.0f, 2).SetDelay(0.1f * iCnt);
}

 

f:id:Karvan:20200908215607g:plain

 

 ■DOFadeChar

文字をフェードイン、アウトさせたい場合はDOFadeCharで不透明度を変更することで実装します。

DOTweenTMPAnimator textAnim = new DOTweenTMPAnimator(MyTextMesh);
for (int iCnt = 0; iCnt < textAnim.textInfo.characterCount; iCnt++)
{
    textAnim.DOFadeChar(iCnt, 1.0f, 2.0f).SetDelay(0.1f * iCnt);
}

第二引数に最終的なアルファ値を指定します。上のソースでは文字が前から順にフェードインします。

f:id:Karvan:20200908215757g:plain

 

これを使って

折角なので現在制作中のゲームにも使ってみることにしました。

アイテムを取得した時のメッセージに対してこれまでは文字全体をフェードアウトさせていましたが

f:id:Karvan:20200908215843g:plain

 

DOTweenTMPAnimatorを使って一文字ずつ左に移動させながらフェードアウトするように変更

f:id:Karvan:20200908215927g:plain

こちらの方が良い感じですね

【Unity】DOTweenのSetLookAtオプション

残暑

今年の夏はあまりに猛暑なので首掛けの扇風機を購入して通勤中に使っていたら、満員電車の中で目の前の女性の髪を吸い込んでしまい大変なことになった皆さんこんにちは。幸いスイッチを切ったらすんなり解けたので良かったのですが、めっちゃ睨まれた。

 

unity1week

評価期間が終わり結果が発表されましたが、相変わらずお絵かきガチ勢が強いなぁという印象です。特に奇麗なピクセルアートを見せる作品は評価が高く、絵作りの強さが楽しさや雰囲気、斬新さといった他部門の評価も引っ張り上げている傾向。見た目は大事ですね。

ジャンル的には製作期間が一週間という短い期間のため、いつもはパズルや2D横スクロールといったジャンルが多いのですが、今回はガッツリとしたAVGや疑似3Dっぽいアクションゲームもあったりしてバラエティに富んでいました。

まぁこれは評価期間が二週間に伸びたので、その分を製作期間に充てて製作する人が多かった事も一因かもしれません。

ちなみに私の作品は箸にも棒にも掛からぬ、といった具合だったので特に述べることはないです。

 

段々と投稿数が増えたり(今回は500!作品)、チームを組んで挑む人が増えたり、と盛り上がり傾向にあるunity1week
レベルが上がり過ぎてビビるんですが、これからも出来るだけ挑戦していきたいと思います。

 

みんなの味方DOTween

さて、製作中の脱出ゲーム内で下の図のようなギミックを作っています。

 

f:id:Karvan:20200901222449p:plain

下のほうにある列車のおもちゃを線路に沿って走らせるのですが、こういう場合に使えるのがみんなの味方DOTweenのDOPathというメソッドです。

 

var doPath = transform.DOPath(path, duration);
var doLocalPath = transform.DOLocalPath(path, duration);

 

pathはVector3の配列です。(Listじゃない)

pathで指定された座標(WayPoint)を順に向けて移動するアニメーションを作成できます。

なので、あらかじめ線路上に列車の通るポイントを指定しておいて、各車両のtransformにDOPathを使用して移動させるようにします。

 

 下の図内の青い四角がDOPathで指定するポイント

f:id:Karvan:20200901222616p:plain

 

で、実際に動かしてみると

f:id:Karvan:20200901222754g:plain

・・・・・

確かに線路上を移動していますが、明らかに脱線しています。各車両が進行方向に沿って回転していないのが原因です。
つまり進行方向に向かわせる処理が必要なのですが、そうしたときにはSetLookAtオプションを使用します。

 

SetLookAtオプション

その名の通り、Tween中のオブジェクトの向きを動的に更新してくれる設定です

 

var doPath = transform.DOPath(path, duration).SetLookAt (0.05f, Vector3.forward);

 

第一引数で指定した秒数先の方向が第二引数で指定した向きになります。
上のコードの場合なら、正面方向が0.05秒後に移動する位置の方向を向く、という指定になります。

 実際に動かしてみるとこんな感じ

f:id:Karvan:20200901223118g:plain

 

各車両が進行方向に沿った向きを向いてくれるようになりましたが、カーブ辺りの動きに違和感があります。連結部分が切れるような感じ。

こういった場合には、第一引数の値を小さくします。調べると最小値は0.0001fらしいので思い切って0.001f辺りを指定します。

 

f:id:Karvan:20200901223307g:plain

今度はカーブでもスムーズな動作になりました。

 

【雑記】STGを作り直している話

デジゲー博

今年こそはデジゲー博に出展しようかと思っていたのにコロナ禍の収束の兆しが見えないのでどうしようか迷っている皆さんこんにちは。

いつも「行ってみたいなぁ」と思っていたのですが今時は東京へ行くこと自体が憚れる情勢で、11月末ともなると第二、三波が来ている恐れもあるので判断に迷うところです。

 

unity1week

夏休み期間という事もあってunity1weekの方は過去最高の投稿数(今のところ450オーバー)となっており、評価期間が一週間延長されています。

私のゲームも半ば強引な形ですが参加させて頂いていますが、案の定、450もある作品群の中に埋もれきっていて閲覧数も伸びていません。

やっぱり毎回頻繁に上位にランクインされている常連さんの作品や初参加でもレベルが高い作品が多々あって、それらと比べ自分の作品を鑑みると反省しきりです。

 

まぁ、比較的パッと遊べる脱出ゲームとなっているので、是非遊んでみてください。(PCで遊ぶことが出来ます)

unityroom.com

 

450もあるので全ての作品を遊んだわけではありませんが、ランダムにプレイした中で私が個人的に気になった作品を紹介すると

 

コロコロポン | フリーゲーム投稿サイト unityroom

クリックで転がっている四角を増やしながらゴールに導くゲームです。
いわゆるカジュアルゲームですが、シンプルで洗練されているゲームデザインには憧れます。

 

ヒメをゴールへつれてって | フリーゲーム投稿サイト unityroom

毎回ピクセルによる絵作りが凄いRyosukeさん
今回もGBを思わせるようでオシャレな画面構成
増えていく仲間を利用して仕掛けを解除しながらゴールへ向かうパズルゲームです。

 

がんばれ!ソラコくん | フリーゲーム投稿サイト unityroom

こちらもunityroom常連のフィズさん
立体的なステージをジャンプアクションで進みアイテムを集めるゲーム
スプライトでここまで立体的に作れるのかと驚きました、とにかく作りこみが凄いです。

 

かたぐるまクローンズ | フリーゲーム投稿サイト unityroom

分身を増やして位置を入れ替えながらゴールへ向かうパズルゲーム
ジャンプの代わりに分身を積み重ねて位置を入れ替える、といった操作を思いついたのが凄い
各ステージのレベルデザインも秀逸です

 

SAMURAI・THE・WORLD | フリーゲーム投稿サイト unityroom

ジョジョの「THE WORLD」よろしく、範囲内に入った敵の動きを止め、コマンド形式で敵を切っていくゲーム
敵をバッサバッサと切っていくのは爽快感があります。

 

UNITEMAN | フリーゲーム投稿サイト unityroom

ステージ最後尾にいる敵にたどり着く前に武器を集め、その武器を「投げつける」ことで敵を倒します。
武器の挙動、軌道にはそれぞれ個性があるので、投げる時にそれを把握しておく必要があります。
意外と中毒性があってハマります。

 

隕星アルファルズ | フリーゲーム投稿サイト unityroom

ぞくぞくするようなカッコよさ。厨二病っぽい世界観もSTGに非常にマッチしています。
2Dと3Dの中間のようなフラットな絵柄のゲームは私も目指しているところなので参考にさせて頂きます。
あと難しい。

 

そんなこんなで

unity1weekの投稿作品で遊んでいたせいでゲーム制作の進捗はあまり進んでいないのですが、脱出ゲームの製作と並行して去年一年間作っていた2.5DSTGの作り直し作業も進めています。

作り直しとなった原因は色々あるのですが、一番は作家性(自分がこう作りたいんだ、という仕様)を強く意識しすぎて、ゲームとしては楽しくない事に気づいたことでしょうか。

 それに加えて、今年の初めunity1weekに投稿した作品(Helios Orbit)が自分の中ではよく出来た作品だったので、こちらをベースに作り直したほうが面白い物が作れるんじゃないかと。

結果として去年一年の作業は実を結びませんでしたが(エターなる?)、これまでの資産が活用出来たらな、と思っています。

 

こんな感じのゲームになります。

f:id:Karvan:20200825220213g:plain

今週はSTGらしく自機から弾丸を発射できるようになりました。

 

【Unity】unityroomにアップロードしたのにゲームが起動しない場合の対処

口を開けば愚痴ばかり

これまで幾つか作成したゲームをunityroomに公開していますが、思った以上に閲覧されなくて評価もコメントも殆どもらえない皆さんこんにちは。

同じ時期に投稿された他のゲームと比べても閲覧数は伸びてないと感じるし、まるでサムネ画面に人を寄せ付けないオーラでも放っているんじゃないのかと思うぐらい。

今回はunity1weekにも半ば強引に参加してみましたが相変わらず閲覧数は少な目です。

 

評価が欲しいと言うよりは不具合や改善点等の第三者の意見を求め、unityroomで公開しているのですが狙った通りには行かないみたいです。

もしよろしければ、以下のリンクから飛べるので何かしらコメントをお願い致します。

unityroom.com

 

自作ゲームをunityroomで公開する

さて、unityroomで自作ゲームをアップロードして公開するには

  1. プロジェクトのプラットフォームをWebGLに変更、Buildを実行
  2. unityroomのアカウントがない場合は開発者アカウントを登録
  3. 投稿ゲーム用のページを新規登録し、情報(タイトルとか説明文等)を入力
  4. 手順1でBulidフォルダに出力された各ファイルを専用ページから順次アップロード

という手順を行います。

 

アップロードが終われば、手順3で指定したURLを開くとゲームがダウンロードされて遊ぶことが出来るのですが、今回の「W.T.」をアップロードした時はちょっとうまく起動されませんでした。

 

ダウンロードのローディングバーが伸びたと思ったら、「An error occurred runnning the Unity content on this page,・・・」のポップアップメッセージが表示され、80%ぐらいローディングバーが伸びた状態のままでいくら待ってもゲームが開始されません。


最初は「ネットワークが混んでいるのかなぁ、夏休みだしなぁ」とか気楽に考えていたのですが・・・

 

1時間

f:id:Karvan:20200818222249p:plain

 

2時間

f:id:Karvan:20200818222319p:plain

 

3・・・

f:id:Karvan:20200818222346p:plain

 

というわけで、ちょうどGhost of Tushimaをクリアしたタイミングだったこともあり、重たい腰を持ち上げて調査することにしました。

 

調査と対処

表示されているエラーメッセージは「このページのUnityコンテンツの実行中にエラーが発生しました。詳細については、ブラウザのjavaspriptコンソールを参照してください。」と何の役にも立たないメッセージなので、手掛かりを求めてunityroomの質問掲示板を覗きます。
すると意外と同じような問い合わせがあってラッキーでした。

 

原因は単純なことで、アップロードファイルが違う事。

プラットフォームがWebGLの場合、Bulidフォルダに幾つかファイルが出力されますが、unityroomで指定するwasm.framework.unitywebファイルでなく、asm.framework.unitywebファイルが出力されており、このasmのファイルをアップロードしていたことが原因でした。

 

wasmでなくasmのファイルが出力されるのはBuild設定のせいですが、これはUnityEditor上で指定するものではなく、ProjectSettings/ProjectSettings.assetファイルで指定する設定です。

 

f:id:Karvan:20200818222707p:plain

このProjectSettings.assetファイルをテキストエディタで開くと"webGLLinkerTarget:0"という設定が記載されています。
「0」という値はasmを出力する設定なので、wasmを出力する場合には「1」を設定する必要があるようです。

 

f:id:Karvan:20200818222746p:plain

上のように「1」に変更する

 

バージョンアップが原因?

これまでWebGL版のビルドは何度が行っていますが上記の設定をいじったことはありません。

ちょうどUnityのバージョンを2019.4.6fから2019.4.7fにバージョンアップした直後だったので、2019.4.7fのデフォルト設定が"webGLLinkerTarget:0"だったのかもしません。

ただ、2019.4.7fから2019.4.8fにバージョンアップした直後にもBuildを行いましたが、こちらではwasm.framework.unitywebファイルが出力されました。

 

基本的にUnityのバージョンアップはこまめに行っているのですが、unity1weekのような短期間で開発を行う場合はリリースが終わるまでバージョンアップを控えたほうが良いかもしれません。

 

◇プライバシーポリシー

●個人情報の利用目的

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

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

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

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

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

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

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

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

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

●免責事項

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

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

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

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

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

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