キャラクターを作る
Assets/
Scenes/
Arena.unity
Scripts/
Prefabs/
Models/
すでにあるものこのレッスンで追加
tab 01 の Arena.unity を開いてください。床には 3 つのカプセル——Knight、Mage、Archer——が立っていて、キー 1 / 2 / 3 で切り替えます。この tab の作業はすべて Knight に対して行います。
Mage と Archer は最後までカプセルのままです。あえて残しています:各レッスンの終わりにキー 2 を押せば、カプセルと並べて、Knight がどれほど進化したかすぐに分かります。
ゲームのキャラクターは、1 つの GameObject に重なる 4 層です:見た目となるモデル、動き付けるリグ、クリップを選ぶ Animator、そして世界とぶつかるコライダー。
モデル、リグ、Animator、コントローラー——この 4 つが揃って初めてキャラクターは歩けます。
キャラクターの入手先
Mixamo(無料、Adobe アカウントが必要):キャラクターを選び、アニメーションを選び、FBX でダウンロード。最も速いスタート方法です。
Unity Asset Store:「free character」で検索し、価格 0 で絞り込みます。
あるいは tab 01 の Knight カプセルをそのまま使う手も——以降のスクリプトはすべてカプセルでも動き、モデルは後から入れられます。
重要なインポート設定
- 1
.fbx を Assets/Models にドラッグし、選んで Rig tab を開きます。
- 2
Animation Type を Humanoid にして Apply を押します。これでモデルのボーンが Unity の標準スケルトンに割り当てられます。
- 3
Humanoid であれば、どの Mixamo アニメーションもどの Mixamo キャラクターにでも使えます——クリップを相互に流用できます。
- 4
Materials tab で Extract Textures / Extract Materials を選べば、後から編集できます。
キャラクターオブジェクトを組み立てる
- 1
Hierarchy で Knight を選び、カプセルの MeshFilter、MeshRenderer、Capsule Collider を削除します——後の Character Controller がコライダーの役目を兼ねます——GameObject と名前はそのまま残してください。
- 2
モデルを Knight の子としてローカル位置 0, 0, 0 にドラッグします。親は名前もスクリプトもスイッチャーのリスト内の位置もそのまま保ちます。
- 3
Knight そのものに を追加します。
- 4
Height 1.8、Radius 0.3、Center Y 0.9 に設定し、カプセルが足を Y = 0 に保ったまま体をすっぽり包むようにします。その後 Knight の Position Y を 0 に戻します——体を持ち上げるのは transform ではなくコライダーになります。
- 5
Y = 1.5 の位置に空の子オブジェクト CameraTarget を作成します——カメラは足ではなくここを狙います。tab 03 で必要になります。
- 6
最後に Knight を Assets/Prefabs にドラッグします。これで Knight はプレハブ——このシーンのオブジェクトであるだけでなく、独立したファイルとして保存されます。
CharacterController と Rigidbody、どちらを使う?
✓ CharacterController
✓ Rigidbody
今後につながるステータスコンポーネント
using UnityEngine;
public class CharacterStats : MonoBehaviour
{
[Header("Base")]
public float maxHealth = 100f;
public float attack = 20f;
public float defense = 10f;
public float moveSpeed = 5f;
[Header("Runtime")]
public float currentHealth;
public bool IsAlive => currentHealth > 0f;
void Awake()
{
currentHealth = maxHealth;
}
public void TakeDamage(float rawDamage)
{
if (!IsAlive) return;
float reduced = Mathf.Max(1f, rawDamage - defense); // always at least 1
currentHealth = Mathf.Max(0f, currentHealth - reduced);
if (!IsAlive) Die();
}
void Die()
{
Debug.Log(name + " died");
// animator.SetTrigger("Die"); next lesson
}
}