Unityで作品を作る上で、回転はとても大事な要素ですね。
そんな回転の中でも、特に需要の高い手法の一つに特定のオブジェクトの方向を向かせるといったことがあげられると思います。
例えば以下のように特定のオブジェクトを、カメラで追うとかでしょうか。
実はUnityならそれがLookAt関数一つで行えるんです!
使い方も非常に簡単なので、ここで学んで見てくださいね。
[基本] LookAtとは?
[基本] LookAtを使ってみよう!
[応用] LookAtのいろいろな使い方!
今回はLookAt関数の基礎部分を学び、続けて応用的な使い方まで見ていきましょう!
それではよろしくお願いいたします!
LookAtとは?
lookat関数を一言で表すなら「指定した方向を見る関数」です。
和訳した通りですね!
lookat関数はオブジェクトが保持するtransformコンポーネントの中に存在する関数で、使用するとそのオブジェクトを指定した方向へ向かせることができます。
これを使用すれば、さっき見たような特定の物を注視する処理を一瞬で実現できますよ!
早速使い方を学んでみましょう!
LookAtを使ってみよう!
では実際に先ほどのオブジェクトを注視する、プログラムの中身を見てみましょう。
このプログラムの、カメラには以下のプログラムをつけています。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LookAtCamera : MonoBehaviour { public GameObject targetObject; // 注視したいオブジェクトを事前にInspectorから入れておく // Update is called once per frame void Update () { this.transform.LookAt(targetObject.transform); } }
このプログラムの重要な点は以下の部分です。
this.transform.LookAt(targetObject.transform);
自身(カメラ)のtransformのLookAt関数へ、注視したいtargetObjectを渡しているだけですね!
それをUpdate関数の中で行っているため、常にオブジェクトを注視できているわけです。
非常に簡単ですね!
LookAtの具体的な使い方
続けてLookAt関数の、引数などの具体的な使い方を見てみましょう!
public void LookAt (Transform target, Vector3 worldUp= Vector3.up);
リファレンスを見ると、LookAt関数の引数はこのようになっています。
第一引数には、注視したいオブジェクトのTransformを入れましょう。
第二引数には上方ベクトルを指定することができますが、特殊なことをやらない限りはVector3.upで問題ありません。
また先ほどの例題に第二引数が設定されていないのは、第二引数のデフォルト引数がVector3.upとなっているからですね!
※デフォルト引数・・・呼び出すとき省略した場合、自動的に使用してくれる引数
LookAtの応用的な使い方!
LookAtを応用すると、いろいろな便利なテクニックが行えます。
その応用例を簡単に見てみましょう。
簡易ビルボードを作ろう!
ビルボードとは、オブジェクトを常に正面へ向かせる仕組みの事を言います。
どんな時に使われるかというと、以下のような場合でしょうか。
・メニュー
・エフェクト
・遠くの雲や木・草などの背景
ゲームなどに詳しい人は「近づいたら実は、カメラに対して正面を向き続けるだけのペラペラな木」なんてものを見たことがあると思います。
あれがビルボードなんです。
ビルボードの有用性は長くなるのでまた別の機会に、説明するとして…
LookAtを使用すると、この仕組みを簡単に実現することができます。
これは先ほどカメラに付与した「常にオブジェクトの方向を見続ける」処理を、オブジェクト側にもつけた状況です。
当たり前ですがカメラ側を見続けてくれていますね!
【補足】簡易ビルボードの「簡易」って?
実は、正確なビルボードはまた違った作り方をする必要があるからです。
単純にカメラの方向だけを見続けた場合、オブジェクトにカメラが近づくと不自然に回転が見えてしまうことがあるんです。
そのため、よく使われる「より正しいビルボード」の作り方はカメラの逆行列をオブジェクトに入れる方法となります。
また木などをより自然に表現するためには、Y軸を固定したりなどの手法を取り入れる必要もあります。
その辺りを説明し始めると長くなるため、また別の機会に見ていきましょう。
ゆっくり追いかけてみよう!
Unityを使っていくと、緩急のある動きをつけたくなることもありますよね。
この緩急は、よりクオリティの高い作品を作る上で重要なテクニックです。
先ほどのようにLookAtを使うと、指定した方向をすぐに向くことができますが、それでは直線的な動きになってしまいます。
より一段上を目指すために、緩急をつけた回転を行ってみましょう!
緩急をつけるとこんな動きになります。
ゆっくりと、オブジェクトの方向を向くようになりましたね!
実際のソースを見てみましょう。
先ほどのカメラにつけたソースを改修しています。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LookAtCamera : MonoBehaviour { public GameObject targetObject; // 注視したいオブジェクトをInspectorから入れておく // Update is called once per frame void Update () { // 補完スピードを決める float speed = 0.1f; // ターゲット方向のベクトルを取得 Vector3 relativePos = targetObject.transform.position - this.transform.position; // 方向を、回転情報に変換 Quaternion rotation = Quaternion.LookRotation (relativePos); // 現在の回転情報と、ターゲット方向の回転情報を補完する transform.rotation = Quaternion.Slerp (this.transform.rotation, rotation, speed); } }
各処理の内容としては、コメントに記述がある通りです。
実はゆっくり追いかける処理に、LookAt関数は向きません。
そのためQuaternion.Slerp関数を使用しています。
この関数が補完処理を行ってくれています。
Slerp関数の使い方を簡単に書くと、第一引数、第二引数に与えられた回転情報を、第三引数の速度で補完をかけてくれる関数と言えるでしょう。
またLookAt関数との違いを一言で行ってしまえば以下のように言えるでしょうか。
LookAt関数・・・すぐに指定方向を向かせる時に使う
Quaternion.Slerp関数・・・方向を補完しゆっくり回転させる時に使う
ぜひ上手に使い分けてみてください。
まとめ
今回はLookAt関数や、それに関する応用的な話を学びました。
Unityを触る上で、回転はとても重要な機能です。
特に「指定した方向を見る」といった機能は、必須と言っても良い機能といえるでしょう。
中でもLookAt関数は簡単に使えて、すぐ指定方向を向ける、とても便利な関数です。
是非使いこなしていきましょう!