VR、ゲーム制作、プログラミング。Unity とか Oculus Rift とか。

2013年12月21日土曜日

[Unity]DotFabで出力したモデルを取り込む

ドット絵を 3D にできる DotFab を Unity で使ってみたときのメモです。

最新の v0.6.1 は 3D モデル出力機能がないので、v0.4.1 を使います。

(注 : 3D の知識はほとんどないので、以下おかしなことを言っているかもしれません)

DotFab の使い方は readme を見ればわかるので割愛しますが、SAVE_3D_OBJECT で出力した .obj (と .mtl) を Unity にドラッグ & ドロップしてインポートすると、下記の画像のようになってしまいました。


どうも大半のポリゴンのマテリアルが正しく設定されていないようです。

試しに Blender でインポートしてみると正しく表示できたので、Unity で .obj のインポートに何かあるのかもしれないと思い、形式を変換してみることにしました。

最終的には .dae 形式でエクスポートすると Unity で期待通りインポートできました。


気になるのは、Blender 上での頂点数は 586 だったのが、Unity 上では 44,000 になっていることです。これはさすがに多すぎるんじゃないかなと。
(このモデルで元々 586 頂点というのも、各ポリンゴンのマテリアル設定で色をつけるのではなくテクスチャを貼ればもっと減らせそうですね)


Cube の頂点数が 8 でなく 24 になるので、Verts の表示は純粋な頂点数でない(もしくは標準の Cube は面ごとに 4 頂点 * 6 面?)のかもしれませんが、それにしても 75 倍は多いような…。


原因はまだわかりませんが、とりあえず表示は一応できたということでメモ。

2013年12月8日日曜日

[Unity]NGUIでUnityの2Dスプライトをアニメーションする

NGUI で Unity 4.3 の 2D スプライトを使う方法は [Unity]NGUIでUnityの2Dスプライトを使う に書きましたが、今回はこれをアニメーションさせる方法です。

NGUI のバージョンは 3.0.6f6 以降が必要です。

まずは上記記事などを参考に、Unity 4.3 の 2D スプライト表示とアニメーション、NGUI で Unity の 2D スプライト表示ができるところまで準備してください。

あとは SpriteRenderer と Animator をアタッチして、数行のコードを追加すれば完成です。(空のオブジェクトに下のコードだけアタッチすれば、必要なスクリプトは全てアタッチされます。)

コードは以下。( GitHub : unity-ngui/UI2DSpriteAnimation.cs )

using UnityEngine;
using System;

[RequireComponent(typeof(UI2DSprite))]
[RequireComponent(typeof(SpriteRenderer))]
[RequireComponent(typeof(Animator))]
public class UI2DSpriteAnimation : MonoBehaviour
{
    System.WeakReference spriteRenderer_ = new System.WeakReference(null);
    SpriteRenderer spriteRenderer {
        get { return (spriteRenderer_.Target ?? (spriteRenderer_.Target = GetComponent<SpriteRenderer>())) as SpriteRenderer; }
    }

    System.WeakReference ui2dSprite_ = new System.WeakReference(null);
    UI2DSprite ui2dSprite {
        get { return (ui2dSprite_.Target ?? (ui2dSprite_.Target = GetComponent<UI2DSprite>())) as UI2DSprite; }
    }

    void Reset () {
        if (spriteRenderer) { spriteRenderer.enabled  = false; }
    }

    void Update () {
        if (!spriteRenderer || !ui2dSprite) { return; }

        spriteRenderer.enabled = false;
        ui2dSprite.nextSprite = spriteRenderer.sprite; // NOT ui2dSprite_.sprite2D = spriteRenderer_.sprite;
    }
}

ポイントは UI2DSprite.nextSprite を使うことです。UI2DSprite.sprite を直接書き換えると点滅します。

nextSprite は直接アニメーションで指定できないので、非表示にした SpriteRenderer 経由でコピーする必要があります。(参考 : Animation Curve を設定できる型はこちら + Unity 4.3 で Boolean とスプライト関連が追加された模様)

スクリプトを追加したら、Animator Controller をインスペクタの Animator にドラッグ&ドロップしてください。


これで動きます。

現時点では公式ドキュメントに UI2DSprite.nextSprite の説明は "To be used with animations." としか書いていませんが、ソースコードを見た範囲ではたぶん間違っていないとおもいます。


2013/12/9 追記 : UI2DSpriteAnimation.cs をアタッチすれば他の必要なスクリプトもアタッチされることを追記。

[Unity]NGUIでUnityの2Dスプライトを使う

Unity 4.3 で 2D スプライト機能などが強化されましたが、GUI 向けではないということで、現状 GUI は NGUI などのアセットを使うのがよいようです。

Unity の 2D スプライトと NGUI を併用する方法は少なくとも 2 種類、それぞれ独立させる方法と NGUI に取り込む方法がありますが、今回は後者について紹介します。


前提として、Unity の 2D スプライトの表示方法は把握していることとします。([Unity]Unity4.3の2D機能入門まとめ もどうぞ。)

NGUI は 3.x 系 (アニメーションも考えると 3.0.6f6 以降) を使ってください。

NGUI で Unity の 2D スプライトを表示するには、UI2DSprite を使うだけと簡単です。

いつも通りメニューから NGUI -> Create -> 2D UI として UIRoot などを作成したあと、NGUI -> Create -> Unity 2D Sprite します。

あとはスプライトをインスペクタにドラッグ&ドロップするだけ(下図)。


これで NGUI と座標系やサイズを共有し、NGUI のイベント処理も使えるようになります。

Unity のスプライトアニメーションとも連携できます。方法はこちら( [Unity]NGUIでUnityの2Dスプライトをアニメーションする )。


NGUI の更新情報はこちら。



2013/12/9 追記 : [Unity]NGUIでUnityの2Dスプライトをアニメーションする を書きました。

[Unity]Unity4.3の2D機能入門まとめ

Unity4.3 で 2D 系の機能が強化され、スプライト表示やアニメーションなどが便利になりました。

これについては皆さんすでに書かれていますので、自分がとりあえず入門レベルになるまでにお世話になったサイトをまとめておきます。


Unity2DとNewGUIについて : Unity の中の人のスライド。Unity の 2D 機能の概要、噂の次期 GUI (uGUI) との住み分けの話など。uGUI が出るまでの GUI 作成は Unity の 2D スプライトではなく NGUI とか使っておくといいかも、といったことも書いてありました。


スプライトを表示して最低限のアニメーションをするところまでは以下のサイトを見ればできると思います。

Unity4.3 で追加された Sprite 機能を使ってみよう - その1 - Unityではじめるゲーム開発 - Mobile Touch

Unity 4.3 2D Spriteの使い方:TextrueとSpriteのパラメーターについて - タカシカンパニーブログ

テラシュールウェア [Unity]Unity2d機能、スプライトの使い方

テラシュールウェア [Unity]Unityのスプライトアニメーションの使い方(基本編)


標準のスプライト分割機能は一枚の画像に異なるサイズのスプライトを詰め込むと使いにくいので、ツール作ったほうがいいかな…と思っていたらすでに作られていました。まだ試してはいないのですが TexturePacker ユーザーには便利だと思います。

テラシュールウェア [Unity]TexturePackerで一つにまとめたテクスチャをUnity 2Dのスプライトで使う


もっと見る場合はこちらも。

UNITY - アップデート情報 : Unity4.3 リリースノート

Unity 4.3 - 2D Game Development Walkthrough - YouTube : 公式ビデオチュートリアル