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 = ユレモノ対応版)でも使えます。

0 件のコメント:

コメントを投稿