読者です 読者をやめる 読者になる 読者になる

Unityで様々な線を描くことができるアセット、"Vectrosity"を試してみました

Unity

きれいな表現の勉強ということで、前回のSkyshop(下記)に続き、今度は線を描くアセットを勉強してみました。

magicbullet.hatenablog.jp


Vectrosity という、$29.95のアセットです。

f:id:Takyu:20160213145011p:plain


このアセットは、「線を描く」で思いつきそうなことが、ほぼ全て網羅されています。

選択した箇所を枠で囲ってみたり、

f:id:Takyu:20160213145829p:plain

個々のオブジェクト間を線でつないでみたり、

f:id:Takyu:20160213145851p:plain


楕円やGridを描いてみたり、

f:id:Takyu:20160213150021p:plain

f:id:Takyu:20160213150044p:plain

などです。


他にも、任意のオブジェクトをワイヤーフレームのようにできます。

f:id:Takyu:20160213150342p:plain


それぞれの線の描画は、サンプルシーンが別々に用意されているので、それを見ることでだいたいイメージがつかめます。

全ては多いので、今回は、

1.準備
2.ワイヤーフレームの表現
3.光の線の描画表現

の3つを解説したいと思います。


1. 準備

まずは購入し、インポートします。
インポートすると、Unityのバージョン別のパッケージが複数同梱されています。
以下は、Unity5系のフォルダ構造です。

f:id:Takyu:20160213151230p:plain


マニュアルを元に整理しました。

Unityのバージョン 使用するパッケージ
4.6〜5.1台 Vectrosity 4フォルダを使用
5.2.2〜5.2.3 Vectrosity 5 フォルダのVectrosity5-Unity5.2.2.unitypackageを使用
5.3以降 Vectrosity 5 フォルダのVectrosity5-Unity5.3.unitypackageを使用


5.2.0、5.2.1、5.2.4は、この表のどこにも当てはまりませんが、私の5.2.4の環境では、Vectrosity5-Unity5.2.2.unitypackageを特にエラーなく使うことができました。

5.2系の場合、5.2.2.unitypackageを使うのがよさそうです。

また、説明書には、展開するunitypackageは一つだけにしてほしい、との記載がありました。


その他、自分で試してわかった内容のメモです。

・使わないバージョンのフォルダは削除してかまわない

