ぱふの自由帳

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

【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のフォローお待ちしています...(`・ω・´) ヨロシク!

現在のSceneの再読み込みをスマートなコードで書く

はじめに

現在のSceneをもう一度読み込みたい時ってありますよね。もう一度ステージをプレイさせるためにステージを読み込み直す時とか...。
毎回、SceneManager.LoadScene("自分のシーン名");って書いても良いのですが...自分のSceneを書くのは変だなと思ったので少しスマートに書いてみました(`・ω・´)!

コード

// 現在のScene名を取得する
Scene loadScene = SceneManager.GetActiveScene();
// Sceneの読み直し
SceneManager.LoadScene(loadScene.name);

これで逐一、自分のシーン名を手書きしなくて済みますネ。

おわり

行数は長くなっちゃいますが結構気に入ってる書き方です(`・ω・´)!

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

Scene画面で移動したオブジェクトが自動で中心にくる方法

はじめに

またタイトルだけでは「?」ですね。
というわけで動きを下に示しておきますー。

f:id:PafuOfDuck:20171005165056g:plain

結構役に立ちそうですね!
「こういった場面に使えるよ!」とハッキリ断言できませんが(笑)

やり方

オブジェクトを選択して《shift+F》

はい!とても簡単です(`・ω・´)!やり方の説明終わり!

おまけ

他のオブジェクトを選択しない限り、オブジェクトの選択を解除しても効果は持続しますヨ!

f:id:PafuOfDuck:20171005165542g:plain

おわり

最初に言えよな内容ですが..Macでの動作となるので気をつけてください(´・ω・`。)
Windowsは確かめれておりませぬ。(借りたPCではデフォルトでこの機能がついていたような...いなかったような...

P.S. 小技ネタ書くの楽しい!だって...短いし...(笑)

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