ぱふの自由帳

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

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

Scene画面でオブジェクトをある単位ずつずらす方法

はじめに

タイトルだけでは「?」が浮かぶ方もいると思いますので...
こういう動きのことでーす。

f:id:PafuOfDuck:20171004183808g:plain

何かを均等に並べる時に便利です。例えば、2DのSpriteを等間隔に並べてマップを作る時に使えたりしますヨ。
ちなみにですが、この移動方法は"Snap"という名前だと思います!(多分。きっと。おそらく。)

ではさっそく使い方をば...

使い方

Ctrl(Macはcommand)を押しながら操作すると
ある単位(初期値は1)ずつずれる

と、まぁ簡単に使用できるので試して見てください ^^。

おまけ

設定画面

間隔を設定する設定画面はEdit > Snap Settingsを選択すれば表示されます。

f:id:PafuOfDuck:20171004190230p:plain

その他

拡大/縮小や回転も同様にある単位ずつ変更できます。特に使い方が思いつきませんが...。

f:id:PafuOfDuck:20171004184659g:plain

おわり

こういった便利機能って他にもあるのでちょこちょこ記事に出来たらなーと思っています。「こういう機能知ってる?」というコメントやDMもどしどし受け付けてますので是非教えてくださいまし(`・ω・´)v

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

Animationを使う時の注意 -Root Motion編-

はじめに

Root Motionを使う場面は様々あると思います。実際にオブジェクトを移動するアニメーションを作成したい場合や、Animatorで動かすオブジェクトをスクリプトでも動かす場合(参考サイトはこちら)等々...
しかし、注意が必要な場面が出てきます。というかハマりました。

では、さっそく見て行きましょう〜。

Root Motionの落とし穴

Root Motionなしパターン

下のGIFを見てください。これはpositionを(-2,0,0)→(2,0,0)に移動するアニメーションを設定しています。

  • Scale(1,1,1)のオブジェクト
    f:id:PafuOfDuck:20171002121407g:plain

  • Scale(0.5,0.5,0.5)のオブジェクト
    f:id:PafuOfDuck:20171002121402g:plain

どちらも同じようにX軸方向に+4だけ移動していることが確認できます。
一応、Animatorの設定については下の画像のようになっています。

f:id:PafuOfDuck:20171002123613p:plain

f:id:PafuOfDuck:20171002121958p:plain

Root Motionありパターン

さて、また下のGIFを見てください。これも同様にpositionを(-2,0,0)→(2,0,0)に移動するアニメーションを設定しています。
しかし、Root Motionを設定している点で異なっています。Root Motionの使い方についてはこちらで少し説明していますのでどうぞ。

  • Scale(1,1,1)のオブジェクト
    f:id:PafuOfDuck:20171002124621g:plain

  • Scale(0.5,0.5,0.5)のオブジェクト
    f:id:PafuOfDuck:20171002124616g:plain

今回はX軸の移動量が異なっていることが確認できると思います。数値で確認するとScale(0.5,0.5,0.5)の方が移動量が半分になっています。これは「Scaleを考慮した移動量に補完されているからかな?」と考えていますが...。真相は闇の中です。

注意点
Root Motionを使用するとAnimtionで設定した数値がオブジェクトのScaleによって変化(補完?)してしまうので注意!!

解決方法?

うーん...これを解決方法としても良いのかどうか分からないのですが二つほど。

  • 補完を考慮した数値をあらかじめ設定する(とてもじゃないが計算が面倒なのでオススメしません)

  • Scaleが(1,1,1)オブジェクトを作成し、Scale(0.5,0.5,0.5)のCubeを子オブジェクトに設定します。そして親オブジェクトにAnimatorを設定します。そうすることで間接的に子オブジェクトを動かします。

おわり

「なんで上手く動かないんじゃー!!」となって調べて見たところRoot Motionが原因でした(´・ω・`。)
解決策がとても微妙なので他の方法をご存知の方がいれば是非教えてください!

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

【unity2017】Animationで設定した値を相対的な値として扱う方法

はじめに

