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
スマホゲームを作ったよ
Search
いも
November 19, 2016
Programming
3
2.5k
スマホゲームを作ったよ
初めてリリースしたiOSアプリの紹介と、マルチシーンエディットの活用事例です
いも
November 19, 2016
Tweet
Share
More Decks by いも
See All by いも
UnityプログラミングバイブルR6号宣伝&Unity Logging小話
adarapata
0
450
Unityテスト活動のふりかえり
adarapata
1
530
Gather.townはいいぞ その後
adarapata
1
1.5k
Unityでの開発事例
adarapata
3
22k
どこのご家庭にもあるシーンマネージャーの話
adarapata
1
7.7k
Gather.townはいいぞ
adarapata
2
2.3k
宴はいいぞ
adarapata
0
1.4k
わかった気になるモブプログラミング
adarapata
1
99
モブワークっぽいのをやっている話/Trying mobwork
adarapata
2
1.2k
Other Decks in Programming
See All in Programming
CDKを使ったPagerDuty連携インフラのテンプレート化
shibuya_shogo
0
120
新宿駅構内を三人称視点で探索してみる
satoshi7190
2
120
Visual StudioのGitHub Copilotでいろいろやってみる
tomokusaba
1
210
はじめての Go * WASM * OCR
sgash708
1
120
Amazon Bedrockマルチエージェントコラボレーションを諦めてLangGraphに入門してみた
akihisaikeda
1
150
Honoをフロントエンドで使う 3つのやり方
yusukebe
7
3.6k
Go 1.24でジェネリックになった型エイリアスの紹介
syumai
2
300
JAWS Days 2025のインフラ
komakichi
1
130
技術を改善し続ける
gumioji
0
180
Datadog DBMでなにができる? JDDUG Meetup#7
nealle
0
160
Boos Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
550
推しメソッドsource_locationのしくみを探る - はじめてRubyのコードを読んでみた
nobu09
2
350
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
Code Review Best Practice
trishagee
67
18k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.2k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
The Invisible Side of Design
smashingmag
299
50k
For a Future-Friendly Web
brad_frost
176
9.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Fireside Chat
paigeccino
35
3.2k
Transcript
ϚϧνγʔϯΤσΟοτ͍͍ͧ Ҫຊେొ(.01&1"#0JOD 6OJUZ'VLVPLB εϚϗήʔϜΛ࡞ͬͨΑ
ΤϯδχΞ Ҫຊେొ !BEBSBQBUB ϩϦϙοϓάϧʔϓ8&#։ൃνʔϜ
ࠓͷ͓ wJ04͚ήʔϜʮϦϏϯάσΠϒʯͷհ wϚϧνγʔϯͷ׆༻ࣄྫ
ϦϏϯάσΠϒ
ϦϏϯάσΠϒ wσΠϒΛૢ࡞ͯ͠ձ͔ࣾΒୀۈ͢ΔΞΫγϣϯήʔϜ wୀۈ͢ΔͨΊʹࡾͭͷΩʔΞΠςϜΛೖख͍ͯ͘͠ wΩʔΞΠςϜΛೖखͯ͠ग़ޱʹ͔͑ΫϦΞʔ wࣾһʹั·Δͱઆಘ ߈ܸ ͞ΕͯμϝʔδΛड͚Δ wϓϨΠ͢Δͨͼʹ෦ͷߏ͕มԽ͢Δ wϓϨΠͷํʹΑ༷ͬͯʑͳশ߸ΛऔಘͰ͖ɺୀۈྗ$ʙ4ͰධՁ͞ΕΔ w࣮ࡏ͢Δاۀͱͷؔ࿈Ұ͋Γ·ͤΜ
σΠϒͷཪଆ w6OJUZ wϓϩάϥϚ̍ਓɺσβΠφ̍ਓɺҰϲ݄΄Ͳ w%Ϟσϧશͯ4ZOUZ4UVEJPTͷΞηοτΛར༻ wεΫϦϓτܥΞηοτ6OJ3Yͱ"SCPSΛ༻ wϒϥϯͬΆ͍දݱͷ͙ͨ͢͞ΜͷϒϩάهࣄΛࢀߟʹͨ͠
Ξηοτհ
6OJ3Y wIUUQTXXXBTTFUTUPSFVOJUZEDPNKQDPOUFOU w3FBDUJWF&YUFOTJPOTΛ6OJUZͰ࣮Ͱ͖ΔΑ͏ʹͳΔϥΠϒϥϦ wͱΓ͢ʔ͞ΜͷεϥΠυΛݟΑ͏ʂ wϦϏϯάσΠϒׂ̔6OJ3YͰॻ͍ͯΔ
"SCPS wIUUQDBJUTJUIXBSFDPNXPSEQSFTT wέοτγʔΣΞ͞Μ࡞ͷΞηοτ wεςʔτϚγϯΛ؆୯ʹ࡞Ͱ͖ΔΤσΟλ֦ு w൚༻తͳػೳඪ४Ͱἧ͍ͬͯΔ ࣗ࡞εΫϦϓτͷՃ͕؆୯ w
࣮ࡍͷਧ͖ग़͠߈ܸͷ࣮
Ϛϧνγʔϯͷ׆༻ࣄྫ 1.
୯ମγʔϯͰઃܭ͢Δ߹ Ұྫ wૉʹγʔϯΛ-PBE͢Δɻ̍γʔϯʹෳͷ1SFGBC͕͋Δ wήʔϜͷγεςϜͷΦϒδΣΫτ 1(͕Α͘৮Δ wഎܠɺϑΟʔϧυͳͲͷΦϒδΣΫτ σβΠφ͕Α͘৮Δ wγʔϯΛ͓ޓ͍ʹ৮Δͱਏ͍ͷͰɺखݩͰ࡞ͬͨͷΛ1SFGBCԽ
w1SFGBCΛγʔϯʹೖΕ࣮ͯྃʂ େݩͷγʔϯʹɺΈΜͳ͕࡞ͬͨ1SFGBC͕Ճ͞Ε͍ͯ͘Πϝʔδ
͜ΕΛϚϧνγʔϯͰସͰ͖ͳ͍͔ʁ
Ϛϧνγʔϯͷ׆༻ࣄྫJOϦϏϯάσΠϒ w(6*ͰͷϚϧνγʔϯΤσΟοτͷ׆༻ wεΫϦϓτͰͷ4DFOF.BOBHFSͷ׆༻
Ϛϧνγʔϯͷ׆༻ࣄྫJOϦϏϯάσΠϒ w(6*ͰͷϚϧνγʔϯΤσΟοτͷ׆༻ wεΫϦϓτͰͷ4DFOF.BOBHFSͷ׆༻
෦ΛͲ͏࡞Δʁ Ұͭͷ෦ʹೖͬͯΔΦϒδΣΫτ w κϯϏ w นɾҜࢠͳͲݐͷใ w ϥΠτɺΧϝϥͳͲͷใ ͜ΕΒΛͲ͏ཧ͢Δʁ ·ͱΊͯ1SFGBCԽ͢Δͱ͍͏ख͋Δ͚Ͳɾɾ
ڊେͳ1SFGBCѻ͍ʹ͍͘ wࢠͷΦϒδΣΫτͷมߋΛͮ͠Β͍ wκϯϏͷҐஔมߋසൟʹى͜Γ͏Δมߋ wγʔϯʹ࣋ͬͯߦͬͯ࿔ͬͯߋ৽ɾɾͱ͍͏खؒ wͦͷͨΊͷTBOECPYతγʔϯͷ༻ҙ w*OTUBOUJBUFͰগ͠ࢭ·ΔՄೳੑ 3FTPVSDFT-PBE"TZODͱ͍͏ํ๏͋Δ wϨϕϧσβΠϯ࣌ʹ༏͘͠ͳ͍ཧํ๏ʹͳΔ
γʔϯϑΝΠϧͰཧͨ͠ํ͕ײతͰʁ
ϚϧνγʔϯΤσΟςΟϯάΛ͏
ϚϧνγʔϯΤσΟοτػೳ w͔Βೖͬͨػೳ wෳͷγʔϯΛಉ࣌ʹฤूͰ͖Δ wಈతʹγʔϯ୯ҐͰͷՃɾআ͕Մೳ wׂͰγʔϯΛׂ͢Δ͜ͱͰɺͭΒ͍ίϯϑϦΫτΛ͛Δ
εΫϦϓτͰͷγʔϯͷॏͶํ SceneManager.LoadScene(sceneName, LoadSceneMode.Additive); SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); ඇಉظͰಡΈࠐΊΔɻ ಡΈࠐΈྃɺআྃͷίʔϧόοΫ͋Δ SceneManager.sceneLoaded += (scene,
mode) => {}; SceneManager.sceneUnLoaded += (scene) => {};
ϦϏϯάσΠϒͷϝΠϯ෦̏ͭͷγʔϯΛॏͶ͍ͯΔ .BJO(BNF )VNBO$POUSPM6* 3PPN
3PPNγʔϯ w ෦Λߏ͢Δγʔϯ w γʔϯԼʹࢄΒ͔ͣ͞3PPUΛڬΉ w ݐɺκϯϏɺΧϝϥFUD w ෦ΛҠಈ͢Δʹಈతʹੜɺഁ غ͞ΕΔ
w ͜͜ʹσΠϒͷใҰͳ͍
)VNBO$POUSPM6*γʔϯ w ϓϨΠϠʔ σΠϒ ͕͍Δ w Ծίϯτϩʔϥ͜͜ w ୯ମͰಈ͔ͤΔ w
3PPNͱ͜ͷγʔϯΛॏͶΔͱɺ෦ ୯ҐͰಈ࡞֬ೝͰ͖Δ w γʔϯՃ͚ͩͳͷͰσβΠφ୯ମ Ͱ࡞ۀ͍͢͠
.BJO(BNFγʔϯ w ࣮ࡍͷήʔϜϑϩʔΛཧ͢Δ w ήʔϜͷΠϕϯτਐߦཧ w ෦ͷಈతಡΈࠐΈɺΓସ͑ w #(.͜͜ w
.BJO(BNF͕࠷ॳʹಡΈࠐ·Εɺॳ ظԽॲཧͰ)VNBO$POUSPM6*ɺ3PPN ΛՃ͍ͯ͘͠ ը૾͕ͳ͍ͨΊՄѪ͍ೣΛ͓ૹΓ͍ͯ͠·͢
ׂͬͯΈͯͷॴײ w࡞ͬͨγʔϯΛͦͷ··͑ΔͷͰײతʹ࿔Γ͍͢ wσβΠφ͕ಈ͖͍͢ɺۀ͕ḿΔ wಈ࡞֬ೝ࣌ʹεΫϦϓτΛ͍͡ΔͷΊͯγʔϯՃ͚ͩͳͷָ͕ wڊେͳ1SFGBCΛ࡞Δ͘Β͍ͳΒ4DFOFʹͯ͠͠·ͬͨํ͕ѻ͍ͦ͢͏ wͨͩɺ(6*ͩͱγʔϯؒͰΦϒδΣΫτͷࢀরͰ͖ͳ͍ͷҙ
Ϛϧνγʔϯͷ׆༻ࣄྫJOϦϏϯάσΠϒ w(6*ͰͷϚϧνγʔϯΤσΟοτͷ׆༻ wεΫϦϓτͰͷ4DFOF.BOBHFSͷ׆༻
ϦϏϯάσΠϒ wσΠϒΛૢ࡞ͯ͠ձ͔ࣾΒୀۈ͢ΔΞΫγϣϯήʔϜ wୀۈ͢ΔͨΊʹࡾͭͷΩʔΞΠςϜΛೖख͍ͯ͘͠ wΩʔΞΠςϜΛೖखͯ͠ग़ޱʹ͔͑ΫϦΞʔ wࣾһʹั·Δͱઆಘ ߈ܸ ͞ΕͯμϝʔδΛड͚Δ wϓϨΠ͢Δͨͼʹ෦ͷߏ͕มԽ͢Δ wϓϨΠͷํʹΑ༷ͬͯʑͳশ߸ΛऔಘͰ͖ɺୀۈྗ$ʙ4ͰධՁ͞ΕΔ w࣮ࡏ͢Δاۀͱͷؔ࿈Ұ͋Γ·ͤΜ
෦ͷࣗಈੜ
ࣗಈੜͷͬ͘͟Γͱ༷ͨ͠ w෦ 4DFOF ͕ҙͷ͚ͩϥϯμϜʹબΕΔ w෦ಉ࢜ɺຖճϥϯμϜʹυΞͰܨ͕͍ͬͯΔ wυΞΛௐΔͱɺผͷ෦ʹΓସΘΔ wඞͣશ෦ͷ෦ʹೖΕΔΑ͏ʹɺ͍͍ײ͡ʹܨ͕͍ͬͯΔ ༻͢Δ෦ͷબ ෦ͷΓସ͑ ࠓճҎԼͷೋʹ͍ͭͯ͢
༻͢Δ෦ͷબ #"% wͱΓ͋͑ͣ෦γʔϯΛҙͷϥϯμϜʹϩʔυͯ͠Έͨ wϋʔυϞʔυͩͱ෦͘Β͍ϩʔυ͞ΕΔ w࣮ػ͕ͩΜͩΜͱԹ͔͘ͳΔ wJ1IPOFͰGQTͱ͍͏είΞΛୟ͖ग़͢ େྔͷγʔϯΛಡΈࠐΉͷݱ࣮తͰͳ͍ͷͰɺ γʔϯΛಡ·ͣʹ෦Λબ͢Δඞཁ͕͋Δ
෦ใͷΓग़͠ 3PPN1SPQFSUZ w෦ͷใΛ4DSJQUBCMF0CKFDUʹ͢Δɻ w෦໊ɺ෦ͷछྨɺυΞͷɺΞΠςϜͳͲ wϑΝΠϧ໊γʔϯ໊ w3FTPVSDFT-PBE"MMͰ·ͱΊͯऔΕΔ w͋ͱϥϯμϜʹબྑ͍ var properties =
Resources.LoadAll<RoomProperty>("Rooms").ToList();
͋Δఔϧʔϧ͚ͨϥϯμϜ wશͳϥϯμϜσβΠϯ͕ݫ͍͠ w෦ʹଐੑΛ͚ͭΔ wඞਢͳ෦ɺඞਢͰͳ͍෦ w)VC &WFOUҎ֎̍ݸ͚ͩඞਢ w)VC̍ݸҎ্ w&WFOǓݸҎ্ public enum
RoomType { Start, // ։࢝ Locker, // ϩοΧʔϧʔϜ Timecard, // λΠϜΧʔυ෦ President, // ࣾࣨ Exit, // ඇৗޱ Goal, // ΰʔϧ Hub, // ଓ෦ (υΞ3ʙ4ͭ) Event // Πϕϯτ෦ }
༻͢Δ෦ͷબ ؆ུԽͨ͠ͷ private List<RoomProperty> BuildRoomsProperties(int count) { // ෦ͷScriptableObjectΛશ෦औΔ var
properties = Resources.LoadAll<RoomProperty>("Rooms").ToList(); // ඞཁͳ෦ଐੑΛఆٛ RoomType[] requiredRoomType = { RoomType.Start, RoomType.Locker, RoomType.Timecard, RoomType.President, RoomType.Exit, RoomType.Goal }; // ༨ΓHubଐੑͰຒΊΔ List<RoomType> hubs = Enumerable.Repeat(RoomType.Hub, count - requiredRoomType.Length).ToList(); // Α͠ͳʹϥϯμϜʹऔΓग़ͯ͠ฦ͢ return hubs.AddRange(requiredRoomType.ToList()) .Select(t => GetRandomRoomProperty(properties, t)) .ToList(); }
෦ͷΓସ͑ɺͷલʹ෦ͷใΛ࣋ͭΫϥε w3PPN1SPQFSUZͰ෦ใఆٛͰ͖ͨ wࠓɺήʔϜಈ࡞தͷใ͕ඞཁʹͳΔ wͲ͜ͱܨ͕͍ͬͯΔʁͲͷΞΠςϜΛௐΒΕͨʁͳͲ w3PPN1SPQFSUZΛϕʔεʹΠϯελϯεΛ࡞ΔΠϝʔδ
෦ͱυΞͷΫϥεఆٛ #"% public class RoomBehaviour : MonoBehaviour { // ෦ใ
public RoomProperty roomProperty; // ෦ʹ͋ΔυΞୡ public List<DoorBehaviour> doors; } public class DoorBehaviour : MonoBehaviour { // ܨ͕͍ͬͯΔυΞ public DoorBehaviour target; }
෦ͱυΞͷΫϥεఆٛ #"% w(BNF0CKFDUʹଓใΛ࣋ͨͤΔͱ·͍ͣ w෦γʔϯϑΝΠϧͰɺසൟʹআ͞ΕΔ wγʔϯআ࣌ʹଓใ͝ͱফ͞ΕΔ wΞΠςϜใγʔϯ࠶ಡΈࠐΈ࣌ʹݩ௨Γ ଓใ(BNF0CKFDUʹґଘ͍͚ͯ͠ͳ͍ɻ σʔλͱ(BNF0CKFDUΛΓ͢ඞཁ͕͋Δ
σʔλΫϥεͱ#FIBWJPVSʹ͚Δ public class Room { private RoomProperty roomProperty; public List<Door>
doors; public List<Item> items; } public class Door { private Room parentRoom; public Door target; }
σʔλΫϥεͱ#FIBWJPVSʹ͚Δ public class RoomBehaviour : MonoBehaviour { public Room roomData;
public List<DoorBehaviour> doors; public List<ItemBoxBehaviour> itemBoxes; } public class DoorBehaviour : MonoBehaviour { public Door doorData; }
σʔλΫϥεͱ#FIBWJPVSʹ͚Δ w3PPN෦ͷݱࡏͷঢ়گ υΞɺΞΠςϜ Λ࣋ͭ w%PPSଓઌͷ%PPSΛ࣋ͭ wγʔϯ্ʹ3PPN#FIBWJPVS͕ҰͭɺυΞͦΕͧΕ%PPS#FIBWJPVSΛ࣋ͭ w͜ΕΒΒͬͨใΛجʹҠಈॲཧΞΠςϜऔಘॲཧΛߦ͏͚ͩ w෦ΛಡΈࠐΉλΠϛϯάͰ#FIBWJPVSʹσʔλΛͯ͋͛͠Δ
γʔϯΛϩʔυ͢Δʹݱࡏͷ෦ใΛ͢ .BJO(BNF )VNBO$POUSPM6* 3PPN 3PPN#FIBWJPVS 3PPN %PPS#FIBWJPVS %PPS#FIBWJPVS
෦ͷΓସ͑ wͬ͘͟Γͱࡾͭͷॲཧ͕Δ ৽͍͠෦ͷಡΈࠐΈ ෦ใͷηοτΞοϓ ݹ͍෦ͷআ
Γସ͑ॲཧ ؆ུԽ public void MoveRoom(Door door) { var target =
door.target; SceneManager.sceneLoaded += (scene, mode) => { var root = scene.GetRootGameObjects().First() .GetComponent<RoomBehaviour>(); root.SetupRoomData(target.room); SceneManager.UnloadScene(door.room.name); }; SceneManager.LoadSceneAsync(target.room.name, LoadSceneMode.Additive); }
Γସ͑ॲཧ ؆ུԽ public void MoveRoom(Door door) { var target =
door.target; SceneManager.sceneLoaded += (scene, mode) => { var root = scene.GetRootGameObjects().First() .GetComponent<RoomBehaviour>(); root.SetupRoomData(target.room); SceneManager.UnloadScene(door.room.name); }; SceneManager.LoadSceneAsync(target.room.name, LoadSceneMode.Additive); } ৽͍͠෦ΛಡΈࠐΉ
Γସ͑ॲཧ ؆ུԽ public void MoveRoom(Door door) { var target =
door.target; SceneManager.sceneLoaded += (scene, mode) => { var root = scene.GetRootGameObjects().First() .GetComponent<RoomBehaviour>(); root.SetupRoomData(target.room); SceneManager.UnloadScene(door.room.name); }; SceneManager.LoadSceneAsync(target.room.name, LoadSceneMode.Additive); } ෦ʹݱࡏͷใΛ༩͑Δ
Γସ͑ॲཧ ؆ུԽ public void MoveRoom(Door door) { var target =
door.target; SceneManager.sceneLoaded += (scene, mode) => { var root = scene.GetRootGameObjects().First() .GetComponent<RoomBehaviour>(); root.SetupRoomData(target.room); SceneManager.UnloadScene(door.room.name); }; SceneManager.LoadSceneAsync(target.room.name, LoadSceneMode.Additive); } ݹ͍෦ͷআ
γʔϯͷΓସ͑ wϩʔυͨ͠γʔϯͷத͔Βҙͷ$PNQPOFOUΛऔΔͷ͕໘ w4DFOF(FU3PPU(BNF0CKFDUTͰώΤϥϧΩʔԼͷ(BNF0CKFDUऔΕΔ wSPPUΦϒδΣΫτ࡞ͬͯͦ͜ʹཧεΫϦϓτஔ͘ͷָ͕ͦ͏ wσΠϒSPPUʹ3PPN#FIBWJPVSΛ͚ͭͯɺ͔ͦ͜Β෦ͱΓऔΓ͢Δ
-PBE4DFOF"TZODͷҙ wίʔϧόοΫ͕ݺΕΔλΠϛϯάɺγʔϯͷಡΈࠐΈ͕ྃͨ࣌͠ wTDFOFͷΦϒδΣΫτ͕ॳظԽ͞Ε͍ͯΔอূͳ͍ w4UBSUʹॳظԽॲཧॻ͍ͯͨΒҙ wϑϨʔϜͬͯॲཧ͢Δͱ࣮֬ wFWFOUͷߪಡղআΕͳ͍Α͏ʹͶʂ
6OJ3Yͩͱ৭ʑָ public void MoveRoom(Door door) { var target = door.target;
// ଓઌͷυΞ͕͋ΔγʔϯΛϩʔυ SceneManager.LoadSceneAsync(target.room.name, LoadSceneMode.Additive) .AsObservable() .Select(__ => SceneManager.GetSceneByName(target.room.name)) .DelayFrame(1) .Subscribe(scene => { // ηοτΞοϓӠʑ }); }
εΫϦϓτॻ͍ͯͷॴײ wಛผࡶʹͳΔ͜ͱͳ͔ͬͨ wඇಉظͰॲཧ͍͚ͯ͠Δͷخ͍͠ wମײతʹɺ1SFGBCΛJOTUBOUJBUF͢ΔΑΓएׯ͍ʁ wγʔϯؒͷܨ͗͜Έॲཧ͕ඞਢʹͳͬͯ͘Δ
ϚϧνγʔϯΤσΟοτ׆༻ͷ·ͱΊ wׂ͝ͱʹγʔϯΛΓ͚ΕΔ͔Βۀ͕Γ͍͢ w୯ମγʔϯ 1SFGBCΑΓௐ࣌ͷख͕͔͔ؒΒͳ͍ wطଘγʔϯʹӨڹΛ༩͑ͳ͍ͷͰϝϯλϧʹ༏͍͠ wܨ͗͜ΈͷΈ࣮͢Δඞཁ͕͋Δ w૯ͯ͡ɺඇϓϩάϥϚͷޮΛ্͛Δͷʹ༗ޮ
࠷ޙʹ ͜Μͳ1SFGBCγʔϯʹͯ͠ྑ͍ͷͰͳ͍͔ʁͱ͍͏ײ w ෳͷผͷ(BNF0CKFDU͕ࠞͬͯ͟Δ w (6*Ͱͷฤू࡞ۀ͕ଟ͍ w ̍ՕॴͰ͔ͬͯ͠ͳ͍ w ୯ମͰػೳ͢Δ
֎෦ͷΦϒδΣΫτʹґଘ͠ͳ͍ σΠϒͷྫɿ w ෦κϯϏɾΞΠςϜɾصͳͲ͍ͬͺ͍͋Δ w ෦ͷஔͳͲසൟʹߋ৽͢Δ w ͭ࠶ར༻͢Δ͜ͱͳ͍ దʹΓ͚ͯͤʹ։ൃ͍ͨ͠
͓ΘΓ