Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
4画面出力とレシート印刷で作る体験型デジタルサイネージ / Unity signage
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
KSK
September 26, 2018
Programming
3.2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
4画面出力とレシート印刷で作る体験型デジタルサイネージ / Unity signage
KSK
September 26, 2018
More Decks by KSK
See All by KSK
Supernova Studio 使いはじめてみたら割と良さそう / supernova_studio
ksk1030m
1
890
CSV出力 - Viewからやるか? 他からやるか? / How to output CSV
ksk1030m
1
660
実録リファラル採用-僕と副社長の1827日- / my referral
ksk1030m
0
1.2k
GitLabを仕事で使っていた私が思うことをつらつらと / about GitLab
ksk1030m
1
1.1k
エンジニア目線で考えるPR戦略 / PR by Engineer
ksk1030m
1
1.5k
Metabase ライブ環境構築 / metabase_live_coding
ksk1030m
0
360
昔の自分に伝えたい容量回復のためのDockerの仕組み / docker_tips
ksk1030m
1
580
Capistranoの罠と他人がハマった事例を見て思うこと / capistrano-trap
ksk1030m
0
350
ガチャを巡る闘い / War of Gacha
ksk1030m
0
130
Other Decks in Programming
See All in Programming
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
330
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
1.9k
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4k
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
150
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.9k
dRuby over BLE
makicamel
2
330
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
100
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
740
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
350
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
490
Featured
See All Featured
Building AI with AI
inesmontani
PRO
1
1.1k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
140
Marketing to machines
jonoalderson
1
5.4k
Scaling GitHub
holman
464
140k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
GraphQLとの向き合い方2022年版
quramy
50
15k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Amusing Abliteration
ianozsvald
1
200
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Transcript
4画面出力とレシート印刷で作る 体験型デジタルサイネージ @ksk1030 Gotanda.unity #8 / 2018.09.26
話します ・どんな物を作ったか ・機能の話ざっくり 話しません ・ハードウェア側の細かい設定の話
どんな物を作ったか?
None
作ったもの
作ったもの 北海道大学博物館内のサイネージ ・クイズゲームで色々学ぼう的な Windows10 上で動作 ・マルチディスプレイ(4画面) ・レシート印刷(施設内で使えるクーポン発行) ・Flicker API(インスタは審査落ちた...) ・csvファイルでのデータ更新
マルチディスプレイ ② ②’ ① ③ プロジェクタ x 3 + 手元のタッチパネル
真ん中とタッチパネルは同じ画面を表示 しているので、実質3つのカメラを用意
マルチディスプレイ using UnityEngine; public class MultiDisplayManager : SingletonMonoBehaviour<MultiDisplayManager> { void
Start() { int maxDisplayCount = 3; #if SINGLE_DISPLAY maxDisplayCount = 1; #endif for (int i = 0; i < maxDisplayCount && i < Display.displays.Length; i++) { Display.displays[i].Activate(); } } }
マルチディスプレイ using UnityEngine; public class MultiDisplayManager : SingletonMonoBehaviour<MultiDisplayManager> { void
Start() { int maxDisplayCount = 3; #if SINGLE_DISPLAY maxDisplayCount = 1; #endif for (int i = 0; i < maxDisplayCount && i < Display.displays.Length; i++) { Display.displays[i].Activate(); } } } Display.displays に接続中のディスプレイが 格納されている Length で取得した台数分 Activate() する (手元で確認するときに1画面出力できる よう環境変数 SINGLE_DISPLAY を用意) 公式:https://docs.unity3d.com/ja/current/Manual/MultiDisplay.html
実装はこれで良いのだが、やってみると... ディスプレイごとの設定でハマる ・リフレッシュレート ・アスペクト比 ・Unity上の Index と OS上の番号が一致しない - PCに物理的に接続した順で判定されている?
- https://gist.github.com/keijiro/a898b77fa06ee7c83cffc263419b32e3 - 詳細情報求ム... マルチディスプレイ
専用のプリンタを設置 クイズで一定以上のスコアを達成すると 博物館内のカフェで使えるクーポン発行 レシート印刷 EPSON TM-m10 https://www.epson.jp/products/receiptprinter/tmm10/
※レシートとは言っても通常の印刷と同じ レシート印刷 signage ┣━ Assets : ┣━ Plugins : ┣━ System.Drawing.dll :
①System.Drawing.dll を Plugins ディレクトリに設置 場所:C:\Windows\Microsoft.NET\Framework\ {バージョン} \System.Drawing.dll ②Other Settings の Api Compatibility Level を “.NET2.0” に
レシート印刷 void PrintExec() { PrintDocument printDocument = new PrintDocument(); //
オブジェクトの作成 printDocument.PrintPage += new PrintPageEventHandler(PrintPage); // イベントハンドラの追加 printDocument.Print(); // 印刷開始 } void PrintPage(object sender, PrintPageEventArgs eventPrintPage) { drawFont = new System.Drawing.Font("Arial", 10); // Arial フォントのサイズ10 drawBrush = new SolidBrush(System.Drawing.Color.Black); // 色は黒 drawFormat.Alignment = StringAlignment.Center; // センタリング string text = "印刷したい文字列"; eventPrintPage.Graphics.DrawString(text, drawFont, drawBrush, drawRect, drawFormat); Image image = Image.FromFile("画像のパス"); eventPrintPage.Graphics.DrawImage(image, new Rectangle(offsetX, offsetY, width, height)); image.Dispose(); //後始末 eventPrintPage.HasMorePages = false; //次のページがないことを通知する }
レシート印刷 void PrintExec() { PrintDocument printDocument = new PrintDocument(); //
オブジェクトの作成 printDocument.PrintPage += new PrintPageEventHandler(PrintPage); // イベントハンドラの追加 printDocument.Print(); // 印刷開始 } void PrintPage(object sender, PrintPageEventArgs eventPrintPage) { drawFont = new System.Drawing.Font("Arial", 10); // Arial フォントのサイズ10 drawBrush = new SolidBrush(System.Drawing.Color.Black); // 色は黒 drawFormat.Alignment = StringAlignment.Center; // センタリング string text = "印刷したい文字列"; eventPrintPage.Graphics.DrawString(text, drawFont, drawBrush, drawRect, drawFormat); Image image = Image.FromFile("画像のパス"); eventPrintPage.Graphics.DrawImage(image, new Rectangle(offsetX, offsetY, width, height)); image.Dispose(); //後始末 eventPrintPage.HasMorePages = false; //次のページがないことを通知する } メインの処理 PrintDocument のオブジェクトを作成して PrintPage イベントハンドラを追加してやる (この辺は .NET の領域)
レシート印刷 void PrintExec() { PrintDocument printDocument = new PrintDocument(); //
オブジェクトの作成 printDocument.PrintPage += new PrintPageEventHandler(PrintPage); // イベントハンドラの追加 printDocument.Print(); // 印刷開始 } void PrintPage(object sender, PrintPageEventArgs eventPrintPage) { drawFont = new System.Drawing.Font("Arial", 10); // Arial フォントのサイズ10 drawBrush = new SolidBrush(System.Drawing.Color.Black); // 色は黒 drawFormat.Alignment = StringAlignment.Center; // センタリング string text = "印刷したい文字列"; eventPrintPage.Graphics.DrawString(text, drawFont, drawBrush, drawRect, drawFormat); Image image = Image.FromFile("画像のパス"); eventPrintPage.Graphics.DrawImage(image, new Rectangle(offsetX, offsetY, width, height)); image.Dispose(); //後始末 eventPrintPage.HasMorePages = false; //次のページがないことを通知する } DrawString に文字列を渡すと印刷できる フォントや色、レイアウトもオプションで 渡せば細かく指定することが可能
レシート印刷 void PrintExec() { PrintDocument printDocument = new PrintDocument(); //
オブジェクトの作成 printDocument.PrintPage += new PrintPageEventHandler(PrintPage); // イベントハンドラの追加 printDocument.Print(); // 印刷開始 } void PrintPage(object sender, PrintPageEventArgs eventPrintPage) { drawFont = new System.Drawing.Font("Arial", 10); // Arial フォントのサイズ10 drawBrush = new SolidBrush(System.Drawing.Color.Black); // 色は黒 drawFormat.Alignment = StringAlignment.Center; // センタリング string text = "印刷したい文字列"; eventPrintPage.Graphics.DrawString(text, drawFont, drawBrush, drawRect, drawFormat); Image image = Image.FromFile("画像のパス"); eventPrintPage.Graphics.DrawImage(image, new Rectangle(offsetX, offsetY, width, height)); image.Dispose(); //後始末 eventPrintPage.HasMorePages = false; //次のページがないことを通知する } DrawImage に画像と表示領域を Rectangle で渡してやると画像も印刷できる
レシートもこれで印刷できるが、これもやってみると... やはりハマる ・System.Drawing.dll なんて知らんかった ・Api Compatibility Level の設定も知らんぞ ・画像とテキストで細かく offset
を指定する必要あり ・別途プリンタのドライバの設定が必要 ・情報が出てこない(→最近は結構情報がある) - https://qiita.com/koukiwf/items/e91067e95c2a64af54d6 - http://madgenius.hateblo.jp/entry/2018/01/30/172740 レシート印刷
その他にも 色々ハマる ・そもそも端末/OS側を色々いじる必要 →3画面出力できるようグラボ取り付け →自動起動/終了のためにタスクスケジューラとか BIOS の設定 ・インスタAPI使いたい →ご当地写真を表示するんだ!審査が必要か! →英文の説明入り動画まで作ったのにリジェクト
→Flicker API で妥協してやった に救われる ・Windows10 だとエッジスワイプで通知が出る →物理的にスワイプできないようフレームをつける
こんだけ色々出てくる → Unityが何でもできるからこそ! ゲームや今回のサイネージ以外でも ・UIの自由度 ・インタラクティブな機能 を活かせるフィールドなら応用できる! 最近だと xR(VR /
AR)なんかが好例 それでも...
Unity盛り上げていきましょう! (そしてマルチディスプレイの順番の詳細を教えてください...)
中谷 圭佑 (@ksk1030) 任天堂株式会社(2011/04〜2013/12) ・人事 株式会社ORSO(2014/01〜) ・エンジニア(Node.js / Ruby がメイン)
・経営企画 ◆Speaker Deck ・https://speakerdeck.com/ksk1030m 自己紹介
We are hiring! ARコンテンツとかも作ってます!
Thank you for listening !!