見出し画像

Unityをいじっている最中に詰まったこと

Youtubeの「QuizKnockと学ぼう」チャンネル(運営:QuizKnock)の中のコンテンツ、「須貝と作れるようになるLIVE」でUnityをいじっています。勝手にいろいろやって躓いたことがたくさんあるので連ツイしていたのですが、そろそろ長くなって見づらくなってきたので、改めてnoteにまとめていきます。Twitterでは書ききれなかった補足も書いています。
環境はMac、日本語のLanguagePackは入れていないので、名称や画面などが異なる可能性があります。

オブジェクトが別オブジェクトの下に入ってしまう

UIに含まれるもの(テキストとか)はヒエラルキービューで順序を変えると表示順序が変わります。(下の方が前面)
2Dに含まれるもの(CircleとかSquareとか)はInspectorビューのSortingLayerの設定を変更する(レイヤー表示した時に下に来る方が前面)か、OrderInLayerの数値(大きい方が前面)を変更すると表示順序が変わります。
Adobeやお絵かきツール等のレイヤー順序とは逆なのでそれに慣れてる人は間違えやすいと思います。

スクリーンショット 2022-01-02 13.50.32
前後関係の設定項目


SortingLayerとOrderInLayerの使い分けとしては、一纏めにしたいオブジェクト群の前後関係をSortingLayerで設定して、同じSortingLayer内の1つ1つのオブジェクトの前後関係をOrderInLayerでやるのではないかと思います。
例えば、バングラディッシュの国旗、日本の国旗を別々のSortingLayerとして定義しておき、四角と丸の順序をOrderInLayerで定義するみたいなイメージ。

以下は補足

OrderInLayerの数値と表示順序の関係
値が大きい方が前面に来ます。

画像8
OrderInLayerの前後関係

SortingLayerの順序と表示順序の関係
レイヤー順序が下の方が前面にきます。

画像7
SortingLayerの前後関係

SortingLayerとOrderInLayerの関係
SortingLayerの方がOrderInLayerより優先されます。

画像9
SoretingLayerとOrderInLayerの関係

条件2では日本国旗の四角のOrderInLayerの値(0)よりバングラディッシュの四角のOrderInLayerの値(2)の方がの値が大きいにもかかわらず、Gameビューでは日本国旗の方が前面に出ています。このことから、SortingLayerの方がOrderInLayerより優先度の高い設定であることがわかります。

Game画面に表示範囲を広げたり狭めたりしたい

ヒエラルキービューでMainCameraを選択して、インスペクタービューのCameraの項目でSizeを変更すると表示範囲が変わります。

カメラサイズ
カメラサイズ
カメラサイズ比較
カメラサイズによるゲームビューの違い

文字を縁取りしたい

Component→UI→Effects→Outlineの順で選択します。
イラストツールの縁取りというより、文字をずらして縁取りぽく見せてるだけな気はします。

画像3
文字の縁取り

背景色を変えたい

ヒエラルキービューでMainCameraを選択、インスペクタービューでBackgroundを変更します。

画像11
背景色変更

Playボタンを押すためにマウスを動かすのが面倒

ショートカットを使いましょう。

スクリーンショット 2022-01-02 17.10.42
ショートカット

画面の大きさを変えたらレイアウトが崩れてしまった

正規の方法かはわからないですが、ヒエラルキービューでCanvasを選択、インスペクタービューにある設定を以下にして各オブジェクトの大きさを設定し直しました。
CanvasScaler
  UI Scale Mode:[ScaleWithScreenSize]
  ScreenMatchMode:[Expand]
(結構面倒だったので、簡単にできる方法あったら教えてください…)

画像10
レイアウトが崩れないようにする

コードは完璧なのにUnity上でエラーが出る

まず、Window→PackageManagerの順で選択します。

画像1
パッケージマネージャーの開き方

開いたPackageManagerの画面で(↑)矢印が付いている行を選択すると右下にUpdate to X.X.X(画像ではUpdate to 5.0.10)と出てくるので、そのボタンをクリックすると更新できます。すべての(↑)のあるパッケージに対して同様の操作を行い、全部を✅状態にしたら出なくなりました。

スクリーンショット 2022-01-02 10.43.22
パッケージマネージャー

再生中に設定値変更したのに、停止したら設定値が元に戻ってしまった

仕様なので泣く泣く再設定してください。(解決方法あったら私も知りたい)
予防策としては、GameビューのMaximize On PlayをONにしておくと再生時に全画面になるので間違えることは少なくなると思います。
(一時停止すると再生状態で元画面に戻るので注意は必要です)

画像13
停止忘れ防止

もろもろやると停止しても設定値が元に戻らないようにできるようです。
参考:https://tsubakit1.hateblo.jp/entry/20131107/1383834400

似たようなオブジェクトを一個一個設定するの面倒!

オブジェクトをAssetsに入れて、Assetsからヒエラルキービューにドラック&ドロップでオブジェクトを配置していきます。Assetsのオブジェクトを選択した状態でインスペクタービューを変更すると一括で設定できます。
ヒエラルキービューのオブジェクトを選択すると個別設定できます。

ボタン押したタイミングでスクリプトを動かしたい

多分そのうちやるので詳細は書きませんが、だいたいこんな実装しました。
・ボタン追加
・スクリプト作成
・スクリプトにpublicの関数追加(ボタン押したときにやりたい処理)
・ボタンにスクリプトをアタッチ
・ボタンのOnClickにボタンのオブジェクトをアタッチ
・作成した関数を指定
画像上ではTestScriptという名前のスクリプトにOnClickFunctionという関数を追加しています。

スクリーンショット 2022-01-02 16.20.41
ボタン押下でスクリプトを動かす



少し深い話(無視しても特に問題はないです)

変数にpublicをつけることに関する話

UnityのUI上で変数とオブジェクトを紐付ける場合は、publicではなく、[System.SerializeField]を使った方が良いと思います。
LIVEでは簡略化のためにpublicにしたのだと思いますが、publicだと他のスクリプトから簡単に触れてしまい、扱うスクリプトが増えていくと元のスクリプトが予期しないところで値を変えられたりする可能性が出てくるためです。
[System.SerializeField]だとコード上ではprivate扱いになるため、他のスクリプトから見えなくなり、安心です。

よくわからなかった人へ

Twitterへのリプや質問箱に投げていただければTwitter上で答えるかもしれません。今回の記事に関係しない事でも良いです。私も勉強になるので、お気軽にどうぞ。
※回答できるよう努力はしますが、回答できない場合もあります。


この記事が気に入ったらサポートをしてみませんか?