三流豆腐。

三流のゲームプログラマ。C/C++/C#/Objective-C/python/技術向上を目指します。

アプリケーションのアイコンを簡単に作成した!

 はじめに

サウンドツール作ったので、qiitaに記事上げました!

https://qiita.com/tofu_doon/items/3b5fbe100262c4a351c2

f:id:tofu_doon:20190809022531p:plain

今回はこのツールのアイコンを簡単に作成したのでご紹介します。

 

作り方

①下記サイトでよさげな素材を探します

https://icooon-mono.com/

 

②組み合わせます

f:id:tofu_doon:20190810003927p:plain

 

③.下記サイトを使ってicon形式に変換します

https://ao-system.net/alphaicon/

 

④Formにアイコンを設定して完了!

f:id:tofu_doon:20190810005734p:plain

 

 

【Unity】SetActiveとenabledの違いとは?

SetActiveとenabledの違いとは?

Menu関連の処理であれを表示、これを非表示に……としている時にSetActiveとenabledの違いがようやくわかったのでご紹介。

Unityバージョン:Unity 2018.3.13f1

 

前準備

以下のようなメニューを作成しました。

Closeのボタンが押されたらメニューを閉じたいと思います。

f:id:tofu_doon:20190512160243p:plain

f:id:tofu_doon:20190512160254p:plain

 

 

enabled

Buttonには以下のスクリプトをアタッチして確認。

Inspectorから親であるImageを受け取ります。

f:id:tofu_doon:20190512160337p:plain

Closeボタンを押すと……。

Imageだけが消えました。

f:id:tofu_doon:20190512160637p:plain

f:id:tofu_doon:20190512160717p:plain

 

SetActive

Buttonには以下のスクリプトをアタッチして確認。

Inspectorから親であるImageを受け取ります。

f:id:tofu_doon:20190512160829p:plain

Closeボタンを押すと……。

親のImageだけでなくメニュー全体が消えました。

f:id:tofu_doon:20190512160913p:plain

 

まとめ

・SetActiveはgameObjectが無効になる(子も無効になる)

・enabledはgameObjectにアタッチされているコンポーネントが無効になる

メニューの表示、非表示等であればSetActiveを使用するほうが便利そうですね。

 

【Unity】Menuを作成する【uGUI】

3Dでも2Dでもメニュー画面を使うことは多いと思います。

以下のようにMenu画面を簡単に作成したのでご紹介します。

f:id:tofu_doon:20190504004524p:plain

Unityバージョン:Unity 2018.3.13f1

 

やり方

①uGUIを組み合わせてMenuを作る

②Menuを呼び出すスクリプトを作る

今回はButtonが押されたらMenuを呼び出し、Menu内のButtonが押されたらMenuを閉じるシンプルな構成にしています。

 

①uGUIを組み合わせてMenuを作る

Menuを構成するパーツ

・Image(Background):背景用のImage、黒色でアルファ値を100にしています

・Image:Menuの主な表示部分

・Button:Menuを閉じる用のButton

・Text:文字列Text Menuを表示

f:id:tofu_doon:20190504004751p:plain

背景用のImageを用意した理由

・表示するMenuより後ろのオブジェクトを触らせないため(Raycast Targetが有効な時)

・現在表示しているMenuを強調するため

親子階層にする理由

・親を表示/非表示すると、子も表示/非表示になるため


②Menuを呼び出すスクリプトを作る

Buttonにアタッチする想定で、以下のように作ります。

Menu表示/非表示のフラグをInspectorから操作できるようにすることで、この1つのスクリプトでMenuを表示するボタン、非表示にするボタンどちらでも使うことができます。

f:id:tofu_doon:20190504010042p:plain

 

後はMenuを表示するボタン、Menu内のボタンへスクリプトをアタッチして、Inspectorから設定をします。

Menu:Menuの一番親である背景用のImageを渡します

