【Unity公式チュートリアル】スクリプティング〈レッスン1.1-1.7〉
この記事について
注意事項
- 特に断りがない限り、C#について記述しています
- 個人的に知らなかったこと、誰かの役に立ちそうな事をまとめています
レッスンタイトル一覧
1.1 Scripts as Behaviour Components
1.2 Variables and Functions
1.3 Conventions and Syntax
1.4 C# vs JS syntax
1.5 IF Statements
1.6 Loops
1.7 Scope and Access Modifiers
スクリプトの作成とアタッチ方法
作成方法
1. Projectウィンドウ→Create
Createボタンではなく、右クリック→Createからでも作成できる
2. Inspectorウィンドウ→AddComponent→New Script
これは作成と同時にそのオブジェクトにアタッチ(追加)されてしまうので注意して下さい。
アタッチ方法
1. ドラッグ&ドロップ(D&D)
アタッチしたいゲームオブジェクトにスクリプトをD&Dするだけ。
2. Inspectorウィンドウ→AddComponent→Script
3. Inspectorウィンドウ→AddComponent→New Script
作成の2. で紹介した方法。作成と同時にアタッチしてくれる。
4. 上のメニューバー→Component→Scripts
何かGameObjectを選択していないと使用できないので注意!
デフォルトのアクセス修飾子
C#では下のような場合、privateとして扱われる。
int num = 1;
なお、JavaScriptはpublic扱いらしいので注意。
public修飾子の罠?
public修飾子をつけたメンバ変数をスクリプト内で初期化していてもInspector側の数値に書き換えられることに注意。Start関数で初期化したり、[System.NonSerialized](参考リンク:工事中)を付加したりする工夫が必要。
ひとこと
前の書き方は長ったらしいなーと感じていたので変えてみました。
だいぶ見やすくなったんじゃない?って感じです(`・ω・´)
初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!
【Unity公式チュートリアル】インターフェースと基本〈Unityのインターフェース〉@ヒエラルキーウインドウとオブジェクトの親子関係 編
ヒエラルキーウインドウとは
シーン内に存在するオブジェクトを追加された順に表示、かつ親子関係も階層的に表示する。また、以下の機能を持つ。
- 表示順番は任意に変更することが可能
- ヒエラルキーウインドウからオブジェクトの削除や複製も行うことが可能
ツールバー
Create ボタン
新しい空のゲームオブジェクトを作成したり、デフォルトで用意されているゲームオブジェクトを作成する際に使用する。Search バー
シーン内のオブジェクトを探す際に使用する。
親子関係
親子とは
二つのオブジェクトが階層になっている場合、階層の上のオブジェクトを”親”と呼び、階層が下のオブジェクトを”子”と呼ぶ。この時、二つのオブジェクトの関係を親子関係という。
親子による影響
上の画像のような親子が存在していたとする。この時、子のワールド座標は親のワールド座標に自身の座標を足したものとなっている。(Transformはローカル座標を表示している。)
このように、Transformが親の影響を受ける。ゆえに、シーンビューで親を動かすと子も同じように動く。もちろん、子を動かしても親は動かない。
ひとこと
タイトル長すぎ問題...。どこか削って短くしようかなぁ。
初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!
【Unity公式チュートリアル】インターフェースと基本〈Unityのインターフェース〉@ゲームビュー 編
ゲームビューとは
ゲーム内のカメラから見たものをレンダリングする。最低でも1つ以上のカメラが必要となる。再生 / 一時停止 / 1フレーム送り は以下のボタンで行う。
なお、再生中に変更した内容は再生を終えると再生前の内容に戻る。
ゲームビューコントロールバー
Display ボタン
シーンにカメラが複数ある時に切り替えることができる。Scale スライダー
ゲームシーンをズームできる。Maximize on Play ボタン
有効にするとゲームシーンをスクリーンと同じ最大のサイズで再生する。Mute Audio ボタン
有効にすると再生中にゲーム内のオーディオをミュートにする。Stats ボタン
レンダリング統計を表示する。ゲームのパフォーマンス確認に役立つ。Gizmo ボタン
Gizumoの表示 / 非表示を切り替える。特定のGizmoだけを表示したい時はドロップダウンだけをチェックする。
高度なオプション
Warn if No Cameras Rendering
有効にすると画面にレンダリングするカメラが無ければ警告が表示される。Clear Every Frame in Edit Mode
有効にすることでゲームが再生中でないときはフレームごとにゲームビューが消去される。(すいません。機能がよくわかっていません...。)
関連(参考)ドキュメント
豆知識
ひとこと
Clear Every Frame in Edit Modeってなんなのでしょう。色々試したのですが良く分かりませんでした...。
【Unity公式チュートリアル】インターフェースと基本〈Unityのインターフェース〉@シーンビュー 編
シーンビューとは
ゲームを視覚的に構築することが可能なインターフェース
操作方法
下の画像にあるボタンで操作方法を切り替えます。画像下部の文字はキーボード上の該当キーで切り替えが行える英字を示しています。
Hand Tool
左クリック+ドラッグ:シーンビューカメラを移動できる
右クリック+ドラッグ:一人称視点で見回すことができる(カメラは移動しない)
Alt+左クリック+ドラッグ:ピポットを中心にカメラを回転
Alt+右クリック+ドラッグ:カメラのズーム調整Translate Tool
オブジェクトをX, Y, Z軸方向に移動可能。 なお、中心をドラッグすることで全ての方向に移動できるが3Dの移動において推奨されているわけではないことに注意。
Rotate Tool
オブジェクトをX, Y, Z軸方向に回転可能。なお、中心をドラッグすることで全ての方向に回転できるが各軸で回転させたほうが便利。
Scale Tool
オブジェクトをのスケールの変更が可能。なお、中心をドラッグすることで比率を保ったスケールの変更が可能であるため推奨されている。
見え方の変更
Rendering Option
シーンビューでのレンダリング方法を変更できる。画像は一例。
〈Wireframe〉
〈Shaded〉
2D / 3D切り替え
基本的に触れる必要がない。2Dのスプライトを重ねる順番を見る時に使えるかも...?Lighting Toggle
ライトをシーンビューにレンダリングするかを切り替えるAudio Preview Toggle
現在のシーンビューカメラ位置でゲームのオーディオを確認するOther Toggle
SkyboxやFogをシーンビューにレンダリングするかを切り替えるSearch
シーン内のオブジェクトを検索可能。検索で見つかったオブジェクト以外は白くフェードアウトされる。
View Gizmo
それぞれの軸を押すとその方向から見ることができる。また、中心を押すことでPerspectiveカメラとIsometricカメラの切り替えが可能。
その他の機能
- Hierarchyでオブジェクトを選択中にFキーを押すとそのオブジェクトにフォーカスする。(ダブルクリックした際と同じ動作になる)
ひとこと
見え方の変更パートで書いた内容ほとんど使ったことないです!(笑)
Searchとかめっちゃ便利な気がするんですが...まぁ今まで知らなかったからね。仕方ないね。(´・ω・`。)
初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!
【Unity公式チュートリアル】インターフェースと基本〈Unityのインターフェース〉@インターフェース概要 編
Unityのインターフェース紹介
メインとなるパネル
Unityのインターフェースは "Scene View / Hierarchy / Game View / Project / Inspector" の5つのパネルで構成されている。
- Scene View:ゲームを視覚的に編集可能
- Hierarchy:シーン上のオブジェクトを階層的に表示して親子関係も表示
- Game View:ゲームのプレビュー画面。Playボタンを押すとエディタ上でテスト可能
- Project:ゲームを構成しているすべてのもの(スクリプト / オーディオ / テクスチャ等)を表示
- Inspector:選択中のオブジェクト等のプロパティを表示
ツールバーボタン
Scene Viewでオブジェクトを操作する際に用いる
回転が”原点中心か軸中心か”&”Local軸基準かGlobal軸基準か”を設定
"再生 / 一時停止 / 1フレーム進む"
不明なボタン(説明なし)
Unity Services用ボタン
アカウントにサインインしたりPro版にアップグレードする際に使用するボタン
Scene View上のオブジェクトの表示 / 非表示をLayerごとに切り替えることが可能なボタン
5つのパネルのレイアウトを保存したり、デフォルトのものに変更する時に使用するボタン
関連(参考)ドキュメント
ひとこと
回転方法を切り替えるボタンとかLayerごとに表示 / 非表示を決めるボタンとか一回も使ったことないですし、そもそもそんな機能があるなんて知らなかったですネ。「このオブジェクトが邪魔で他のオブジェクトが見辛いわ〜」とか思ったことなんて何度もあるんですけどね。無知って怖いネ。そしてUnityさんさすがだネ。
Scriptを非アクティブにしても生き残る関数たち
はじめに
まず下のスクリプトを見て下さい。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { void Awake(){ Debug.Log ("Awake"); } void Start(){ Debug.Log ("Start"); } void Update(){ Debug.Log ("Update"); } void OnTriggerEnter2D(Collider2D other){ Debug.Log ("OnTriggerEnter2D"); } }
このスクリプトを下のようなオブジェクトにアタッチします。(画像はアタッチ済み)
もちろん、スクリプトは非アクティブにしていますー。
前提が長くなりましたが、今回は「再生ボタンを押して、下の画像のBallをぶつけるとどのようなログが残る...?」と言うお話です。
本題
いきなり結果
結果からどうぞ。と言うことでGIF画像をどーん。
スクリプトが非アクティブでもAwake()
とOnTriggerEnter2D()
は呼ばれていますね。
解明...?
オーバーライドしている関数が非アクティブでも(オーバーライドが)有効になっているのですかね...。OnTriggerEnter2D()
は良いとして、Awake()
は特殊なのでしょうか...うーむ...。
ちなみに
スクリプトをAwake()
とOnTriggerEnter2D()
だけにすると以下の画像のようにアクティブ状態を切り替えるボタンが無くなります!
おわり
結局、「この関数が生き残るんだ!」という法則らしいものはお見せ出来ませんでした...(´・ω・`。)スイマセン
...が!何か変な挙動をしていたら「スクリプトが生きているのかも?」と気にかけるきっかけになると嬉しいです^^。
OnCollisionExit2D()はDestroyでも呼ばれるのか
はじめに
2Dのことだけしか調べてません(`・ω・´)
”多分”3Dでも一緒じゃないかなー。ってことなんで、誰か実際に調べて結果だけください。
本題
悩み
OnCollisionExit2D()
という関数はTriggerではないCollider同士が接触から離れた際に呼び出される関数です。この関数、接触中の片方のオブジェクトがDestoryされた場合はどうなるんだ?という疑問ががが...
結果
Destory(gameObject)
だろうがSetActive(false)
だろうがColliderが消滅しても離れたという判定になるようです。
豆知識?
消滅したオブジェクト側でも消滅前に
OnCollisionExit2D()
が呼ばれる接触しているオブジェクトを両方同時にDestroyしても
OnCollisionExit2D()
が両方とも呼ばれるOnCollisionEnter2D()
内でDestroyするとOnCollisionExit2D()
→OnCollisionEnter2D()
の順で処理されるオブジェクトが生じてしまう可能性がある(私の環境では100%)ので注意
おわり
「記事内でColliderと書いてるけど”Collider2D”じゃね?」とか言われるかなーと思いつつ修正が面倒なのでそのままで...(笑)
初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!
現在のSceneの再読み込みをスマートなコードで書く
はじめに
現在のSceneをもう一度読み込みたい時ってありますよね。もう一度ステージをプレイさせるためにステージを読み込み直す時とか...。
毎回、SceneManager.LoadScene("自分のシーン名");
って書いても良いのですが...自分のSceneを書くのは変だなと思ったので少しスマートに書いてみました(`・ω・´)!
コード
// 現在のScene名を取得する Scene loadScene = SceneManager.GetActiveScene(); // Sceneの読み直し SceneManager.LoadScene(loadScene.name);
これで逐一、自分のシーン名を手書きしなくて済みますネ。
おわり
行数は長くなっちゃいますが結構気に入ってる書き方です(`・ω・´)!
初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!
Scene画面で移動したオブジェクトが自動で中心にくる方法
はじめに
またタイトルだけでは「?」ですね。
というわけで動きを下に示しておきますー。
結構役に立ちそうですね!
「こういった場面に使えるよ!」とハッキリ断言できませんが(笑)
やり方
オブジェクトを選択して《shift+F》
はい!とても簡単です(`・ω・´)!やり方の説明終わり!
おまけ
他のオブジェクトを選択しない限り、オブジェクトの選択を解除しても効果は持続しますヨ!
おわり
最初に言えよな内容ですが..Macでの動作となるので気をつけてください(´・ω・`。)
Windowsは確かめれておりませぬ。(借りたPCではデフォルトでこの機能がついていたような...いなかったような...
P.S. 小技ネタ書くの楽しい!だって...短いし...(笑)