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
580
Unityテスト活動のふりかえり
adarapata
1
590
Gather.townはいいぞ その後
adarapata
1
1.6k
Unityでの開発事例
adarapata
3
23k
どこのご家庭にもあるシーンマネージャーの話
adarapata
2
8.3k
Gather.townはいいぞ
adarapata
2
2.4k
宴はいいぞ
adarapata
0
1.6k
わかった気になるモブプログラミング
adarapata
1
130
モブワークっぽいのをやっている話/Trying mobwork
adarapata
2
1.3k
Other Decks in Programming
See All in Programming
目的で駆動する、AI時代のアーキテクチャ設計 / purpose-driven-architecture
minodriven
11
3.6k
[堅牢.py #1] テストを書かない研究者に送る、最初にテストを書く実験コード入門 / Let's start your ML project by writing tests
shunk031
11
6.1k
「文字列→日付」の落とし穴 〜Ruby Date.parseの意外な挙動〜
sg4k0
0
310
AWS CDKの推しポイントN選
akihisaikeda
1
210
JJUG CCC 2025 Fall: Virtual Thread Deep Dive
ternbusty
3
490
開発生産性が組織文化になるまでの軌跡
tonegawa07
0
200
これだけで丸わかり!LangChain v1.0 アップデートまとめ
os1ma
4
220
CSC509 Lecture 13
javiergs
PRO
0
260
OSS開発者の憂鬱
yusukebe
14
11k
Level up your Gemini CLI - D&D Style!
palladius
1
130
Feature Flags Suck! - KubeCon Atlanta 2025
phodgson
0
180
『実践MLOps』から学ぶ DevOps for ML
nsakki55
2
480
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
A Modern Web Designer's Workflow
chriscoyier
697
190k
BBQ
matthewcrist
89
9.9k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
11
940
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Navigating Team Friction
lara
190
16k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
2.9k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Fireside Chat
paigeccino
41
3.7k
It's Worth the Effort
3n
187
29k
[RailsConf 2023] Rails as a piece of cake
palkan
57
6.1k
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 ͭ࠶ར༻͢Δ͜ͱͳ͍ దʹΓ͚ͯͤʹ։ൃ͍ͨ͠
͓ΘΓ