OK_NO NO NIKKI

OK_NOの日々を日記に起こしました

Unityの初心者でも中級者の話を聞けるようになりたい② - コンポーネント編

はじめに

初めに、

このブログはUnityの初心者or挫折者が中級者になるための筋道を見つけるためのブログです。

中級者:

  • 「ポスプロ焚いたんだけど、見た目よくならないんだよねぇ、、、」
  • 「自分で作ったクラスをシリアライズフィールド化するのってどうすればいいんだっけ?」
  • 「コルーチン便利すぎワロタ」

 

今回は↑の中級者(?)の話が分からないというか、どう調べたらついていけるの??って人向けのブログです。

というか、この会話はどちらかというと中級者になるための会話、みたいな感じです

自分もまだ、中級者に足を突っ込もうとしている最中なので、間違ってたらすみません…

 

でも、少なからず、「Unityの教科書は読んだけど、そのあとどうするの??」とか

「問題が起きてることはわかるんだけど、どう調べたらいいか、どう解決するのかわからない」とかって方はいると思います。

 

今回はその方々の悩みを解決するためのブログです。

あ、間違ってたら即教えてほしいですよろしくです。

 

 

 

コンポーネント

調べるって言っても、やっぱり知識は必要です。

まずは、ざっくりですが、「Unity内でよく見かける標準コンポーネント」をおさらいしましょう

コンポーネントは、簡単にいうと、ゲームオブジェクトにアタッチ可能なクラスです。

多分定義は全然違いますが、とりあえずこう考えておいてもらっていいと思います。

 

そして、

「正直、ゲームオブジェクト作ったけど、元からついてるコンポーネントとか良くわかんネ。なんやこれ。」

ってなってませんか?

 

そんなあなたのために、うっす~~~~~~~~く各コンポーネントを紹介します。

間違ってたらすまそ

 

Transform

これは超大雑把にいうと「位置・角度・大きさ・親子関係」をつかさどるコンポーネントです。

Position・Rotation・Scaleですね。あとParent。

ん?Parentってなんだっけってなってる方、居るかもですね。

Parentはヒエラルキービューで見れるやつですね。

ここでいうと、Canvasがその下のmode selectionからText(TMP)までの

「親」です。

逆に、Canvasの子はmode selectionからText(TMP)までのすべての要素です。

 

親子関係

親子関係は、

Transform的なつながりを非常に色濃く持ちます。

今のCanvasはちょっと例外としてとりま飛ばして、

以下のSunとEarthで考えてみましょう。

 

でかい親のほうがSun、小さい子がEarthだとします。

この場合、SceneビューからSunの座標を変えると、

こんな感じで、Earthも一緒についてきます。

 

回転も同様、Sunのほうの回転だけ回転させたいのに、Earthがついてきやがります。

みたいな感じで、親子関係には位置、角度、大きさの結びつきがあります。

でも、内部的にはどう動いてるんでしょうか

 

答えは単純で、

EarthはSunを基準として、Transformの位置を設定しているんです。

 

まずはWorld座標系(普通の座標系)を確認しましょう。

とりあえず、地球も太陽もワールド座標系を示してます。

この図はまぁわかると思います。

次は太陽を基準とした地球の座標を示します。(太陽座標基準のローカル座標系)

わかりづらいとは思いますが、太陽の座標から考えてみると、わかりやすいかもしれません。

簡単にいうと、(0,0,0)という基準点が太陽にある。みたいなものです。

なので、太陽基準のローカル視点から世界の始点を見ると、(0,0,0)にはなっていないんですね。

 

 

ざっくりいうと、これが親子関係です。

角度も、大きさも、これと同様です。親が基準となって作用します。

 

めんどくさいのは、インスペクタービューのEarthのTransformの値は、太陽基準のローカル座標系なのです。

だから、世界の始点の場所に強制的に移そうと(0,0,0)を指定しても、うまくいかなかったりします。

そこでUnityでは、

transform内の関数として、LocalPositionとWorldPositionがあります。Localは自分の親を基準として、Worldは世界を基準としてます。

と、そんな感じで、親子関係はTransformに深~く深くかかわっています。

Transformでの移動などがうまくいかないときは、親子関係を探ったり、LocalかWorldかを知らべてみてください。

 

 

 

ん?

太陽だけを自転させたい???

いい質問するな~↑↑

めんどくさいのでざっくり言いますが、

親子関係を見直しましょう。Create EmptyでSolarSystemを作り、先ほどのSunとEarthをこのようにおいてあげましょう。

SunとEarthの親はSolarSystemで同一です。(SolarSystemはたしか訳:太陽系のはず)

