【Unity公式チュートリアル】スクリプティング〈レッスン1.13-1.28〉
この記事について
注意事項
- 特に断りがない限り、C#について記述しています
- 個人的に知らなかったこと、誰かの役に立ちそうな事をまとめています
レッスンタイトル一覧
1.13 Translate and Rotate
1.14 Look At
1.15 Linear Interpolation
1.16 Destroy
1.17 GetButton and GetKey
1.18 GetAxis
1.19 OnMouseDown
1.20 GetComponent
1.21 Delta Time
1.22 Data Types
1.23 Classes
1.24 Instantiate
1.25 Arrays
1.26 Invoke
1.27 Enumerations
1.28 Switch Statements
n秒後にDestory
GameObjectを生成してから5秒後にDestroyしたいという時は以下のように書くことが出来ます。
void Start () { GameObject.Destroy (gameObject, 5f); }
私はInvokeやコルーチンでDestroyを遅らせていました...。全く知らなかったです(´・ω・`。)
GetKey と GetButton
この二つは同じような使い方をすれば同じように動きます。ですが、Unityの公式はGetButtonを推奨しています。理由をググった結果、以下の記事で納得できたので紹介しておきます。
OnMouseDown
ユーザーがGUIElementまたはColliderを持つオブジェクト上でマウスボタンを押したとき、そのオブジェクトにOnMouseDown関数が設定されていれば呼び出されます。 しかし、Layerの設定がIgnore Raycastであれば呼び出されません。
以下はCubeにスクリプトをアタッチしています。
値型と参照型
値型
値型の例として
int / float / double:数値を格納
bool:真偽値を格納
Structs:Vector3やQuaternionのような2つ以上の変数を持つ構造体
といったものがあります。
実際に変数の中に値が入っているのが特徴です。以下のようなスクリプトを実行してもスクリプトがアタッチされているオブジェクトは特に変わりません。これは変数posが値型であり、新たな値を代入するとpos自身の値が変更されているだけだからです。
void Start () { Vector3 pos = transform.position; pos = new Vector3 (0, 2, 0); }
参照型
参照型は
- インスタンス化したクラス(のアドレス)が格納された変数
変数が値の格納されているアドレスを持っているのが特徴です。以下のようなスクリプトを実行するとスクリプトがアタッチされているオブジェクトは(0,2,0)に移動します。これは変数tranが参照型であり、参照先の値を変更したために同じ場所を参照していたオブジェクトが動いたということです。
void Start () { Transform tran = transform; tran.position = new Vector3 (0, 2, 0); }
Invoke系まとめ
Invoke(string methodName, float time)
Invoke("関数名", 実行までの待機時間)
という感じで使用します。
void Start () { Invoke ("Hogehoge", 2f); } void Hogehoge(){ Debug.Log ("ほげー"); }
これで開始から2秒後に「ほげー」という文章が出力されます。
注意点としては下の二つぐらいですかね。
- void関数のみしか呼べない
- 引数を渡せない
InvokeRepeating(string methodName, float time, float repeatRate)
InvokeRepeating("関数名", 実行までの待機時間, 再実行までの待機時間)
という感じで使用します。
void Start () { InvokeRepeating ("Hogehoge", 2f, 1f); } void Hogehoge(){ Debug.Log ("ほげー"); }
これで開始から2秒後に「ほげー」という文章が出力された後、1秒ごとに「ほげー」という文章が出力されます。
CancelInvoke(string methodName)
CancelInvoke("キャンセルする関数名")
という感じで使用します。Invoke()やInvokeRepeating()で実行予定であった関数を指定してキャンセル出来ます。なお、キャンセルする関数名を書かないと全ての実行予定の関数をキャンセルしてしまいます。
ひとこと
OnMouseDownは上手く使えば、タッチされた場所取得してRay飛ばして...とかせずに済みそうですね(^^)
初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!
【Unity公式チュートリアル】スクリプティング〈レッスン1.8-1.12〉
- この記事について
- Awake()に注意
- Start()の実行タイミング
- ベクトルのプチまとめ
- enable と SetActive()
- activeSelf と activeInHierarchy
- ひとこと
この記事について
注意事項
- 特に断りがない限り、C#について記述しています
- 個人的に知らなかったこと、誰かの役に立ちそうな事をまとめています
レッスンタイトル一覧
1.8 Awake and Start
1.9 Update and FixedUpdate
1.10 Vector Maths
1.11 Enabling and Disabling Components
1.12 Activating GameObjects
Awake()に注意
Awake()
はスクリプトが非アクティブでも実行される。
参考リンク:Scriptを非アクティブにしても生き残る関数たち
Start()の実行タイミング
Start()
はスクリプトがアクティブな状態での最初のフレーム(Update()の前)で一度のみ実行される。アクティブなスクリプトを一旦、非アクティブにした後に再びアクティブにしても実行されないことに注意。
ベクトルのプチまとめ
長さ
長さは”Magnitude”と呼ばれる。自前で計算しなくて済むように変数(Vector2.magnitude
やVector3.magnitude
)が用意されている。
内積
二つのベクトルの各要素を掛け合わせたものの和。和が0になるかどうかでベクトルが垂直であるかどうかの判断に使うことが出来る。
使用例:飛行機が地面に対して水平かどうかを調べる
なお、内積を計算する関数(Vector2.Dot
やVector3.Dot
)が用意されている。
外積
二つのベクトルに垂直なベクトルを生成する。二つのベクトルからなる平面に垂直なベクトルが誕生するイメージ。当たり前だが、2Dでは概念自体が存在しない。
使用例:戦車の放題の回転前後のベクトルから回転軸ベクトルを求める
なお、外積を計算する関数(Vector3.Cross
)が用意されている。
enable と SetActive()
公式チュートリアルでコンポーネントのアクティブ切り替えにはenable
を、GameObjectのアクティブ切り替えにはSetActive()
を使用していたので従うのが吉?
activeSelf と activeInHierarchy
activeSelf:自身がアクティブかどうか
activeInHierarchy:実際にアクティブかどうか
分かりづらいと思うので具体例を以下に示します。
上画像のような構造になっているオブジェクトがあるとする。この時のBについて見ていく。
Aがアクティブ / Bがアクティブ
activeSelf → true
activeInHierarchy → trueAがアクティブ / Bが非アクティブ
activeSelf → false
activeInHierarchy → falseAが非アクティブ / Bがアクティブ
activeSelf → true
activeInHierarchy → falseAが非アクティブ / Bが非アクティブ
activeSelf → false
activeInHierarchy → false
親が非アクティブな時点で子も非アクティブ扱いになるのでactiveInHierarchyは親が非アクティブであれば100%falseになりそうですね(`・ω・´)
ひとこと
activeSelf と activeInHierarchy...。私は何に使えるか思いつきませんが役に立つ時が来るんでしょうね...(´・ω・`。)タブン
初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!
【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”じゃね?」とか言われるかなーと思いつつ修正が面倒なのでそのままで...(笑)