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
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
typoなんかねぇよ
raspython3
0
680
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
150
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
230
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
590
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
180
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.2k
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
7
3.6k
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
890
Odyssey Design
rkendrick25
PRO
2
800
Building Applications with DynamoDB
mza
96
7.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
A Modern Web Designer's Workflow
chriscoyier
699
190k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
How to make the Groovebox
asonas
2
2.4k
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