【Blender】アニメーションデータを別のBlenderファイルにコピーする方法

というわけで、今回は Blender のファイル間コピーに関するお話です!

shot2ss20161029191337676

自作ゲームキャラのモデルを別ファイルで作り直したのですが、アニメーションデータのコピー方法が分かりませんでした。
ぐぐっても「キーフレームのコピー」とかそんな話題が多いですorz
Blenderのアペンド機能でいい感じにできたので、メモしておきます!

shot2ss20161029191406444

ちなみに作り直しているのは、本ブログで度々登場する「マリンパ」というウサギっぽいキャラです。
適当に作ったモデルで通していたので、リデザインしてモデリングし直したところです。
ある程度完成したら作り方などを紹介しようと思います!

ボーンのコピー

ボーンに限った話ではありませんが、単なるオブジェクトであれば「Blenderを2つ起動→片方でコピー→片方でペースト」でいけます。
Ctrl+C でコピーして、Ctrl+V で貼り付け・・・なんてこのブログを見ている方ならご存知かと思います!

shot2ss20161029191731003

shot2ss20161029191745003

ただし、マテリアルやテクスチャが付いたオブジェクトをコピペした場合、それらの情報も持ってきてしまいます。
再利用するなり、データブロック削除 (Shift+×クリック) で整理しましょう。
特にオブジェクトやマテリアルの名前が重複して接尾辞 (001とか) が付いてしまっている場合があるので、その手の命名に神経質な人はご注意下さい。

アニメーションデータのコピー

ボーンのコピーは出来ましたが、アニメーションデータはくっ付いてきてくれません。
Blender にはアペンドという機能があり、これを使えば他のblendファイルのデータを持ってこれるようです。
元ファイル側でエクスポート等を行う必要がないので楽々です。

File→Append からインポートしたい.blendファイルを選択します。

shot2ss20161029192226650

.blendファイル内に存在するデータの一覧が出るので、インポートするデータを選択します。
かなりいろいろ選択できるみたいです。

shot2ss20161029192348171

「Action」内にあるアニメーション名を指定することで、キーフレームごとインポートされます。
Shiftキーを押しながら選択することで複数選択も可能なので、一括でのインポートもできます。
選択したデータはオレンジ色になります。

shot2ss20161029192431241

選択したら右上の「Append from Library」を選択します。
ActionEditor でアニメーションがインポートされているか確認しましょう。

shot2ss20161029192829560

問題なさそうです!
インポートしたアニメーションはFボタン (上画像の赤い丸) を押して関連付けておきます。

まとめ

そんなわけで、Blenderファイル間でのデータコピーについて調べてみました!
特にモデルやアニメーションのコピーは多用しそうなので、しっかり覚えておきます。

【Unityメモ】エディタ拡張でタグを選択できるようにする

というわけで、絶賛仕事が忙しいりべるんです。
ブログのネタはおろか、Unity すらまともに触れていない日々です。
すっぽかすわけにもいかないので、何か簡単に記事にできそうなものについて書いていきます。

shot2ss20161019200247596

今回のお題はタイトル通り、「エディタ拡張でタグマネージャのタグを選択できるようにする」ことです!
ぐぐるとそれなりにヒットするので今更感はありますが、自分用のメモとして書いておきます。

拡張用クラスの作成

エディタ拡張用のクラスを作成します。
Editor ディレクトリの中に保存する必要があります。

using UnityEngine;
using UnityEditor;
using System.Collections;

[CustomEditor(typeof(Block))]
public class TagSelecter : Editor {
    SerializedProperty trigger_tag;

    void OnEnable() {
        trigger_tag = serializedObject.FindProperty("trigger_tag");
    }

    public override void OnInspectorGUI() {
        base.OnInspectorGUI();

        serializedObject.Update();

        trigger_tag.stringValue = EditorGUILayout.TagField("Trigger Tag", trigger_tag.stringValue);

        serializedObject.ApplyModifiedProperties();
    }
}

Unity5.3から SerializedProperty を使用した形式でないと値が保存されないようです。
OnInspectorGUI() 内で Update() と ApplyModifiedProperties() を呼ぶようにします。

ちなみにエディタ拡張で指定した際、クラスのフィールドがインスペクターに表示されなくなってしまいますが、親の OnInspectorGUI() を呼んであげれば上手くいくようです。
割と盲点だったので気を付けるようにします。

拡張先のクラス修正

タグマネージャから選択させる理由として、「ブロックが特定のタグと接触した場合のみ壊れる」といったことをしたいためです。
インスペクターから直接打ち込んでも良いのですが、タグマネージャから選択できるほうが便利で確実です。

ゲーム上のブロックは Block クラスを継承しているため、Block クラスにエディタ拡張を設定します。
エディタ拡張クラスで [CustomEditor] 属性で Block を指定しておきます。

using UnityEngine;
using System.Collections;

public class Block : MonoBehaviour {

    [HideInInspector]
    public string trigger_tag;

    public void OnTriggerEnter(Collider c){
        if (c.gameObject.tag == trigger_tag) {
            Destroy(gameObject);
        }
    }
}

