CustomScript

2014年12月24日水曜日

Unity Mecanim Tips

  • Unity4.6
(2015-01-15更新)

Mecanim勉強中です。
勉強していてひっかかった点をメモしておきます。

● 遷移図が見きれてしまったらマウスの中ボタンドラッグで調整

● どんな状態からでも遷移させたい場合は"Any State"からTransitionを作る

● Atomic属性がONのTransitionは遷移中に他の状態に切り替えられない(デフォルト)

● 次の関数は毎フレーム呼ばないと意味が無い(呼び出す毎に計算をしている)
  - SetFloat(name, value, dampTime, deltaTime)
  - MatchTarget(...)

● OnAnimatorMove()コールバックを実装するとアニメによる移動量が無視される
適用したい場合はこの関数内で animator.rootPosition,animator.rootRotationをtransformに適用する

● MecanimのIKとアニメーションカーブはPro版の機能

● Animator の SetLookAtPosition() はPro版の機能。IKの一部ということらしい。わかりにく!
  - Head Look Controller サンプルプロジェクトのスクリプトを使えばFree版でも視線制御可能

2014年12月18日木曜日

Unityのキャラモデル構造の勉強

  • Unity4.6
3Dキャラモデル構造についての理解がイマイチなので調べてみました。



まずは、キャラモデルを構成する要素の復習です。

● ポリゴン

最小の3D表示単位として三角形ポリゴンがあります。
全ての3Dグラフィックはこの集まりと思っていてよいでしょう。

● メッシュ

三角形ポリゴンのまとまりをメッシュといいます。
これにより様々な立体を表現します。

● マテリアル

色や模様といった情報です。
ポリゴンは形だけですが、マテリアルを追加することで多彩な色表現が可能になります。
関連:カラー、テクスチャ、シェーダ

● メッシュとマテリアル

基本的には1メッシュにつき1マテリアルになります。
GPUの動作として、まずマテリアルを設定し、その設定でメッシュを描写します。この1描写が1DrawCallに相当します。

● ボーン

座標系を親子関係で構成した情報です。
これにより関節の動きを表します。
この座標系1つ1つをボーンと呼びます。

● ボーンモデル(?)

各ボーンの座標系にそれぞれメッシュを描写します
これにより関節の動きに沿った描写が可能になります。
ボーンモデルではボーンとメッシュは1対1です。

● スキニングモデル

1つのメッシュに対して複数のボーンを適用したものです。
メッシュの各頂点がどのボーンに所属するかを定義することにより繋ぎ目のない関節が描写できます。
昨今のモデルはほとんどこの形式です。



だいたいこんなものでしょうか。
では実際にUnityのモデルがどのような構造になっているか見てみましょう。



よくデモで見かけるモデルです。
青枠がメッシュ、赤枠がボーンです。
ボーン階層は折りたたんでいますが、広げれば指先まで設定されています。
メッシュ1に骨格1という、シンプルなスキニングモデル構造になっています。
DrawCallは1です。



これはMecanimのサンプルに付属のモデルです。
メッシュが6つあり、左右の眼球のメッシュがボーン構造内にあります。上4つはスキンメッシュですが、眼球は単なるメッシュになっており、ここだけボーンモデル構造になっています。
DrawCallは6です。

ちなみにUnityChanは超リッチに作られており、DrawCallは40でした。参考まで。

2014年12月17日水曜日

3D迷路ゲーム作ってみた

  • Unity4.6
Unityのリハビリとして3D迷路ゲームを作ってみました。

3D迷路ゲーム

https://dl.dropboxusercontent.com/u/13310317/unity/Maze/Maze.html


操作はよくあるFPS操作です。
敵に捕まらないように迷路を脱出してください。ステージはLEVEL3までです。
MSXの「イリーガス」を目指して作っていましたが気力が尽きたのでこの中途半端な状態で終わり。

2014年12月10日水曜日

