三流豆腐。

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

【Unity】SceneManagerを使用しないフロー制御

SceneManagerを使用しないフロー制御

Sceneは1つのまま、内部でフロー制御できないか試したので、ご紹介します。

Unityバージョン:Unity 2018.3.13f1

やり方

①フロー制御のManagerを作成

②フローごとのオブジェクトをPrefab化

③ManagerがフローごとにPrefabを生成

f:id:tofu_doon:20190427230817p:plain

f:id:tofu_doon:20190427231006p:plain

 

ManagerのInspectorにフローのObjectを指定。

f:id:tofu_doon:20190427231309p:plain

f:id:tofu_doon:20190427231113p:plain

 

各フローのObjectが遷移後のフローを指定します。

今回はButtonにButton用スクリプトをアタッチしてOnClick()の中で呼び出してます。

f:id:tofu_doon:20190427231611p:plain

f:id:tofu_doon:20190427231620p:plain

 

フローのEnumも用意します。

この時、Managerの中に用意すると呼び出すときにManager.EnGameFlowとなってちょっと長いので、Managerの外に定義してます。

f:id:tofu_doon:20190427231713p:plain

 

後は、ManagerのUpdateでリクエストが来たら今のフローのObjectを削除してリクエストのフローのObjectを生成します。

f:id:tofu_doon:20190427232014p:plain

これで、フロー制御することができました。

 

感想

 Sceneを跨がないので、フェードアウトの制御もしやすいと思います。

ただ、LoadSceneとこの方法どちらが早いの検証等もまだしてないので、今後やっていけたらなと思います。

問題点等ありましたら教えてくださいm(__)m

【Unity】FindやSerializeFieldを使用せず他のスクリプトを使用したい!

FindやSerializeFieldを使用せず他のスクリプトを使用したい!

データやオブジェクトを管理するManagerを作ることは多々あると思います。

その際、Manager側のメソッドをFindやSerializeFieldを使って呼ぶのが億劫だと思ったので、ちょっとした方法をご紹介します。

Unityバージョン:Unity 2018.3.13f1

 

やり方

シングルトンを使用します。

下記の記事を参考にさせて頂きました。

 https://www.hanachiru-blog.com/entry/2018/09/26/010232

①Managerのclassと同じ型の変数をpublic staticで定義

②定義した変数にthisを代入

③どこからでもクラス名.宣言した変数でアクセス可能に

f:id:tofu_doon:20190427211247p:plain

Sceneを跨いで使用しない想定なので自身のgameObjectの削除は行っていません。

f:id:tofu_doon:20190427211258p:plain

これで、他のスクリプトから呼べます。

f:id:tofu_doon:20190427212137p:plain

注意点

他にもシングルトンの実装方法はあったので、もっと調べてみる方がよさそうですね……(>_<)

 

【Unity】シーン遷移

UnityのScene遷移

Unity触っていたら誰もが通ると思います。

Scene遷移。

今回は軽く躓いたところをご紹介。

Unityバージョン:Unity 2018.3.13f1

 

やり方

①using UnityEngine.SceneManagement;を書きます

②LoadSceneの引数に遷移させたいScene名を指定します。

スクリプトをボタン等にアタッチしてメソッドを呼び出します。

Sceneの指定ですが、Asset以下ならパス指定しなくても読み込んでくれるみたいですね。

f:id:tofu_doon:20190426004224p:plain

注意点

こんなエラーが出たときは、

f:id:tofu_doon:20190426004500p:plain

Sceneがビルドに含まれていないので追加してあげましょう。

f:id:tofu_doon:20190426004559p:plain

これで大丈夫。

まぁ、エラーメッセージ読んだらわかるんで躓くことでもないですね('ω')

 

【Unity】Debug.Logに関するTIPS

 

Debug.Logに関するTIPS

Unityバージョン:Unity 2018.3.13f1

Unity触っていたらよくお世話になるDebug.Log。

すごく基本的なTIPSをご紹介します。

使い方

Logには以下の3種類があり、

①通常のLog

②Warning

③Error

状況に応じて使い分けられそうです。

自分は通常のLogとLogErrorしか使ってませんが。

Assertは引数に(number > 0)のように条件を指定でき、falseの場合Assertが出ます。