Animtionの使い方は ”unity Animation 使い方” で素晴らしいサイトが沢山ありますのでそちらを参考にしてください!今回はAnimationの小技(?)の話です。

「前置きはいいから、解決方法だ早く教えて!」という方は《解決したいこと》を読み飛ばしてください(`・ω・´)b

解決したいこと

では早速ですが、下の写真の赤枠の箇所をみてくださいー。

f:id:PafuOfDuck:20171001143152p:plain

枠内の値を変更することでアニメーションを作成していきますよね。この値がアタッチされているオブジェクトのTransformを書き換えてくれることでアニメーションとなっているのですが...

f:id:PafuOfDuck:20171001144730p:plain

このままでは大変不便に感じますね。
例えば、原点で(親を持たない)Cubeがジャンプするようなアニメーションを作ったとします。その後、「このCubeを隣にもう一つ並べたい!」と思った時にこのままでは使えません。(Animationで設定した値でTransformを書き換えているので、配置時にずらしていても同じ場所で同じ動きをします。)

問題点
同じAnimation Clipを設定すると同じ場所で同じ動きをするオブジェクトになってしまう

さて、これを解決するためには配置時のTransformを基準としてAnimationで設定した値を適用してくれればOKですね。その方法について説明します。

解決方法

"Root Motion"という機能を使用して問題を解決していきます。

まず、適用したいAnimation Clipを選択してください。選択するとInspectorが以下の画像のようになるので、赤線の箇所をクリックしてください。

f:id:PafuOfDuck:20171001150635p:plain

次に、アニメーション予定のオブジェクトにアタッチされているAnimatorの設定を変更します。赤線の箇所にチェックを入れてください。(画像はチェック後です。)

f:id:PafuOfDuck:20171001151020p:plain

はい。たったこれだけで完了です!
実際にGIFを用意すればちゃんと意図通りに動いてるのをお見せできるのですが、GIFを用意するのが面倒くさ.. 今回は用意できていません(´・ω・`。)

小噺

この機能を知るまで私がどのように実装していたかという話に興味があれば読んでみてください。(笑)

「Transformが書き換わるのかー。ってことは親を設定してあげるとLocalPositionが書き換わるってことでしょ?じゃあ親を設定してあげれば(無駄なオブジェクトにはなるけど)実装できるじゃん。」ってな訳で...ほいっとな。

f:id:PafuOfDuck:20171001152325p:plain

こうすることで"JumpCubeSet"の位置を動かせばその位置を基準としてアニメーションしてくれます。めでたしめでたし...?

・・・。

はい。これはAnimationの遷移に対応するのが面倒でした。(おかげで"Root Motion"に辿り着けたのですがネ。)

おわり

"Root Motion"を上手く使えば、Animationだけで移動させることも簡単です!是非お試しをば(`・ω・´)b

ブログの書き方を試行錯誤して、分かりやすい構成を模索中です...。今回も迷走している気がしますが優しく見守ってください(´・ω・`。)

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

Actionを使おうとして「あれ?エラー...?」となった話

はじめに

現環境でもActionを使うのが良いのか分かりませんが、Action使ってみたい!と思った時に少しだけ時間を無駄にしたのでメモ。

メイン

「コルーチンとAction組み合わせてみよう!Qiitaに良き記事があるね。良きかな良きかな。」カキカキ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Hoge : MonoBehaviour {

    void Start(){
        //n秒後に実行する
        StartCoroutine (DelayMethod (n, () => {
            Debug.Log ("Delay call");
        }));
    }

    private IEnumerator DelayMethod(float waitTime, Action action){
        yield return new WaitForSeconds (waitTime);
        action ();
    }
}

「さて実行...あれ?Actionが存在しないですよエラーが出てる(´・ω・`)

解決方法

using System;

これを忘れずにつけときましょう。
ちなみにFuncを使用する際にも必要だそうです。

おわり

usingが足りないんだろうなぁと思っていたにもかかわらず【unity Action 使い方】とググってしまいました。(笑)
今調べてみると【unity Action using】で1発で出ますね...(´・ω・`。)ググり力が足りないZE...

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