ぱふの自由帳

週3更新(火・木・日)を目指すUnityブログ。良ければフォローお願いします(`・ω・´)

【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を推奨しています。理由をググった結果、以下の記事で納得できたので紹介しておきます。

qiita.com

OnMouseDown

ユーザーがGUIElementまたはColliderを持つオブジェクト上でマウスボタンを押したとき、そのオブジェクトにOnMouseDown関数が設定されていれば呼び出されます。 しかし、Layerの設定がIgnore Raycastであれば呼び出されません。

以下はCubeにスクリプトをアタッチしています。

f:id:PafuOfDuck:20171030071437g:plain

値型と参照型

値型

値型の例として

  • 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〉

この記事について

注意事項

  • 特に断りがない限り、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.magnitudeVector3.magnitude)が用意されている。

内積

二つのベクトルの各要素を掛け合わせたものの和。和が0になるかどうかでベクトルが垂直であるかどうかの判断に使うことが出来る。

使用例:飛行機が地面に対して水平かどうかを調べる

なお、内積を計算する関数(Vector2.DotVector3.Dot)が用意されている。

外積

二つのベクトルに垂直なベクトルを生成する。二つのベクトルからなる平面に垂直なベクトルが誕生するイメージ。当たり前だが、2Dでは概念自体が存在しない。

使用例:戦車の放題の回転前後のベクトルから回転軸ベクトルを求める

なお、外積を計算する関数(Vector3.Cross)が用意されている。

enable と SetActive()

公式チュートリアルコンポーネントのアクティブ切り替えにはenableを、GameObjectのアクティブ切り替えにはSetActive()を使用していたので従うのが吉?

activeSelf と activeInHierarchy

activeSelf:自身がアクティブかどうか
activeInHierarchy:実際にアクティブかどうか

分かりづらいと思うので具体例を以下に示します。

f:id:PafuOfDuck:20171030024913p:plain
上画像のような構造になっているオブジェクトがあるとする。この時のBについて見ていく。

  • Aがアクティブ / Bがアクティブ
    activeSelf → true
    activeInHierarchy → true

  • Aがアクティブ / Bが非アクティブ
    activeSelf → false
    activeInHierarchy → false

  • Aが非アクティブ / Bがアクティブ
    activeSelf → true
    activeInHierarchy → false

  • Aが非アクティブ / 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
f:id:PafuOfDuck:20171028214256p:plain

Createボタンではなく、右クリック→Createからでも作成できるf:id:PafuOfDuck:20171028214628p:plain

2. Inspectorウィンドウ→AddComponent→New Script
f:id:PafuOfDuck:20171028214829p:plain

これは作成と同時にそのオブジェクトにアタッチ(追加)されてしまうので注意して下さい。

アタッチ方法

1. ドラッグ&ドロップ(D&D)
アタッチしたいゲームオブジェクトにスクリプトをD&Dするだけ。

2. Inspectorウィンドウ→AddComponent→Script
f:id:PafuOfDuck:20171028215250p:plain

3. Inspectorウィンドウ→AddComponent→New Script
作成の2. で紹介した方法。作成と同時にアタッチしてくれる。

4. 上のメニューバー→Component→Scripts
f:id:PafuOfDuck:20171028215829p:plain

何かGameObjectを選択していないと使用できないので注意!

デフォルトのアクセス修飾子

C#では下のような場合、privateとして扱われる。

int num = 1;

なお、JavaScriptはpublic扱いらしいので注意。

public修飾子の罠?

public修飾子をつけたメンバ変数をスクリプト内で初期化していてもInspector側の数値に書き換えられることに注意。Start関数で初期化したり、[System.NonSerialized](参考リンク:工事中)を付加したりする工夫が必要。

ひとこと

前の書き方は長ったらしいなーと感じていたので変えてみました。
だいぶ見やすくなったんじゃない?って感じです(`・ω・´)

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

【Unity公式チュートリアル】インターフェースと基本〈Unityのインターフェース〉@ヒエラルキーウインドウとオブジェクトの親子関係 編

ヒエラルキーウインドウとは

シーン内に存在するオブジェクトを追加された順に表示、かつ親子関係も階層的に表示する。また、以下の機能を持つ。

  • 表示順番は任意に変更することが可能
  • ヒエラルキーウインドウからオブジェクトの削除や複製も行うことが可能

ツールバー

  • Create ボタン
    f:id:PafuOfDuck:20171025180303p:plain
    新しい空のゲームオブジェクトを作成したり、デフォルトで用意されているゲームオブジェクトを作成する際に使用する。

  • Search バー
    f:id:PafuOfDuck:20171025180324p:plain
    シーン内のオブジェクトを探す際に使用する。

親子関係

親子とは

二つのオブジェクトが階層になっている場合、階層の上のオブジェクトを”親”と呼び、階層が下のオブジェクトを”子”と呼ぶ。この時、二つのオブジェクトの関係を親子関係という。

f:id:PafuOfDuck:20171025175043p:plain

親子による影響

f:id:PafuOfDuck:20171025175550p:plain

f:id:PafuOfDuck:20171025175553p:plain

