カテゴリー別アーカイブ: Windows Stoa Application

Unity3dでuniversal App Projectを吐き出す際のメモ

※再度試したところ、プロジェクトファイルを書き換えなくてもコンパイラが通りました。
 自分の環境のせいで何かしらおかしなことが起こっていたのかもしれないですが、なぜ通らない現象が起きたのか、何が原因なのかよくわかりません。


吐き出して其の儘だとVisualStudio2013Up3でコンパイルが通りません。

参照の中にリンク不明のエラーが二つでます。

Unity3d Ver4.5.4p2
VisualStudio2013 UpDate3
VisualStudio Tools Unity 1.9.1
上記環境で現象が起きています。

・.Windows.csproj
・.WindowsPhone.csproj
上記二つのプロジェクトファイルの一部を書き換えます。
エラーを起こしているファイルは「Assembly-CSharp.dll」「Assembly-CSharp-firstpass.dll」の二つです。

	<Reference Include="$(UnityProjectDir)\bin\Store 8.1\$(PlatformName)\$(ConfigurationName)\Assembly-CSharp-firstpass.dll" >
		<HintPath>.\$(UnityProjectDir)\bin\Store 8.1\$(PlatformName)\$(ConfigurationName)\Assembly-CSharp-firstpass.dll</HintPath>
	</Reference>
	<Reference Include="$(UnityProjectDir)\bin\Store 8.1\$(PlatformName)\$(ConfigurationName)\Assembly-CSharp.dll" >
		<HintPath>.\$(UnityProjectDir)\bin\Store 8.1\$(PlatformName)\$(ConfigurationName)\Assembly-CSharp.dll</HintPath>
	</Reference>

このように書かれており、一見問題なく通ると思われるのですが、なぜか「$(PlatformName)」がコンパイラで指定している「ARM」「x86」ではなく「AnyCPU」となってしまうために起こるエラーです。
(「Store 8.1」の部分はWP8.1用では「Phone 8.1」となっています)

    <Reference Include="Assembly-CSharp">
      <HintPath>bin\$(PlatformName)\$(ConfigurationName)\Assembly-CSharp.dll</HintPath>
    </Reference>
    <Reference Include="Assembly-CSharp-firstpass">
      <HintPath>bin\$(PlatformName)\$(ConfigurationName)\Assembly-CSharp-firstpass.dll</HintPath>
    </Reference>

そこで上記のように書き換えます。
さらに、VisualStudio2013Up3の「デバッグ」>「オプションと設定」>「全般」の中の「起動時にユーザーコードが見つからない時警告(マネージのみ)」についているチェックを外します。

debugoption
これが自分の環境のせいなのか、VS側の問題なのか、Unityの書き出しの問題なのか不明です。
もう少し調べてみたいところですが、そんなことよりアプリ作るために作業を進めたいと思います。

※追記
Unity-chanというUnity公式キャラクターがあります。
オフィシャルページからUnity用のAssetファイルをダウンロードすることができます。

このキャラクターを使ったアプリを作成しようとテストしていたのですが、ストアアプリ向けに吐き出そうとするとエラーが発生します。

