Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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.3k
Godot Engine完全に理解したかった
ueshita
1
680
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
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
200
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
420
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
310
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
3.1k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
120
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
460
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
320
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
140
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
290
Are APIs Still Relevant in the AI Era?
soyuka
0
390
The Rails Doctrine Decade
koic
2
440
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
How GitHub (no longer) Works
holman
316
150k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
710
How to build a perfect <img>
jonoalderson
1
6.1k
Writing Fast Ruby
sferik
630
63k
It's Worth the Effort
3n
188
29k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
560
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
710
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
350
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
510
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
860
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