2015年4月26日日曜日

SDユニティちゃんを小さくして使う

SDユニティちゃんのモデルサイズを変更して使う際のメモ。

モデルの大きさは簡単に変更できますが、ユレモノ関係の当たり判定が元サイズのままで服や髪がきれいに揺れてくれません。

今回はこれをなんとかしてみます。


目的

SDユニティちゃんを元サイズの1/2で使いたい(実質背丈が半分)。
ユレモノも適切に揺らしたい。
※最終的には任意倍率で調整可能にします。

環境

Unity5.0.1f1 personal

※SDユニティちゃんのAssetはダウンロード&プロジェクトにImport済み前提。
※作業中素材には『ユニティちゃんライセンス』で提供されるコンテンツを利用しています。


モデルサイズを1/2にする

SDユニティちゃんをシーンにドラッグ&ドロップ。
(ユレモノ設定済みの Prefabs内のSD_unitychan_generic を使用)

選択状態からInspectorのTransform欄を見るとScaleが <1,1,1> になっています。
これを <0.5, 0.5, 0.5>にすればシーン上のSDユニティちゃんは簡単に半分の背丈になります。

しかしこのままUnityをPlayしてみると・・・
サイズを1/2にした方のSDユニティちゃんは、服の裾がめくれあがったり、髪が持ち上がったりしています。
ユニティちゃんのアイデンティティであるツノ(?)もこれではまるでウサギ耳のように!?。

黄色い球のGizmosが揺れるパーツ側の当たり判定で、これらが元サイズのままなのが原因です。
※ここでは見えてませんがユレモノが当たる相手側(腕とか)の当たり判定サイズも同様です。



ユレモノの当たり判定サイズ

SDユニティちゃんの髪や服の裾などのユレモノは複数のスクリプトで制御されています。
(普通サイズのユニティちゃんのユレモノ対応版も同様)


今回注目するスクリプトは2つ。

スクリプト名 SpringBone: 髪などの揺れる側用。
スクリプト名 SpringCollider: 腕などの衝突相手側用。

これらのスクリプトがユレモノ関連パーツに適切に設定されています。


この2つのスクリプトはpublic変数 Radius を持っています。
この値による球状範囲が相互に当たり判定サイズになっています。

つまりこの値も全て1/2にすれば当たり判定サイズがモデルサイズに合うわけです。


SDユニティちゃんではSpringBoneは13個、Spring Colliderは27個各パーツに入っています。

簡単に言えば、シーン上のSDユニティちゃんモデルでこれら計40個のパーツ内スクリプトRadius値を1/2にするだけです。

手動で作業するならここで話は終了です。


が、大きさを変えるたびにこれを手作業でやるのはハッキリ言って、

疲れます( ゚Д゚;)


※ちなみにSDではないユレモノ対応ユニティちゃんではパーツ数が多く53個になってます。

ということで、スクリプトで自動化してみます。



ユレモノサイズ変更スクリプト

以下のC#ソースをシーン上のSDユニティちゃんに放り込んで使います。

PlayするとSDユニティちゃん内のSpringBone、SpringColliderを検索して各Radius値を書き換えます。
※resizeMag で倍率を指定。1/2なので0.5。
※非constでpublicの方が便利な気がしないでもない。適時お好みで。



スクリプト名:Extention_SpringForUnityChan
-----
/*
 *  @file   Extention_SpringForUnityChan.cs
 *  @attention  
 *  @note
 */
using UnityEngine;
using System.Collections;
using UnityEngine;
using UnityChan;// Scope for SpringCollider/SpringBone

public class Extention_SpringForUnityChan : MonoBehaviour {
    const float resizeMag = 0.5f; //!< Resize number

    void ChangeRadius_Spring(GameObject go){
        //SpringCollider[] cs_sc = go.GetComponentsInChildren<SpringCollider>(true);//note: find to hide object too when set true.
        SpringCollider[] cs_sc = go.GetComponentsInChildren<SpringCollider>();
        Debug.Log ("Found SpringCollider="+cs_sc.Length);
        for(int i=0;i<cs_sc.Length;i++){
            cs_sc[i].radius = cs_sc[i].radius * resizeMag;
        }
        SpringBone[] cs_sb = go.GetComponentsInChildren<SpringBone>();
        Debug.Log ("Found SpringBone="+cs_sb.Length);
        for(int i=0;i<cs_sb.Length;i++){
            cs_sb[i].radius = cs_sb[i].radius * resizeMag;
        }
    }

    void Awake(){
        ChangeRadius_Spring(gameObject);
    }
    //void Start () {
    //}
    //void Update () {
    //}
}
-----

