ぱふの自由帳

ぱふの技術ブログ。メインはUnity。最近はUnity1Weekの放送してます。良ければフォローお願いします、、

【Unity公式チュートリアル】ブログ更新がんばるぞい!

お知らせ・・?

「ブログを毎日更新したい!」と熱いあの思いはどこに行ってしまったんだ...「更新内容がない」とかいろいろ文句をつけている現状....と言うわけでUnityの公式チュートリアルを見てまとめていこうかと思います。

公式チュートリアルって皆さん見たことありますか?私は全く見たことありませぬ。もはや、自慢できるレベルで・・・。
ちなみにこんな感じになっています〜 ↓↓↓

f:id:PafuOfDuck:20171022033936p:plain

今回は《トピック》部分のチュートリアルを見ていこうかなと思います。
《トピック》の中はこんな感じになっています ↓↓↓

f:id:PafuOfDuck:20171022035203p:plain

なので、、、赤枠のまとめ記事の場合のタイトルは

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

という長っっったらしい名前になります...(汗
まぁ良いのです。どうせメモとか自己満用ですしおすし。


というわけで見てくれる方がいましたら覗いてやってください(´・ω・`。)
たまには役に立つまとめが出てくるかもしれません(`・ω・´)タブン...

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

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