ライスC#やらUnityやらを勉強していて、これはメモっといたほうがええやろ、ということを書くつもりですこの広告は、90日以上更新していないブログに表示しています。操作ができるようにいろいろ用意されている。その中で根幹を担っているのが、すべてのゲームオブジェクトにくっついてくる"Transform"コンポーネントである。uGUIが導入された最近では"RectTransform"コンポーネントというものもあるのだが、これとてTransformから継承したクラスに過ぎない。そんな重要なものなのであるが、それゆえに(私を含む)Unity初心者がつまづきやすいところでもある。Size」という3つの項目で物体の3D空間上の状態を保持しているのだが、なにが分かりにくいかというと、"Rotation"という項目なのである。Rotationの難点Rotationという項目は読んで字のごとく物体の回転状態を表している。インスペクター上で見ると以下のようになっていて、回転が度数法(360度で一周するもの)を使って表示されている。うむ、じゃあこの物体はX軸に90度、Y軸に30度、Z軸に10度回転しているのだな、と理解しそうになるのだがちょっと待ってほしい。いうかこのページはRotationで困っている人しか見ていないと思うのでもうわかっているとは思うが、そういう理解ではうまく動かないのである。(自分も詳しくないのだが)三次元空間上では物体を回転させるのに3つの情報だけでは無理なのである。回転の軸を決めるベクトル(3次元ベクトル)と、どれだけ回転させるか(ただの数字)の情報が必要なのだ。どないすんねん・・・、とここまで読んだ人々は嘆息するかもしれない、実際私もそうである。敵の攻略にはまず敵を知ることから始めねばなるまい。結論から言うと、Rotationは"Quaternion"という構造体であらわされている。いうことかというと以下の通りだ。//これが正しいこれは四元数というもので、ごく簡単に言ってしまうと複素数を拡張したものである。実数部分と虚数部分×3という4つのパラメータから成っている数なのだ。(少し勉強したことのある人なら知っていると思うが、複素数というのは二次元上の回転を表すのに便利なことが知られている。四元数は複素数の拡張なのである。三次元上の回転を表すのに便利だ。)数学的な知識は皆無に等しいので突っ込んだ話はできないが、とにかく回転は4つのパラメータで表さないといけない。それなのにインスペクター上では3つのパラメータしか見えない。これこそが、そもそもの混乱の原因なのである。先述のRectTransformにも、見えているパラメータと実際に使われているパラメータが違うことが原因で生じる混乱があり、Unityではこういうことが多々あるので、インスペクターを信じ切ってしまうことはあまりよろしくないのである。指摘があったので少し言い直しておくと、回転は一応3次元ベクトルで表すことができる。このときに注意しないといけないのが3次元ベクトルに対する回転は一意ではないということなのである。どの成分から回転させるかによって結果が変わってしまうのである。したがってインスペクタ上でX軸に何度、Y軸に何度、Z軸に何度と順番に指定した場合と、Z軸に何度、Y軸に何度、X軸に何度と指定した場合では異なる状態となってしまうのだ。これからこのQuaternionとの付き合い方について見ていこう。理解するな、関数を使え正直言って人間は三次元空間上にへばりついた下等な生き物にすぎないので3Dのものを3Dとしてそのままとらえることはできない。二つのお目々でできることといえば、せいぜい二次元画像を取得し、それを脳みその中で頑張って処理し、3Dなものとして錯覚させることぐらいなのである。三次元の回転を理解しようとしてはいけない。そもそも無理なのである。数学や物理といったすさまじい学問をやっている人たちに限ってはそれを理解していて、数字に落とし込むことに成功している。我々のなすべきことはそういった賢人たちの知恵を借りることなのである。いった賢人たちの知恵は、Unityでも「関数」として我々愚人たちが簡単にアクセスできるように用意されている。Quaternionの使い方それでも度数法で回転させたいやっぱりQuaternionなんかめんどくさい、という人はこの項目を見るといい。Quaternion.Eulerという関数がある。10);という風に、度数法で表した回転の三次元ベクトルを突っ込んであげればいいのである。思った通りに動いてくれるとは限らないが、たいていの場合はこれで事足りるだろう。難しいことは考えずに、とにかくある方向を向かせたいそういう人はこの項目を見てくれると助かる。transform.LookAtという関数がある。30);としてやればいい。30)という座標を向いてくれる(伝われ)。ある軸の周りにいくらか回転させたいこのあたりからQuaternionを使わないとどうしようもなくなってくる。90);としてやればいい。60)といった変なベクトルでも同じことだ。angle);とでもしてあげればよいのである。あるベクトルをある軸で回転させたいたとえばキャラクターを動かすスクリプトを書きたいとき、InputうんたらとしてHorizontalの入力とVerticalの入力を受け取った時にどうすればよいのか。キャラクターが常に正面を向いていればそのままpositionにそれらを足してやればいいのだが、そうでない場合そのままでは「キャラクターが向いている方向に対して右」などといったベクトルを取得するにはめんどくさい処理を書かないといけなさそうだ。そこでQuaternionとVector3との掛け算を使う。vertical));ということができる。vertical)」というベクトルにかけることによってこのベクトルを回転させているのだ。これが本来のQuaternionの使い方である。Vector3」の順でなければいけない。horizontal);という風に書ける、ということも追記しておく。オブジェクトを連続的に回転させたいQuaternion.Slerp想像するならば、物音に気付いてこちらを振り返る敵や、戦闘機がスピンするとき。t);}などというふうにしてあげればよい。すると"from"という角度から"to"という角度へ、"t"という割合だけ寄った角度を計算してくれる。ここで"t"は0から1までの少数である。このサンプルでは、初め"from"という角度を向いていたオブジェクトが、1秒かけてゆっくりと"to"という角度を向く、という処理を行っている。君がこの記事を読んでいるのも何かの縁だ。Desktopのプレビューが公開されたので使ってみる月別アーカイブはてなブログをはじめよう!spi_8823さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。