Unity

【脱出ゲーム制作2】3Dモデルのアニメーション作成とスクリプトによる再生方法

オリジナルのボクセルを使って脱出ゲーム制作に挑戦!

用意するもの
  • Unity
  • VSCode,VisualStudioなどのソフト
  • 箱型の3Dモデル

この記事ではUnity6を使用しています。

前回の工程

前回はプロジェクトを作成し、モデルをインポートするところまでやりました。

前回の記事はこちら

木箱のフタをクリックで開閉させよう

今回は木箱の「フタ」を開閉させるアニメーションを作成し、木箱をクリックしたらアニメーションが再生されるようにします。

この茶色い四角いのが木箱くん

下準備

アニメーションさせる作業の前に下準備をします。

カメラを調整

現在のカメラの位置は全体を映すような位置にあるので、アニメーションさせたい『木箱』の前に配置させます。

Game画面

ワイプを表示

作業しやすいようにワイプを表示する。

ワイプを表示させると、現在カメラがどのように映ってるかわかりやすくなるよ

MainCameraを木箱の前に移動

MainCameraを選択し、Transformを変更。

PositionのY軸を少し上にし、RotationのX軸を20にして見下ろす感じにする。

Game画面

木箱のフタのアニメーションの作成

Animationsフォルダの作成

Assetsに「Animations」フォルダの作成を作成する

フタが開くアニメーションを作成

フタのモデルを選択し、Window→Animation→Animation

「Create」を選択

Animationsフォルダに「OpenWoodenBox」と名前を付けて保存。

録音ボタンを押す

Rotationを少しいじるとキーフレームが作成される。
このキーフレームは0秒なのでRotationは全て0にし、フタが閉まっている状態にする。

60と入力してキーフレームを作成し、Z軸を-50。

1秒かけてフタが開くといった感じ

AnimationsフォルダにAnimationファイルとAnimatorファイルが作成された。

再生したらこんな感じ。

開くアニメがループし続けてしまうので「OpenWoodenBox」の「LootTime」のチェックを外す

フタが閉まるアニメーションを作成

次はフタが閉まるアニメーションの作成。
録音する方法とは別の方法で作成してみる。

CreateNewClipで「CloseWoodenBox」という名前で保存

AddPropertyを押し、Rotationの+を選択

Rotationのを-50にしてスタート

キーフレームを60にし、Rotationのを0にして完成。

閉まるアニメもループをオフにするのを忘れないように

Animatorの確認

Animatorを開くと、作成した2つのアニメーションが確認できる。

アイドル状態のアニメーションを作成する

このままではゲームが開始したら開くアニメが再生されてしまうので、何も動かない状態の「IdleWoodenBox」を作成する。

CreateState→Empty

「Set as Layer Default State」でデフォルトに設定する。

名前を「IdleWoodenBox」に変更。

「開く」「閉まる」「なにもしない」の3つのアニメーション

クリックしたらアニメーションを再生させる

マウスで木箱をクリックしたら、指定したアニメーションが再生されるようにする。

木箱本体に当たり判定を追加する

Add Componentから「Box Collider(当たり判定)」を追加

フタの辺りをクリックしても反応させたいので、当たり判定を少し大きくする

スクリプトを作成

Scriptsフォルダに「WoodenBox」スクリプトを作成。

WoodenBox.cs
using UnityEngine;

public class WoodenBox : MonoBehaviour
{
    [SerializeField] Animator animator;
    bool isOpen = false;

    public void OnClickObj()
    {
        if (isOpen)
        {
            Close();
        }
        else
        {
            Open();
        }
    }

    void Open()
    {
        isOpen = true;
        animator.Play("OpenWoodenBox");
    }

    void Close()
    {
        isOpen = false;
        animator.Play("CloseWoodenBox");
    }
}

木箱がクリックされたら、OnClickObjメソッドを実行し、isOpen変数がfalseだった場合(フタが閉まっていた場合)Openメソッドを実行し、OpenメソッドでisOpen変数をtrueに変更し、開くアニメーションを再生。フタが閉まっていたらCloseメソッドを実行といったスクリプト。

スクリプトを実行させる

作成したスクリプトを実行させるためにオブジェクトにアタッチさせたりする。

フタのモデルに「WoodenBox.cs」をアタッチさせ、AnimatorにAnimatorをアサインさせる。

ややこしいけど、スクリプトからAnimatorのアニメを実行させるためにアサインする必要がある

木箱本体にAdd Componentから「Event Trigger」を追加

Add New Event Type→「PointerClick

+ボタンを押し、フタのモデルをアサインする。

Function→WoodenBox→OnClickObj()を選択。

これで木箱本体がクリックされたらフタにアタッチされてるWoodenBox.csのOnClickObjメソッドを実行するように関連付けされた。

EventSystemを作成

イベントを実行させるためにはEventSystemが必要。

ヒエラルキーから、UI→EventSystem

EventSystemは特に何もいじらないよ

カメラにPhysicsRaycasterを追加

MainCameraにPhysics Raycasterを追加

Add Component→「Physics Raycaster」

クリックされたらカメラからレーダーが出て、オブジェクトに当たったかどうか判定されるという感じ。

レーダー

完成

プロジェクトを実行し確認。

クリックしたら開閉するようになった。

連打すると途中で次のアニメが実行されちゃうから調整が必要そう

とりあえず今回はここまで

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です