カテゴリー: Unity

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

細かい修正や追加をしていて余り進んでいないかも(´・ω・`)

タイトル画面でToggleやDropdownを増やして、基本的な設定変更はそこでやってもらう形にすることに。効果音の有無、BGMの有無、マッチ後のカードの自動消滅や裏面分けの有無。

あと結局、ややアルファを落として下のカードを視認出来る程度の透明度のでっかいオーバーレイ表示を行うことにした。やっぱり、小さいカードに情報を詰め込むのは無理くさい。というか出来るけれども読めないので意味がない(´・ω・`)


UIのDisable(グレーアウト)

トランプを選択した場合、

  • 情報系と違って長時間表示している意味がないので、デフォで自動消滅するようにして、Toggleをdisabledにする。
  • またオーバーレイ表示をする意味はないので、オーバーレイ表示をしないようにして、Toggleをdisabledにする。
  • トランプは図オンリーなので、カード内容を選択するdropdownをdisabledにする。

という風にしたかったので、最初はenabledにfalseを設定した。

そうすると操作は効かなくなっったが、色が変わらない(´・ω・`)
次にSetActive(false)をすると、表示自体しなくなった…

これはこれでいいかもと思ったが、そうするとDropdownのインスペクターに表示されてる"Disabled Color"ってなんだよ(´・ω・`)?っていう疑問に至り、ぐぐる。

