「 メモ 」一覧

【メタセコ】【Blender】【Unity3D】モデルをmecanimに食わせるまでのトラブルあれこれ

メタセコで作ったモデルをBlenderでボーン入れてmecanimに食わせようと頑張ってましたが、

度重なるトラブルに超イライラしてたのでメモだよ!

あくまで自分が辿った道筋だから参考にはならないかも!

環境:
Blender 2.63.0
メタセコ 3.1.4
Unity 4.1.3f3

 

 

トラブル1 :
Blenderでインポートしたメタセコのモデルが一部おかしな事になっている

 

画像用意してませんが、インポートしたモデルの一部の頂点が座標0, 0, 0付近に勝手に移動していた。

メタセコでインポート元のデータを確認すると・・・そんなところに頂点は無い。

 

なのでとりあえずblenderでそのズレた頂点を戻そうとしたら・・・
視点があらぬ所に吹っ飛ぶという始末・・・明らかにバグ・・・

適当にクリックして3Dカーソルの座標を確認すると「X: -1 #IND Y: -1 #IND Z: -1 #IND」ってな ん だ こ れ は

 

結局これの原因としては、元のモデルの頂点の並びがズレており、そこにメタセコの厚みを付けるプラグインを使った結果
辺はあるが面が無いという変なデータが出来上がっていた事によるものだと分かりました。。

なおBlenderの視点を戻すには3Dビューの、ビュー > 視点を揃える > 3Dカーソルと視点のリセット
で良いようです。。

 

 

 

トラブル2 :
Blenderのウェイトペイントが言う事を聞かない

 

とりあえず主にやりたい事は、
自動ウェイトで設定した時に、特定のボーンが動いた時にあらぬ所が動くので
その特定のボーンに対する、その特定の頂点に対するウェイトを0にしたいということ。

————————————————–
その前に、その「特定のボーンに対する特定の頂点に対するウェイト設定方法ですが

0. まずボーンが正しく設定されているものとする
bwt1
1. Armatureを選択してポーズモードに切り替え。
2. ウェイトを設定したいオブジェクト(上で言えばbody.001等)を選択してウェイトペイントモードに切り替え
※下にも書いてますが時々違うオブジェクトが選択されたままなのを見逃すので、設定したいオブジェクトが選択されてる事をきちんと確認して下さい。。
3. この状態でターゲットとなるボーンを右クリック。あとは塗るだけ。
bwt2
————————————————–

 

しかしまず、裏面を塗ることが出来ないので例えば「服のオブジェクトに靴下からスカートまで全部含める」
なんて事をしてると
「スカートが邪魔で靴下の裏面どうやって塗るんやあああ」ってなりますorz

※なお、スカートも靴下も厚みがついてる場合のお話です。

 

では、Weight Toolにて 反転 > すべて正規化 > 反転 とするといい感じになるのでは?

と考えましたが、困ったことに特定ボーンに対するウェイトではなく、
全てのボーンに対するウェイトがゼロになってしまいます。

結局のところ、裏面が塗れなさそうな構成になる場合は、きっちりオブジェクトを分けるしかないようです。

 

またその他にも気付いたことは

1. ウェイトペイントモードになっているオブジェクトに再度自動ウェイトを設定すると
IKが掛かっていないボーン?のウェイトがゼロに設定されるようです。困ったもんです。。
自動ウェイトをまた設定するには、一旦ウェイトペイントモードを解除してからでないとダメなようです。。

 

2. ウェイトペイントモードのオブジェクトが選択されている状態でボーンを選択するとウェイトが表示されますが、
そのまま別のウェイトペイントモードのオブジェクトを選択しても前に表示されたウェイトはそのままで、
更に違うボーンを選択しても前のウェイトが残ったままなので、時々勘違いして違うボーンにウェイトを設定しちゃったりします。要注意です。。

 

うーん説明が長すぎるorz

 

 

 

トラブル3 :
mecanimで自前のモデルが使えない

 

原因は単純に、mecanimが求めるボーン構成と異なるからのようです。

————————————————–
その前に、blenderで作ったモデルをmecanimに読ませる手順としては
1. FBX形式でエクスポート
2. Unityにファイルを放り込む
3. Rig > Animation Type を Humanoid に変更。
4. Avater Definition のとこの Configure を 押すと設定が出来る。
mecaset
※ちなみにHumanoidに変更した後に、Model > Scale Factor を変更して Configureに移動すると、
モデルがぐちゃぐちゃになる事があります。その時はMapping画面のPose > Reset を押す必要があります。
(下記に画像アリ)

————————————————–

 

で、話を戻して今回ダメだったボーン構成は以下のとおり。

-before-
mod-bef

最低限ボーンがあればokのようなので、髪がツインテールだとか右手に何か持ってるとかは考えないで下さい。
また、ついでに2.5等身モデルです。これちゃんと動くのか?というのは保証しません。そこから先は今からなので・・・
なお片足最低3個のボーンが必要なので、見えにくいですが両足それぞれ小さいボーンが先に1個ついてます。

 

で、このような構成になっているのですが、mecanimではダメと言われます。