スクリプトは全てUnityscript(C#ではない)で書かれている

・ただし、C#APIも用意されているのでC#でも使用可能

・VectrosicyDemos.unitypackageを展開し、_Scenesフォルダを開くと、多数のサンプルシーンがある。

・シーンには最低限のスクリプトだけが使われてる。Scriptsフォルダはシーン別にフォルダ分けされている。そのため、該当するシーンのスクリプトを見れば「どうやったらこの表現ができるのか」が理解しやすい

・UnityScriptの場合はimport Vectrosity、C#の場合はusing Vectrosity、をスクリプトの冒頭に付けるだけで使える

2. ワイヤーフレームの表現

最終的にこんな変化をさせます。

f:id:Takyu:20160213152145p:plain


ちなみに、ここで使ったのはWizard Staff Packという杖モデルです。
何でもよかったのですが、cubeやsphereではつまらないし、あまり大きいのは準備が大変なのでこれにしてみました。

f:id:Takyu:20160213152408p:plain

2-1. LineMakerによる、フレーム情報の生成

まず、前準備として、ワイヤーフレームを作るには、LineMakerというツールワイヤーフレーム化したいオブジェクトを選択し、フレーム用のデータを生成する必要があります。

LineMakerはAssetsの中に追加されています。

f:id:Takyu:20160213152031p:plain


Hierarchy Viewで対象のオブジェクトを選択してからLineMakerを開くと、このようなウインドウが表示されます。

f:id:Takyu:20160213152959p:plain

番号①②③の順に選択します。

Pointer Size とLine Sizeはオブジェクトの大きさによって調整すればよいと思います。今回のStaff(杖)は小さかったので、どちらも最小サイズにしました。


③を選択すると、拡張子".bytes"形式のファイルが生成されます。これはオブジェクトの頂点座標をまとめたもののようです。

ワイヤーフレーム化したい処理で使います。

オブジェクトの頂点座標を取得する方法はもう一つあって、Generate Line(UnityScript)、Generate Line(C#)のどちらかをクリックしてもよいです。

クリックすると、new Vector3(a,b,c)の配列がクリップボードにコピーされます。

このように、scriptに貼付ければ、あとはここで処理を記述することで、ワイヤーフレームを生成できます。

f:id:Takyu:20160213153417p:plain
(コピペしただけです。相当長いスクロールが続きます。実際は配列化などの記述を加えないとコンパイルエラーになります)

ただ、new Vector3(a,b,c)の数があまりに多いためか、私の使っているMono Developがしょっちゅう固まりました。

個人的には、特定の頂点座標を知りたい、などがなければ、bytes形式のファイルを使った方がやりやすいと思います。

2-2. スクリプトで、ワイヤーフレームを生成する処理を記述

たとえば、以下のようなスクリプトを作成し、Staffオブジェクトにアタッチします。

using UnityEngine;
using System.Collections;
using Vectrosity;

public class GenerateWireFrame : MonoBehaviour {

	public TextAsset frameData; /*(1)*/
	private VectorLine line;
	private Color color1 = Color.green;

	void Start () {
		var linePoints = VectorLine.BytesToVector3List (frameData.bytes); /*(2)*/
		line = new VectorLine(this.gameObject.name, linePoints, 2.0f);/*(3)*/
		line.SetColor(color1);/*(4)*/
		VectorManager.ObjectSetup (this.gameObject, line, Visibility.Dynamic, Brightness.None);/*(5)*/
	}
}

以下、補足です。

(1)
まず、TextAsset型で変数を宣言します。ここには、先ほどLineMakerで作った.bytes形式のデータを、Inspector上で指定します。

(2)
TextAsset型の変数を読み込み、描画すべき点を取得します。

(3)
VectorLineのインスタンスを生成します。ここの2.0fは太さです。

(4)
色指定です。記述は必須ではなく、記述ない場合、白線のワイヤーフレームになります。

(5)
線を描画します。


この状態でシーン実行すると、上で紹介したようにstaffがワイヤー状になります。

また、同様の手順でやれば、任意のモデルをこのような表現にできます。


ちなみに、もし下記のような結果になった場合、使うAPIが間違っている可能性があります。

f:id:Takyu:20160213155221p:plain


私の場合、bytesファイルの読み込み時に、間違って"BytesToVector2List"を指定してました。。



** 3.光の線の描画表現


デモシーンの中に、Scribblecubeというシーンがあります。

[補足]
scribble :走り書きする

f:id:Takyu:20160213155543p:plain


scribble(走り書き)とはいえ、光の線はきれいですよね。

ここでは、サンプルシーン実行時に出たエラー対処方法と、オブジェクトを光の線で描画する方法を解説します。

3-1. サンプルシーン実行時に出たエラー対処方法

サンプルシーンを実行すると、以下のエラーが出ます。

f:id:Takyu:20160213164905p:plain

エラーの内容

ArgumentException: Input Axis Mouse ScrollWheel is not setup.
To change the input settings use: Edit -> Project Settings -> Input
CameraZoom.Update () (at Assets/VectrosityDemos/Scripts/Scribblecube/CameraZoom.js:5)


これは、マウススクロールのキー割当がされてない場合に発生します。

修正方法は下記です。

f:id:Takyu:20160213170934p:plain

Edit -> Project Settings -> Input を選択

Axis を11に変更

新しく追加されたElementを、以下のように変更する

Name : Mouse ScrollWheel
Gravity : 0
Dead:0
Sensitivity:0.1
Type : Mouse Movement
Axis :3rd Axis (joysticks and Scrollwheel)
Joy Num : Get motion from all joysticks


これでマウススクロールができるようになったので、スクロールによってscribbleの中身に近づくことができます。

f:id:Takyu:20160214071430p:plain

うまく使うと、幻想的なシーンも作れそうですね。


ちなみに、Unity5.2.4で新規プロジェクトを作ったら、Mouse ScrollWheelは初めから設定されていました。
なぜVectrosityのアセットインポート時に設定がなかったのかは不明です。

3-2. オブジェクトを光の線で描画する方法


サンプルシーンの光の線を出す仕組みを調べたところ、

line = new VectorLine("Line", linePoints, lineTexture, lineWidth, LineType.Continuous);

のように、線のインスタンス生成で、テクスチャを指定していました。


先ほどのワイヤーフレームのときは、

line = new VectorLine(this.gameObject.name, linePoints, 2.0f);

だったので、テクスチャの指定はありませんでした。


そこで、このlineTextureを調べると、

public Texture lineTexture;

で定義されており、ProjectViewで見ると、形式はpsd(Photoshop)でした。
(テクスチャにPhotoshop形式も指定できるとは知りませんでした)


Photoshopで開いてみました。

f:id:Takyu:20160214062912p:plain

f:id:Takyu:20160214062927p:plain

このように、中心が白色で、あとはalphaを段階的に変えているようです。

サンプルシーンでは光の線を描画する方法しか描かれていませんが、先ほど任意のオブジェクトをワイヤーフレーム化させることができているので、このワイヤーフレームを光の線で描画してみます。

方法は、psd形式のファイルをlineTextureとして指定し、以下のようなコードを書くだけです。

using UnityEngine;
using System.Collections;
using Vectrosity;
using System.Collections.Generic;

public class GenerateWireFrame : MonoBehaviour {

	public Texture lineTexture;
	public Material lineMaterial;

	public TextAsset frameData;

	private VectorLine line;
	private float lineWidth = 15.0f;

	private Color color1 = Color.blue;
   private Color color2 = new Color( 0,1.0f,1.0f,0.4f);

	void Start () {
		var linePoints = VectorLine.BytesToVector3List (frameData.bytes);
	 	line = new VectorLine("Line", linePoints, lineTexture, lineWidth, LineType.Continuous);
		//line.SetColor(color1);
                line.SetColor(color2);
		VectorManager.ObjectSetup (this.gameObject, line, Visibility.Dynamic, Brightness.None);
	}
}

Color.blue(alpha=1)を指定した場合と、

f:id:Takyu:20160214070620p:plain


Colorのalphaを0.4にしたシアン色の場合です。

f:id:Takyu:20160214070630p:plain


alpha値を小さくする方が、より線の周辺が淡くなるので光って見えます。

この仕組みを使えば、好きな色の光の線も描けそうですね。