- 投稿日:2020-03-24T22:28:32+09:00
MagicaVoxelでモデルの中心(ピボット)を調整する方法
MagicaVoxelで3Dモデルをつくり、いざOBJファイルにエクスポートしてUnityで動かそうとしたら、モデルの中心位置がおかしくなっていることがあります。わざわざBlenderなどを使わず、MagicaVoxel内でピボットを調整する方法があったのでここに記録しておきます。
バージョン
MagicaVoxel-0.99.4.2-alpha-win64
World画面に切り替える
まずは、画面右上の矢印のボタンを押して、World画面へと切り替えてください。
モデルから矢印が出ていたらOKです。
ピボットを調整する
矢印を動かして、モデルのpivotにしたい位置がWorld画面の黒い線の交点に来るようにしてください。
もし、モデルの中央にpivotを設定したいのにモデルの幅のボクセル数が奇数で持ってこれない場合、一旦World画面からモデリング画面へ戻り、Toolの2Xボタンでモデルの大きさを2倍にしてください。
エクスポートされるモデルの大きさも2倍になってしまうのが嫌なら、MagicaVoxelのconfigフォルダにあるconfig.txtを次のように編集します。
io_objのscaleを'0.1'から'0.05'に変更OBJファイルにエクスポート
画面右下のExportボタンを押すと色々なボタンが出でくるので、objボタンを押してOBJ形式でエクスポートします。このときに、ちゃんとWorld画面になっているかを確認してください。モデリング画面のときにエクスポートしても、povotの位置が反映されません。
- 投稿日:2020-03-24T16:28:27+09:00
【uGUI】 UI要素のサイズを別UI要素と一致させるスクリプト
背景
UI要素のサイズ(RectTransform.sizeDelta)を別UI要素に追従させ、見た目上で一致させたい
- 一致させる対象が直接の親の場合
- Stretch指定でOK
- 一致させる対象が子かつ子の数が1つの場合
- 下記公式ドキュメントの実装で可能
- https://docs.unity3d.com/ja/2018.4/Manual/HOWTO-UIFitContentSize.html
- Horizontal/Vertical Layout Groupを使用する必要があり、自動で整列されるため子1つのみの制約あり
- 構成が複雑でわかりづらい
上記の様なヒエラルキーや要素数に依存しないコンポーネントが欲しかったので自作しました
また、Inspector上でのサイズ変更を不可にしましたUISizeFitter
using UnityEngine; [ExecuteInEditMode, RequireComponent(typeof(RectTransform))] public class UISizeFitter : MonoBehaviour { [SerializeField] RectTransform _target; RectTransform _selfRect; Vector3 _cachedTargetLossyScale; Vector2 _cachedTargetSizeDelta; bool _isDirty = true; void UpdateDirty() { if (_cachedTargetSizeDelta == _target.sizeDelta && _cachedTargetLossyScale == _target.lossyScale) { return; } _cachedTargetSizeDelta = _target.sizeDelta; _cachedTargetLossyScale = _target.lossyScale; _isDirty = true; } void AdjustSize() { if (!_isDirty) { return; } _selfRect.sizeDelta = _cachedTargetSizeDelta * _cachedTargetLossyScale; _isDirty = false; } // Layout Groupみたいに「Some values driven by 〜」とInspector上の編集を禁止する void LockRectTransformProperty() { DrivenRectTransformTracker dt = new DrivenRectTransformTracker(); dt.Clear(); dt.Add(this, _selfRect, DrivenTransformProperties.SizeDelta); } void Awake() { _selfRect = GetComponent<RectTransform>(); LockRectTransformProperty(); } void Update() { if (_target == null) { return; } UpdateDirty(); AdjustSize(); } }補足
常に追従させたかったのでUpdateで実行していますが、負荷的に問題になったり、動的に変更しないのであればStart辺りに移動し一度のみ実行するのが良いと思います
また、lossyScale
がUnity側でキャッシュしているのか毎回計算しているのかが不明だったため、とりあえずComponent側でキャッシュしていますがUnity側で毎回計算している様だと比較時の負荷が若干気になります
_cached〜でキャッシュしているのは比較の方がコピーより高速だろうという考えの下です
- 投稿日:2020-03-24T15:24:16+09:00
オブジェクトのFadeIn/FadeOut
オブジェクトのフェードイン、フェードアウトの
自分なりのスクリプトです。
いろいろ応用してください。色を徐々に変える際も使えます。
Colorのrbgaをいじってみてください。
① オブジェクトに任意のマテリアルをアタッチ
② オブジェクトのRendering ModeをFadeにする
③ 以下のスクリプトをオブジェクトにアタッチする以下はフェードアウトですのでフェードインしたい場合はfの値を+=してください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FadeObject : MonoBehaviour { float f; // Start is called before the first frame update void Start() { f = 1f; } // Update is called once per frame void Update() { if (f >= 0) { FadeOut(); } else { Debug.Log("FadeOut完了"); } } void FadeOut() { //マテリアルを取得 Material mat = GetComponent<Renderer>().material; //カラーを取得 Color c = mat.color; //マテリアルのインスペクターでRendering ModeをFadeにすることを忘れずに c.a = f; f -= 0.001f; //colorはrgb //マテリアルのカラーに変更値を再代入(この場合アルファ値の変更) mat.color = new Color(c.r, c.g, c.b, c.a); } }