Enabled:チェックあり(Menu表示)/チェックなし(Menu非表示)

f:id:tofu_doon:20190504010837p:plain

 

まとめ

・MenuはuGUIのコンポーネントを組み合わせて作れる

・親への変更は子へも反映される(Active、Position、Scale等)

・背景用のImageを使うことで後ろのオブジェクトを操作させなく出来る

 簡単なメニュー画面を作成しましたが、スマートフォンゲームでよくあるような表示時の演出等がないので、今後実装出来たらなと思います。

【Unity】Textから文字列を取得するには?【uGUI】

Textから文字列を取得するには?

画面上に文字を表示する際よくお世話になるText。

スクリプトからTextの文字列を取り出す際に躓いた点をご紹介します。

Unityバージョン:Unity 2018.3.13f1

 

問題

・Text内のNew Textの文字列が正常に取得できない

 

Text内にあるNew Textという文字列を表示Logに表示したいと思います。

f:id:tofu_doon:20190503115115p:plain

 

以下のコードで正常にでるかなと思ったのですが……。

f:id:tofu_doon:20190503115219p:plain

 

ダメでした。

よく考えてみたらわかることですが、Textのコンポーネントの中にあるTextの文字列を表示したいので、きちんとアクセスしていませんでしたね。

f:id:tofu_doon:20190503115434p:plain

 

解決

以下のコードできちんとNew Textの文字列が表示されました。

変数名にコンポーネント名を入れることが多いので、Text.textというようにちょっと分かり辛くなってしまいますね。

変数名は一度考え直すほうが良いかもしれません。

f:id:tofu_doon:20190503115725p:plain

f:id:tofu_doon:20190503115740p:plain


 

まとめ

・Text.ToString()ではコンポーネントの名前が表示されてしまう

・Text内の文字列を表示するには、Textコンポーネント内のtextにアクセスしよう

コンポーネント名が取得したい機会はあまりないと思いますが、取得した際コンポーネント名の後ろに(UnityEngine.UI.Text)と付いているので、純粋にTextで判定や比較を行う際は一工夫必要かもしれませんね。

 

【Unity】recttransformから幅、高さをとるには?

recttransformから幅、高さをとるには?

recttransformから幅、高さを取りたいと思うことは多いと思います。

sizeDeltaを使用して取得していましたが、Anchorの設定がstretchの際に正常に値が取得出来なかったのでご紹介します。

下記記事を参考にさせていただきました。

http://sprfield.hatenablog.jp/entry/2017/03/19/233623

Unityバージョン:Unity 2018.3.13f1

 

比較

手順

①width:720 height:1080のScreenを用意

②width:100 heigh:100 Anchor:stretchのImageを用意

③sizeDelta、rectをDebug.Log()で確認

f:id:tofu_doon:20190502113159p:plain

 

参考記事にもありましたが、rectだと正常に幅、高さが取得出来ていますね。

一方、sizeDeltaの値はおかしいですね……。

Screenの幅、高さからImageの幅高さを引くと確かに(620,980)にはなりますが、Logに出力されている値のマイナスはどこからきたものなのでしょう……。

f:id:tofu_doon:20190502113454p:plain

 

色々探していると、下記記事で原因がわかりました。

https://codeday.me/jp/qa/20190320/440891.html

AnchorがstretchなのでAnchor間の幅、高さはCanvasと同じになります。

CanvasはScreenと同じ大きさなので(720,1080)。

(Imageの幅、高さ) - (Anchor間の幅、高さ) = sizeDelta

(100,100) - (720,1080) = (-620,-980)

こういうことだったんですね。

 

まとめ

・幅、高さを取るにはrecttransform.rect

・sizeDeltaは(オブジェクトの幅、高さ) - (アンカー間の幅、高さ)

Unityのドキュメントも確認していましたが、ちょっと分かり辛かったですね。

https://docs.unity3d.com/ja/current/ScriptReference/RectTransform-sizeDelta.html

 