[C#] ループする範囲に値を正規化する

  • C#
0から360でループする角度のように、任意のループする範囲に値を正規化する関数を作ってみました。
C#で浮動小数の%演算がいい働きしてくれています。

【MSDN】% 演算子 (C# リファレンス)
http://msdn.microsoft.com/ja-jp/library/0w4e0fzs.aspx

    float NormalizeLoopRange(float val, float min, float max)
    {
        if (min >= max) throw new System.ArgumentException("need min < max");

        if (val >= max)
        {
            return min + (val - min) % (max - min);
        }
        else if (val < min)
        {
            return max - (min - val) % (max - min);
        }
        else
        {
            return val;
        }
    }
あまり動作検証していませんのでバグがあったらすみません。

2014年12月9日火曜日

Unity勉強 4.6の新UIを試してみた

  • Unity4.6
Unity4.6で念願の新UIが実装されたので試してみました。
どんなことができるかはこちらのムービーを見るのがはやいです。様々な画面比に対応できる機能が使いやすそうなのが嬉しいです。



実際にどのように組んでいくかはこのあたりを参考に。

【Libro.】Unity 4.6の新GUIを使おう
http://libro.tuyano.com/index3?id=3266003
【わなびのーと】[Unity]Unity4.6 UIチュートリアル Lesson1.UI Canvas 日本語要約
http://wannabe-note.com/544

で、試しに作ってみたのがこれです。なんの役にもたちませんが、作ったよという証として。

2014年12月8日月曜日

UnityとVisualStudioの連携

  • Unity4.6
  • VS2013
久々にUnityを触ってみました。VisualStudioの拡張で Visual Studio 2013 Tools for Unity というものが無料で使えます。これを導入することで、MonoのエディタではなくVisualStudioでスクリプトデバッグできるようになります。C#を扱う環境としてVisualStudioは最適だと思うので、これはうれしいです。

Visual Studio 2013 Tools for Unity
https://visualstudiogallery.msdn.microsoft.com/20b80b8c-659b-45ef-96c1-437828fe7cf2

使い方にちょっとした手順が必要なので、ドキュメントを軽く読んでおくとよいです(英語;)。コード補完、デバッガ以外にも便利機能があるようです。

Visual Studio Tools for Unity - Documentation
http://unityvs.com/documentation/
http://unityvs.com/documentation/configuration/ (使い方)

以前はUnityVSという製品名で有料だったんですが、Microsoftに買収されて無料になったようです。VisualStudioもComunityという高機能無料バージョンが出たし、良い時代になったものです。

2014年12月6日土曜日

WPF勉強(11) アプリ配布方法について WiX編

  • VS2013
  • WiX3.9
WiXでインストーラを作成してみました。

Windows Installer XML toolset(ウィックス)は、XML ドキュメントから Windows Installer (MSI) パッケージを作成するためのフリーソフトウェアのツールセットである。WiX はコマンドラインベースの環境をサポートしている。(by Wikipedia)

WiXについては下記ページを参照してください。

WiX Toolset (公式)
http://wixtoolset.org/
WiXチュートリアル(日本語訳)
http://wix.softark.net/

今回はVisualStudioでWiXを使ってみます。 そこそこの見栄えにするため、チュートリアルの2.4ぐらいまで進めていることを前提にします。

チュートリアルはコマンドラインですが、標準ではパスが通っていません。下記のようなバッチを作ってそこから作業すると良いでしょう。
@set Path=%Path%;C:\Program Files (x86)\WiX Toolset v3.9\bin
@start /b

WiXをインストールするとVisualStudioでWiXのプロジェクトが作れるようになります。
次のムービーを参考に最小のWiXプロジェクトを作ってみてください。



私は英語がわかりませんが、操作を見ていればなんとなくわかります。映像は偉大です。
チュートリアルとWiXの構造が違うように見えますが、<Fragment>で要素が外に置かれているだけです。新しい要素としては、<MajorUpgrade>はアップグレードの簡易設定用で、<MediaTemplate>は<Media>に替わるもの?です。

で、実際に自分のプロジェクトでやってみたときのWiXコードがこれです。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <Product Id="*" Name="テストアプリ" Language="1041" Codepage="932" Version="1.0.0.0" Manufacturer="テストアプリ製作所" UpgradeCode="YOURGUID-6dddd4f9-12ba-476a-92bb-92f4460670cf">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes"  />

    <Feature Id="ProductFeature" Title="SetupProject1" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
      <ComponentGroupRef Id="ProgramMenuComponents" />
    </Feature>

    <UIRef Id="WixUI_Minimal" />
    
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="テストアプリ" />
      </Directory>
      <Directory Id="ProgramMenuFolder">
        <Directory Id="MyMenuFolder" Name="テストアプリ" />
      </Directory>
    </Directory>
 </Fragment>

  <Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <Component Guid="*">
        <File Source="$(var.WpfApplication1.TargetPath)" KeyPath="yes">
          <Shortcut Id="ShortcutMyMenu" Directory="MyMenuFolder" Name="テストアプリ" WorkingDirectory="INSTALLDIR" Icon="MyIcon.exe" IconIndex="0" Advertise="yes"/>
        </File>
        <File Source="$(var.WpfApplication1.TargetPath).config" />
      </Component>
    </ComponentGroup>

    <ComponentGroup Id="ProgramMenuComponents" Directory="MyMenuFolder">
      <Component Guid="*">
        <RemoveFolder Id="MyMenuFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type ="string" Value="" KeyPath="yes" />
      </Component>
    </ComponentGroup>

    <Icon Id="MyIcon.exe" SourceFile="$(var.WpfApplication1.TargetPath)" />
    
  </Fragment>

</Wix>

.exeと一緒に.exe.configもインストールするようにしています。WPFアプリの静的な設定ファイルみたいなもの?なので、セットにしておくと良いようです。

スタートメニューから起動できるようにショートカットを作るようにしています。

ちょっと豪華なUIにするためにWiXUIを使っています。チュートリアルではコマンドラインで "-ext WixUIExtension" オプションを追加していましたが、VisualStudioのプロジェクトでは参照(References)でWixUIExtension.dllを追加します。日本語設定も必要なので、プロジェクトのプロパティの[Build]の Cultures to build: に "ja-JP" を記述しています。


2014年12月5日金曜日

WPF勉強(10) アプリ配布方法について ClickOnce編

  • VS2013
調べてみるといろんな配布方法がありますが、まずはVisualStudio2013標準の配布方法 ClickOnce を試してみます。

この方法、試すだけならとても簡単。[ビルド]メニューから[(アプリ名)の発行]を選びます。そうすると発行ウィザードが立ち上がるので、それに答えていくだけです。とりあえず試すだけなので以下の設定でいきます。ほとんどデフォルトだと思います。
アプリケーションはどこに発行しますか?
publish\
ユーザーはアプリケーションをどのようにインストールするのですか?
CD-ROMまたはDVD-ROMから
アプリケーションの更新はどこで確認するのですか?
アプリケーションの更新を確認しない
最後に[完了]ボタンを押せば発行作業が開始され、プロジェクトフォルダに「publish」フォルダができます(自動で開きます)。このpublishフォルダ自体が配布セットになっていて、そのsetup.exeを実行するとインストールが行われます。発行元が確認できない警告が出ますが、自分で作ったものなので問題なし。インストールに成功するとアプリが立ち上がります。スタートメニューにも登録され、アンインストールはコントロールパネルから行うことができます。 ね、簡単でしょ? しかもこのアプリ、最近のアプリによくある自動更新機能がほぼ標準装備です。すごい。

…ですが、このClickOnce方式、ほとんど世の中で見かけません。

カスタムできる範囲が狭い
インストール場所を選んだりできません。コンポーネントを選んでインストールということもできません。 なので大規模な商用アプリには向かないように思えます。

証明書を用意する必要がある
ネットからの配信にするのが理想の形なのでしょうが、セキュリティが問題です。このため、ちゃんとした証明書を取得して添付してやらないといけません。このようなコストはちょっとしたアプリを一般公開したい場合には向きません。
試しに何も設定しないでネットからのインストール設定で発行、IEからインストールを試してみたところ、これでもかというくらいの警告が出ます。そんな状態では社内であろうと公開できません。

インストーラーが1ファイルではない
発行されたフォルダごと配布しようと考えた場合、zipにまとめますよね。解凍して中のsetup.exeを実行という手間を考えると、最初から1ファイルでインストーラーになっている従来型で良い気がします。もしくは単なるzipまとめ配布でも。

発想がAndroidやiOSアプリに近いので、従来の考え方だとなじまないのが普及しない原因でしょうか。証明書周りさえちゃんと用意できればそこそこ使えそうですけどね。


2014年12月1日月曜日

WPF勉強(9) RichTextBoxの内容をテキストで保存する

  • .Net4.5
 特殊な内部構造のRichTextBoxですが、これをテキスト形式で保存するには次のようにします。
using (var fileStream = System.IO.File.Open(filename, System.IO.FileMode.Create))
{
    TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
    textRange.Save(fileStream, DataFormats.Text);
}

TextRangeすごい。
ちなみに、string形式が欲しい場合はTextプロパティを使います。
string text = textRange.Text;


参考URL
http://stackoverflow.com/questions/4010314/wpf-richtextbox-save-load-in-custom-format

WPF勉強(8) ウィンドウの右下をつまんでリサイズ

  • .Net4.5


ウィンドウ右下を摘むとウィンドウサイズを変えることができるアレを実装します。

WindowコントロールのResizeModeプロパティを CanResizeWithGrip に変更するだけです。簡単。