見出し画像

ユニティちゃんを操作してみる (1) - 事始め

ユニティちゃんの操作方法をまとめました。

・2021.3.6f1

1. ユニティちゃんの3Dモデルのダウンロード

ユニティちゃんの公式サイトから、「SDユニティちゃん 3Dモデルデータ」(SD_UnityChan-1.unitypackage)をダウンロードします。

2. プロジェクトの作成

プロジェクトの作成手順は、次のとおりです。

(1) Unityの3Dプロジェクトを作成。
(2) Unityのメニュー「Assets → Import Package → Custom Package」で、「SD_UnityChan-1.unitypackage」をインポート。

コードが古いため、インポートするとコンソールに以下のようなエラーがでます。

(3) コンソールのエラー表示をダブルクリックして該当コード(AutoBlinkforSD.cs)を開き、Policyの行をコメントアウト。

・AutoBlinkforSD.cs (8行目)

(4) 同樣にアニメーション再生時にエラーが発生する場合があるため、以下の修正を適用。

・FaceUpdate.cs (74行目)


パッケージのフォルダ構成は、次のとおりです。

・UnityChan
 ・License : ライセンス
 ・Models : ユニティちゃんシェーダー
 ・Scripts : 各種スクリプト
 ・SD_Kohaku_chanz : こはくちゃんズのデータ
 ・SD_unitychan : ユニティちゃんのデータ
  ・Animations : アニメーション
  ・FaceAnimations : フェイスアニメーション
  ・Models : モデル
  ・Prefabs : プレハブ
  ・Scenes : シーン

3. ユニティちゃんの配置

ユニティちゃんを配置する手順は、次のとおりです。

(1) Hierarchyウィンドウに「UnityChan/SD_unitychan/Prefabs/SD_unitychan_humanoid」をドラッグ&ドロップ。
(2) カメラの位置と向きの調整。

Position = (0, 0.7, 1.85) 
Rotation = (0, 180, 0)

(3) ライトの向きの調整。

Rotation = (30, 150, 15)

(4) Hierarchyウィンドウの「+ → 3D Object → Plane」で床を配置。

Playボタンで実行すると、動作確認用のUI付きで表示されます。

表示が荒い場合は、「Low Resolution Aspect Ratios」がチェックされている可能性があります。チェックされてたら外します。

4. 動作確認用のUIの非表示

ユニティちゃんのモデルに設定されてるコンポーネントは、次の7つです。

・Animator : アニメーションの管理
・Idle Changer : モーションの変更
・Face Update : 表情の制御
・Auto Blinkfor SD : まばたきの制御
・Spring Manager : 揺れものの制御
・IK Look At : IKの制御
・Random Wind : ランダムな風

今回は、動作確認用のUIは必要ないので、「Idle Changer」「Face Update」を有効化のチェックをはずし、「Random Wind」「IKLookAt」の「Is GUI」のチェックをはずします。

5. AnimatorControllerの準備

AnimatorController」は、状態や条件に応じてキャラクターのアニメーションを切り替えるコントローラです。作成手順は
次のとおりです。

(1) Projectウィンドウで「+ → Animator Contoller」を選択し、名前に「UnityChanAnimatorController」を指定。
(2) 「UnityChanAnimatorController」をダブルクリックし、Animatorウィンドウを開く。

Animatorウィンドウ」は「AnimatorController」を編集するウィンドウです。画面構成は次のとおりです。

レイヤー&パラメータエリア : レイヤーとパラメータの追加。
レイアウトエリア : 状態の追加と設定。

6. パラメータの追加

レイヤー&パラメータエリア」 は、レイヤーとパラメータの編集を行うエリアです。「レイヤー」は 複数のステートマシンに分けて管理できるようにするためのレイヤーです。初期状態はレイヤー1つのみ(Base Layer)です。
パラメータ」は ステートに影響を与えるパラメータで、コードからステートを操作するために使います。

今回は、ユニティちゃんの状態が「Running」であるかどうかを示すパラメータ「is_running」を追加します。

(1) 「Parameters」タブを選択。
(2) 「+ → Bool」を選択し、名前に「is_running」を指定。

パラメータのデータ型は、次のとおりです。

・Float : 浮動小数値
・Int : 整数値
・Bool : true/false
・Trigger : 任意のアニメーションを1回だけ再生

7 状態の追加と設定

「レイアウトエリア」では、状態の追加と設定を行います。

◎ 状態の追加
(1) レイアウトエリアを右クリックし、「Create State → Empty」でStateを生成し、名前に「Idle」、Motionに「UnityChan/SD_unitychan/Animations/SD_unitychan_mothion_humanoid/Standing@loop」を指定。

Entryから矢印でつながっている状態が、初期状態になります。初期状態を変更したい場合は、Entryを右クリックし、「Set StateMachine Default State」で選択します。

(2) レイアウトエリアを右クリックし、「Create State → Empty」でStateを生成し、名前に「Running」、Motionに「UnityChan/SD_unitychan/Animations/SD_unitychan_mothion_humanoid/Running@loop」を指定。

◎ 状態の設定
(1) 「Idle」を右クリックし、「Make Transition」を選択し、「Running」をクリック。
「Idle → Running」の矢印ができます。

矢印を削除したい場合は、矢印とつながっている状態を選択し、Transitionsの「-」をクリックします。