【Unity】フェード処理を作ってみる

フェード処理を作ってみる

フェード処理はゲーム作っていたらほぼほぼ必要になりますが、今現在もUnityのデフォルト機能ではないみたいですね。

フェードに関しては色々なやり方を見かけましたが、今回は自作してみることにしましたので一部ご紹介します。

※ゲームフローの制御はSceneではなくObject単位で行っています。

Unityバージョン:Unity 2018.3.13f1

 

順序

①FadeManagerというオブジェクトとスクリプトを作成

②フロー制御のManagerがフロー変更のタイミングでFade処理をリクエス

③FadeManagerのUpdateがFade処理を実行

 

問題点

ゲームフローの制御をObject単位で行っており、動的に生成しているのでFadeManagerの上に描画されてしまいきちんとフェードがかかりませんでした。

なので、描画順を変更するためにSort Orderをスクリプト上から変更するのですが、変更後値を元に戻してもフローObjectのボタンが反応しないという問題も出ました……。

f:id:tofu_doon:20190430204508p:plain

f:id:tofu_doon:20190430204526p:plain

 

解決

きちんとフェードがフローObjectoにもかかるようにFadeManagerにあるCanvasのSort Orderを変更します。

フェード処理のリクエスト時に、Sort Orderを1にし描画順をフローObjectの上にします。

フェード処理が終わったら、Sort Orderを0へ戻しフローObjectへ影響がないようにします。

f:id:tofu_doon:20190430210341p:plain

f:id:tofu_doon:20190430210129p:plain

 

これで、きちんとフェードがかかるようになりましたが、次はフェード後フローObjectのボタンが押せなくなる問題です。

Sort Orderも元に戻しているし、他にも探してみましたが原因は分かりませんでした。

しかたがないので、フェード用PanelのRaycast Targetを切って対応することにしました。

まぁ、これでボタンは押せるようになったのでよしとしますか……('ω')

f:id:tofu_doon:20190430210039p:plain

 

まとめ

・複数のCanvasで描画順を変更したいときはSort Orderを変更する

・判定させたくないオブジェクトのRaycast Targetは切る

まだまだ、足らない点が多いですがとりあえずは動くようになりましたw

そもそも、フロー制御をObject単位で行うというのも効率が良いかは今のところ分かりません。

今後もいじりながら最善の手法を模索していきたいですね。

 

 

【Unity】ImageのColorをスクリプトから変更

ImageのColorをスクリプトから変更したい

前記事に続きフェード処理途中で若干モヤっとした事のご紹介をします。

下記記事を参考にさせていただきました。

https://qiita.com/Hal_mai/items/1469398078e81bc7ef27

Unityバージョン:Unity 2018.3.13f1

 

やり方

 ImageのColorを変更したいので、スクリプトではImageをSerializeFieldで受け取って、こうアクセスして変更すれば良いよね。

f:id:tofu_doon:20190430124300p:plain

f:id:tofu_doon:20190430124402p:plain

ダメでした。

Colorの内部を直接いじることは出来ないみたいですね。

正しくはこんな感じ。

RGBAの順です。

f:id:tofu_doon:20190430124545p:plain

 

おまけ

ちなみにですが、RGBA個別の色を取得することは出来ます。

f:id:tofu_doon:20190430131521p:plain

 

まとめ

・Color内のRGBAは個別に変更できない

・主要な色はカラーネームにある(参考記事参照)

特定の色に変更するだけならば、Color.blackなどカラーネームを使用すればいいですが、動的に色を変更させるなど細かな設定が必要な場合はnew Color(R,G,B,A)のやり方が良いかもしれませんね。

また、参考記事ではmaterialの色を変更していますが、Imageでも使用しているColorは同じなので問題なさそうですね。

個人的にはColorのRGBA個別に色を変更出来たほうが便利なんじゃないかなぁと思うのですが……。