Slide 1

Slide 1 text

Unity ϝϞϦʔ࠷దԽ Ԧቨ 2014-07-17

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

མͪΔ མͪΔ མͪΔ σʔλͷಡΈࠐΉ ॲཧ͍ͯ͠ͳ͍Τϥʔ ֎෦ϓϥάΠϯͷѱ͍ ϝϞϦʔ଍Γͳ͍ ʁʁʁ େࣄͳ͜ͱ ͩΕͰ΋෼͔Δ͜ͱඞཁʂ

Slide 6

Slide 6 text

iPhone 4 iPhone 4s iPad mini: 512M iPhone 5Ҏ্: 1G Androidେମ: 1Gɺ2G΋͋Δ ىಈ͢ΔͱɺγεςϜ΋ϝϞϦʔ͔͔Γ·͢ iOS 6 -> 70M Ϩϕϧ iOS 7 -> 200M Ϩϕϧ *iOS 7.1.2ʹվળग़དྷ·͕ͨ͠ɺ170M͙Β͍ ݁࿦ɿϝϞϦʔҰ൪ݫ͍͠ͷ͸ iPhone 4 ͱ iOS 7 (7.1.2Ҏ֎) ͷ૊Έ߹ΘͤͰ͢

Slide 7

Slide 7 text

WHY ϝϞϦʔਃ੥ ϝϞϦʔ࢖͏ ऴΘͬͨ ϦϦʔε GC.Collect

Slide 8

Slide 8 text

Unity ϝϞϦʔ؅ཧϧʔϧ 1͔ͭ͋͠Γ·ͤΜʂ ࢀর͕͋Ε͹ɺ ϦϦʔεʢճऩʣͰ͖·ͤΜ

Slide 9

Slide 9 text

࠷ॳ͔ΒϝϞϦʔਖ਼͘͠࢖༻ͷҙࣝΛ෇͍ͯɺ ϧʔϧΛकΕ͹ɺ࠷దԽͷ࡞ۀ͕؆୯ʹͳΒΕ·͢ʢͳ͠ʁʣ ͜ͱ͔͠Βɻɻɻ

Slide 10

Slide 10 text

ࢀরʁ ը૾ʢAtlasɼTextureɼSpriteͳͲʣ Ի੠ʢSEɼBGMɼϘΠεͳͲʣ ΦϒδΣΫτʢεΫϦϓτɼModel dataʣ UnityͷΞηοτ C#

Slide 11

Slide 11 text

ࢀরྫ GameScene->Sprite(GameObject)-> UISprite->StartAltas(UIAtlas) ->StartAtlas(Material)->StartAtlas.png ϝϞϦʔҰ൪

Slide 12

Slide 12 text

NGྫ 1 ࢖͍ͬͯͳ͍Sceneͱ͔ Destroyͯ͠ͳͯ͘ɺ SetActive false͚ͩ ͓͢͢Ίɿ࢖͍ͬͯͳ͍΋ͷdestroyͯ͠ɺඞཁͳ࣌࠶Load ॏͯ͘ɺΑ͘࢖͏΋ͷ͕CacheͰ΋OK

Slide 13

Slide 13 text

NGྫ 2 Talk.cs private static OnComplete _onTalkComplete = null; public static void Open(StoryData story, OnComplete onTalkComplete) { _story = story; _onTalkComplete = onTalkComplete; MakeATalk().Show(); } //Talk animation finished: public void OnTalkFinished() { if (_onTalkComplete != null) { _onTalkComplete(); } Destory(this) } Script.cs public void Go() { Talk.Open(story, ()=> { Debug.Log(“Talk finished”); }); } _onTalkComplete -> Script.cs -> Script GameObject -> ը૾ͱ͔

Slide 14

Slide 14 text

NGྫ 2 Talk.cs private OnComplete _onTalkComplete = null; public void Open(StoryData story, OnComplete onTalkComplete) { _story = story; _onTalkComplete = onTalkComplete; Show(); } //Talk animation finished: public void OnTalkFinished() { if (_onTalkComplete != null) { _onTalkComplete(); } Destory(this) } Script.cs public void Go() { Talk t = new Talk(); t.Open(story, ()=> { Debug.Log(“Talk finished”); }); } ͓͢͢Ί staticඞཁͳ͍΋ͷɺstatic͠ͳ͍Ͱ staticɺ΋͘͠͸ singleton ཞ༻͠ͳ͍Ͱ

Slide 15

Slide 15 text

NGྫ 3 AssetBundle AssetBundle1 = AssetBundle.CreateFromFile("1.unity3d"); obj1.renderer.material.mainTexture = AssetBundle1.Load("wall") as Texture; obj2.renderer.material.mainTexture = obj1.renderer.material.mainTexture; //… Destroy(obj1); Destroy(obj2); Assetͷࢀর͕ͳ͘ͳΔ͚Ͳɺ AssetBundle·ͩϦϦʔε͞Ε͍ͬͯͳ͍

Slide 16

Slide 16 text

NGྫ 3 AssetBundle AssetBundle1 = AssetBundle.CreateFromFile("1.unity3d"); obj1.renderer.material.mainTexture = AssetBundle1.Load("wall") as Texture; obj2.renderer.material.mainTexture = obj1.renderer.material.mainTexture; //… Destroy(obj1); Destroy(obj2); AssetBundle1.Unload(true); //͔͔࣌ؒΓ·͢ Resources.UnloadUnusedAssets(); ը૾ϦϦʔεɺdelayͰ΋େৎ෉

Slide 17

Slide 17 text

1 2 3 Profiler Window (Cmd+7) ։ൃͷ࣌΋ͪΐͬͱݟ͓ͯئ͍ https://www.youtube.com/watch?v=sBpXiJ9G3OY https://docs.unity3d.com/351/Documentation/Manual/Profiler.html

Slide 18

Slide 18 text

NGྫ 4 ϦʔΫͰ͸ͳ͍͚Ͳɺ GC AllocͰύʔϑΥʔϚϯεѱ͘ͳΔ public void Update() { GameController controller = GetComponent(); controller.Foo(); List characters = new List(); transform.parent = practiceControler.cardRoot; transform.localScale = initCardScale; transform.position = initCardPosition; }

Slide 19

Slide 19 text

NGྫ 4 public void Awake() { _cachedController = GetComponent(); _characters = new List(); _cachedTransform = transform; } public void Update() { _cachedController.Foo(); _characters.Clear(); _cachedTransform.parent = practiceControler.cardRoot; _cachedTransform.localScale = initCardScale; _cachedTransform.position = initCardPosition; } GameObject.Find ͳͲͷ୳͢method΋

Slide 20

Slide 20 text

GC Alloc ຖFrameɹϝϞϦʔਃ੥ͷྔ kbͷϨϕϧʹकΓ·͠ΐ͏ GC.Collect গͳ͘ͳΔɺύʔϑΥʔϚϯεΞοϓ

Slide 21

Slide 21 text

No content