• ジグソーパズルなんぞ作ってみたりして・・・その2

    2019-07-20 22:12
    ■先に物理演算を入れてみた

     過去の Java版と同等の新規作成画面を作ってですな。



     「生成」すると上から降ってきて箱に入りましてな。



     簡単な当たり判定をつけて、物理演算をカマしているので、単純に積み重ならず、崩れたりこぼれたりもする、と。



     マウスのドラッグ&ドロップで運べる。でも現状は、運んでる最中にめり込んだり、突き抜けて無限の彼方に落ちて行ったり。



     ピースがでかいと周囲に滑っていかないので、高く積みあがった挙句、ひっくり返ったり。(未だ改善してないシェーダでは「厚み」しか表現していないので、表示も崩れる)



    ■物理演算を入れて本当にいいものか・1

     このままだと、ピースが簡単に行方不明になってしまう。また、裏返ったままでは必要な部分を探すこともままならない。
     が、これらは現実のジグソーパズルにもあることである。愛嬌愛嬌。
     箱の外に行ってしまったピースは、UI に用意する「集合」ボタンを押せば、自動的に生成位置に呼び戻され、箱に入るようにすればいいと思う。また、手動でマットに移動したものは物理演算処理をカットし、角度も水平にすればいいだろう。
     マット上でのピースの重ね合わせは不可にしたいところ。どうするといいかな? ドラッグ&ドロップではなく、クリックして移動開始、クリックして設置、だけどピースと重なってしまう場合は移動終了不可、みたいな感じかなぁ。
     スナップ処理との整合性も考えながら決める。

    ■物理演算を入れて本当にいいものか・2

     当方の環境(Core i7, GTX1050Ti)では 200ピースの状態で何のストレスも無いけど、1,000ピースで試すと生成中に 3FPS以下まで低下する。全て生成し終わって実際に操作できる段階になるまで我慢できなかった。
     物理演算に Flex を使って、各ピースを 9ヶのパーティクルの平面にでもすればいいかしら・・・合計 9,000ヶなら問題ないはず。
  • 広告
  • ジグソーパズルなんぞ作ってみたりして・・・その1

    2019-07-19 02:30
    長いことゲーム(のようなもの)作りをやってないので、リハビリのために久々に Unity を使ってみた。

    ■契機

     某クソゲーのスレに、やべージグソーパズルの話題が挙がっているのを見て、「そういやジグソーパズルのソフト作ったっけなー」と思い出して引っ張り出してみた。

    ※元絵は https://www.pakutaso.com/20170333074post-10665.html より拝借

     PC の Java環境で動作する。URL もしくはファイルで好きな画像を指定して遊べる。
     マウスで操作。ホイールでピース回転。ピースを右クリックすると最背面に隠す。近づけたピース同士が適合すると自動的にスナップして、以後一緒に動く。

     某クソゲーより優れているのは
     ・おそらく15年ほど前に作成、当時のPCでも1,000ピースで処理落ち軽微。今皆無
     ・形状がランダムに設計される。ベタ1色でもパズルとして機能する
     ・「キ」の字のみにするかバリエーションを持たせるかも変更可能

    ランダム係数を高くすると歪な形になる。0にすると全部同じ凹凸になる

     優れているかどうか分からんが、俺的なこだわりとしては
     ・盤面にはスナップしない。適当に動かして自動で答えが分かっちゃうと面白くない
     ・初期位置として、似た色のピースが同じ場所にくるように並べる

     特に優れてない、もしくは劣っているのは
     ・ゲームクリアとかは表示されない。全部接続しても何も起こらない
     ・セーブできない

     とても楽しく遊べる。ただし1,000ピースはわりと苦行。そらーリアルでだって大変なんだから、いくらマウスでひょいひょいやれるったって、セーブできなきゃ大変だわな。でもね奥さん、件のクソゲーもセーブできないんですってよ。あらやーねー。

    ■で、Unity版を作る
     
     数時間でできたとこまでで、こんな感じ。大分ブランクがあるわりに、そんなに鈍ってない。おっさんなのに頑張るなぁ、俺。
     シーンエディタで生成、表示テストしているだけで、まだゲームとしては機能してない。ゲームビューにおけるマウス操作とスナップ判定を作れば、とりあえず上記の Java版と近しいものにはなるかな。
     

    ■やったことその1・ベジェ曲線

     ピース同士の境界は、下図のようなベジェ曲線で作っている。(Java版のソースを紛失してしまい、いちから書くことになってしまったので、テキトーに再現。イマイチ不恰好なのでハヨ直したい)

     形状をランダム化するには、経由点や制御点の位置を微妙に変えてやればいい。
     
    ランダム形状にした例
    (ピースの中心座標をわざとずらしているのでぴったりハマってないのです。悪しからず)

     もちろん、隣り合ったピース同士は、共通のランダム曲線を使うことになる。

     問題は、ベジェ曲線のパラメータ群(=Vector2D 16ヶ×4本分)を、いかにして3Dオブジェクトに仕立てるか、というところだ。

     かつて Unity を使い始めた当時は 2Dグラフィックスの環境が貧弱で、Java などでできるような線画描画や塗りつぶしなどは何もできないのでがっかりしたものだが、現状ではアルファ版ながらベジェ曲線が使える。
     こちらのサイトを参考に、Package Manager を使って Vector Graphics 1.0.0-preview.28 をインストールする。さすればスクリプトで Unity.VectorGraphics のクラス群が使えるようになる。
     
     で、自分でも未だ良く分かってない処理をあーだこーだと重ねていくと、曲線内部を塗りつぶした形に相当するメッシュが作成できる。
     例えば以下のような感じで、481頂点・479ポリゴンからなるメッシュができあがる。こんなの 1,000もピース作ったら重てーんじゃねーかと心配になるが、重たくない。不思議だなぁ、怖いなぁ。


     さて、これだけではよくない。これではピースの表面のメッシュを用意しただけである。側面のポリゴンも追加して、厚みを表現しなければならない。

     その方法としては、
      ・ある2頂点をともに含むポリゴンが1つしか見つからない場合、
       その2頂点からなる線分は、ピースの外郭線の一部である。
      ・外郭線を y軸方向にシフトして作った長方形を考え、
       長方形を構成する2つのポリゴンを既存メッシュに加える
     という方法がある。


     あるんだけど、こんなの基本なんだけど、俺自身こんな感じのことはしょっちゅうやってるんだけど、何故だか今日はボケッとしていてどうすりゃいいのかさっぱり分からず、思わずシェーダを書いて解決してしまった。ばかじゃねーのか。

    ■やったことその2・厚みジオメトリシェーダ



     こちらのブログにあるソースを一部拝借して、自分なりにアレンジした。
     必要なところだけ抜粋するとこんな感じ。

          [maxvertexcount(21)]
    void geo(triangle v2g IN[3], inout TriangleStream<g2f> triStream) {
    #define ADDV(v, color) triStream.Append(SetVertex(v, color))
    #define ADDTRI(v1, v2, v3, color) ADDV(v1, color); ADDV(v2, color); ADDV(v3, color); triStream.RestartStrip()

    ADDTRI(IN[0], IN[1], IN[2], float4(1, 1, 1, 1));
    for (uint e = 0; e < 3; e++) {
    v2g IN_s = IN[(e + 0) % 3];
    v2g IN_e = IN[(e + 1) % 3];

    v2g IN_sd = IN_s;
    v2g IN_ed = IN_e;

    IN_sd.vertex.z += 0.04f;
    IN_ed.vertex.z += 0.04f;

    ADDTRI(IN_s, IN_ed, IN_e, float4(0.5, 0.5, 0.5, 0));
    ADDTRI(IN_sd, IN_ed, IN_s, float4(0.5, 0.5, 0.5, 0));
    }
    }

     概要だけ説明すると、
      ・MeshRenderer からGPUへは、表面のポリゴンメッシュだけ渡す
      ・GPU側ではポリゴン1つ(3頂点)を、7ポリゴン(21頂点)に拡張する。
       増えた6ポリゴンは、3つの線分に対応する側面長方形の各2ポリゴン。
      ・増えた分とオリジナルで、異なる色情報を与えておく(側面はグレー、w = 0)。
       フラグメントシェーダで条件分岐し、テクスチャ色で塗るか側面色で塗るか決める

     上記では外郭線がどうのこうのと書いたが、そんなのお構い無しに、479ポリゴン全ての線分に対して、側面ポリゴンを自動生成するのである。必要ない部分まで全部。はっきり言って馬鹿の所業。1,000 ピース全部でそんなことしたら重てーんじゃねーかと心配になるが、重たくない。不思議だなぁ。でも絶対良くないよなぁ。

    ■次の段階へ

     プレビュー中は特に重たくないのだが、1,000ピースの生成には 15秒くらいかかる。できることならもうちょっと改善したい。

     もちろん、上記の側面ポリゴンも改善したい。ちゃんと必要な分だけ作るようにしよう。大切な資源。電気は大切に。
     メッシュの座標データとしては今と同じく表面分だけを作ってGPUに渡す。ただし、外郭線判定を予め行なっておき、結果を頂点色情報として与えておく。ジオメトリシェーダ機構の部分で頂点色情報を利用して条件分岐すれば、全体の処理量は軽減できると思う。多分。

     あと問題になるのはスナップ機構。15年前の俺が作れたんだから、今の俺に作れないわけはない。処理落ちなども同等以下に抑えられるはずである。
     要は、現在動かしてるピースの座標と、上下左右にスナップされうる4ピースの座標差分のみを評価すれば、それでよい。(件のクソゲーはプレイを重ねると段々重くなっていく上に、本来隣り合ってないはずのピース同士がくっつくバグがあるようだが、ここでもう既に余計な計算をしてるんじゃないか? 例えば1つのピースに対して999回評価してるとか・・・はは・・・まさかね・・・)
     スナップした複数のピースが、グループとして同時に動いているときでも、処理量はそんなに大きくならない。グループ内の個々のピース×4の評価で済むし、既にスナップしてグループに追加済みなら、処理は飛ばせる。

     せっかく3Dにしたので、簡単な当たり判定を作って、盤面の上や箱の中で、ピースがごしゃごしゃごしゃっと動くような処理にしたい。重いならやめる。

     コントローラプレイでどこまで利便性良くできるかも挑戦してみたい。
     例えば、
      ・左スティックで仮想的な手のひらを動かし、ピースを大雑把につかむ
      ・つかんだピースをD-Padの上下ボタンで選択、左右ボタンで特別な箱に振り分ける
       ex.) 特徴的な線が入ってるのは左の箱、標識や看板の文字が入っているのは右の箱
      ・箱の新規作成、箱から箱への振り分けも自由にできるようにする
     なんてのにすれば、コントローラでも無理なく遊べると思うのだがどうか。

     どうかとか言ってないでさっさと作ってみろ、俺。
  • モンスト無課金ソロ4ヶ月半経過その1

    2019-07-13 09:33
    ■経過

     今月前半は
     ・神獣の聖域に挑戦→キャラ不足で詰まってしまう
     ・超絶・激究極も挑戦→全部勝利
     ・爆絶・轟絶にどんどん挑戦→全部敗退
     ・玉楼・弐が出現したので、上記すべて保留してそちらにほぼ集中
      (オーブ稼ぎの為に覇者の塔は行く)
    という感じ。

     なお、超究極クレイを最後に、以降、高難度ステージでの助っ人利用は行なっていない。でも覇者の塔の自前貫徹は未達成。それやるとどうせ途中でつまっちゃうので、いいんだ、キニシナイ!

    ■まずはガチャ

     ・新キャラ、ホームズが引きたかったが、確定演出の喜びも束の間、ソロモンがダブる
     ・マッチ売りの少女メイを引く。ちょこちょこ使ってみる。レーザーストップいいね!
     ・タージ・マハルを引く。オオサカくんと同期の子だね。つおい!
     ・チェシャ猫。こちらもなかなかの活躍。

     まずはこれだけ。

    ■神獣の聖域。面白かったが、狩人7体入手で限界

     キャラ特性が合ってないと門前払いをくう。現状の俺にとっては爆絶くらいの難易度になるところもある。さりとて入手できる狩人のうち、どうやら古いものはアビリティが少なく、正直しょぼい。とは言えステージはなかなか面白いので手をつけていき、狩人を7体入手。
     キャラ不足であちこち詰まりはじめたので、狩人ステージはひとまずおいといて、神獣ステージを覗き見。神獣達はかなり役に立ちそうだから、取れるなら早く取りたい。中でもレキオウ、ティグノスは、爆絶のために喉から手が出るほど欲しい。
     しかし、神獣ステージの雑魚からして、狩人以外のキャラでは火力が通らない。おそらく、色んな狩人を4体連れても、ギミック対応できないので厳しい。つまり、パーティ内に同じ狩人を複数体用意すればいい? えー、BOXに余裕が無いから全部重ねちまったい。

     ここでやる気が途切れてしまった。もう1回狩人に勝つのも面倒だが、それよりも、いろんなキャラを4体織り交ぜて勝つ、というのができなさそうなのが残念。だって、それが楽しくてこれまでやってきたんだから。
     「同じキャラが2回攻撃してる」みたいな考え方をしてもいいのだが・・・。今までのところそれをやったのは、稼ぎクエ以外では、永倉さんを卑弥呼2人体制で倒したときぐらいだ。
     どうせ詰まっているステージもあるし、一旦打ち切り。禁忌の獄と同じく、これもまた、やることが無くなったら挑戦しよう。ただ、それだと一部爆絶もつらくなるのだが・・・。

    ■玉楼出現前。爆絶は全部負け、超絶・激究極は3件撃破

     以下を撃破。
     ・超絶韋駄天 通算28戦目(滝廉太郎、スラッシュX、デネブ、ソロモン)
     ・超絶キュウキ 初見撃破(ドラえもん、摩利支天、クーフーリン、カーリー)
     ・激究極ロコモコ 初見撃破(タージ・マハル、半蔵、ジャンヌダルク、劉備)

     韋駄天はもうやりたくない・・・と思ったが、玉楼・弐に入っている。またあの、狭っ苦しい地獄が始まるのか・・・。

     以下は、負けたが、かなり奥まで行けた。
     ・轟絶・極シュリンガーラ(ヤマトタケル廻、ヤマトタケル零、ヤマトタケル、モーセ)
     ・爆絶エルドラド(ツクヨミ廻、アカシャ、ツクヨミ、クーフーリン)
     ・爆絶アルカディア(モーセ、ブラック、司馬懿、テキーラ)
     ・爆絶カタストロフィ(ザッハーク、黄泉、ジャンヌダルク、オオサカ)

     シュリンガーラ戦は、イマイチつまんない。個々のキャラの強さで凌いでるだけ。しかも三つ子状態だし。もっと別のキャラが居ればなあ。
     アルカディアはテキーラ→モーセのSS連撃、カタストロフィはオオサカくんの友情全敵レーザー、エルドラドはクーフーリンの友情バフが(多分)、それぞれうまく働いていた。そういうのをやりたいな。

     以下は結構厳しい。ガチャの優秀なのが一体居るが、残りは全部降臨キャラで、って感じ。でも、優秀なキャラをしっかり上手く使いさえすれば勝てるはずだ。
     ・爆絶ニギミタマ(反射水属性「高火力必須」明記。モーセだけ)
     ・爆絶ラグナロク(バリア+飛行orマイン水属性。おらん。ソロモンで誤魔化せるか?)
     ・爆絶蓬莱(貫通ウォール木属性。できればマインor飛行。シェヘラザードだけ)
     ・爆絶アルマゲドン(アンチブロックの木属性。デネブだけ)
     ・爆絶アラミタマ(反射ウォール木属性。デネブだけ)
     ・爆絶サキミタマ(貫通ウォール+飛行orマイン火属性。オオサカくんを進化版にする?)
     ・爆絶アポカリプス(反射ワープ+ブロック光属性。弁財天がSS撃てば対応する)
     
     この中でマシなのはアポカリプスか。手持ちの中でギミック対応してるのが記念引き換えキャラのシーホウだけ、という有様なんだけど、一回だけ出し抜けに、ボスマップの2つ目まではいけた。残りの3人、弁財天・スフィンクス・玉藻前は半端な対応ながらも回復持ちなので、HP個別制のこのステージでは、とても重要。シーホウ以外はとても愛着があるから、このまま勝てたらいいな。

     なお、ランダム降臨のツバサにも負けた。ブロックを軽視して半蔵・ローザなんか入れたのが間違い。何にもできなかった。メイちゃんはレーザーブロックが有用そうだし、昨今挑戦している中では使えそうなのがここくらいなので、次回も連れて行こうと思う。

    半蔵、すっかり籠の狐。1マップ目突破でこのHP。

    ■なんとなく感じていたキャラの偏りを再確認

     どうもうちのガチャ★6キャラは、アンチブロックが弱い。モンスター図鑑でガチャで絞り込んでみると、アンチ重力バリアは6.74%、アンチウィンドは8.57%を所持しているが、ブロックは4.11%しかいない。しかもその中には弁財天とソロモンがいる。そら、毎度あちこちで頼るわ。そら、韋駄天やら何やらで苦労するわけだわ。
     一番所持数が多いのが火属性バリア。だからエスカトロジーに勝てたんだな。また、先月からジャンヌダルク→劉備→タージマハルと続いて入ったので、バリア+ワープがめっぽう強い。重複除いた約30キャラ中の7体(進化版弁財天も入れれば8)を持ってる。何でこんなに偏るんじゃ。おかげでカナンやカルナで善戦できたけど。

    ■ほんでまたガチャ

     爆絶に挑戦したうち、一番キャラ不足を感じたのが水属性の2ステージだったので、木属性オンリー、アンチブロックならなおよし! と意気込んでガチャをたくさん引く。が、不発。くそう。

    ■玉楼(と覇者の塔)出現。プランを決定

     あまり公式サイトを見てなかったので、覇者の塔が突如出現してびっくり。えっこないだやったとこじゃん。こんなに頻繁に出るんだっけ? てことは、玉楼にも行けるやんけ。
     また壱をやってもしょうがないので、弐を選択。未攻略の爆絶4件、超絶廻4件が含まれている。まったく未見のものもある。上述の蓬莱のように、幾つかは辛酸をなめているし、攻略済のも、壱より大分難しい。その一方で、前回以降、ガチャ★6は6体しか増えていない。計50体。
     「じゃあ今回はとりあえず未攻略分だけクリアして、ついでに何列か揃えられればいいかな」・・・なーんて考えながらも、一応キャラを振り分けてみると、超絶以上のキャラも増えたため、何とかなりそうな気もする。わりと本気目に挑戦してみることにした。

    ■玉楼挑戦のための追加ガチャ

     覇者の塔の報酬オーブは全て玉楼挑戦用のスタミナ回復に回すつもりでいたが、毎日のログボ+モンスポット分もあり、オーブが大分集まったので、挑戦の最中に、一度だけ10連を引いた。それでも40ヶも残る。十分だ。
     激獣神祭は、所持済みのナイチンゲールや弁財天などがピックアップされている。こういうとき、俺はまたダブりを引いてしまう気がしたので、あえて避けて、新キャラを狙いに行く。
     一番のお目当ては、つらかった爆絶に対応しているあいつ。玉楼・弐の攻略には直接大きく寄与はしないが、しかし強いキャラが一つ増えりゃあ、それだけどこかが楽になるわけだ。そして全体が楽になる。来い! 引け!

    引いた!

     引いたー! アラミタマ用のやーつ! 次の機会には、デネブとこれと、あとはクシナダーズで、俺、頑張るよ。

     つづく。