困ったことにエラーのログが文字化けして詳しいエラー内容がわかりませんが、エラーコードから「Script/AutoBlink.cs」に書かれている「using System.Security.Policy;」はassemblyがないというエラー。
これはコメントアウトすれば解決するので、それほど問題はないと思います。
(もしくは#ifで囲ってしまうほうがいいかもしれません)

もう一つは下記画像なのですが

BycphOiIYAEf1nW.jpg large

「Script/SpringManager.cs」にある「UpdateParameter」関数内

			var prop = springBones [0].GetType ().GetField (fieldName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);

GetType しているGetField の内容が不正ということだと思うのですが、取りあえずこれも「#if」で囲って使用されないようにすることで、吐き出すことができました。

とりあえず出だしのところで躓くというへっぽこな開発スタートでしたが、まずはどうすればいいかを早いところ洗い出しておきたいです。

WindowsPhone8/8.1 Game Pad/Controller

WindowsPhone8/8.1(以降WP8/8.1)にはGame Pad/Controllerが有りませんでした。
これはモバイル向けGame Pad/Controllerとの接続で良く使用されるBluetoothですが、WP8/8.1にはBluetoothは搭載されているものの、対応profileとして「HID」が無いため外部入力機器が使用できませんでした。

ところが、最近検索していて見つけたのですが、Bensussen Deutsch & Associates, Inc(以下 BDA)社の「MOGA Game On Anywhere(以下 MOGA)」シリーズの一部が対応しているとの記事を見つけました。

MOGAにはiPhone用とAndroid用のゲームコントローラーがあるのですが、Android用でWP8/8.1に使用できる機能が付き、WP8用SDK(WinPRT)が公開されています。

MOGA Pro SDK – WindowsPhone8

自分は下記のコントローラーを購入して、SDKにあったサンプルでコントローラーが動作することを確認しました。


此方はUSB充電伝可能なリチウム電池内蔵型です。


価格は安いものの、単三電池二本が必要になる、リチウム電池やUSBコネクタはありません。

というわけで、WP8(WinPRT)用とはなっているものの、WP8.1WinRTベースで使用できるようにできないかと、色々試してみました。

続きを読む

dynabook TabをWindowsストアアプリのリモートデバッガで使用する

2014/05/29-30に行われた日本マイクロソフト社主催のイベント「de:code」で学習用機材として配布された「TOSHIBA dinabook Tab VT484/22K」を活用する一歩として、Windowsストアアプリのリモートデバッグを出来るようにしてみました。

使用した機材
・母艦PC:デスクトップPC
・タブレット:TOSHIBA dinabook Tab VT484/22K
・LAN:BUFFALO 10/100M USB2.0用 LANアダプタ LUA3-U2-ATX
・USB変換:ELECOM タブレットPC用USB変換アダプタ A(メス)-microB(オス) TB-MAEMCB010BK

リモートデバッグを行う場合は同一ネットワーク内にある必要があります。
その為デスクトップPCと接続するため、有線LANにするためUSB-LANアダプタを使用しました。

設定
・ルーターのDHCPでMACアドレスを利用してIPを固定しています。
固定していなくても実行可能とは思いますが、IPがコロコロ変わるのは面倒なので、固定しました。

必要なソフト
・母艦PC側はVisualStudio2013(Update3適応済み)を使用しています。
・dynabook Tabには「Remote Tools for Visual Studio 2013 Update1 x86」をインストールします

「Remote Tools for Visual Studio 2013」は「x86」「x64」「ARM」があります。
dynabook Tabでは「x86」版を使用しています。
dynabook Tab以外で行う場合は其々環境にあったバージョンをご使用ください。

インストール後、「Remote Debugger」を起動します。
起動すると各種設定に関する承諾が出ますがOKを押してください。
「Visual Studio リモート デバッグ モニター」が表示され、「サーバが開始され、接続を待っています」と表示されれば、「dynabook Tab」側は準備完了です。

Remote
母艦PC側のアプリソリューションを開き、アプリ動作先を「リモートコンピュータ」に変更して実行します。
実行の際、dynabook Tabがロックされていないように注意してください。
ロックされていると転送エラーになり、作業できません。

実行すると「接続先の選択」が表示されますので、きちんと接続準備ができていれば、リモートの「dynabook Tab」が選択可能です。(使用している開発言語で違いがあります)

接続が完了すると「開発者ライセンス認証」が促されます。
認証を行うとアプリが転送され、リモートデバッグが可能になります。

マルチタッチやカメラ、比較的非力なタブレット型でのデバッグが可能になり、開発のアイデアも浮かびやすいのではないかと思います。

Windowsデベロッパーセンターに「リモート マシンでの Visual Studio からの Windows ストア アプリの実行」という項目があり、ここに詳細がかかれています。

WindowsPhoneでダイスと籤

アプリを作っていると、いろいろな判定やランダムによるチェックを行うことがあると思います。

その中でもよくある方法としては、ダイス(サイコロ)を振ってその数値による判定というのと、一定数の当たりから籤を引くという判定があります。

まずはダイス判定関数です。
基本はランダムを利用したもので、ランダム用のシードを作成する関数。
シード利用してランダム関数をコールして、結果の数値に+1して返すダイス関数。(Random.Next(Count)は0~指定数値-1なので)
複数ダイスを判定する関数で構成しています。

        /// <summary>
        /// 複数ダイスのロール
        /// 2D6 なら DiceRoll(2, 6)
        /// 1Dなら「.First<int>()」をつけて呼び出せばintで見れる
        /// </summary>
        /// <param name="numCount">サイコロの数</param>
        /// <param name="surfaceCount">サイコロの面数</param>
        /// <returns>各個の返り値</returns>
        public static int[] DiceRoll(int numCount, int surfaceCount)
        {
            var ret = new int[numCount];

            for (int i = 0; i < numCount; i++)
            {
                ret[i] = Dice(surfaceCount);
            }

            return ret;
        }

        /// <summary>
        /// サイコロ
        /// 数値は0~maxCount - 1なので、出てきた数値に + 1
        /// </summary>
        /// <param name="maxCount">最大数を渡す、D6なら6を</param>
        /// <returns>1~maxCount</returns>
        private static int Dice(int maxCount)
        {
            // シードを生成
            var rnd = new Random((int)GenerateRndNumber());

            var ret = rnd.Next(maxCount) + 1;

            return ret;
        }

        /// <summary>
        /// ランダム用のシード生成
        /// </summary>
        /// <returns></returns>
        private static UInt32 GenerateRndNumber()
        {
            // Generate a random number.
            var rnd = CryptographicBuffer.GenerateRandomNumber();

            return rnd;
        }

次に、籤による判定関数です。
この関数は、箱の中に当たりくじを入れて、その配列を返す関数にしています。
普通にダイス関数での判定でもいいではないかと思う方もいらっしゃると思いますが、これは当たり籤を判断させるための判定です。

どこかに入っている当たりくじを引くというのはダイスでは比率になり、ランダム性にかけます。

そこで、当たりくじの箱を作って、ダイスを振り、そこが当たりくじかどうかを判定することで、比率だけではない判定を行うために作製しました。

        /// <summary>
        /// 100の中に当たりくじをランダムで仕込む
        /// </summary>
        /// <param name="trueDataCount">あたりの数</param>
        /// <returns></returns>
        public static bool[] CreateHundredLottery(int trueDataCount)
        {
            if (trueDataCount > 100) return null;

            // falseで初期化
            bool[] bLotteryArray = Enumerable.Repeat<bool>(false, 100).ToArray();
            bool[] bAddArray = Enumerable.Repeat<bool>(true, trueDataCount).ToArray();

            bAddArray.CopyTo(bLotteryArray, 0);

            // 配列のランダム化
            var retArray = bLotteryArray.OrderBy(i => Guid.NewGuid()).ToArray();

            // 配列の中身を確認する
            // string stData = string.Join(Environment.NewLine, retArray);
            // Debug.WriteLine(stCsvData);

            return retArray;
        }

これらのコードはWindowsPhoneSilverlight8.1ベースですが、WinRTでもほぼそのまま使えるのではないかと思います。
書き換えるとしたらシード生成のところを書き換える形で、Windowsストアアプリでも使用は可能なはずです。

ViewBox下でManipulationを行う場合

Viewbox>Canvas>UIElement
画面サイズに左右されないように、上記のような構成で行っているの場合が多いと思います。
この時にManipulationを使用してUIElementを移動させる場合、ずれが出ます。
Viewboxがサイズだけでなく移動距離も変換しているためとみられます。

これを解決する方法としては、Viewboxの変換スケールを取得して、移動量をスケールで除算することで可能です。

private void ManipulationDelta(object sender, Windows.UI.Xaml.Input.ManipulationDeltaRoutedEventArgs e)
{
        var scaleX = Viewbox.ActualWidth / Viewbox.Child.DesiredSize.Width;
        var scaleY = Viewbox.ActualHeight / Viewbox.Child.DesiredSize.Height;

        double x = e.Delta.Translation.X;
        double y = e.Delta.Translation.Y;

        x = Canvas.GetLeft(obj) + (x / scaleX);
        y = Canvas.GetTop(obj) + (y / scaleY);
}

0除算チェックなどはしてないコードですが、こんなのでどうにかなります。

個人的には、移動までスケール変換されるのはどうなのかなとは思いますが、仕様ということならしょうがない(;´Д`)

でも、これはこれで修正されるとこのコード入れてるのがおかしくなるだろうから痛し痒し、がらっとバージョン変わった時でないと分離できないかなー

シンプルサッカー戦術ボード for WindowsPhone8.1 リリース

シンプルサッカー戦術ボード WindowsPhone8.1版をリリースしました。
これは先にリリースしていたWindows 8.1 ストアアプリ版をWindowsPhone8.1用に編集、再編したアプリです。

また、このアプリとWinストア版のアプリはuniversalアプリとして連携しています。

シンプルなサッカー戦術ボードアプリです
マグネットを移動出来ます。
また、マーカーで指示記入ができます。
ゴール前ボードに切り替えることが出来ます
Tweet 機能を搭載しています

試用版でも、機能制限は一切ありません。
気に入っていただけたら、ご購入下さい。

WPS_Download_cyan

*対応言語:日本語,English,português,español,italiano,русский,Deutsch,
français,简体中国,한국어

シンプルサッカー戦術ボード

*Simple soccer tactics board
*Simples Placa das táticas do futebol
*Simple tablero de tácticas de fútbol
*Simple tactique de football bord
*Semplice bordo tattiche di calcio
*Einfache Fußball Taktik Bord
*Простой тактики футбола доска
*심플 축구 전술 보드
*简单的足球战术板

Windopws Phone SilverLight 8.1 アプリをuniversal Appとして申請する場合のメモ

Windows8.1ストアアプリ側でInkManagerなどを使用したアプリを作成していた場合、WindopwsPhone SilverLight 8.1(以下WPSL8.1)で、アプリを作成しなければならなくなります。

このWPSL8.1アプリをユニバーサルアプリとして連携させる場合、ひと手間かかります。

sys000

上記のように同じソリューション内にWPSL8.1用のプロジェクトを作成するのが一般的だと思います。

作成はそのまま進めることで問題ないですが、そのままではアプリ登録時の検証でエラーが発生します。

sys001

WPSL8.1用の「Package.appxmanifest」をダブルクリックすると上記のように表示されるので、「パッケージ名」を登録済みWindowsストアアプリの「Package.appxmanifest」からコピーします。

次にWPSL8.1用「Package.appxmanifest」を右クリックし、「ファイルを開くアプリケーションを選択」>「ソースコード(テキスト)エディター」を選択して、XMLをテキストとして開きます。

sys002

「Identity」にある「Publisher=”CN=~”」をWindowsストアアプリの「Package.appxmanifest」、発行者に書かれている「CN=~」をコピーしてペーストします。

これらの書き換えはWindowsストアアプリが登録済みでなければできないので、WPSL8.1アプリを先行させている場合は、更新時に連携設定と書き換えを行う形になります。

WinRTベースのユニバーサルアプリを作成する場合は共有となり「Publisher=”CN=~”」の書き換えなどは必要ないので迷わず行えます。

今回はWPSL8.1アプリで説明しましたが、universal連携そのものはWP7.5/8アプリでも可能なようです。
おそらく同じような方法で連携設定を行うことになるのではないかと思いますが、自分は環境をWP8.1に移行していますので、検証できていないことをご了承ください。

de:code 2014 day2 #decode14

さてさて、二日目です。

・Kinect update 2014 ~テクノロジの進化~
 新Kinectの話題、いろいろできそうだなー
 新型はWindows8以降対応の予定、Core i7以上、DirectX11(GPU使っているため)、メモリ4GB以上など少々負荷が高め
 新型はサービス動作なので複数アプリから動作可能
 旧型は複数台可能、旧型+新型も可能、新型の複数台は未定

・WindowsPhone8.1アプリ開発徹底解説
 WinRTJSが投入された。
 APIは90%共有しているから、ほぼそのままWin8.1のコードが流用可能。
 WP8.1はSilverLight(以下SL)8.1を搭載しており、これまでのWP7のSL、XNA、WP8でのSL8.0、DirectX、WinRTのAPIが使用可能
 開発の際はSL8.1をベースにするとWinRTも使えるので、非常に強力な開発が可能。
 端末固有の機能はSL8.1でしかアクセスできないものがある(カメラなど)のでそういう意味でも、SL8.1をベースにするのが良いのではないか?
 バックグラウンド音楽再生機能などの一部機能がSL8.1では未実装だが、早いうちに更新されるのではないか?

・Internet of ThingsをWindowsプラットフォームで実践~センサークラウド、M2M、Big data、つないで、連携して、溜めて、活用~
 BTLE Gatt protocol等つなぐためのプロトコルにいろいろ対応
 今後マイクロソフトがIoT向けのサービス、エージェントを直接提供する
 6月にIoTイベント「Microsoft IoT Summit 2014」を開催
 「.Net Micro Framework」は「FEZ」というボードが対応している
 「FEZ」は「TINYCLR社」の商品で日本では「株式会社デバイスドライバーズ」が取り扱っている
 ※VS2012までの対応なので、現在のところはVS2013は非対応

・ユニバーサルWindowsアプリの画面設計~4インチから82インチまで~
 高DPI、画面の解像度、モニタのサイズが非常に幅広い
 30cm前の4インチと3メートル先の40インチは同じサイズに見える
 縦長への対応どうする?
 そして正方形の画面になる場合が存在するがどうする?
 横前提なら、縦長への対応をすっぱり割り切って横表示だけにする、横表示で狭いなら広げて使ってもらうように促す画面を表示する
 ゲームなどの場合メインの「表示/プレイエリア」を正方形で作ってしまい、周辺のUIをサイズに合わせて移動させるのもあり(例としてアナ雪のパズルアプリ)
 解像度ごとの対応はscaleで複数用意することができて自動的に変更してくれるが、一枚で済ませたいのなら、(必要なサイズの)400%サイズの画像を用意して配置する。

・de:code参加者に捧げる最新Microsoftデモ・プレゼンの極意
 短時間ではあったものの、スピーチテクニック、デモテクニックについて濃い内容でした
 自分もこうできるように訓練しよう
 西脇さんは本を出されているのでリンクを置いておきます。
 Kindle版もあるよ

二日間にわたって参加してきましたが、非常に濃い技術漬けの二日間でした。
ただ、どちらかといえば導入向けのセッションがDeviceセッションでは多かったかもしれません。

今後順次ビデオなどがMicrosoft Virtual Academy等で公開されるそうです

参加者の皆様、関係者の皆様、お疲れさまでした。

de:code 2014 day1 #decode14

日本マイクロソフトのデベロッパーイベント「de:code」に参加してきました。
早期割引でとは言え、自分には少々重い負担ではありましたが、非常に濃く、刺激を受けることができました。

・キーノート
 樋口泰行氏、伊藤かつら氏、MSエヴァンジェリストの皆様
 キーノートでは先にアメリカで開催されたBuildを元に日本での技術、開発者向けイベントを開催するにあたって、マイクロソフトの現在の方向性が「Mobile First、Cloud First」であることを再度訴えていました。

 今回、教材として東芝とインテルの協力で「dynabook TAB VT484/22K(8int WindowsTab)」を配布するので、ストアアプリの開発、普及に活用してくださいとのことでした。

 さて、自分が気になっていた事というかメインは日本での「WindowsPhone」の展開に関してですが、樋口氏からは「今日は何も発表ございません」とのことで、周辺からやはりかとがっかりした雰囲気が漂いました。

 しかしながら伊藤氏スピーチの際に、「各国からかき集めたWindowsPhone8端末を教材としてお渡ししますので体験してください」との発言の際は会場から驚きが上がりました。
 ただ、この端末は技適には通っていないので「通信機能をOFF」で使用するようにとの注意は付きました。
 一応とは付きますが日本での「WindowsPhone」展開に関しては含みを残した状態でキーノートは終わりました。

 もちろん、WindowsPhone以外にも、

 ・今後もde:codeを開催する
  TechEdからde:codeへ、毎年開催すると宣言されていました。

 ・Microsoftのフォーカス
  ・Mobile
  ・Cloud
  ・Usage(使ってもらってなんぼ)
  ・Engineer

IoT(MSとしてはIoYT=Internet of YOUR Things)
  すべての物がネットに接続される、MSとしては身近な物、使うものだから「YOUR」を追加

 ・Project Siena
  タブレットでタブレットアプリを作るためのツールということで、紹介されたプロジェクト
  グリッドアプリを配置と、Excelのような関数、Bindの簡易化などで、手軽にプリプロできる、簡単な物ならそのまま提供可能なアプリを制作可能

 等々、時間中に可能な限り二日間の内容を凝縮したようなキーノートでした。

 Channel 9に伊藤かつら氏の部分が公開されていました
 「de:code | Channel 9
 今後公開可能なセッションはさらに追加されていくことでしょう。

・Windowsアプリ開発、どこへ向かうのか。~Deviceトラックの歩き方~
 奥主洋氏
 今回「Deviceセッション」が非常に多く、どのような感じなのかを分類してチラ見せしつつこの講義はチェックということを解説されました。
 また、ストアアプリをお勧めはするけども、デスクトップアプリを切るわけではなく、共存進化させていく。
 ただ、タブレット等のタッチデバイスへの対応を考えるとストアアプリ化を進めていただいたほうが便利で楽に作れますとのこと。

・Xbox One apps~新世代エンターテイメントの提案~
 鵜木健栄氏
 日本での発売日が決まったXbox Oneに関するセッションでした……が、ごめんなさい都合により書けません。

・HTML/JavaScript/CSSとC++で作る、Windows、WindowsPhone、Xbox One アプリ
 WP8.1でWinRTの共用が図られた結果、HTML5+JSで両方のアプリが使えるようになった。
 ライブコーディングで、ほぼそのまま動作。
 ほぼというのは、読み込むJSが違うので、宣言をすることを忘れずにとのこと。

・WindowsPhone8.1プラットフォーム徹底解説
 WPアプリは現在25万アプリだそうです。
 非公開配布(URL知ってれば別として)機能はWPだけ

・デスクトップアプリケーションとWindowsストアアプリの連携ーアプリ間の連携技術ー
 非常にマニアックな内容ではあったんですが、なんだか懐かしいセッション内容
 言ってしまえば「プロセスフック(乗っ取り)」でアクセスする
 いやー懐かしい話だなーw
 もちろんこれはストアに提出してもはじかれるものではあるんですが、企業内アプリをタブレットなどのタッチデバイス化したい場合に有効ではないかなと思います。

・参加者パーティ
 DJやazure#というグループが歌ったりとなかなかに派手でした。

一日目はこんなセッションに参加していました。

“.AsStream”拡張

よく見失うのでメモがてら

「System.Runtime.InteropServices.WindowsRuntime」を「using」する。

一発でわかるってのは少ないような気がするんだが、引っかかってる人が見当たらないってことは、自分の勉強不足だね orz

忘れてなければどうということはないことではあるんだけどね