この構成、参考書を見てほとんどそのまま真似たんだけどなあ!!
※まあ言わずもがな、blenderの参考書なんでmecanimまで考慮してる訳は無いのですが。。

 

 

というわけで検索で資料を探し、ボーンを以下のように修正。。あとでまたウェイトをチェックしとかないとなあ。。

mod-aft

っていうかこの構成だと、腰にあるゼンマイのようなボーン要らない気がする。

 

 

トラブル4 :
mecanimが認識するボーンが、前後逆になる

 

ボーンの左右が逆で、指の位置関係が逆になっていました。つまり、向いてる方向が180度反対ってことですね。

というわけで

exp-z

fbxのエクスポートオプションで「-Z Forward」となっている所を「Z Forward」に変更。

そして再度インポートしてmecanimの設定を開く・・・が、前後逆のまま!!

 

 

結論としては
mecreset

Configureの画面の下にあるPose > Reset を押す必要があります。
またその後、隣にあるMapping > AutoMap を押すとせめて前後逆に認識されてるという状態は回避されるかと思います。

 

 

もうね、モデル変えたりしたら毎回毎回前後逆に認識されたmecanimのボーン設定を修正すんの?(‘`;
なんて思っててほんと疲れましたorz orz

 

 

という訳で以上です orz orz


【Unity3D】【VS2010】IDEを2つ立ち上げてコピペでソース管理する時のメモ1

そもそも何故2つ立ち上げているかと言うと、

 

片方はゲーム本体(Unity)で、もう片方はアプリケーションサーバーな訳です。

 

で、この時に共通の情報(パケット処理周り)を持たせてる共通クラスファイルが1個だけあるんですが・・・

何が面倒かと言えば、

 

Unityのコンソール出力は「Debug.Log」に対して

鯖側が普通にWindowsフォームなので「Console.WriteLine」であること。

なので共通クラスファイルにこういうコードを書いて・・・

    namespace UnityEngine
    {
        public class Debug
        {
            public static void Log(string s)
            {
                Console.WriteLine(s);
            }

            public static void LogWarning(string s)
            {
                Console.WriteLine(s);
            }
        }
    }

コンソール出力はDebug.Logで統一。

ソースを変更して、鯖からUnityにコピペした時はこれをコメントアウト
Unityから鯖にコピペした場合はコメントアウトを外す・・・とやってましたがちょっと面倒くさい(‘A`

 

#if で何とかならんかなあ・・・と思ってた結果

 

1. 鯖側のプロジェクトのプロパティ > ビルド > 条件付きコンパイルシンボルに任意の文字列を追加

kk001

※セミコロン区切りで複数定義可能。

2. ソースをこのように書き換える

#if IsM2Server
    namespace UnityEngine
    {
        public class Debug
        {
            public static void Log(string s)
            {
                Console.WriteLine(s);
            }

            public static void LogWarning(string s)
            {
                Console.WriteLine(s);
            }
        }
    }
#endif

これで無事にUnity側にコピペしてもこのDebug.Logモドキはコンパイルされないことに。

シンボルの定義を今更知った次第でありました(汗

 

そもそもこれ以外にも方法あるよ!とか管理の仕方からおかしい!

とかいう話だったら申し訳無い(‘A`


【Unity3D】XMLSerializerでシリアライズ→デシリアライズした時に特定の型(List<int[]>)がnullに

正確には以下の環境で発生。

シリアライズ: .Net Framework 4.0
↓(TCPで送信)
デシリアライズ: Unity 4.1.2 f1

 

・・・そもそもそこでXMLSerializer使うのはどうなのという点は置いといて。。

 

とりあえず結論としては、monoのバグか何かのようで・・・

 

まず、.Net Framework4でシリアライズしたクラスの出力がこちら。

<?xml version="1.0"?>
<MyPacket xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PacketType>N_Debug2MatchingInfo</PacketType>
  <Data xsi:type="N_Debug2MatchingInfo">
    <MatchineKeyNumber>1</MatchineKeyNumber>
    <IsHost>false</IsHost>
    <UnitPartes>
      <ArrayOfInt>
        <int>0</int>
        <int>0</int>
        <int>0</int>
(以下略)

続いてUnityで同じクラスをシリアライズしたクラスの出力がこちら

<?xml version="1.0" encoding="shift_jis"?>
<MyPacket xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PacketType>N_Debug2MatchingInfo</PacketType>
  <Data xsi:type="N_Debug2MatchingInfo">
    <MatchineKeyNumber>1</MatchineKeyNumber>
    <IsHost>false</IsHost>
    <UnitPartes>
      <ArrayOfInt1>
        <int>0</int>
        <int>0</int>
        <int>0</int>
(以下略)

違いはencoding指定がついてるのと・・・ArrayOfInt1?なにこれ?

 

なおこの「ArrayOfInt」となるUnitPartesという変数の型は、List<int[]>です。

List<bool[]>とかList<byte[]>も同じようになるのかなあ・・・

 

まあ他の方法で代用すれば良いので、早速修正するか。。

余談ですが、int[ , ] も「2Dimensionはサポートされていません」みたいなこと言われてシリアライズ出来ないのでご注意。