カテゴリー: C#

うにのトゲは刺さると痛い(´・ω・`)-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]

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


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

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

Windows Updateとの苦闘を繰り返した間に、何をどれくらいやったか忘れた("・ω・゙)

まあでも内部的な変更とか追加ばっかりだったから、あんまりC#やUnityがどうこうって話は少ないかな…?


と思ったが、一つ二つUnity絡みで不可解な事象にハマっていたことを思い出した。

謎エラーに遭遇(´・ω・`)

或るタイミングで以下のエラーが表示されてUnityが起動しなくなった…んだったかな?

そのタイミングは確かVisual Studioの更新かなんかを促されて適当にやってしまった後だったような…

メッセージにある通り、"unity editor resources"がおかしいらしい。これの復旧方法が解らず、結局インストーラを再び叩いて再インストール(?)したら、このエラーは表示されなくなった。本当にVSの更新が原因かどうかは解らないが、何はともあれ再インストールというか上書きインストールすれば一応回避出来た。


謎例外に遭遇(´・ω・`)

結論から言えば、コードに問題があったのだが、なんでこの例外になるのかが解らなかった。

ハンドルされない例外が 0x000000014087332F (Unity.exe) で発生しました: 0xC0000005: 場所 0x0000000000000000 の読み取り中にアクセス違反が発生しました。 が発生しました

具体的にどういう状況かと言うと、GameManagerで

public Text MessageDisplay;

というモノを作り、Editor上でD&Dしておいて、メッセージを表示させる。→ ゲーム終了時にDestroy → タイトル画面に戻らずに(シーン遷移せずに)リスタートしようとした時に再び利用としていた。

まあ、Destoryしてるものを再び利用しようとしたらエラーになるのは解るのだが、例外が起きてUnity毎落ちてしまうのかが謎(´・ω・`)

もしかしたら、今まで遭遇して来なかっただけで、これが正しい挙動なのかな? 或るいはうちの環境だけの問題なのかも。まあ、Destroyしないで

MessageDisplay.gameObject.SetActive(false);

みたいな感じにしたら問題は起きなくなったので良いか。

何はともあれ、少なからずうちの環境でまたこれが起きたら、Destroyしたオブジェクトを触ろうとしていないかを疑えばいいのかな。


設定ダイアログ

そう言えば、ボタン用のテクスチャをコード内で作成するようにしようとして結構時間を費やしてしまったのを思い出した…(ヽ'ω`)

頑張った割にアンチエイリアスとかが上手く出来ていないのでアレな出来になってしまった。いずれもう少しブラッシュアップしたいところではあるが…

ゲームプレイ中に効果音とBGM、オーバーレイ表示を切り替えられるようにした。これも元々のコードがそんなことを想定していない感じで書いていたので、直すのに苦労した(ノ∀`)

切り替え用UIにはToggleを使用したが、大きさを変えるとチェックボックスが消えた(´・ω・`) 何処を設定すれば表示されるかは解らず、まあこのままでもいいかと放置w GUIContent等を利用してアイコンにノーチェック時とチェック時の画像をセットすればいいだけなのかもしれないけれども、そこまでチェックボックス自体は重要ではないかなと思ったので。


得点演出

カードがマッチした後に何にもないと寂しいので得点時演出を追加する。と言っても、得点とコンボ数、コンボ内容に応じた褒め言葉が上に上がって消えるだけ(ノ∀`)

得点体系がいまいちしっくり来ないのでこれも直さないとな。まあでも、正直なところ、この神経衰弱ゲームにおける得点という要素はあくまでもおまけなのでそんなにこだわらなくても良いような気がしないでもないw


得点結果

一応、得点結果の表示をするようにもした。得点もカウントアップするけれども、ちょっと時間を調整しないとすぐに終わってしまうな(´・ω・`)

色とかもどうしようかなぁ…(´・ω・`)


設定画面にしろ、得点時演出にしろ、痛感したことは

俺氏、この手のことに
ガチでセンスがねぇ( ;・´ω・`)ゴクリッ

思いっきり時間をかければ、いくらかはマシになるかもしれないけれども、パッと出せる俺氏のセンスではこんなのが精一杯だw なんつーか「ゲームってこーいう風だよね(・∀・)」って頭で、センスではなくロジックで作ったという感じの出来(ノ∀`)

まあこの辺は今は措いておくしかないw
この神経衰弱の本当の狙いはゲームとしての楽しさではなくもっと消極的時間潰しだし、習作故にゲームに必要な要素を一通り舐めることが目的なので、この辺は今は切り捨てておく。

本当は6月中に機能を全部載せて、7月にカードコンテンツを増やしてリリースするつもりだったが、PCに色々あったり、暑くなり死にかけ始めているので思うように進んでいない…_| ̄|○

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

パソコンというかシステムがおかしくなったので、それの復旧をしていたり、他のことをしていたり、色々と改修したけど何を回収したのか忘れたりで前のエントリから大分経ってしまった…(´・ω・`)

進展はしてるけれども、リファクタリング的なことの方が多かったかな?


Unityの日本語化

取り敢えず復旧の際に2018.1にした。何かを調べていた時に日本語化が出来ることを知ったので日本語化した。ちょっと感動する(・∀・)

でも"RectTransform"等のコンポーネント名まで無理に"矩形トランスフォーム"のように訳さなくても良いんじゃなかろうかと思ったり。

参考:
【Unity】Unity2018.1を日本語化する方法


.NET 4.6 (C# 6.0)

確か、これもやったような気がする…("・ω・゙)

参考:
Unity2017 で .NET 4.6 (C# 6.0) を使う方法


Outline

こんな感じでOutlineを動的に追加したような…("・ω・゙)

var outlineComponent = textObject.AddComponent<Outline>();
outlineComponent.effectColor = new Color32(0, 80, 80, 255);
outlineComponent.effectDistance = new Vector2(1, -1);

参考:
Unity5のColor構造体は、0から1の範囲で、Color32構造体が0から255の範囲を取ります。


あとは内部的に作り変えたことばかり…のような……(´・ω・`)
えらく時間がかかって面倒くさかったけれども特筆する技術的な問題はなかった…かな?

ネパールとバチカン市国の旗が通常の国旗と形状や比率が異なることから、正しく表示されていなかったのを解消したくらい。なるべく文字のはみ出しが発生しないようにしてみたけれども、全部は確認していない(ノ∀`)

メニューの位置とか、表示情報の整理とかしないといけない(´・ω・`)メドイ

カード裏面を分けられるようにしてみたが、思っていた以上に単一言語モードではない日英モードはやっていて難しいというかきつい。記憶力だけの問題じゃないような気がしてきたw カード裏面を分けられるようになって気づいたが、シャッフルは出来ていても、妙にカードが偏ってしまう。もう少しその辺をチューンするか、無理矢理交互になるような仕組みにすべきなのかな?


取り敢えず今は得点系っぽいのを実装中。これも色々考えると面倒だなぁ…(´・ω・`)