Unity超初心者が引き出し開閉アクションをつくるその1


はじめに

iTweenという便利なアセットがあります。
今の私では使いこなすとこができそうにないので、
写経したスクリプトを含め作成手順のおさらいと、できたら仕組みの理解を深めたいので
勉強メモとして残そう思います。

使用したアセット

1.引き出し
https://assetstore.unity.com/packages/3d/props/furniture/chest-of-drawers-58835
2.FPSコントローラー
https://assetstore.unity.com/packages/essentials/asset-packs/standard-assets-for-unity-2017-3-32351v

iTweenとは

書籍やこちらの記事を読みざっくり知りました。
スクリプトでオブジェクトを動かすアニメーションを作りたいときに
使用する超人気アセット、それがiTweenです。
https://qiita.com/zob_by_zooa_inc/items/cbe68726a158cb2166e5

作成したもの

動作がとても重たかったです。
なのできれいに撮る難易度が高かったです。実際の引き出しの動きはかなりスムーズです。

今回の録画はこちらのパッケージを拝借しました。
https://github.com/f-space/FrameCapturerExtension/blob/master/Packages/Full.unitypackage
※録画パッケージ導入の参考手順
https://www.f-sp.com/entry/2016/09/06/032801

スクリプト追加

まずはインポートした引き出しアセットのパーツ内に「Drawer1」があるのでここに新規スクリプトを追加して
Eキー押下で開閉する処理を作成していきます。

InteractiveObject.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InteractiveObject : MonoBehaviour
{
    // Vector3型 引き出しが開いた時(openPositon)と閉じたとき(closePosition)の座標位置をインスペクタ表示、数値入力で設定
    [SerializeField] private Vector3 openPositon, closedPosition;

    // Float型 引き出しの開閉スピードをインスペクタ表示、数値入力で設定
    [SerializeField] private float animationTime;

    /* ブーリアン型 開いているか閉じているかを真偽の値で調べている、「isOpen」
     (これがないとEキーで開いたとき、引き出しが閉まらなくなる)
     ブール値はデフォルトの状態でfalseにする*/
    [SerializeField] private bool isOpen = false;

    // God_P.234 ハッシュテーブル:キーと値の組み合わせの情報で、
    // キーにより値を出し入れすることができる連想配列と呼ばれる配列の一種のこと
    // (これがないと引き出しを開けたとき空間に飛び出たままになった)
    private Hashtable iTweenArgs;

    void Start(){
        /* P.234 ハッシュテーブル作成_渡す引数(arguments)は2個ペア
        Property NameとTypeをカンマ区切りで追加する*/
        iTweenArgs = iTween.Hash();
        // GameObjectがアニメーション化する空間内のポイント。
        iTweenArgs.Add("position", openPositon);
        // アニメーションが完了するまでの秒数
        iTweenArgs.Add("time", animationTime);
        // 「islocal」ワールド空間でアニメ化するか、親(引き出し)を基準にしてアニメ化するか。
        // (デフォルト値はfalseでtrueにすることで親オブジェクトを基準としている)
        iTweenArgs.Add("islocal", true);
    }

    void Update(){
        // Eキーが押下されたら
        if (Input.GetKeyDown(KeyCode.E)){
            // (isOpenの値が開いているか閉じているかの状態を保持している)
            if (isOpen){
                // 引き出しが開いていたら閉じる
                iTweenArgs["position"] = closedPosition;
            }else{
                // 引き出しが閉じていたら開く
                iTweenArgs["position"] = openPositon;
            }
            //  (真偽を交互に置き換えする、ここにこれがないとEボタン連打したときに引き出しの開け閉めがうまく動作しなかった)
            isOpen = !isOpen;
            // インスペクタで設定した座標位置にアニメーション移動(引き出し開閉)
            iTween.MoveTo(gameObject, iTweenArgs);
        }
    }
}

引き出しが開いている状態の座標位置を得るために
シーン画面でこんなかんじで動かします。

インスペクター内に引き出しのPosition情報がでるので
作成したスクリプトの引き出し開閉時の座標は同じくインスペクター内に下図のように設定します。

キャプチャを取り忘れてしまったんですが、引き出しの開閉スピードは
Animation Timeの数値で調整可能です。
好きな開閉スピードで調整しましょう、1.5がちょうどいいスピードになるみたいです。

あとはゲーム画面をスタートしてEキーを押下します。

これではまだ不十分

いまの状態だと引き出しの取っ手に触れることなく引き出しを開閉することができます。
これはこれで超能力者みたいでかっこいいのでありかもしれませんが、
つぎはRaycastというレーザ状のオブジェクトを使用して
取っ手に触れたら引き出しを開閉できるようにするやつを進めていきたいと思います。

今回参考にしました

・Unityで神になる本。 廣 鉄夫
https://www.amazon.co.jp/dp/4274069222/ref=cm_sw_r_tw_dp_U_x_L7cMEbB6VZKT

・iTween公式サイト「DOCUMENTATION」
http://www.pixelplacement.com/itween/documentation.php

・Unity 5 Tutorial Tuesdays: Doors, Drawers and Treasure Chests Part 1
https://www.youtube.com/watch?v=a5WXiMN3APk&t=780s