スクリプト適用前後比較。



とりあえずこれで裾や髪も元サイズ同様な感じになりますヽ(´ー`)ノ

※今回は小さくしてますが、倍率値次第で大きくしても使えると思います。
※SDではないユニティちゃんモデル(unitychan_dynamic = ユレモノ対応版)でも使えます。

2015年4月8日水曜日

デカールを貼る ~ SubStance Painter

SubStance Painterで凹凸のある3Dモデルにデカールぽいものを貼ってみるメモ。


※他にもっとスマートな方法がありそうな気もしますが、とりあえずやってみたのでメモ。
※デカール = プラモデルなどで車のボンネットや戦闘機の翼などに貼ってあるマーク類。痛車ぽい絵を貼る際にも使えるかも。
※Blender上でも同様なことは一応できますが、SubStance Painterの方がいろいろと利便性が良い感じ。





環境

Windows7x64
SubStance Painter 1.3.3。
(モデルとマスクテクスチャ作成にBlender、PhotoShopを使用)

※作業中のデカール素材には『ユニティちゃんライセンス』で提供されるコンテンツを利用しています。


3Dモデルを用意

表面に凹凸があるモデルを用意(Blenderで適当に作ったもの)。
Obj形式でExportできれば他の3Dツールでも良いと思います。



□Blenderでモデルを作る場合のプチメモ:

先のモデルはBlender上では、
  • 色ごとに3つのObjectに分かれている(赤、青、緑)。

  • マテリアルは1つのみ作成。
    3つのObjectで1つのマテリアルを共用に設定。
     
  • UV配置も共存
    それぞれUV展開後、1枚のテクスチャ面積に収まるように各UVを配置。

こうしておくと SubStance Painter上では、
  • マテリアルは1つなので、1つのモデルのように塗れる。
    Particleでオイルなどを流した際に3つのObjectにまたがって流れてくれる。
    ※Blender上で各Object毎にマテリアルを個別に作ってしまうと別のマテリアル領域には流れない。
    デカールも貼りやすくなる(3つのObjectにまたがって同時に貼れるので)。

  • パーツごとの塗りには色選択マスクを使う。
    各Object毎の塗りは色選択マスクを使えば問題なし。
    (参考記事: 色選択マスク ~ SubStance Painter
    マスクは別途2Dソフトで作る必要有。
    BlenderからUVレイアウト(Object3つ分)を出力し2Dソフトで合成&着色するだけ。

  • SubStance Painter上での(3つのObject分の)作業結果も1枚のテクスチャ(法線/絵/光沢など各1枚)になる。
    ExportしてBlenderやUnityで貼る際にも楽。

ということで、Objectが複数あるモデルの場合はマテリアルを1つ(各Objectで共用)でExportすると楽な場合がありそうです。

色選択マスクのテクスチャ(UV)はこんな感じ。
※追記:左下1つだけ8角形に塗れてないのはミスです。
後から気付きましたが記事の本筋には支障がないのでそのまま( ゚∀゚;



SubStance Painterで準備

  1. 3Dモデルの読込。
    Obj形式でExport済みの3DモデルをSubStance Painterで読み込む。

  2. Fill Layerを3つ作成&各色選択マスク追加。
    各Fill LayerにAdd mssk with color selection で色選択マスクを追加。
    2Dソフトで作成済みの色選択マスクを読込む。
    3つのObjectに相当するパーツを色選択マスクで指定。
     
  3. 3つのパーツを適当に塗り塗り。
とりあえず適当にこんな感じに。


デカールを貼る


  1. デカール素材読込
  2. レイヤ追加
  3. ブラシ選択
  4. ブラシのマテリアルにデカール素材を指定



デカールを貼る面が正面にくるように3Dビューを調整。
※3Dビュー内で CTRL+SHIFT+マウス左ボタン押し状態で90度単位の回転を使うと楽。

ブラシ設定内で、アライメントをカメラに設定(重要ポイント)。
各~ジッタの数値を0にする。
Alphaを無し、他、貼る角度を変更など。

3Dビュー上で大きさを調整して左クリックで貼る。


貼り終わった状態。

独り言

SubStance Painterの入門者向け(?)な日本語情報が少ない気がします。

オンラインマニュアル(英語)も簡素な感じであまり詳細に触れてないような。

Youtubeの動画は情報源としてそれなりに有効なのですが英語ばかりですし。
(特に公式動画は早口過ぎっ)

3Dツール関係は必要な基礎知識量(?)が多そうなので、どこまで詳細に説明するかなど、いろいろ難しそうですね。