■一般的なキャラクターのGameObjectの作り方
- 空のゲームオブジェクトを作成し、FBXのモデルなどはこの子オブジェクトとする
- 移動や回転などのスクリプト、RigidBody、Animatorなどのコンポーネントは親オブジェクトにアタッチする
- アタッチしたAnimatorに子オブジェクトにしたモデルのAvatarと、モデルに使いたいAnimatorControllerをセットする
- つまり、移動等の処理は親オブジェクトが一元管理し、キャラクターの素材となるオブジェクトが子として入っているイメージ
今回は3人のキャラクターをCharacterという空オブジェクトにまとめたものと、キャラクターの中心を表すためのGameObjectと、影のPlaneを子オブジェクトにした。
ちなみに、これ知っておくとAssetStoreでDLしてきたモーションやSampleAssetsのスクリプトなどを試すのが楽になる。(子オブジェクトとAvatarを差し替えれば良いことがわかる)
なお、人間のモーションを流用するときはProjectのモデルを選択し、Inspectorに表示される「Rig」のAnimation TypeをHumanoidにする必要がある。
このときConfigure...を押すとボーン(関節?)の状態が表示されるが、対応するボーンが存在せずマップが赤くなっていることがある。MMDモデルはUnityで動かすことを想定していないので、このような事態が割と良くある。
本当なら対応するボーンを手動で指定して、マップを全てグリーンにする必要があるようだが、多少赤い箇所が含まれていてもモーションに差し支えないケースがある。赤い箇所が含まれていても、試すだけ試してみると良い。動かしてみてダメそうなら、ボーンの問題をどうにかする必要がある。
ちなみに、この画面のときHierarchyにはボーンのオブジェクトが表示される(表示されないときもあるが原因不明)。どの関節がどこにあるか調べるのに便利。MMDやFBXなどのモデリングではボーンにナンバリングするようなので、この番号を頼りに必要な部位を探したりする。
■キャラクターチェンジ
*実装方法はあくまで一例です要点
- モデルの子オブジェクトをあらかじめ複数用意しておき、操作しているキャラ以外は全員非アクティブにしておく
- チェンジの際にはモデルのアクティブとAvatarを切り替える
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using System.Collections; | |
public class CharacterChanger : MonoBehaviour { | |
public Avatar [] avatars = new Avatar[3]; | |
public GameObject [] characters = new GameObject[3]; | |
private int index = 0; | |
private Animator playerAnimator; | |
//アタッチされているPlayerのAnimatorを取得 | |
void Start(){ | |
playerAnimator = GetComponent<Animator> (); | |
} | |
// Update is called once per frame | |
void Update () { | |
Change (); | |
} | |
//キャラクターの切り替え | |
void Change(){ | |
if(Input.GetButtonDown("Fire2")){ | |
index++; | |
//上限を超えたら0に戻す | |
if(index == 3){index = 0;} | |
//まず全て非アクティブにする | |
foreach(GameObject gamObj in characters){ | |
gamObj.SetActive (false); | |
} | |
//GameObjectのアクティブとAvatarを対応させる | |
characters [index].SetActive (true); | |
playerAnimator.avatar = avatars[index]; | |
} | |
} | |
} |
0 件のコメント:
コメントを投稿