上の画像のような親子が存在していたとする。この時、子のワールド座標は親のワールド座標に自身の座標を足したものとなっている。(Transformはローカル座標を表示している。)
このように、Transformが親の影響を受ける。ゆえに、シーンビューで親を動かすと子も同じように動く。もちろん、子を動かしても親は動かない。

ひとこと

タイトル長すぎ問題...。どこか削って短くしようかなぁ。

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

ゲーム再生中のエディタの色を変更する方法【Unity2017.1】

はじめに

今回は下の画像のようにエディタの色を変える方法です。
再生中ってことを視覚的に理解する助けになりますよ〜。

f:id:PafuOfDuck:20171025215731p:plain

やり方

  1. メニューバーからUnity → Preferencesを選択(Macであれば "commnd" + "," でも可)します。

  2. ウィンドウが開いたら下画像の赤枠の箇所を変更します
    f:id:PafuOfDuck:20171025220519p:plain

3.以上!

おわり

記事を書き終わって思ったのですが、何も設定せずとも再生中の色って変わるんでしたっけ...。
まぁタイトル詐欺にはなってないしセーフかなぁ(´・ω・`。)

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

【Unity公式チュートリアル】インターフェースと基本〈Unityのインターフェース〉@ゲームビュー 編

ゲームビューとは

ゲーム内のカメラから見たものをレンダリングする。最低でも1つ以上のカメラが必要となる。再生 / 一時停止 / 1フレーム送り は以下のボタンで行う。

f:id:PafuOfDuck:20171025171516p:plain

なお、再生中に変更した内容は再生を終えると再生前の内容に戻る。

ゲームビューコントロールバー

  • Display ボタン
    f:id:PafuOfDuck:20171025163953p:plain
    シーンにカメラが複数ある時に切り替えることができる。

  • Aspect ボタン
    f:id:PafuOfDuck:20171025163602p:plain
    アスペクト比率が異なるモニターでどのような表示になるかをテストする。

  • Scale スライダー
    f:id:PafuOfDuck:20171025164352p:plain ゲームシーンをズームできる。

  • Maximize on Play ボタン
    f:id:PafuOfDuck:20171025164414p:plain
    有効にするとゲームシーンをスクリーンと同じ最大のサイズで再生する。

  • Mute Audio ボタン
    f:id:PafuOfDuck:20171025164427p:plain
    有効にすると再生中にゲーム内のオーディオをミュートにする。

  • Stats ボタン f:id:PafuOfDuck:20171025164509p:plain
    レンダリング統計を表示する。ゲームのパフォーマンス確認に役立つ。

  • Gizmo ボタン f:id:PafuOfDuck:20171025164521p:plain
    Gizumoの表示 / 非表示を切り替える。特定のGizmoだけを表示したい時はドロップダウンだけをチェックする。

高度なオプション

f:id:PafuOfDuck:20171025165903p:plain

  • Warn if No Cameras Rendering
    有効にすると画面にレンダリングするカメラが無ければ警告が表示される。

  • Clear Every Frame in Edit Mode
    有効にすることでゲームが再生中でないときはフレームごとにゲームビューが消去される。(すいません。機能がよくわかっていません...。)

関連(参考)ドキュメント

豆知識

ひとこと

Clear Every Frame in Edit Modeってなんなのでしょう。色々試したのですが良く分かりませんでした...。

【Unity公式チュートリアル】インターフェースと基本〈Unityのインターフェース〉@シーンビュー 編

シーンビューとは

ゲームを視覚的に構築することが可能なインターフェース

操作方法

下の画像にあるボタンで操作方法を切り替えます。画像下部の文字はキーボード上の該当キーで切り替えが行える英字を示しています。
f:id:PafuOfDuck:20171022234714p:plain

  • Hand Tool f:id:PafuOfDuck:20171023001002p:plain
    左クリック+ドラッグ:シーンビューカメラを移動できる
    右クリック+ドラッグ:一人称視点で見回すことができる(カメラは移動しない)
    Alt+左クリック+ドラッグ:ピポットを中心にカメラを回転
    Alt+右クリック+ドラッグ:カメラのズーム調整

  • Translate Tool f:id:PafuOfDuck:20171023120015p:plain
    オブジェクトをX, Y, Z軸方向に移動可能。 なお、中心をドラッグすることで全ての方向に移動できるが3Dの移動において推奨されているわけではないことに注意。
    f:id:PafuOfDuck:20171023120326p:plain

  • Rotate Tool f:id:PafuOfDuck:20171023120544p:plain
    オブジェクトをX, Y, Z軸方向に回転可能。なお、中心をドラッグすることで全ての方向に回転できるが各軸で回転させたほうが便利。
    f:id:PafuOfDuck:20171023120729p:plain

  • Scale Tool f:id:PafuOfDuck:20171023120744p:plain
    オブジェクトをのスケールの変更が可能。なお、中心をドラッグすることで比率を保ったスケールの変更が可能であるため推奨されている。

見え方の変更

  • Rendering Option f:id:PafuOfDuck:20171023121319p:plain
    シーンビューでのレンダリング方法を変更できる。画像は一例。
    〈Wireframe〉
    f:id:PafuOfDuck:20171023121516p:plain
    〈Shaded〉
    f:id:PafuOfDuck:20171023121519p:plain

  • 2D / 3D切り替え f:id:PafuOfDuck:20171023121957p:plain
    基本的に触れる必要がない。2Dのスプライトを重ねる順番を見る時に使えるかも...?

  • Lighting Toggle f:id:PafuOfDuck:20171023122707p:plain
    ライトをシーンビューにレンダリングするかを切り替える

  • Audio Preview Toggle f:id:PafuOfDuck:20171023122935p:plain
    現在のシーンビューカメラ位置でゲームのオーディオを確認する

  • Other Toggle f:id:PafuOfDuck:20171023122953p:plain
    SkyboxやFogをシーンビューにレンダリングするかを切り替える

  • Gizmo Menu f:id:PafuOfDuck:20171023123850p:plain Gizmoの調整をする。アイコンの大きさを調整したり2D / 3Dの切り替えが可能。

  • Search f:id:PafuOfDuck:20171023124154p:plain
    シーン内のオブジェクトを検索可能。検索で見つかったオブジェクト以外は白くフェードアウトされる。
    f:id:PafuOfDuck:20171023124122p:plain

  • View Gizmo
    f:id:PafuOfDuck:20171023124720p:plain
    それぞれの軸を押すとその方向から見ることができる。また、中心を押すことで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でオブジェクトを操作する際に用いる
    f:id:PafuOfDuck:20171022224952p:plain

  • 回転が”原点中心か軸中心か”&”Local軸基準かGlobal軸基準か”を設定
    f:id:PafuOfDuck:20171022225003p:plain

  • "再生 / 一時停止 / 1フレーム進む"
    f:id:PafuOfDuck:20171022224133p:plain

  • 不明なボタン(説明なし)
    f:id:PafuOfDuck:20171022225643p:plain

  • Unity Services用ボタン
    f:id:PafuOfDuck:20171022225649p:plain

  • アカウントにサインインしたりPro版にアップグレードする際に使用するボタン
    f:id:PafuOfDuck:20171022225653p:plain

  • Scene View上のオブジェクトの表示 / 非表示をLayerごとに切り替えることが可能なボタン
    f:id:PafuOfDuck:20171022225701p:plain

  • 5つのパネルのレイアウトを保存したり、デフォルトのものに変更する時に使用するボタン
    f:id:PafuOfDuck:20171022225706p:plain

関連(参考)ドキュメント

ひとこと

回転方法を切り替えるボタンとか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");
    }

}

このスクリプトを下のようなオブジェクトにアタッチします。(画像はアタッチ済み)
もちろん、スクリプトは非アクティブにしていますー。

f:id:PafuOfDuck:20171018131450p:plain

前提が長くなりましたが、今回は「再生ボタンを押して、下の画像のBallをぶつけるとどのようなログが残る...?」と言うお話です。

f:id:PafuOfDuck:20171018131712p:plain

本題

いきなり結果

結果からどうぞ。と言うことでGIF画像をどーん。

f:id:PafuOfDuck:20171018135403g:plain

スクリプトが非アクティブでもAwake()OnTriggerEnter2D()は呼ばれていますね。

解明...?

オーバーライドしている関数が非アクティブでも(オーバーライドが)有効になっているのですかね...。OnTriggerEnter2D()は良いとして、Awake()は特殊なのでしょうか...うーむ...。

ちなみに

スクリプトAwake()OnTriggerEnter2D()だけにすると以下の画像のようにアクティブ状態を切り替えるボタンが無くなります!

f:id:PafuOfDuck:20171018143615p:plain

おわり

結局、「この関数が生き残るんだ!」という法則らしいものはお見せ出来ませんでした...(´・ω・`。)スイマセン
...が!何か変な挙動をしていたら「スクリプトが生きているのかも?」と気にかけるきっかけになると嬉しいです^^。

OnCollisionExit2D()はDestroyでも呼ばれるのか

はじめに

2Dのことだけしか調べてません(`・ω・´)
”多分”3Dでも一緒じゃないかなー。ってことなんで、誰か実際に調べて結果だけください。

本題

悩み

OnCollisionExit2D()という関数はTriggerではないCollider同士が接触から離れた際に呼び出される関数です。この関数、接触中の片方のオブジェクトがDestoryされた場合はどうなるんだ?という疑問ががが...

結果

Destory(gameObject)だろうがSetActive(false)だろうがColliderが消滅しても離れたという判定になるようです。

豆知識?

  • 消滅したオブジェクト側でも消滅前にOnCollisionExit2D()が呼ばれる

  • 接触しているオブジェクトを両方同時にDestroyしてもOnCollisionExit2D()が両方とも呼ばれる

  • OnCollisionEnter2D()内でDestroyするとOnCollisionExit2D()OnCollisionEnter2D()の順で処理されるオブジェクトが生じてしまう可能性がある(私の環境では100%)ので注意

おわり

「記事内でColliderと書いてるけど”Collider2D”じゃね?」とか言われるかなーと思いつつ修正が面倒なのでそのままで...(笑)

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!