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
670
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
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.8k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
270
Flow は今どうなっているか
mizdra
PRO
0
660
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
220
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
200
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
1.1k
バグを直したら useEffect が消えた
colorful12
3
660
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
280
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
250
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
710
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
400
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
270
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
KATA
mclloyd
PRO
35
15k
The browser strikes back
jonoalderson
0
1.5k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
390
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
500
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
270
Code Reviewing Like a Champion
maltzj
528
40k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
How GitHub (no longer) Works
holman
316
150k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
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