(C#)UnityのButtonをDisabledにしたくて地味に躓いた

ああ、interactable をfalseにするんか(・∀・)

問題自体は解決したが更に、
Unityのボタンのenabled/setActive/interactableの違いというエントリを読むと、enabledとinteractableはGameObjectに使えず、setActiveはUIObjectに使えない模様。

※2018/5/25追記
よくよく考えてみるとComponent.gameObjectがあるので、

[UIコンポーネント].gameObject.SetActive(false);

とすれば非表示に出来る模様。


なんでCheckboxじゃなくてToggleって名前にしたんだろうね(´・ω・`)

Toggleのチェックマークが小さすぎるので、どうやって大きくするのかとToggle the Images on Toggle Button .やら他のエントリを一生懸命読んだりしたが、単純にチェックマークのイメージを大きくするだけでよかった(ノ∀`)

ToggleとかのGetIntとSetIntは三項演算子が楽なんだね(・∀・)
【Unity】チェックボックスとラジオボタン


BGM再生

今まではデフォでBGMを再生していたけれども、BGMのON/OFF設定を追加したので、その辺を修正した。【Unity開発】Audioまとめ(基本編)【ひよこのエッセンス】を参考にして最終的に

    void Update()
    {
        if (isPlayBGM && !(GetComponent<AudioSource>().isPlaying) )
        {
            GetComponent<AudioSource>().Play();
   }
    }

という感じにした。BGM再生の設定を読み込んだisPlayBGMだけだと毎回再生を始めようとするのかなんなのかわからないが、最初の数秒流れて音楽が止まってしまった。なのでisPlayingで再生していない場合だけ再生を開始するようにした。もしかしたら、もっと正しいやり方があるのかもしれないが、今のところ、これで良しとしよう。


タッチ

マッチ後のカードの自動消滅の設定を追加したので、位置やUIを限定した画面タッチではない画面タッチを拾う必要が出て来たが、どうすればいいのかわからず、ぐぐる。

タッチパネル対応を参考に

    void OnGUI()
    {
        
        if (Event.current.type == EventType.MouseDown) {
         //Do Something
     }
    }

という感じに。意外と簡単だった(・∀・)
これで本当に正しいのかはわからないw


dropdownの画像指定

カードの裏面選択を画像から選べるようにしたいなぁと思い、ぐぐる。参考ページを読んだり、色々いじったりするもDropdownの仕組みがイマイチわかりにくかった(´・ω・`)

が、しばらくしてからようやく何に引っ掛かっていたのかがわかったw

もう既に知っていたことだったのだが、
1つのGameObjectに対してImageコンポーネントやTextコンポーネントは1つしかアタッチ出来ないという大前提を忘れていたのが原因(ノ∀`)

これ、実はToggleのCheckmarkのところでも同じことでハマっていたというか納得せずに悶々としていたw Graphicというプロパティ(?)に対してImageをD&Dしようとしても上手く行かず、GameObjectじゃないとD&D出来ない状況に、ドウシテダヨ,バーヤバーヤヽ(`Д´)ノと怒っていた俺氏であったが、先の大前提を踏まえれば、当然至極であった。

複数のImageやTextをアタッチしたいGameObjectは子Objectを作って、それにImageをアタッチしなきゃ駄目だからこういう形になるんだな。

取り敢えずDropdownの下にGameObjectを追加して、そのオブジェクトにImageコンポーネントを追加。そしてそのGameObjectをCaption ImageにD&Dしてサイズ調整をし、OptionsのImageの方にD&Dすれば意図していた画像選択が可能になった。

※追加し忘れていた(ノ∀`)

参考:
Dropdown
【Unity開発】uGUIのDropDownの使い方【ひよこエッセンス】


取り敢えず後は

  • 表示フォントサイズやどのくらい情報を表示するかの調整
  • 神経衰弱ゲームとしてのゲームギミック関連
  • カード(データ)・セットを増やす

辺りか。

どれも重い作業だけれども、まあ、ゴールが見えて来た……かなぁ…(ヽ'ω`)
カードセットの追加は後々継続的にしなければならない作業だし……

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

進んでいるように見えて後退してる(´・ω・`)?

と思いながら、漸進中…(ヽ'ω`)

実際は後退はしてないんだけども、最初の想定が甘すぎたので、やらならければならないことの実際量を目の当たりにして自分の中の適当工程表が長くなり、相対的に後退しているように思えてるだけ(ノ∀`)

この動画だと潰れていてわからないが、sqliteで読み取った日本語と英語のデータを対にしてカードにセットし、裏面も替えられるように出来た(・∀・)

問題は糞長い国名を持つ国をどうするかであるw
TextのBestFitとかでもいいんだけどねぇ。まあでも出来ればRichTextでsizeを指定してしのぎたいw

長いのってこの三国だけなんだけどねぇ…

  • セントクリストファー・ネーヴィス(セイント・キッツ・アンド・ネイビス連邦)
  • イギリス/グレートブリテン及び北アイルランド連合王国
  • セントビンセント及びグレナディーン諸島

まあ日本語表記ではこれだけだとしても、ひらがな表記、えせローマ字表記では更に長くて問題になる国は出て来るだろう…これについては単純にsizeを小さくして対応するしかない。老眼の俺氏では最早読むことは叶わないだろうがこの二種の表記はそもそも俺氏のような日本人中年男性向けのものではないので、読みにくくても

かまわん(・∀・)

いずれにしても、この確認作業が色々めどい(´・ω・`)
この後、国旗との同時表示モードも試さないといけないし。
プログラミング(技術調査?と実プログラミング)もデータ作りもテストも自分一人でやるのは大変だと思いました(・∀・)(小並感)

まだもうちょい、先に作ろうとした単純神経衰弱のゲーム的なギミック作成に入れない(ノ∀`)
カードデータ・セットももうちょい作らないといけないし…

何はともあれ、思ってた以上にスマホで小さいフォントを使うと老眼の人には読めなくなるのだなと知った…(ヽ'ω`)


お気に入りに入れてあるから、おそらくは参考にしたんだと思うんだけども、色々やりすぎてどの局面で参考にしたかよく覚えていない(´;ω;`)

多分、抽象クラスを継承させたクラスを処理系内部で判別して処理を分ける必要が出て来て調べたり、ImageやTextをどうにかして字を突っ込んだりいじったりしようとして調べたんだと思う…

参考:
Text
オブジェクトの親子関係のまとめ - Unity
Object.GetType メソッド ()
Genericsメソッド内で型に応じた処理を行う【C#】
Unity スクリプト 親子関係 形成・解除・取得 エントリが消えてた。
【Unity uGUI】Imageコンポーネントを徹底解説

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

本格的にリファクタリングを試みる(`・ω・´)

凄くベタな書き方をしてきたのでリファクタリングをすることにした。
という風に書くと意識高いというか余裕があるように見えるが、実際は今のままだとカードセットの変更が非常に面倒くさいことになると気づいたからだった(ノ∀`)

今内部で処理しているトランプのカードセットと今後追加したいカードセットとでは構造が異なるので、まずはカード絡みの処理をインターフェイスや抽象クラスにしておくかと頑張った(`・ω・´)

初めにいびつな形でカード用のプレハブに貼り付けていたCardManagerを分離し、カードのparentになるCanvasに共通の処理のみを持つCardManagerを貼り付けて、各カードにはACardInfoを継承したクラスを貼り付け、そのクラスにACardDataというカード情報の実体を持たせた。各カードへカード情報を設定する為のACardSetを継承するクラスも作ったら一応、目的通りの挙動になった。まだ完成はしていないけれども(ノ∀`) 大枠の部分は出来た。

参考:
インターフェイスのプロパティ (C# プログラミング ガイド)

C#のインターフェイスってフィールドを持てないんだね(´・ω・`)
Javaは持てた気がするんだけども。仕方がないので抽象クラスにしたけども。
Why can't C# interfaces contain fields?

eclipseに比べるとやっぱりなんだかVisual Studioは使いにくいねぇ(´・ω・`)
Visual C# のコード スニペット

試してはいないけれども、自分でコードスニペットを作ればいいのだろうか。
チュートリアル: コード スニペットを作成する

インターフェイスじゃなくて抽象クラスで受けてる(´・ω・`)
GetComponentを使うときはインターフェースを使おう


スクリプトをファイル名指定で動的に追加する

こんな感じらしい。つーかこれってスクリプトに限らず、あらゆるコンポーネントの動的追加方法か。取り敢えずstart()とかは動かない模様(´・ω・`)

targetGameObject.AddComponent(Type.GetType(scriptFileName));

参考:
Unityスクリプト実装メモ


EventTriggerの動的追加

Unity 動的にEventTriggerへ引数を持った関数を設定する方法の回答の通りにしてみたけど、何か追加されていないように思える(´・ω・`)

色々悩んで、ぐぐり直した結果、

注意点として、この方法で追加したeventはインスペクタに表示されません。
自分用Unityメモ:EventTriggerにスクリプトからEventを追加する

ということだった…_| ̄|○ ドウイウコトダネ…


Textの追加
本当は先に神経衰弱の追加要素を先に作ろうと思っていたが、国旗のデータセットを作ってしまったので、後で追加しようと思っていた文字表示を先にやっつけた。まだ細かいところを直していないのでアレだが、何はともあれ簡単にGameObject上に文字を表示出来るのが判って良かった(・∀・)

uGUIのパーツを一発生成
【Unity】ScriptからuGUIのTextにアクセスして内容を変更する


あとはPlayerPrefsリセットボタンを追加したり、タイトル画面にカード・タイプ選択用のドロップダウンを追加した。

参考にしたコードに

            //dropdown.RefreshShownValue();//更新を確認(画像を設定したとき)

と有ったのに、移植する際にコメントを削ってしまったが為にハマることに(ヽ'ω`)

別段画像を設定したわけではないのだけれども、RefreshShownValue()を入れないとIndexが0の場合に表示が真っ白になってしまった(´・ω・`)

内部的には問題はないようであったが表示がされないよう(´;ω;`)と悩んだ挙げ句、スクリプトリファレンスを眺めて、Dropdown.RefreshShownValueかヽ(`Д´)ノ と追加して解決してドヤ顔だったが、このエントリを書く際に参考にしたコードに既に注記されていたことに気づき、へこむ(´・ω・`)

参考:
Unityで、保存データ全消しのデバッグ用ボタンを配置する ← なんかWordpressのエラーが表示されてる。
【Unity】【C#】uGUI ドロップダウンの要素をコードで設定と取得、外観のカスタマイズなど

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

データ作成で時間がかかる(´・ω・`)

一応、前回で音楽有りのカード枚数を変更したりすることが出来たので、新たな機能を追加しようと思ったが、適当に作っていたから色々とコードが酷い(ヽ'ω`)

というわけでちょこちょこリファクタリング…というよりも大手術を実施中。
その途中で新しいカードセットが必要となり、国旗のセットを作ろうと目論む。
なんやかんやで無料素材があったのだけれども、その他のデータもついでにちょっと載せようとしたが為に、中々データ作成が終了しない…_| ̄|○

国連加盟国が193だか194で、日本が認めているのが196くらい?
なんか国連の広報センターだかが出してる国連加盟一覧は2014年のもので内容が古かったり、外務省の正式名称とも違ったりしていてイヤンな感じである(´・ω・`)

謎のエラーにハマり中
そんなこんなでデータ作成に一日二日と掛けていてコードの方はほとんど触っておらず、Android端末での起動もしていなかった。久しぶりにちょっと起動して愕然とする…カードの表側が表示されずに真っ白……( ;・´ω・`)ゴクリッ
Unity Editor上では正しく表示される…

新しくFilePathを追加したのがいけないのかと思ったが、Unity Editor上では問題ないし…

色々と調べた結果、どうもAndroid端末上だとTextデータが正しく読み取れていないみたい。
その結果、imageをロード出来なくて真っ白白助になっている模様(´・ω・`)
カードをクリックしてマッチしてない場合は戻り、マッチしている場合は消えるので他のデータはきちんと読み込まれている。

なんだろう… "SQLiteUnityKit" の使い方を間違えているのか……ちょっと調べないといけないな…(ヽ'ω`)


と思った数時間後、原因は判明しないが一応の解決はした。

色々とぐぐっても同じような事象はこの一件だけ。しかも何のコメントもなし。
How to make Sqlite work for Android with Unity and SQLiteUnityKit

それ以外でヒットすることもなく。凄く悩んだ(´・ω・`)
最初は何らかの処理が足らないかと思ったが、そんなこともなく。
AndroidではTEXT型だけ読めないのだろうかと思ったが以前試したdbのプロジェクトでは何事もなく読み取れた。

コードの書き方が悪くて負荷が大きくなって読めないのかと思って色々試したが状況は変わらず。
StreamingAssets内のdbを一旦削除し、残しておいた元dbをもう一回フォルダに突っ込んだけれども状況は変わらず。

致し方なく以前上手く動いていたdbを今のプロジェクトに持って来て試したところ、TEXT型の内容が読み取れた( ・´ω・`)?
最終的にそのdbを改変して内容をコピーした結果、無事に前の通り動くようになった…_| ̄|○

元々のdbが壊れたのだろうか…でもPC上では動いたな。
そう言えば、Android端末を再起動したのが効いたのかな?
dbは後から列を加えたりしたので、Android上のsqliteが前のdbをキャッシュしてて、それを読み込んでいたのかな?

まあ何はともあれ、何とか解決して良かった(・∀・)
また時間を無駄にしてしまったが…_| ̄|○

※追記
もしかすると上記の予想で当たりかもしれない。同じ現象に遭遇したが、Androidを再起動して、アンインストール後にインストールし直したら無事に解決した。アンインストールも関係ないかも。 一回でもアプリを起動して、その中でdbを使った後、PC上でdbの中身をいじってから、Android端末を再起動していない状態でアプリを再インストールすると駄目だったから。