サークル獏の佐藤敏 Unityとか備忘録

サークル獏の佐藤敏 Unityとか備忘録

サークル獏の佐藤敏がUnityとかで知ったTipsを書いておく備忘録です。

中心がズレた小道具をAdjust Pivotで直す

f:id:VinSatoo:20180917074718p:plain
こちらはImagineGirlsのVienneV2のfbxをBlenderに読み込み、メガネ以外を全部削除して再度fbxとして書きだしたもの。
メガネだけをよそで転用したい、みたいな感じである。
それをUnityに読み込んだ。

中心がズレた小道具の問題

見ての通り、中心点(Pivot)とメガネの中心位置が激しく違う。
このまま回転させると……
f:id:VinSatoo:20180917074904p:plain
この通りである。これでは位置合わせがやりづらくてしょうがない。

Adust Pivot(無料)の登場

そこでAdust Pivot(無料)を活用する。
assetstore.unity.com
プロジェクトにインポートしたら、[Window]-[Adjust Pivot]ができるので早速起動。
f:id:VinSatoo:20180917075252p:plain
Adjust Pivotのウィンドウが出てきた。
f:id:VinSatoo:20180917075322p:plain

位置調整オブジェクトの追加

今回中心を調整したいglassesの子に、位置調整用の空オブジェクトを作る。
f:id:VinSatoo:20180917075447p:plain
名前はGame Objectのままで特に問題ナシ。
f:id:VinSatoo:20180917075516p:plain

位置調整オブジェクトの位置合わせ

普通にUnityの移動ツールでGame Objectをメガネの中心になるように動かしていく。
カメラの角度によって中心だと思っていた位置が全然違っていたりするので、カメラを回転させたりしながら確認していこう。
f:id:VinSatoo:20180917080314p:plain
f:id:VinSatoo:20180917075611p:plain
そしてGame Objectをメガネの中心に持ってきた後で、Adust Pivotの「Move ~~ pivot here」を押すと……
f:id:VinSatoo:20180917075730p:plain

移動の中心がメガネの中心になった

このように、「移動の中心=メガネの中心」になった。
最初と違って、回転させてもとんでもない動き方をしない。
これなら位置調整もしやすい。
f:id:VinSatoo:20180917080037p:plain
f:id:VinSatoo:20180917075949p:plain

ちなみに、一度こうなったら位置調整用のGame Objectは削除してしまって構わない。
あとはPrefabにでもして保存、Unity Packageとして書き出したりすれば使い回しもしやすいだろう。
 
 

位置調整を目分量でやらない

ところで、上のやり方はGameObjectを手動で動かしていることになる。
カメラの角度によって見え方がまるで違ったりするし、結構大変だ。

で、メッシュの中心はGetComponent().bounds.center;で得られるらしい。
thethird.hatenablog.com

なので、自動化することを考えた。
(Adjust Pivotにはこの機能は入っていないように見える……タブン。)

using UnityEngine;
using UnityEditor;

public class MeshCenter 
{

    // 自前のメニューと項目を作成
    [MenuItem("Window/MeshCenter", false, 1000)]
    static void MeshCenterProc() {
        if (Selection.activeGameObject == null)
            return;

        GameObject centerTarget = new GameObject("CenterTarget");

        var vec3 = Selection.activeGameObject.GetComponent<Renderer>().bounds.center;
        Selection.activeGameObject.transform.position = -vec3;
        centerTarget.transform.SetParent(Selection.activeGameObject.transform);

        Selection.activeGameObject = centerTarget;
    }
}

このようなC#スクリプトを書き、MeshCenter.csなどの名前でプロジェクト内の「Editor」フォルダに保存する。

MeshCenterの実行

Glassesを選択。
MeshCenterを実行する。
f:id:VinSatoo:20180917081353p:plain
自動で作られたCenterTargetというオブジェクト。
勝手に選択状態になる。
f:id:VinSatoo:20180917083005p:plain
 
位置調整も自動で終わっているので、そのまま「Adjust Pivot」を実行。
f:id:VinSatoo:20180917081427p:plain
さっき手動でやったのと同じように、回転の位置がちょうどよくなった。
もし微妙に中心をズラしたい場合は、「Adjust Pivot」実行前に手動で調整すればよい。
f:id:VinSatoo:20180917081435p:plain
また、小道具によっては自動計算された中心と見た目の中心がまるで違うこともある。
その場合は手動でガンバルしかないだろう。
 
 

Blenderからの書きだしのときの多少の注意点?

f:id:VinSatoo:20180917080854p:plain
メガネだけになったVienne。
記憶があいまいだが、メガネは最初非表示だったかもしれない。
その場合、Unityに持ってきたときMeshRendererがオフになっているので手動でメガネのMeshRendererをInspectorからオンにすること。

f:id:VinSatoo:20180917080617p:plain
書き出しの際はオプションの「エンプティ」「カメラ」「ランプ」「アーマチュア」「メッシュ」「その他」と並んでいるところから「メッシュ」だけ選んだ。日本語化していないと表記が違うかもしれない

ImagineGirlsのライセンス表記

f:id:VinSatoo:20180917081654p:plain
なお、今回使ったVienneV2は無料素材ではなく有料素材なのでそこは注意。
と言っても使っているのはメガネだけだが……
www.dlsite.com

(初代Vienneなどは無料だし、V2にもフリー版はあるもよう)
imaginegirls.com