これで、Sunのローカル座標を0,0,0にしてあげれば、太陽だけ自転できます。

 

ってな感じで、Transformでした。

位置と角度と大きさと親子関係、です。

ほかにも要素はありますが、興味があれば「Unity Transform できること」みたいな感じで調べてみましょう。

 

Mesh Filter

Cube(Mesh Filter)みたいな感じで表記されてると思います。

もしかしたら、Cubeの部分は違うかもですね。

簡単にいうと、ゲームオブジェクトのモデルの形です。

ぶっちゃけ使わないですね。というか、あんまり自分は使ったことないです。

ただ、「モデルが正しくないな」と感じたら、ここを疑ってもいいかもですね。

 

 

参考:さまざまなゲームオブジェクト(3/5):初心者のためのUnity超入門 - libro

 

Mesh Renderer

こちらはレンダラー、つまりゲームオブジェクトの描画周りを設定するコンポーネントです。

上のMesh Filterのモデル形状と、アタッチされているマテリアル、などから自分の描画の設定を行います。

描画周り、と考えましょう。

 

Collider

コライダーは「あたり判定」です。

実はコライダーのコンポーネントには種類があり、MeshCollider、SphereCollider、BoxColliderなどがあります。

色々ありますが、先ず、モデルの形を正確に反映させたMeshColliderが一番重いです。

 

これはコライダーの内部を考えると楽です。


例えば、SphereCollider同士の接触判定には、2つの円の中心の座標の距離が2つの円の半径の合計より近ければ重なっている、イコールなら接触、離れていれば接触していない状態となります。

 

 

また、Boxに関して考えると、それぞれ8点の頂点があり、そこから割り出して考えることができます。

 

 

Boxと同様にMeshColliderを考えると、モデルの頂点数分、判定して考えてあげないといけません。

例えば、StandardAssets内のボール転がしゲーム用のPrefab「RollerBall」では、頂点の数が5177個あります。(Verticles:5177)

どう考えても、SphereColliderで処理したほうが軽い処理ができそうですね。

なので、こちらではSphereColliderを使用します。

 

しかし、場面によっては正確なあたり判定の処理が必要な場合もあります。

そんなときはMeshColliderを使用しましょう。

 

 

 


※ちなみに、こういったMesh(モデル)についての画面はMesh Filter内のアタッチされたモデルをクリックすると、プロジェクトビューでハイライトされます。

 

ColliderとTrigger

コライダーの種類には、もう一つ、トリガーというものがあります。

コライダーは主に接触・衝突判定に使用されますが、

トリガーは重複判定に使用されます。

 

重複とは、文字どおり、重なっているかどうかを判定するものです。

例えば、ゲーム内で水の中に入ったら、泳いでるアニメーションに変えたいとします。

普通に

if(y < waterLevel)

みたいに設定するのもいいですが、ここからここまでが水だよ~ってUnityEditor上から示すことができたら便利ですよね

 

そういう時に使えるのが「トリガー」です。

先ほど説明したコライダーを水中全域に張り巡らせて、この中に入ったら水中!

としてあげます。

設定方法などは下記をご覧ください。

 

ColliderとTriggerについて

【Unity】当たり判定を一通り!OnTrigger・OnCollisionをひとまとめ | 侍エンジニアブログ

 

Camera

カメラはUnityの世界を切り取り、Gameビューあるいはビルドした画面などに出力するためのコンポーネントです。

詳しくはレンダリングの知識がしっかり必要となるので詳しくは話しませんが、

GameViewにおいて、全体的なレンダリングの改善、変更をしたい場合はこのコンポーネントをいじるとうまくいったりします。

 

詳しく知りたい場合は「Unity Camera できること」「Unity Camera 基礎」で検索してみましょう。

 

Light

ライトはシーン上を照らすライトを設定するコンポーネントです。

Lightコンポーネントを導入することで、特定のゲームオブジェクトのレンダラーコンポーネントに影響を与えます。

 

例えば、TypeをPointにすると、コンポーネントを持つゲームオブジェクトの付近のゲームオブジェクトのレンダラーに光の情報を与えます。

そうすると、レンダラーは受け取った光の情報をもとに計算を行い、自分の色を導きます。

この部分については私は不正確なため、あくまでたとえとして受け取ってください。

しかし、このようにレンダラー、レンダリングに深く作用するため、基本的には重たいです。

 

なので、軽量化の要素が多く設けられており、Render Modeから影について設定することができ、Culling Maskを用いて光の情報を与えない設定を選択できます。

AudioListener

