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
Unityで3Dツールを作って開発を加速する
Search
ueshita
September 03, 2017
Programming
3.7k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Unityで3Dツールを作って開発を加速する
Unity LT大会 2017 で発表
ueshita
September 03, 2017
More Decks by ueshita
See All by ueshita
こわくない!! たのしい!! GDExtension
ueshita
0
2.2k
Godot Engine完全に理解したかった
ueshita
1
660
UnmanagedThreadノススメ
ueshita
2
8.4k
EmscriptenのOpenGLと純粋なWebGLと共存させる黒魔術
ueshita
1
5.1k
asm.js 減量やってみた
ueshita
0
1k
Other Decks in Programming
See All in Programming
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
140
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
2
260
Oxcを導入して開発体験が向上した話
yug1224
4
330
ふつうのFeature Flag実践入門
irof
8
4.1k
Contextとはなにか
chiroruxx
1
360
Claspは野良GASの夢をみるか
takter00
0
210
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
220
Oxlintのカスタムルールの現況
syumai
6
1.1k
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
560
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.3k
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
260
A2UI という光を覗いてみる
satohjohn
1
150
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
320
Marketing to machines
jonoalderson
1
5.5k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
600
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
610
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
490
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
Designing for humans not robots
tammielis
254
26k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Transcript
Unityで3Dツールを作って 開発を加速する Unity LT大会 2017 うえした (@ueshita)
同人ゲームを作っています こんな感じのSRPG
このゲーム Unity製ではないです。 OpenGLを直叩き!オレオレエンジン!俺がねねっちだ!
SRPGにはマップエディタが必要 うちは極小規模サークルのため、 マップの地形を3Dモデリングで作るとか、デザイナーパワーで殴ることができない 前作はExcelでマップを作成(つらい) デザイン&企画の人「今作は立体交差とかできるといいよね^^」
3Dのグラフィカルなツールを作る サクッとUnityで作ろう! 誰でも3Dマップが作れるようにする Unityが無くてもいいようにビルドする。
作ったマップエディタ マインクラフト風に ブロックを積み上げ るマップエディタ コピペ、アンドゥ機能 OBJ形式でエクス ポート可能
Unityが3Dツール開発に向いている理由 プログラム言語がC# ・ 実行速度はあまり気にせずガンガン書ける 3D機能がバリバリ使い放題 ・ シェーダ書けるし、アニメーションも付けられる マルチプラットフォーム ・ WinでもMacでも動くツール!
ツール開発で絶対に必要なもの アンドゥ、リドゥ機能 コピー&ペースト ファイルを開く、保存ダイアログ
アンドゥ、リドゥ機能 絶対必要。 でも作るのは結構大変。 開発初期からアンドゥ、リドゥを前提に作る必要がある。
アンドゥ機能を作る class Command { public delegate void Method(); public Method
Do {get; private set;} public Method Undo {get; private set;} public Command(Method doMethod, Method undoMethod) { this.Do = doMethod; this.Undo = undoMethod; } } 全ての操作をコマンド化 操作するたびにCommandをnewして ListにAddする。 実行するときは Do(); 元に戻す(アンドゥ)ときは Undo(); やり直す(リドゥ)するときは Do();
コマンド実装例①:ブロックを追加する public void AddBlock(Vector3 position, BlockDirection dir) { EditLayer layer
= this.CurrentLayer; Block block = new Block(position, dir); this.AddCommand(new Command( () => { // Do layer.AddBlock(block); }, () => { // Undo layer.RemoveBlock(block); })); } 現在のレイヤーに ブロックを作成して追加する 操作コマンドを作成 ・最初の引数がDo() ・次の引数がUndo() “実行”と”戻す”ときに必要な 変数はラムダ式にキャプチャされる
コマンド実装例②:ブロックを移動する public void MoveBlock(Block block, Vector3 moveOffset) { EditLayer layer
= this.CurrentLayer; Block removedBlock; this.AddCommand(new Command( () => { // Do layer.RemoveBlock(block); // レイヤーから一旦削除 block.position += moveOffset; // ブロックの位置を移動する removedBlock = layer.AddBlock(block); // 移動したブロックを追加。上書きしたブロックを保持しておく }, () => { // Undo layer.RemoveBlock(block); // レイヤーから一旦削除 block.position -= moveOffset; // ブロックの位置を戻す layer.AddBlock(block); // ブロックを戻す layer.AddBlock(removedBlock); // 上書きしたブロックを戻す })); }
C#のラムダ式は超便利 操作コマンドごとにクラスを作る必要がない 保持するべきデータはローカル変数に保存 ラムダ式で参照すると勝手にキャプチャされる データが不要になったらGCが解放してくれる
コピー&ペースト機能を作る EditorGUtility.systemCopyBufferを使う? → × UnityEditor名前空間なので、実行時に使えない! Windows.FormsのClipboardを使う? → Unityからは”通常”使えない System.Windows.Forms.dll を
Plugins/ に置けば使える!\(^o^)/ 場所: C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\4.5-api\
ファイルを開くダイアログを呼び出す System.Windows.Forms.dll を置いておくと、 各種コモンダイアログも使えるようになる。 - ファイルを開く: OpenFIleDialog - 名前を付けて保存: SaveFileDialog
ツールでは必須の機能
ダイアログのデザインがちがくね? System.Windows.Forms.dllが Windowsネイティブ実装ではなく、Mono実装なのが原因。 Windowsユーザー的にはデザインが違うので、ちょっと使いにくいかも?
Windowsネイティブなダイアログを呼び出す Win32APIを C# から 叩く [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar
= true, CharSet = CharSet.Auto)] public static extern bool GetOpenFileName([In, Out] OpenFileName ofn); Windowsネイティブな ダイアログが使えるように →
ツールを作った結果 自分以外の人でもマップが作れるようになった! Githubに置いてあります。 https://github.com/ueshita/TsumikiEditor