とりあえず最低限の動作ですが、こんな感じでしょうか。
フィールド名はエディタ拡張クラスの FindProperty() の引数と合わせる必要があります。

public の場合、フィールド自体の項目とエディタ拡張の項目で二重に表示されてしまいます。
他から変えてもらっても困るので private か protected が妥当なところですが、今の構造上変えるのも面倒だったので、[HideInInspector] 属性を付けてインスペクター上から隠してみました。

まとめ

すごく短いですが、エディタ拡張でタグを選択できるようにしてみました!
所謂「マジックストリング」的なコーディングは避けたいところなので、こういった便利機能を入れていきたいですね。

【Unity】パーティクルシステムで光剣っぽいエフェクトの作成

というわけで、仕事繁忙のため全然更新できていませんが、今回のお題はこちらです!

shot2ss20161001091241801

剣のモデルから「光の剣」のようなものを出してみました!
「武器に光が纏って強くなる」なんてシチュエーションはファンタジーなゲームでよくありますよね!
プレイヤーがこの状態になると攻撃力やリーチが上がり、見た目と相まってテンションが上がったりします。

パーティクルシステムの Renderer モジュールで、生成するパーティクルの形状を変化させることができます。
初期状態では Billborad ですが、これを Mesh にしてモデルを指定すればOKです。

このあたりはテラシュールブログさんに分かりやすく記載されております。

下準備

パーティクルのベースとなる剣のモデルを作成します。
剣といっても柄の部分は不要で、刃の部分だけそれっぽくなっていればいいので、割と適当でも問題ありません。
そんなわけで、Blender でさくっと作ってみました。

shot2ss20161001100028913

今回は専用のモデルを作りましたが、キャラクターが剣を持っている場合はそのメッシュを使ってしまっても大丈夫です。
ただし剣の刃と柄が1オブジェクトに結合されている場合、パーティクルのエフェクトに柄も反映されてしまうので注意が必要です。
専用のモデルを作ると剣の形に依存しなくもなるので、モデルの状態や作成するゲームの雰囲気に合わせて・・・といった感じでしょうか。

ベースエフェクトの作成

光の剣となるエフェクトを作成します。
新規でパーティクルシステムを作成し、パラメータを設定していきます。

shot2ss20161001092021719

shot2ss20161001092101239

ポイントはやはり Renderer モジュールのメッシュ指定です。
これを剣の位置・移動に合わせるため、 剣に近い bone の子オブジェクトに設定し微調整します。

地味に詰まった点として、RenderMode を Mesh にし、シェーダーを Particle~ 系にすると、画面上に表示されなくなってしまいました。
ProjectSettings→Player→Other Settings→Auto Graphics API for Windows にチェックを入れることで解決しました。

shot2ss20161001092242887

新規プロジェクト作成時はチェックが入っているので外れている理由が分かりませんが、Windows10 にしたから・・・かも?
7→10のアップデート時にいろいろトラブったので、関係がないとは言い切れなそうです。

shot2ss20161001093940980

出来上がったのがこちら!
ちょっと安っぽい感じはしますが、雰囲気だけならそれなりに出来ているのではないでしょうか。
マテリアルの設定とかテクスチャとか拘ればもっと見た目はよくなると思われます。

20161001_01

振り回すとこんな感じに。
見た目は剣のリーチが伸びたように見えますが、現状では攻撃判定が伴っていない詐欺エフェクトだったりします。
通常時と光剣時で攻撃判定を分ける必要がありそうです。

ちなみに剣の軌跡の部分は「X-WeaponTrail」というアセットで簡単かつ綺麗に作れます。
下の記事で紹介しています。

「X-WeaponTrail」を使った武器の軌跡について

サブエフェクトの作成

↑だけでは寂しいので、何か適当にエフェクトを追加してみます。
関連オブジェクトをまとめるための空オブジェクトを作成し、先ほどのパーティクルを子オブジェクトとした上で追加していきます。

まず簡単にできるエフェクトとして、剣から少しオーラが出ているような見た目にしてみます。
メインエフェクトを複製し、Start Speed を少しだけ上げてみました。

shot2ss20161001095516161

もし「水の剣」など流動的なものを想定する場合は Start Speed ではなく、 Gravity Modifier を使うとそれっぽい見た目になります。
上げすぎると自己主張が強くなるので、少しだけ上げましょう。

shot2ss20161001100342543

あとちょっとしたエフェクトとして、剣の周りに粒子を出してみます。
今度は Shape を Mesh にして先程と同じ剣のモデル選択し、RenderMode は Billborad にします。
その他はデフォルトのマテリアルで適当に。

shot2ss20161001095638977

エフェクトとはちょっと違いますが、光剣という名目なのでライトが欲しいところです。
適当に PointLight を追加します。

shot2ss20161001095747584

上は Range が50、 Intensity を1.5に設定してあります。
Directional Light が効いていると微妙ですが、暗い場所なら目立つ・・・かも。

まとめ

そんなわけで、パーティクルシステムを使った光の剣 (っぽいもの) について考えてみました!
攻撃時の見栄えがかなりよくなるので、強力な攻撃の際には付けると良さそうです。