(2) 「Idle → Running」の矢印を選択し、「Has Exit Time」のチェックをはずし、「Conditions」の「+」を押して「is_running : true」を追加。
「Idle」で「is_running=true」になった時、「Running」に遷移する設定になります。

・Has Exit Time : アニメーション完了まで、次のアニメーションを待機。
・Conditions : この遷移が発生する条件

(3) 「Running」を右クリックし、「Make Transition」を選択し、「Idle」をクリック。
(4) 「Running → Idle」の矢印を選択し、「Has Exit Time」のチェックをはずし、「Conditions」に「is_running : false」を追加。
「Running」で「is_running=false」になった時、「Idle」に遷移する設定になります。

8. ユニティちゃんを走らせる

モデルにAnimatorControllerを追加し、そのパラメータを操作するスクリプトも用意することで、ユニティちゃんを走らせます。

(1) ユニティちゃんの「Animator → Controller」に先程作成した「UnityChanAnimatorcontroller」を指定。

(2) ユニティちゃんに「Add Component」で新規スクリプトを追加し、名前に「UnityChanTest」を指定し、以下のように編集。

・UnityChanTest.cs

using UnityEngine;
using System.Collections;

// ユニティちゃんの動作テスト
public class UnityChanTest : MonoBehaviour {
    Animator animator;

    // スタート時に呼ばれる
    void Start() {
        animator = GetComponent<Animator>();
    }

    // 定期時間毎に呼ばれる
    void FixedUpdate() {
        // 前進
        if (Input.GetKey("up")) {
            transform.position += transform.forward * 0.05f;
            animator.SetBool("is_running", true);
        } else {
            animator.SetBool("is_running", false);
        }

        // 左右回転
        if (Input.GetKey("left")) {
            transform.Rotate(0, -5, 0);
        } else if (Input.GetKey("right")) {
            transform.Rotate(0, 5, 0);
        }
    }
}

「Animator」の各種メソッドでパラメータを操作できます。Triggerのみパラメータ値指定はなく、キャンセルにはResetTrigger()を使います。

animator.SetFloat(string name, float value)
animator.SetInteger(string name, int value)

animator.SetBool(string name, boolean value)
animator.SetTrigger(string name)
animator.ResetTrigger(string name)

Playボタンで実行すると、方向キーで走らせることができます。

9. ユニティちゃんを敬礼させる

Triggerを使って、ユニティちゃんを敬礼させます。

◎ トリガーの追加
(1) 「Parameters」タブを選択。
(2) 「+ → Trigger」を選択し、名前に「salute」を指定。

◎ 状態の追加
(1) レイアウトエリアを右クリックし、「Create State → Empty」でStateを生成し、名前に「Salute」、Motionに「UnityChan/SD_unitychan/Animations/SD_unitychan_mothion_humanoid/Salute」を指定。

◎ 状態の設定
(1) 「Idle」を右クリックし、「Make Transition」を選択し、「Salute」をクリック。
「Idle → Salute」の矢印ができます。
(2) 「Idle → Salute」の矢印を選択し、「Has Exit Time」のチェックをはずし、「Conditions」の「+」を押して「salute」を追加。
「Idle」で「salute」が呼ばれた時、「Salute」に遷移する設定になります。
(3) 「Salute」を右クリックし、「Make Transition」を選択し、「Idle」をクリック。
(4) 「Salute → Idle」の矢印を選択し、「Has Exit Time」のチェックをはずす。
Triggerの戻りの矢印には、「Conditions」の設定は必要ありません。

◎ コードの編集
(1) スペースキーを押した時に「salute」を呼ぶようにコードを編集。
前進時にトリガーリセットも追加しています。

・UnityChanTest.cs

using UnityEngine;
using System.Collections;

// ユニティちゃんの動作テスト
public class UnityChanTest : MonoBehaviour {
    Animator animator;

    // スタート時に呼ばれる
    void Start() {
        animator = GetComponent<Animator>();
    }

    // 定期時間毎に呼ばれる
    void FixedUpdate() {
        // 前進
        if (Input.GetKey("up")) {
            transform.position += transform.forward * 0.05f;
            animator.SetBool("is_running", true);
            animator.ResetTrigger("salute"); // トリガーリセット
        } else {
            animator.SetBool("is_running", false);
        }

        // 左右回転
        if (Input.GetKey("left")) {
            transform.Rotate(0, -5, 0);
        } else if (Input.GetKey("right")) {
            transform.Rotate(0, 5, 0);
        }
    }

    // フレーム毎に呼ばれる
    void Update() {
        // 敬礼
        if (Input.GetKeyDown("space")) {
            animator.SetTrigger("salute");
        }
    }
}

Playボタンで実行すると、スペースキーで敬礼させることができます。

【おまけ】 現在の状態名の取得

現在の状態名は、以下のコードで取得できます。

        // 状態名の取得
        if (animator.GetCurrentAnimatorStateInfo(0).IsName("Base Layer.Idle")) {
            print("Idle");
        } else if (animator.GetCurrentAnimatorStateInfo(0).IsName("Base Layer.Running")) {
            print("Running");
        } else if (animator.GetCurrentAnimatorStateInfo(0).IsName("Base Layer.Salute")) {
            print("Salute");
        }

【おまけ】 APIリファレンス

次回


この作品はユニティちゃんライセンス条項の元に提供されています

この記事が気に入ったらサポートをしてみませんか?