f:id:tofu_doon:20190425003414p:plain

f:id:tofu_doon:20190425003430p:plain

注意点

Debug.Logは重いので、製品版では無効化するほうが良いみたいですね。

https://qiita.com/rodostw/items/39183e62ed2a1f52f690

 

【Unity】InputFieldの落とし穴【uGUI】

InputFieldの落とし穴

f:id:tofu_doon:20190424004845p:plain

InputFieldから、数値だけを取得しようとして躓いたことを紹介。

Unityバージョン:Unity 2018.3.13f1

 

入力された数値を取得する

順序:

①InputFieldをHierarchyに生成

②InspectorからContent TypeをInteger Numberへ変更

③textの文字列を数値へ変換

 

Content TypeをInteger Numberへ変更した事で、数値以外の入力を制限できます。

f:id:tofu_doon:20190424005500p:plain

 

 

数値以外の入力を制限したとはいえ、textから取得できるのは文字列なので、Convert.ToInt32を使用して数値に変換します。

※using Systemを忘れずに!

f:id:tofu_doon:20190424005512p:plain


さぁ、これで完璧だ!

と思ったんですけどね……。

 

バックスペースでエラー

バックスペースでInputFieldの数値を全て消そうとすると……。

f:id:tofu_doon:20190424004713p:plain

FormatException: Input string was not in a correct format.

というエラーが!

Content TypeがInteger Numberなのにそれ以外が入ってしまっているみたいですね。

 

対処法

変換前にチェックの処理挟んで解決しました。

f:id:tofu_doon:20190424010221p:plain

文字コードとかで判定しようかと思ったんですが、textからさらに取得して判定して……の流れが面倒だったのでこの形にしました。

もっとスマートなやり方があったら教えてくださいm(__)m

 

【Unity】ScriptableObjectに関するTIPS

ScriptableObjectに関するTIPS

キャラデータなどで重宝するScriptableObject。

何といってもInspectorから編集できるのは便利ですよね。

そんなScriptableObjectのTIPSをご紹介します。

使いどころがあるかわかりませんが。

 何と読み込んだAssetからメソッドが呼べます!w

 

 使い方

手順

①ScriptableObjectのクラスを作る

②他のクラスなどでScriptableObjectのAssetを生成する

③使用するクラスで読み込む

※(Resources.Load、SerializeField等)

f:id:tofu_doon:20190423004120p:plain

f:id:tofu_doon:20190423002447p:plain

f:id:tofu_doon:20190423002145p:plain

Assetからはメソッドは呼べないものだと勝手に思い込んでました('ω')

これで、メソッドを経由してデータ設定したり出来るのでnullチェックとかでバグ等減らせそうですね(白目

 

【Unity】クリック箇所にuGUIがあるか判定する……そして……。

 

使用バージョン:Unity 2018.3.12f1

目次:

 

やりたい事

・クリック時に特定のuGUI以外だったら処理をさせない。

今回は赤枠のimage以外だったら処理させないようにします。

f:id:tofu_doon:20190421233017p:plain

 

順序

①Raycastの結果を受け取るListを用意する

②PointerEventDataの変数にクリック時のマウス座標を入れる

③RaycastAllを使用する

 

最初、Physics2D.Raycast使おうと思ってましたが、

uGUIには使えないみたいですね(>_<)

 

 使用方法

PointerEventData型の変数のpositionにマウスの座標を入れて、

RaycastAllの引数にPointerEventData型の変数とListを入れれば、

渡したListにRaycastにヒットした結果が入ってきます。

f:id:tofu_doon:20190421235221p:plain
結果のListからgameObjectにアクセスできるから大体の処理は出来そう。

以下は個人的にやりたかった処理。

f:id:tofu_doon:20190421235329p:plain

子オブジェクトがクリックされたかの確認というのは、

f:id:tofu_doon:20190421234758p:plain

Board以下にImage以外にも動的に追加されるので、

Boardの子オブジェクトをforeachで回してます。

ちなみにthisはBoard。

 

おまけ

f:id:tofu_doon:20190421235558p:plain

綺麗じゃないけどImage以外のところだったら処理しないようにはできたんだけどね!

学生の頃割とやってた書き方('ω')w