20200324のUnityに関する記事は3件です。

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の位置が反映されません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【uGUI】 UI要素のサイズを別UI要素と一致させるスクリプト

背景

UI要素のサイズ(RectTransform.sizeDelta)を別UI要素に追従させ、見た目上で一致させたい

  • 一致させる対象が直接の親の場合
    • Stretch指定でOK
  • 一致させる対象が子かつ子の数が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〜でキャッシュしているのは比較の方がコピーより高速だろうという考えの下です

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

オブジェクトの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);

    }
}

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む