カテゴリー: プログラミング

うにのトゲは刺さると痛い(´・ω・`)-20

ギミック追加途中でハマリ中(ヽ'ω`)

三枚組・四枚組モードを追加していて、基本的な部分は比較的簡単に実装出来たのだけれども、オーバーレイ表示した時に三枚目のimageコンポーネントの表示位置がおかしい(´・ω・`) でも四枚組の時は問題ない。どっかしらに原因があるのだけれども、それが見つけられなくて先に進めない…(ヽ'ω`) 独自実装のイニシャライズを呼んでいないような気がするんだけど、まだ完全には原因をつかめていない…


致命的問題 1

ちなみにバグではないが実装途中に致命的な問題に気づいた。

48/3=16だからトランプだと3セット足りない_| ̄|○

何の話かと言えば、2枚組の場合(1つの数字につき2枚ではなく4枚(=スート毎)生成している。)と4枚組の場合において48枚モードの時に必要なセット数は48/4=12、つまりはQまであれば賄えるが、48/3=16セットが必要となりKまでだと3セット足らないという状況になる(ヽ'ω`)

当初は3枚組の48枚モードをなくそうと思ったが、最終的には既存の二種のジョーカーを三枚ずつに増やし、もう一枚ジョーカーを作って三枚にし、合計9枚増やすことによって何とかした(ノ∀`) 余り美しい解決方法ではなかったが、取り急ぎこれでいいかな。


致命的問題 2

もう一つバグとかそういうレベルじゃない致命的な問題に気づいた。

三枚組、四枚組モードは難度が上がりすぎる…(ヽ'ω`)

何かに書き留めてやるならまだしも、かなりの記憶力か攻略術を持っていないと全然カードが減っていかないだろう(´;ω;`) 左上から数列的に覚えて行けばトランプの方はある程度攻略できなくもない気がするが、国旗の方になるともうお手上げな気がする∩(´;ω;`)∩ 

こんな神経衰弱、難度が高すぎてやる気なくなるわ、ボケヽ(`Д´)ノ


上の三枚組表示の問題が解決してもポイントとかペナルティ等々の部分を直さないといけない。一律にしていた適当なデフォルトハイスコアの値も変えないといけない。

この辺りを解決して、もう一つのギミックを追加して、クレジット画面の表示(無料素材利用条件)を実装すると、ソフト的には完成する……

が、カードコンテンツの追加で凄い時間がかかりそう…(ヽ'ω`)ハチガツニハリリースシタイ……ケドアツイ

うにのトゲは刺さると痛い(´・ω・`)-19

( ゚Д゚)ハッ

前回のエントリから、もう10日以上経ってた…(ヽ'ω`)
何したんだっけかな…("・ω・゙)
ちょっと前にやってたことと今現在の苦境は解るんだが…えーと……


続・効果音の追加

取り敢えず、ビルトイン音声は用意しないが、固有名の音声ファイルをアプリフォルダ(Application.persistentDataPath)に突っ込んでおくと特定の時にそれらが再生されるようにした。具体的には連続コンボを達成した時に「good」とか「nice」と言わせる為のもの。

著作権的なところがよく解らないのと、テンションが低い発音(つまりは普通の発音)なので同梱しないけど、このサイトでテスト用音声を作成した。
The Shtooka Project

ごっぐるの何とかトゥスピーチは単語音声のみを作成してダウンロード出来るようなものじゃなかったのと、使い方とこれまた著作権的なところがよく解らなかったので利用せんかった(ノ∀`)

まあこの機能はあんまり重要ではないけれども、使い方によっては楽しめるよね、きっと的なもの。アニメや音楽が好きな人なら声優やアーティストの褒め言葉のwavファイルを入れておけば、その人なりの楽しみ方が出来るとは思う。

前回追加したカード裏画像の指定を併用すれば、自分だけの神経衰弱ゲームが出来上がります(`・ω・´) ←別に要らんやろ、そんなん(´・ω・`)

ついでに今回足すかどうかわからないけれども、幼児向けに平仮名の絵合わせみたいなカードセットを追加した場合に、仕事が忙しいとか遠くに住んでいるという両親や祖父母の褒め言葉を入れてプレイさせたりしたら、何か良いことあるかしら、どうかしらと思ったけども、どうだろう(´・ω・`)?

BGMもoggファイルで変えられるようにしたが、よくよく考えてみるとAudioFocusを奪ったりしてないので、他の音楽プレーヤーで音楽再生してもらって、こっちのBGMは切ってもらえばいいだけのことに気づいたのは実装して、実機で試してからだったよ(´・ω・`)ウウン、ナイテナイヨ


Textureの保存

無理やりIMGUIでダイアログを作っていたが、さすがにボタンが増えると負荷が半端ないので、ない場合は作成して保存、ある場合は読み込みという形にしたw やっぱり無理があるわ、色々とw

Texture2Dをpngとしてファイル保存


デストロイヽ(`Д´)ノ

ゲーム画面から「新規ゲーム」を開始出来るようにしたら、挙動が変(´・ω・`)
結果ダイアログやハイスコアダイアログと違って変な状況になる。
新規カードが既存カードの上に配布されるというw

考えてみたら、既存カードを破棄しないといけなかったんだなとまとめてデストロイした。
Unityでタグのついたオブジェクトをまとめて操作する方法

ところが、こちらの想定通りに動かない(´・ω・`)
ぐぐる。
UnityのDestroyは即時反映されないので、DestroyImmediateを使う

なるほどそういうことか。推奨はされていないらしいが、背に腹は代えられないということで、これを使用して一応解決。


追加情報表示

ようやく追加情報表示を実装。ただこの機能自体は大して難しいものではなくどうでもいいのだが、表示する情報を追加する作業が苦行(ヽ'ω`)

幾つかの世界地図の無料素材サイトを巡ったが、本当に欲しいタイプの画像がなかった……

それでも比較的近い形の素材を配布しているサイトを発見(`・ω・´)
http://www.abysse.co.jp/world/map/country/index.html

でもそこから素材をもらってくる作業が大変_| ̄|○
更にそれを加工する作業が大変。
加えてこのサイトではオセアニアの島国家(英連邦系?)の地図がなかった。これらの国家と台湾やパレスチナ自治政府やガンデンポタンやバチカン市国用の地図を無理くり作るのが大変だった…(ヽ'ω`) 

特に遠く離れた島国家やガンデンポタンの現在位置やバチカン市国は既存地図に点を打つだけだったので、凄く苦労した。正しい位置に打てたかどうかは不明(´・ω・`)

何にしてもいずれは望み通りの画像を作成して差し替えたい…

テキストの方に関してはWikipediaのテキストを持って来て、文字数等を調整する形にする予定。(dbの先頭にあったアフガニスタンの日本語表示のみ、お試しとして入れてみた。)

ちなみにこの作業で3日間近く潰れた…
テキストの取得や改変を考えると……( ;・´ω・`)ゴクリッ

まあこの部分は肝と言えば肝なので、時間がかかるのは致し方ないか…


ついにギミック追加作業へ

カードの表示部分の操作をカードマネージャーから個別のカードセット固有のCardFrameオブジェクトで行う形に大改造する。これでカードセットによって表示する内容を自由に変えられる(`・ω・´) ←但し、それによってカードセットの作成が大変になることを忘れてはならない。まあ、ある程度作ったら、後はそのパターンをコピーして改変するだけでよくなるんだろうけれども

ここに来てようやっとゲーム的ギミックの追加に入る。
これは大したギミックではないが内緒(・∀・)

だがしかし実装は苦行(ヽ'ω`)

今までいい加減に実装していた部分にメスを入れて直さなければならない為、非常に辛い……当初はGameSceneをコピーしてそれぞれのモード用を作るかと思っていたが、現時点で70MBオーバーになっていることを踏まえると、出来うる限りSceneは増やしたくない… 

まあSceneを増やしても、騒ぐほど容量を食うわけではないのだろうけれども。管理が面倒くさくなりそうな気もするので同一GameSceneで行くことに。挫折したら、そっちに方向転換するけどもw


作業自体も辛いけど、何よりも辛いのは、

暑い( ´・ω・`;)ことだ。

うにのトゲは刺さると痛い(´・ω・`)-18

暑い( ´・ω・`;)

取り敢えず残りの実装すべきアプリ関連の機能の設定用トグルなどを追加した。普通の人には大したことではないが、"設定画面を作成したりしてると死にたくなる病"の俺氏にとっては命に関わる難作業であった( ・´ω・`)アブナイトコロダッタ

後はその機能の実装だけなので気は楽だヽ( ・∀・)ノ
とかいいつつ地獄を見るのがいつものパティーン(´・ω・`)


ハイスコア表示

ハイスコア表示はまあ、取り敢えずこんなんでいいや的代物に(・∀・)
配色がなぁ……まあいいか。

こないだはDateTimeOffset型を使わないと駄目かなと思っていたが、よくよく読んでみると必要がないことがわかったw あれはUTCが必要な時に使うべきものか(ノ∀`)


カードの自動戻し

二枚カードをめくってマッチ時にのみ停止して画面タップされるまで表示し続けるか自動消滅するかの設定を用意していたのだけれども、NG時も停止出来るようにした。これはまあ、カード内容を覚えたい人向け……というか自分でやっていてもNG時にカード内容を読みたいなぁと思ったから、急遽追加した(ノ∀`)


ユーザー指定画像ファイルの使用

これは前々から実装を考えていたもので、以前に作っていたものの完成させられなかったAndroid用音楽プレーヤー(余裕が出来たら完成させたいが)でやろうとしていたこと。自分で良いデザインが産み出せないなら、ユーザーに丸投げすればいいじゃない的いい加減さを実現(`・ω・´)ナオジッソウハチョットメンドウダッタ

100x150の固有名を持つファイルをApplication.persistentDataPathのところにぶちこんで、このオプションをONにすると他の設定を無視してそのファイルをカード裏として読み込む。(※尚、この猫画像はGoogle+の猫サークルかなんかで拾ったものだったかしら(´・ω・`)?)

100x150ぴったりだと四角のカードになってしまい、ビジュアル的におかしくなるので実際に使用するには

に画像を貼り付けたモノを用意しないといけない。プログラム的に生成することも出来なくはない気はするが、今はそんなに余力がないのでいずれするとしよう。ついでにファイルパス指定で読み込めるようにもしたいなぁ。

以下のページを参考にしてニコイチにした。と思ったが、正確には前回参考にしたJson読み込みのコードをベースにしているのでサンコイチか(ノ∀`)
ファイルパスから画像を読み込み、Texture2Dを作って、それをSpriteにするだけ。
参考:
【Unity】pngファイルを読み込み同サイズのTexture2Dを生成する
Texture2DからSpriteを作成する


Sprite sprite = GetSpriteFromFolder(Application.persistentDataPath + "/usf01.png");

            }
            Sprite GetSpriteFromFolder(String filePath)
    {
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            using (BinaryReader br = new BinaryReader(fs))
            {
                byte[] values = br.ReadBytes((int)br.BaseStream.Length);

                Texture2D texture = new Texture2D(100, 150);
                texture.LoadImage(values);

                return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
            }
        }
    }

ユーザー指定音楽ファイルの使用

ついでに効果音も読み込めるようにした(`・ω・´)

外部からだとmp3は読み込めないのね(´・ω・`)
なんかライセンスの絡みだとかあったけど、mp3のライセンスって去年の5月くらいに消滅してるみたいなんだよね。他の違うライセンスの問題? 或るいはUnityのフリー版だけ駄目とか?

まあ何はともあれ以下のページを参考にしてwavファイルを読み込むようにした。

参考:
[Unity] Unity×音についてざっくりまとめ
Unityで外部音楽ファイルを読み込む
WWW.GetAudioClip

エディター上(Windows上?)では「file:///」じゃないと読み込みが出来ないらしいけど、Androidは「file:///」でも読み込めるので、「file:///」一本槍にしてしまっているが、いいのであろうか(´・ω・`)?

ユーザー指定の効果音ファイルがない場合はデフォルトの効果音を使いたいのでこんな形にした。

AudioClip LoadWavFile(string fileName,AudioClip defaultClip)
    {
        if (File.Exists(Application.persistentDataPath + "/" + fileName))
        {
            return GetAudioClip("file:///" + Application.persistentDataPath + "/" + fileName);
        }

        return defaultClip;
    }
    AudioClip GetAudioClip(string filePath)
    {
        using (WWW www = new WWW(filePath)) {
            while (!www.isDone) { }
            return www.GetAudioClip(false, false,AudioType.WAV);
        }       
    }

効果音系をもうちょい触って、ローカライズファイルを読み込めるようにして……あとは追加表示とゲームのギミックを二つ程追加すれば外殻は完成なんだけども、ギミック部分の実装にどれだけかかるかだなぁ……

それが終わったら、ようやくカードセットの追加にかかれるのだけれども。

うにのトゲは刺さると痛い(´・ω・`)-17

暑くて色々と捗らない…(ヽ'ω`)


Windows関連

Windowsの不具合絡みでなんかやったような記憶が(´・ω・`)
Microsoftのコミュニティのやり取りが珍しく役に立った(・∀・)
スタートボタンが反応せず、シャットダウンできない

デバイスキャストがコンテキスト上に出ちゃうのって結構邪魔じゃない(´・ω・`)?
Win 10編: コンテキストメニューの<デバイスキャスト>を取り除く


続・得点表示

見た目は余り進化していないが多少変化させた。少しだけ動的変化を追加しただけだが、それを実装するのに時間がかかった。やっぱりIMGUIでやるべきではないと思いました(・∀・)(小並感)


ハイスコア表示

どうせローカルレベルの話だし、要るかなー、要らないなー、でも一応有ったほうがゲームっぽいかなーということで申し訳程度のハイスコア表示をすることにした。
ここで結構ハマった(´・ω・`)

まず第一に、どの保存方法を取るかで悩む。PlayerPrefsは一番お手軽であり、申し訳程度のハイスコア表示ならこれでいいのだけれども、それだと俺氏の技術的進化が全くないなと思い違う方法を模索。 ←すぐに退化しちゃう人(´・ω・`)

ZeroFormatterとかが良いのかしらと思ったけれども、俺氏の今現在のC#の知識では理解不能なので、止めておいた(ノ∀`) 単純にライブラリとして使えばいいのだろうけれども、その前段階のセーブ/ロードの方法を知らないので、まあ今回はパス。

関係ないけれども、UniRxを公開していたグラニという会社のCTOの人が作成していたらしいが、この人はCTOを退任して、グラニはマイネットというところの傘下になったらしい。ソシャゲ等に興味がないので、どっちの会社もよく解らない(ノ∀`)
ZeroFormatter - C#の最速かつ無限大高速な .NET, .NET Core, Unity用シリアライザー

取り敢えず、以下のリンク等々を読み、JSONデータで保存することにした。
クラスを丸ごと保存するデータ管理方法【Unity】
JsonUtility
【Unity】Jsonデータをセーブ・ロードしたい!
Unityでゲームデータのセーブ・ロードを行う方法

で、まぁエディタ上では上手く保存出来ていたので、大して気にせずに他の部分のリファクタリングをしたりしていたのだが、Androidの実機でやったら上手く行かない(´・ω・`)

結論から言うとApplication.dataPathではなく、Application.persistentDataPathにファイルを保存する方向に。
そもそもapkに書き込みって出来るの(´・ω・`)?

参考:
UnityでAndroid,Windowsにファイルを書き込む際の注意点
Unityで作成したAndroidアプリでファイルをxml形式で読み書きする

試してはいないけれども、暗号化。
【Unity】AESでデータを暗号化 エントリが消えていた。


日付等

基本中の基本なんだろうけれども、忘れちゃうのでリンクしておこう。DateTimeOffsetを使ったら、何処の国でも正しい時刻を取得出来るのかな(´・ω・`)?

参考:
誰もが一度は陥る日付処理。各種プログラミング言語におけるDateTime型/TimeStamp型の変換方法のまとめにC#が無いので追加
String.Split メソッド (Char[])
String.Substring メソッド (Int32)
DateTimeの代わりにDateTimeOffsetを使用する
DateTimeとDateTimeOffsetの違いとは?[C#、VB]

まだ途中なのでアレだが、まあこんな感じだよね、ハイスコア表示って(´・ω・`)


まだまだやることがいっぱいあるな(ヽ'ω`)