- 3Dモデル。人間のモデルデータ。
- アバター。ヒューマノイド(人間型)の構造データ。
- コントローラー。各種の動きを実現するアニメーションクリップのセットのようなもの。
- 動作を制御するスクリプト。
基本的な設計構造が決まっていて公開されており、それに従って設計すれば、それぞれの部品を組み合わせて自分のキャラクターを作れる。
例えば、キャラクターのモデルを3Dモデルツールなどで作り、それにメカニム用に作られた他のアバターのアニメーションセットやスクリプトを設定すれば、もう自分の作ったモデルが動き出す。
「モデルさえできれば、後は他のを借りてくる」ということができる。
Unityの開発元が、メカニムを利用するための基本パーツをまとめた「Mecanim Locomotion Starter Kit」というソフトウェアをアセットストアで配布している。
1. Window -> Asset Storeでアセットストアを開き、ログインする。
2. 検索窓から「Mecanim Locomotion Starter Kit」で検索し、選択してインポート。
3. インポートが終わると、Assetsフォルダの中に新たに「Locomotion Setup」フォルダが作られ、必要なものがまとめられている。
2. 検索窓から「Mecanim Locomotion Starter Kit」で検索し、選択してインポート。
3. インポートが終わると、Assetsフォルダの中に新たに「Locomotion Setup」フォルダが作られ、必要なものがまとめられている。
人間の構造にあわせて3Dモデルの部品をマッピンした情報のこと。
ただ、マッピングされて作られたキャラクターモデルもアバターと呼ばれたりもする。
シーンに配置してあるキャラクターのことをアバターと呼んでもいい。
ただ、マッピングされて作られたキャラクターモデルもアバターと呼ばれたりもする。
シーンに配置してあるキャラクターのことをアバターと呼んでもいい。
多くの部品によって、まるで人間の骨と関節のような仕組みがそのまま実現されているから。
3Dモデルだけでなく、人間の骨と間接の構造情報を用意し、それと3Dモデルの各部品とをきれいにマッピングすることで、どの部品がどの部分に当たるか、どれとどれが間接としてつながっているか、といったことが設定されている。
3Dモデルだけでなく、人間の骨と間接の構造情報を用意し、それと3Dモデルの各部品とをきれいにマッピングすることで、どの部品がどの部分に当たるか、どれとどれが間接としてつながっているか、といったことが設定されている。
コントローラー
正確には「アニメーターコントローラー」。
アニメーションの流れをコントロールするためのもの。
アバター
3Dモデルと人体構造のマッピング情報。
Mecanim Locomotion Starter Kitのアバターには既に設定されているが、3Dモデルによっては自分で設定しないといけない場合もある。
操作スクリプト
アバターに「このキーを押したらこっちに動かす」といった処理を記述したスクリプトを用意しなければならない。
正確には「アニメーターコントローラー」。
アニメーションの流れをコントロールするためのもの。
アバター
3Dモデルと人体構造のマッピング情報。
Mecanim Locomotion Starter Kitのアバターには既に設定されているが、3Dモデルによっては自分で設定しないといけない場合もある。
操作スクリプト
アバターに「このキーを押したらこっちに動かす」といった処理を記述したスクリプトを用意しなければならない。
- アバターのMecanimscript欄をNoneに設定。
- Main CameraのSmooth FollowのScript欄をNoneに設定。
using UnityEngine; using System.Collections; public class mecanimscript : MonoBehaviour { private Locomotion locomotion; protected Animator animator; void Start () { animator = (Animator)GetComponent ("Animator"); locomotion = new Locomotion (animator); } void Update () { float h = Input.GetAxis ("Horizontal"); float v = Input.GetAxis ("Vertical"); locomotion.Do (v * 2, h * 100); Vector3 vec = transform.position; Vector3 fvec = transform.forward; vec.y = 1; fvec *= 2; fvec.y = 0; Camera.main.transform.position = vec - fvec; Camera.main.transform.LookAt (vec); } }
今回は、「アバターから見た相対的な方向」をどうやって計算するか、がポイント。
前とか右とか左とかいっても、アバターがどっちを向いているかによって位置は変わってくるので、それをうまく処理しなければいけない。
GetAxisは、入力された情報を元に水平および垂直方向の値を計算して返す。
上下左右の矢印キーだけでなく、例えばジョイスティックなどを使った場合も常に入力値を取り出すことができる。
ゲームで上下左右の移動操作を行う場合、GetKeyなどよりもこれらを使った方がより汎用的な入力に対応できる。
引数には、縦および横を示すテキストを指定する。
Verticalは縦方向、Horizontalは横方向を意味する。
上矢印を押した場合、Vertical = 1、Horizontal = 0。
右矢印を押した場合、Vertical = 0、Horizontal = 1。
下矢印、左矢印だと-1になる。
つまり、入力された値を-1〜1の範囲内のfloat値で返すということ。
前とか右とか左とかいっても、アバターがどっちを向いているかによって位置は変わってくるので、それをうまく処理しなければいけない。
float h = Input.GetAxis ("Horizontal"); float v = Input.GetAxis ("Vertical");入力された一方向に関する値を取り出すのに、Inputクラスのメソッドを使用。
GetAxisは、入力された情報を元に水平および垂直方向の値を計算して返す。
上下左右の矢印キーだけでなく、例えばジョイスティックなどを使った場合も常に入力値を取り出すことができる。
ゲームで上下左右の移動操作を行う場合、GetKeyなどよりもこれらを使った方がより汎用的な入力に対応できる。
引数には、縦および横を示すテキストを指定する。
Verticalは縦方向、Horizontalは横方向を意味する。
上矢印を押した場合、Vertical = 1、Horizontal = 0。
右矢印を押した場合、Vertical = 0、Horizontal = 1。
下矢印、左矢印だと-1になる。
つまり、入力された値を-1〜1の範囲内のfloat値で返すということ。
得られた値を元に移動。
これはLocomotion.Doを呼び出すだけ。
掛け算について
第1引数の速度は、1だと歩く速さになる。数字が大きくなるほど速く走る。
ここでは2倍にして小走りぐらいにしてある。
第2引数のhは向きを示すものだが、Input.GetAxis("Horizontal")で得られた値をそのまま使うと、回転する角度が非常に小さくなってしまうため、100倍して、左右に素早く向きを変えるようにしてある。
これはLocomotion.Doを呼び出すだけ。
locomotion.Do(v * 2), h * 100);
掛け算について
第1引数の速度は、1だと歩く速さになる。数字が大きくなるほど速く走る。
ここでは2倍にして小走りぐらいにしてある。
第2引数のhは向きを示すものだが、Input.GetAxis("Horizontal")で得られた値をそのまま使うと、回転する角度が非常に小さくなってしまうため、100倍して、左右に素早く向きを変えるようにしてある。
Vector3 vec = transform.position; Vector3 fvec = transform.forward;
アバターの位置はtransform.positionで得る。
「一歩先の位置」は、Transformクラスの「forward」というプロパティで得ることができる。
これは、そのアバターが向いている方向に一歩進んだ位置の値。
そして、取り出された2つのVector3の値を調整する。
vec.y = 1; fvec *= 2; fvec.y = 0;yは高さを示すもの。
現在位置を「1」、一歩先は「0」にしておく。
後でVector3を引き算するので、そのときにy軸の値が「1」のまま変わらないように、ここで調整。
forwardで取り出したVector3を2倍しているが、これは1歩先ではなく、2歩先の位置に調整している。
要するに「もうちょっと離れた場所」にしている。
Camera.main.transform.position = vec - fvec;調整したら、現在の位置から一歩先(2歩先?)の位置を引き算。
Vector3の引き算すると、2つの位置の「向き」となるベクトルの値が計算できる。
現在位置から、一歩先の位置を引き算することで、「現在位置よりも一歩後ろの位置へのベクトル値」が得られる。
これが新しいカメラの位置となる。
Camera.main.transform.LookAt (vec);カメラの位置を移動するだけだと、アバターの向きが変わったら、カメラがアバターの方を向かなくなる。
そこでカメラに「アバターの方を向け!」と命令する。
Transformの「LookAt」は、引数に指定した位置の方にカメラを向けるメソッド。
これでカメラがアバターの方に向く。
実をいえば、アバターでは衝突イベントが使えない。
何かオブジェクトに接触しても、まったくイベントは起こらない。
これは、アバターにはコライダーもリジッドボディもないから、イベントの発生しようがない。
そこで、アバターにコライダーを設定する。
アバターに設定するコライダーは「キャラクターコントローラー」と呼ばれるものを使う。
これは、アバターなどのヒューマノイド型も出るを扱う場合に利用する専用コライダー。
何かオブジェクトに接触しても、まったくイベントは起こらない。
これは、アバターにはコライダーもリジッドボディもないから、イベントの発生しようがない。
そこで、アバターにコライダーを設定する。
アバターに設定するコライダーは「キャラクターコントローラー」と呼ばれるものを使う。
これは、アバターなどのヒューマノイド型も出るを扱う場合に利用する専用コライダー。
アバターのインスペクターの「Animator」の中にあるUpdate ModeをNormalから「Animator Physics」に変更する。
すると、物理エンジンと連動して動くようになる。
すると、物理エンジンと連動して動くようになる。
アバターを展開して、▼から3Dモデル本体(Geo_Grp)を選択。
Component -> Physics -> Charactor Contoroller
これでキャラクターコントローラーが3Dモデル本体に組み込まれる。
Component -> Physics -> Charactor Contoroller
これでキャラクターコントローラーが3Dモデル本体に組み込まれる。
アバターの大きさにコライダーが合うように調整する。
Center
コライダーの中心位置を指定。
アバターは、地面の設置部分がゼロ地点になっているので、Yの値を少し上(1〜2ぐらい)に調整する。
X、ZはゼロでOK。
Center
コライダーの中心位置を指定。
アバターは、地面の設置部分がゼロ地点になっているので、Yの値を少し上(1〜2ぐらい)に調整する。
X、ZはゼロでOK。
public float moveSpeed = 5f; // 移動速度 CharacterController characterController; void Start () { characterController = GetComponent<CharacterController> (); } void Update () { characterController.Move(<Vector3> * moveSpeed * Time.deltaTime); }Positionを直接変更するのではなく、CharacterControllerのMove()を使うことで、「位置の変更」ではなく「移動」として扱われ、衝突の処理や速度の取得が可能になる。
Radius
コライダーの半径を設定。
1ではかなり太り気味になるので、だいたい0.25くらいに調整するとよい。
Height
コライダーの高さ。
1〜2の間くらいで、だいたいアバターの身長に合う大きさに調整する。
コメントをかく