ヒエラルキービューからCameraをつくるとカメラのゲームオブジェクトに勝手についてきて、Scene内に複数あると、このコメントが毎フレームずっと表示されてしまう。忌々しいアレです。

 

オーディオリスナーの考え方は簡単で、音楽を聴くための耳の位置です。

人間であれば、目(Camera)の近くに耳(Audio Listener)があるので、同一のゲームオブジェクトに勝手に配置されます。

基本的には、耳の位置による音の変化は後述のAudioSourceが3Dでないと効力を持たないです。

 

AudioSource

AudioSourceは音を鳴らすコンポーネントです。

アタッチされたAudioClip(音源)を鳴らします。

PlayOnAwakeでは、シーンが読み込まれた瞬間に音が鳴り

LoopではBGMのようにループ再生を行い

Spacial Blendを使うことで、発音するゲームオブジェクトとリスナーと位置による変化がない2Dと、変化がある3Dを設定することができます。

Rigidbody

リジッドボディは物理挙動を行うコンポーネントです。

コライダーを使用し、物理挙動を計算したのち、Transformの座標と回転に反映します。

リジッドボディには質量、摩擦係数、重力の有無などがあります。

 

また、Constraintsでは「物理挙動は行うが、回転を制限する」なんてことができたり、

物理挙動が聞かない座標軸を設定できます。

例えばFPSゲームで坂を上らせると毎回プレイヤーが傾いてしまったりとか、めんどくさすぎですよね。あとは2Dアクションゲーム作ったのに、物理挙動のせいで奥行きがずれちゃったりとか、

ある一定の部分だけは物理挙動を行わせたい、なんて時に便利です。

 

 

また、Unityの内部的にはFixedUpdateと同タイミングでRigidBody系統の物理挙動処理を行います。

理由はFixedUpdate自体が、物理挙動用のUpdateだからです。

一応、ここ重要なので、ふわっとでも覚えておいてください。

Canvas

キャンバスコンポーネントはUI系のコンポーネントを持つすべてのゲームオブジェクトの親オブジェクトとして存在しています。

RenderModeから、GameView上のどの部分に描画を行うか、Order in Layerでどの順番で描画するかなど、UI部全体のGameView用の描画設定を行います。

 

キャンバスを出すと色々ほかのコンポーネントも生まれますが、自分もあまりよく知らないです(汗)

RectTransform(下書き中)

レクトトランスフォームコンポーネントCanvas内部でのTransformを行いやすくするためのコンポーネントです。

こちら下書き(参考は↓より考え中)

 

参考:

【Unity】これだけは覚えておきたいRectTransformの基本 - おもちゃラボ

【Unity】図解でわかるRectTransformのアンカーとピボット | アトリエ・クラフトロン

UnityでRectTransform配下での子オブジェクトの生成/破棄を行う - MRが楽しい

Text

TextはUI上で文字を表示する場合に使用します。

ちなみに、Textは最新のUnityでは非推奨で、ヒエラルキー上で作成する場合はLagacy→Textと設定します。

 

また、UI系のクラスをScript内て扱う場合は、

「using UnityEngine.UI;」

をつけることを忘れないようにしましょう。

 

あと、Textコンポーネント内の文字はtextという変数にあります。

要素textの型がStringクラスなのネーミングセンス最悪ですよね…

Text.textはStringて…

 

間違えないようにですね…

TMP - TextMeshPro

TMP(TextMeshPro)コンポーネントでは上記Textコンポーネントでは使用できない、様々な追加要素を加えたTextの進化系です。

僕はあまり詳しくないので、説明はパスさせていただきますが、一つ注意点として、

TMPはスクリプト上で扱うためには「using TMPro;」を行う必要があり、

さらにTMPのクラスは「TextMeshProUGUI」となります。

これが結構知らないと厄介な部分なので、こんなこと言ってたなぁ、程度に覚えておいて下さい。

 

 

参考:

UnityのTextMesh Proをマスターする(1/3) - 51N1

【Unity C#】TextMeshProをスクリプトで表示 - プログラミング教室 フタバゼミ

 

 

まとめ

今回はUnityのコンポーネントについてまとめてみました。

こういうコンポーネントの知識って、入門書に詳しく書いてないわりに、中級者になるためには必須条件の知識だったりするんですよね。自分も未だ全然詳しくないですが、とりあえず何か作ってみようとすると、その過程で結局調べることになったりします。

お疲れさまでした。

 

次回

次回は、3DCG全般の理解になります。何故重たくて、何故Shaderというものが使われるのかレンダリング?マテリアル?とは

続きが気になる方はこちら