From dd980aab3b2882d7985eba8c9a3eaca658756d0c Mon Sep 17 00:00:00 2001 From: Qwreey Date: Thu, 23 Feb 2023 19:41:16 +0900 Subject: [PATCH] Added GetChildren and ChildAdded on Extend --- docs/en/sitemap.xml | 2 +- docs/en/sitemap.xml.gz | Bin 203 -> 203 bytes docs/kr/changelogs/index.html | 9 ++ docs/kr/include/extend/index.html | 124 ++++++++++++++++++++++- docs/kr/include/locales/index.html | 92 ++++++++--------- docs/kr/reference/extend/index.html | 124 ++++++++++++++++++++++- docs/kr/reference/lang/index.html | 92 ++++++++--------- docs/kr/search/search_index.json | 2 +- docs/kr/sitemap.xml | 98 +++++++++---------- docs/kr/sitemap.xml.gz | Bin 521 -> 521 bytes docs/kr/tutorial/11_extend/index.html | 130 ++++++++++++++++++++++++- docs/kr/tutorial/8_register/index.html | 12 ++- docs/kr/tutorial/9_lang/index.html | 117 +++++++++++++--------- md/kr/changelogs.md | 3 + md/kr/include/extend.md | 79 ++++++++++++++- src/class.lua | 52 +++++++++- src/exports.lua | 2 +- src/mount.lua | 8 +- src/signal.lua | 4 +- src/store.lua | 33 +++++-- src/types.lua | 2 +- 21 files changed, 772 insertions(+), 213 deletions(-) diff --git a/docs/en/sitemap.xml b/docs/en/sitemap.xml index 62831b8..7e731c8 100644 --- a/docs/en/sitemap.xml +++ b/docs/en/sitemap.xml @@ -2,7 +2,7 @@ https://quad.qwreey.kr/en/ - 2023-02-22 + 2023-02-23 daily \ No newline at end of file diff --git a/docs/en/sitemap.xml.gz b/docs/en/sitemap.xml.gz index d97b38a8b142cb5335f15cbf22a7caf2a8631101..63dbb1c8a07974f0ec740a53c9e9d2585da17d64 100644 GIT binary patch literal 203 zcmV;+05ty}iwFq1Lib|=|8r?{Wo=<_E_iKh08NiQ4udcZg?CO7WhbVvv{eXOPtYD9 z0vAvrfjE?M`-YzZFSegQJw40f*LUoTj#_JSeh~?0Xi8hPrq226`G~K)P?4NmN9b9A z4duM?ez*h7^DLQ3* zKm!ui`x)2ddt0eANwYXf<1`D%p`Ea@(Wb_?!%)E@-;=k@>r F008atUA+JR literal 203 zcmV;+05ty}iwFn~r1fJ0|8r?{Wo=<_E_iKh08Nig5`r)ch4-GK(>)E=jXI_5Jb@md z0}&XZg{Fwy-tw~`nT36`Bg`&+cnof}S(795}R9=!)CQ?RZ*A7@w8(ZPq{tK+ F005)=VMqV~ diff --git a/docs/kr/changelogs/index.html b/docs/kr/changelogs/index.html index 0d0151f..f9e1fdc 100644 --- a/docs/kr/changelogs/index.html +++ b/docs/kr/changelogs/index.html @@ -421,6 +421,13 @@
    +
  • + + 2.25 + + +
  • +
  • 2.24 @@ -1209,6 +1216,8 @@

    버전 번경사항

    +

    2.25

    +

    실험적 API 로써 GetChildren() 과 ChildAdded::Bindable 이 추가되었습니다.

    2.24

    모든 문서가 정리되었습니다.

    2.23

    diff --git a/docs/kr/include/extend/index.html b/docs/kr/include/extend/index.html index b3fa103..c8dc4f3 100644 --- a/docs/kr/include/extend/index.html +++ b/docs/kr/include/extend/index.html @@ -1453,7 +1453,7 @@ local Mount = Quad.Mount local Evnet = Quad.Event -local TextBox = Class "TextButton" +local TextButton = Class "TextButton" local myClass = Class.Extend() function myClass:Render(props) @@ -1481,6 +1481,128 @@ Mount(ScreenGUI, myButton)

    +
    +

    Event .ChildAdded:Connect((child)->())->Connection

    +
    +

    자식 오브젝트가 추가될 때 발생하는 이벤트입니다. :Init 에서 사용하면 옵션으로 넣은 자식 오브젝트가 이 이벤트를 통해 얻어질 수 있으며, :AfterRender 에서는 추후 Mount 를 통해 추가되는 자식 오브젝트만 이 이벤트로 얻어질 수 있습니다.
    +

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    local Quad = require(path.to.module).Init()
    +local Class = Quad.Class
    +local Mount = Quad.Mount
    +local Evnet = Quad.Event
    +
    +local TextButton = Class "TextButton"
    +
    +local myClass = Class.Extend()
    +function myClass:Render(props)
    +    return TextButton {
    +        self "_holder";
    +    }
    +end
    +function myClass:AfterRender()
    +    self.ChildAdded:Connect(function(child)
    +        print(child.Name)
    +    end)
    +end
    +
    +local myImported = Class(myClass)
    +local myButton = myImported{
    +    -- Init 에 ChildAdded 를 넣은것이 아니기 때문에 출력되지 않습니다.
    +    -- 그러나 AfterRender 에 :GetChildren 을 넣어 이 오브젝트를
    +    -- 얻어올 수 있습니다.
    +    TextButton { Name = "Hello "};
    +}
    +
    +Mount(myButton, TextButton{ Name = "Hello" })
    +Mount(myButton, TextButton{ Name = "World" })
    +

    +
    +
    +

    :GetChildren()

    +
    +

    자식 오브젝트들을 가져오는 함수입니다. :Init() 에서는 빈 테이블을 반환하고, AfterRender 에서는 옵션에 들어간 자식 오브젝트들이 담긴 테이블을 반환합니다. 자식의 순서는 일정하지 않습니다. +

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    local Quad = require(path.to.module).Init()
    +local Class = Quad.Class
    +local Mount = Quad.Mount
    +local Evnet = Quad.Event
    +
    +local TextButton = Class "TextButton"
    +
    +local myClass = Class.Extend()
    +function myClass:Render(props)
    +    return TextButton {
    +        self "_holder";
    +    }
    +end
    +function myClass:AfterRender()
    +    for i,v in ipairs(self:GetChildren()) do
    +        print(v.Name)
    +    end
    +end
    +
    +local myImported = Class(myClass)
    +local myButton = myImported{
    +    TextButton { Name = "Hello World"};
    +}
    +
    +-- 나중에 추가하는 오브젝트는 출력되지 않습니다.
    +Mount(myButton, TextButton{ Name = "Hello" })
    +Mount(myButton, TextButton{ Name = "World" })
    +

    +
    diff --git a/docs/kr/include/locales/index.html b/docs/kr/include/locales/index.html index 07d5807..bf0e4f2 100644 --- a/docs/kr/include/locales/index.html +++ b/docs/kr/include/locales/index.html @@ -1038,52 +1038,52 @@

    Locales

    Default (default)
    -English (en_us)
    -Spanish (es_es)
    -French (fr_fr)
    -Indonesian (id_id)
    -Italian (it_it)
    -Japanese (ja_jp)
    -Korean (ko_kr)
    -Russian (ru_ru)
    -Thai (th_th)
    -Turkish (tr_tr)
    -Vietnamese (vi_vn)
    -Portuguese (pt_br)
    -German (de_de)
    -ChineseSimplified (zh_cn)
    -ChineseTraditional (zh_tw)
    -Bulgarian (bg_bg)
    -Bengali (bn_bd)
    -Czech (cs_cz)
    -Danish (da_dk)
    -Greek (el_gr)
    -Estonian (et_ee)
    -Finnish (fi_fi)
    -Hindi (hi_in)
    -Croatian (hr_hr)
    -Hungarian (hu_hu)
    -Georgian (ka_ge)
    -Kazakh (kk_kz)
    -Khmer (km_kh)
    -Lithuanian (lt_lt)
    -Latvian (lv_lv)
    -Malay (ms_my)
    -Burmese (my_mm)
    -Bokmal (nb_no)
    -Dutch (nl_nl)
    -Filipino (fil_ph)
    -Polish (pl_pl)
    -Romanian (ro_ro)
    -Ukrainian (uk_ua)
    -Sinhala (si_lk)
    -Slovak (sk_sk)
    -Slovenian (sl_sl)
    -Albanian (sq_al)
    -Bosnian (bs_ba)
    -Serbian (sr_rs)
    -Swedish (sv_se)
    -Arabic (ar_001)

    +English (en-us)
    +Spanish (es-es)
    +French (fr-fr)
    +Indonesian (id-id)
    +Italian (it-it)
    +Japanese (ja-jp)
    +Korean (ko-kr)
    +Russian (ru-ru)
    +Thai (th-th)
    +Turkish (tr-tr)
    +Vietnamese (vi-vn)
    +Portuguese (pt-br)
    +German (de-de)
    +ChineseSimplified (zh-cn)
    +ChineseTraditional (zh-tw)
    +Bulgarian (bg-bg)
    +Bengali (bn-bd)
    +Czech (cs-cz)
    +Danish (da-dk)
    +Greek (el-gr)
    +Estonian (et-ee)
    +Finnish (fi-fi)
    +Hindi (hi-in)
    +Croatian (hr-hr)
    +Hungarian (hu-hu)
    +Georgian (ka-ge)
    +Kazakh (kk-kz)
    +Khmer (km-kh)
    +Lithuanian (lt-lt)
    +Latvian (lv-lv)
    +Malay (ms-my)
    +Burmese (my-mm)
    +Bokmal (nb-no)
    +Dutch (nl-nl)
    +Filipino (fil-ph)
    +Polish (pl-pl)
    +Romanian (ro-ro)
    +Ukrainian (uk-ua)
    +Sinhala (si-lk)
    +Slovak (sk-sk)
    +Slovenian (sl-sl)
    +Albanian (sq-al)
    +Bosnian (bs-ba)
    +Serbian (sr-rs)
    +Swedish (sv-se)
    +Arabic (ar-001)

    diff --git a/docs/kr/reference/extend/index.html b/docs/kr/reference/extend/index.html index a432569..d61b76b 100644 --- a/docs/kr/reference/extend/index.html +++ b/docs/kr/reference/extend/index.html @@ -1475,7 +1475,7 @@ local Mount = Quad.Mount local Evnet = Quad.Event -local TextBox = Class "TextButton" +local TextButton = Class "TextButton" local myClass = Class.Extend() function myClass:Render(props) @@ -1503,6 +1503,128 @@ Mount(ScreenGUI, myButton)

    +
    +

    Event .ChildAdded:Connect((child)->())->Connection

    +
    +

    자식 오브젝트가 추가될 때 발생하는 이벤트입니다. :Init 에서 사용하면 옵션으로 넣은 자식 오브젝트가 이 이벤트를 통해 얻어질 수 있으며, :AfterRender 에서는 추후 Mount 를 통해 추가되는 자식 오브젝트만 이 이벤트로 얻어질 수 있습니다.
    +

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    local Quad = require(path.to.module).Init()
    +local Class = Quad.Class
    +local Mount = Quad.Mount
    +local Evnet = Quad.Event
    +
    +local TextButton = Class "TextButton"
    +
    +local myClass = Class.Extend()
    +function myClass:Render(props)
    +    return TextButton {
    +        self "_holder";
    +    }
    +end
    +function myClass:AfterRender()
    +    self.ChildAdded:Connect(function(child)
    +        print(child.Name)
    +    end)
    +end
    +
    +local myImported = Class(myClass)
    +local myButton = myImported{
    +    -- Init 에 ChildAdded 를 넣은것이 아니기 때문에 출력되지 않습니다.
    +    -- 그러나 AfterRender 에 :GetChildren 을 넣어 이 오브젝트를
    +    -- 얻어올 수 있습니다.
    +    TextButton { Name = "Hello "};
    +}
    +
    +Mount(myButton, TextButton{ Name = "Hello" })
    +Mount(myButton, TextButton{ Name = "World" })
    +

    +
    +
    +

    :GetChildren()

    +
    +

    자식 오브젝트들을 가져오는 함수입니다. :Init() 에서는 빈 테이블을 반환하고, AfterRender 에서는 옵션에 들어간 자식 오브젝트들이 담긴 테이블을 반환합니다. 자식의 순서는 일정하지 않습니다. +

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    local Quad = require(path.to.module).Init()
    +local Class = Quad.Class
    +local Mount = Quad.Mount
    +local Evnet = Quad.Event
    +
    +local TextButton = Class "TextButton"
    +
    +local myClass = Class.Extend()
    +function myClass:Render(props)
    +    return TextButton {
    +        self "_holder";
    +    }
    +end
    +function myClass:AfterRender()
    +    for i,v in ipairs(self:GetChildren()) do
    +        print(v.Name)
    +    end
    +end
    +
    +local myImported = Class(myClass)
    +local myButton = myImported{
    +    TextButton { Name = "Hello World"};
    +}
    +
    +-- 나중에 추가하는 오브젝트는 출력되지 않습니다.
    +Mount(myButton, TextButton{ Name = "Hello" })
    +Mount(myButton, TextButton{ Name = "World" })
    +

    +
    diff --git a/docs/kr/reference/lang/index.html b/docs/kr/reference/lang/index.html index 6b8140f..e06ef5f 100644 --- a/docs/kr/reference/lang/index.html +++ b/docs/kr/reference/lang/index.html @@ -1104,52 +1104,52 @@ Lang.Locales 안의 값을 사용합니다.


    Lang.Locales

    Default (default)
    -English (en_us)
    -Spanish (es_es)
    -French (fr_fr)
    -Indonesian (id_id)
    -Italian (it_it)
    -Japanese (ja_jp)
    -Korean (ko_kr)
    -Russian (ru_ru)
    -Thai (th_th)
    -Turkish (tr_tr)
    -Vietnamese (vi_vn)
    -Portuguese (pt_br)
    -German (de_de)
    -ChineseSimplified (zh_cn)
    -ChineseTraditional (zh_tw)
    -Bulgarian (bg_bg)
    -Bengali (bn_bd)
    -Czech (cs_cz)
    -Danish (da_dk)
    -Greek (el_gr)
    -Estonian (et_ee)
    -Finnish (fi_fi)
    -Hindi (hi_in)
    -Croatian (hr_hr)
    -Hungarian (hu_hu)
    -Georgian (ka_ge)
    -Kazakh (kk_kz)
    -Khmer (km_kh)
    -Lithuanian (lt_lt)
    -Latvian (lv_lv)
    -Malay (ms_my)
    -Burmese (my_mm)
    -Bokmal (nb_no)
    -Dutch (nl_nl)
    -Filipino (fil_ph)
    -Polish (pl_pl)
    -Romanian (ro_ro)
    -Ukrainian (uk_ua)
    -Sinhala (si_lk)
    -Slovak (sk_sk)
    -Slovenian (sl_sl)
    -Albanian (sq_al)
    -Bosnian (bs_ba)
    -Serbian (sr_rs)
    -Swedish (sv_se)
    -Arabic (ar_001)

    +English (en-us)
    +Spanish (es-es)
    +French (fr-fr)
    +Indonesian (id-id)
    +Italian (it-it)
    +Japanese (ja-jp)
    +Korean (ko-kr)
    +Russian (ru-ru)
    +Thai (th-th)
    +Turkish (tr-tr)
    +Vietnamese (vi-vn)
    +Portuguese (pt-br)
    +German (de-de)
    +ChineseSimplified (zh-cn)
    +ChineseTraditional (zh-tw)
    +Bulgarian (bg-bg)
    +Bengali (bn-bd)
    +Czech (cs-cz)
    +Danish (da-dk)
    +Greek (el-gr)
    +Estonian (et-ee)
    +Finnish (fi-fi)
    +Hindi (hi-in)
    +Croatian (hr-hr)
    +Hungarian (hu-hu)
    +Georgian (ka-ge)
    +Kazakh (kk-kz)
    +Khmer (km-kh)
    +Lithuanian (lt-lt)
    +Latvian (lv-lv)
    +Malay (ms-my)
    +Burmese (my-mm)
    +Bokmal (nb-no)
    +Dutch (nl-nl)
    +Filipino (fil-ph)
    +Polish (pl-pl)
    +Romanian (ro-ro)
    +Ukrainian (uk-ua)
    +Sinhala (si-lk)
    +Slovak (sk-sk)
    +Slovenian (sl-sl)
    +Albanian (sq-al)
    +Bosnian (bs-ba)
    +Serbian (sr-rs)
    +Swedish (sv-se)
    +Arabic (ar-001)

    diff --git a/docs/kr/search/search_index.json b/docs/kr/search/search_index.json index 2165253..48ecbb5 100644 --- a/docs/kr/search/search_index.json +++ b/docs/kr/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":[" "]},"docs":[{"location":"","title":"Quad","text":"

    \ucc98\uc74c\uc624\uc168\ub098\uc694? \ud29c\ud1a0\ub9ac\uc5bc \ubb38\uc11c\ub97c \uc77d\uc5b4\ubcf4\uc138\uc694! \ucc98\uc74c\ubd80\ud130 \ucc28\uadfc\ucc28\uadfc Quad \ubaa8\ub4c8\uc744 \uc815\ubcf5\ud560 \uc218 \uc788\uc5b4\uc694

    "},{"location":"changelogs/","title":"\ubc84\uc804 \ubc88\uacbd\uc0ac\ud56d","text":""},{"location":"changelogs/#224","title":"2.24","text":"

    \ubaa8\ub4e0 \ubb38\uc11c\uac00 \uc815\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#223","title":"2.23","text":"

    \uac1d\uccb4 \uc0dd\uc131\uc2dc \uc77c\uc5b4\ub098\ub294 \uc624\ub958\ub97c \ud574\uacb0\ud588\uc2b5\ub2c8\ub2e4. \uc774\uc81c Extend \uac1d\uccb4 \ub0b4\ubd80 \uc790\uc2dd\uc774 Unmount \ub418\ub294 \uacbd\uc6b0 __child \uc5d0\uc11c \uc81c\uac70\ub429\ub2c8\ub2e4. types \uc758 \uc624\ud0c0\ub97c \uace0\ucce4\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#222","title":"2.22","text":"

    \ub354\uc774\uc0c1 Event.Prop \uac00 \ucc98\uc74c \uc0dd\uc131\uc2dc \uc2e4\ud589\ub418\ub294 \uc77c\uc774 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#221","title":"2.21","text":"

    Linker \uac00 \uc774\uc81c \ud074\ub798\uc2a4 \uc548 \ud074\ub798\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ub420 \uc218 \uc788\ub3c4\ub85d \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#220","title":"2.20","text":"

    Docments \uac00 \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub9ce\uc740\uc591\uc758 \uc0c8\ub85c\uc6b4 \ud29c\ud1a0\ub9ac\uc5bc\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4. Mkdocs \ud14c\ub9c8\uc640 \uc5ec\ub7ec\uac00\uc9c0 \uc124\uc815\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c Makefile \uc744 \ud1b5\ud574\uc11c rojo build \uc640 mkdocs build \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#219","title":"2.19","text":"

    Linker \uac1d\uccb4\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c GetPropertyChangedSignal \uc640, self \uc5d0 \ud2b9\uc815 \uc624\ube0c\uc81d\ud2b8 \ud639\uc740 \uc774\ubca4\ud2b8\ub97c \uc5f0\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#218","title":"2.18","text":"

    \uc774\uc81c \ub354\uc774\uc0c1 GC \uc5d0 \uc758\ud574 Store \uc758 Instance \uac12\uc774 \uc190\uc2e4\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#217","title":"2.17","text":"

    Tween \uc758 CallBack \ub4f1\ub85d \uc2dc \uc8fc\uc5b8\uc9c0\ub294 \ud30c\ub77c\uba54\ud130\uac00 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c \ub354\uc774\uc0c1 ~ \ubb38\uc774 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#215-breaking-changes","title":"2.15 BREAKING CHANGES","text":"

    \uc774\uc81c Lang \uc5d0\uc11c CurrentLocale, FailedMessage \uc744 \ubcc0\uacbd\ud558\uba74 \uc790\ub3d9\uc73c\ub85c \ubcc0\uacbd\uc0ac\ud56d\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4. \ub610\ud55c \uc77c\ubd80 \ud544\ub4dc\uc758 \ub124\uc774\ubc0d\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#214","title":"2.14","text":"

    Lang \ubaa8\ub4c8\uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. register \ub97c \uc0ac\uc6a9\ud574 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub2e4\uc911\uc5b8\uc5b4 \uc9c0\uc6d0\uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#213","title":"2.13","text":"

    Signal \ubaa8\ub4c8\uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c Class.Extend \uc5d0\uc11c GetPropertyChangedSignal \uacfc EmitPropertyChangedSignal \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#212","title":"2.12","text":"

    Mount \ubc18\ud658 \uac1d\uccb4\uc5d0 Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d Mount \uac1d\uccb4\uac00 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#211","title":"2.11","text":"

    Store.GetObjects \uc5d0 \uc774\uc81c & \ubb38\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#29","title":"2.9","text":"

    PreloadAsync \ub97c \ud1b5\ud574 \uc774\uc81c round.lua \uc5d0\uc11c \ub77c\uc6b4\ub4dc \uc774\ubbf8\uc9c0\ub97c \ubbf8\ub9ac \ub85c\ub4dc\ud569\ub2c8\ub2e4.

    "},{"location":"changelogs/#28","title":"2.8","text":"

    \ubc18\ud658 \uad00\ub828 \ucf54\ub4dc\uac00 exports \ub85c \uc774\uc8fc\ub418\uc5c8\uc73c\uba70. init.lua \uc5d0\uc11c\ub294 \uc790\ub3d9\uc801\uc73c\ub85c types \ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    "},{"location":"changelogs/#27","title":"2.7","text":"

    \uc774\uc81c types \ub97c \uc644\uc804\ud788 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc9c1\uc811 \ubd88\ub7ec\uc640 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#2126-breaking-changes","title":"2.1~2.6 BREAKING CHANGES","text":"

    \ubaa8\ub4e0 \ubaa8\ub4c8\uc758 \ud544\ub4dc\uc758 \uc774\ub984\uc774 \ubcc0\uacbd\ub418\uc5c8\uc73c\uba70, \ubaa8\ub4e0 \ud074\ub798\uc2a4\ub4e4\uc774 \uae30\ubcf8\uc801\uc73c\ub85c \ub300\ubb38\uc790 \uc2dc\uc791 \ub124\uc774\ubc0d\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \uba85\uba85\uaddc\uce59\uc744 \ubcc0\uacbd\ud588\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#20","title":"2.0","text":"

    \ubc84\uc804 \ud310\uc62c\ub9bc, BREAKING CHANGES \ub97c \uc704\ud574 \ubc84\uc804\uc744 \ud310\uc62c\ub9bc \ud558\uc600\uc2b5\ub2c8\ub2e4.

    "},{"location":"gallery/","title":"\uac24\ub7ec\ub9ac","text":"

    \uc5ec\uae30\ub294 \uc5ec\ub7ec\ubd84\ub4e4\uc758 \uc791\ud488\uc744 \uc62c\ub824\ubcfc \uc218 \uc788\ub294 \uacf3\uc785\ub2c8\ub2e4! Quad \ub97c \uc0ac\uc6a9\ud55c \uc5ec\ub7ec\uac00\uc9c0 \ud6cc\ub96d\ud55c \uc791\ud488\ub4e4\uc744 \ubcf4\uc5ec\uc8fc\uc138\uc694!

    "},{"location":"license/","title":"\ub77c\uc774\uc120\uc2a4","text":"

    QwreeyKawaii License v1.3

    KoreanEnglish Permissions Limitations Conditions \u2705 \uc0c1\uc5c5\uc801 \uc0ac\uc6a9 \u274e \ubcf4\uc99d \u2753 \ub77c\uc774\uc120\uc2a4\uc640 \uc800\uc791\uad8c \uace0\uc9c0 (\uad8c\uace0\uc0ac\ud56d) \u2705 \ubc30\ud3ec \u274e \ubb34\ub840\ud558\uac8c \uad74\uae30 \u2705 \ubcc0\uacbd/\uc218\uc815/2\ucc28\uc800\uc791 \u274e \ub7ec\uc2dc\uc544\ub97c \ube44\ub86f\ud55c \uc804\uc7c1\uc744 \ub3d5\ub294 \u2705 \uac1c\uc778\uc801 \uc0ac\uc6a9 \u274e \uc544\ubb34\ub7f0 \ubcc0\uacbd\uc0ac\ud56d \uc5c6\uc774 \ubcf5\uc81c
              QwreeyKawaii license v1.3\nCopyright 2023. Qwreey [qwreey75@gmail.com]\n\n\uc774 \ub77c\uc774\uc120\uc2a4\ub294 DBAD \ub77c\uc774\uc120\uc2a4\ub97c \uae30\ubc18\uc73c\ub85c \ud569\ub2c8\ub2e4.\n\ub204\uad6c\ub4e0\uc9c0 \uc774 \ub77c\uc774\uc120\uc2a4 \ubb38\uc11c\uc758 \uc6d0\ubcf8 \ud639\uc740 \uc218\uc815\ubcf8\uc744\n\ubcf5\uc0ac, \ud3b8\uc9d1, \ubc30\ud3ec \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\nQwreeyKawaii \ub77c\uc774\uc120\uc2a4\uc758 \ubcf5\uc0ac \ubc30\ud3ec \ubc0f \uc218\uc815\uc5d0\n\uad00\ud55c \uaddc\uc815\uacfc \uc870\uac74.\n\n1. \ub2f9\uc2e0\uc740 \uc774 \uadc0\uc5ec\uc6b4 \ucc3d\uc791\ubb3c\uc744 \uac00\uc9c0\uace0 \uc5b4\ub5a0\ud55c\n\uac83\uc774\ub4e0 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8, \ubb34\ub840\ud558\uc9c0 \ub9c8\uc138\uc694.\n\ubb34\ub840\ud55c \ud589\ub3d9\uc740 \ud1b5\uc0c1\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.\n\n\uac00. \uadc0\uc5ec\uc6b4 \uc774 \ucc3d\uc791\ubb3c\uc744 \uc5b4\ub5a0\ud55c \uac00\uacf5\ub3c4 \uc5c6\uc774\n    \ubcf5\uc81c\ud558\uac70\ub098, \uc774\ub984\ub9cc \ubc14\uafb8\ub294 \uac83\uc740 \ubb34\ub840\ud558\uba70\n    \ub178\uace8\uc801\uc778 \uc800\uc791\uad8c \uce68\ud574\uc785\ub2c8\ub2e4.\n\ub098. \uadc0\uc5ec\uc6b4 \uc774 \ucc3d\uc791\ubb3c\uc5d0 \uc74c\ub780\uc131 \ud639\uc740 \uc720\ud574\ud55c\n    \ucf58\ud150\uce20\ub97c \ud3ec\ud568\uc2dc\ud0a4\ub294 \uac83\uc740 \ubb34\ub840\ud569\ub2c8\ub2e4.\n    \uadc0\uc5ec\uc6b4 \ucf58\ud150\uce20\ub85c \ub2e4\ub978\uc774\ub97c \ud574\uce58\uc9c0 \ub9c8\uc2ed\uc2dc\uc624.\n\n\uadf8\ub7ec\ub098 \uc774\uc5d0\ub9cc \uad6d\ud55c\ub418\ub294\uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4.\n\ubb34\uc5c7\ubcf4\ub2e4\ub3c4, \uadc0\uc5ec\uc6b4 \ud0c0\uc778\uc744 \uc0c1\ucc98\uc8fc\uc9c0 \ub9c8\uc138\uc694.\n\n2. \ub2f9\uc2e0\uc774 \uc774 \ucc3d\uc791\ubb3c\uc744 \uc0ac\uc6a9\ud574 \ub9ce\uc740 \uc774\ub4dd\uc744 \ubcf8\n\uacbd\uc6b0, \uadc0\uc5ec\uc6b4 \ucc3d\uc791\uc790\uc5d0\uac8c \uc0ac\ub791\uc744 \ubc30\ud478\uc138\uc694.\n\uc778\uac04\uc801\uc778 \uc0ac\ub78c\uc740 \uadc0\uc5ec\uc6b4 \uc0ac\ub78c\ub4e4\uc744 \uc678\uba74\ud558\uc9c0\n\uc54a\uc2b5\ub2c8\ub2e4. \ub2f9\uc2e0\uc758 \ucee4\ud53c \ud55c\uc794\uc744 \ub098\ub220\uc8fc\uc138\uc694.\n\n3. \uc774 \ucc3d\uc791\ubb3c\uc740 \uc5b4\ub5a0\ud55c \ubcf4\uc99d \uc5c6\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.\n\uc774 \ucc3d\uc791\ubb3c\uc744 \uc0ac\uc6a9\ud558\ub2e4, \ucc3d\uc791\uc790\uc758 \uadc0\uc5ec\uc6b4\n\uc2e4\uc218\ub85c \uc778\ud574 \ubb34\uc5b8\uac00 \uc798\ubabb\ub418\uc5c8\ub2e4\uba74, \ubb38\uc81c\ub97c \uc9c1\uc811\n\ud574\uacb0\ud558\uc138\uc694. \ubb34\ub840\ud558\uc9c0 \uc54a\uc740 \uc0ac\ub78c\uc740 \uc801\uc5b4\ub3c4\n\uadc0\uc5ec\uc6b4 \ud0c0\uc778\ub4e4\uc744 \ube44\ub09c\ud558\uac70\ub098 \ubaa8\uc695\ud558\uc9c0\ub294 \uc54a\uc73c\uba70\n\uc218\uc815\ubcf8\uc744 \uc81c\ucd9c\ud558\uac70\ub098 \ubc84\uadf8\ub9ac\ud3ec\ud2b8\ub97c \uc81c\ucd9c \ud560\n\uac83\uc785\ub2c8\ub2e4.\n\n4. \ub2f9\uc2e0\uc774 \uc774 \uadc0\uc5ec\uc6b4 \ucc3d\uc791\ubb3c\uc744 \ud65c\uc6a9\ud574 \ub2e4\ub978 \ucc3d\uc791\ubb3c\n\uc744 \ub9cc\ub4e4\uace0 \uc2f6\uc740 \uacbd\uc6b0 \uc801\uc5b4\ub3c4 \uc0ac\uc6a9\ud588\ub2e4\ub294 \uace0\uc9c0\ub294\n\ub0a8\uaca8\uc8fc\uc138\uc694. \uadc0\uc5ec\uc6b4 \ucc3d\uc791\uc790\ub4e4\uc740 \uc790\uc2e0\uc758 \ucc3d\uc791\ubb3c\uc774\n\uc88b\uc740\uacf3\uc5d0 \uc0ac\uc6a9\ub418\uc5c8\uc74c\uc744 \uae30\ubed0\ud560 \uac83\uc785\ub2c8\ub2e4.\n* \uc774\ub294 \uad8c\uace0 \uc0ac\ud56d\uc785\ub2c8\ub2e4. \ud544\uc218\uac00 \uc544\ub2c8\uba70 \ubd88\uac00\ud53c\ud55c\n    \uacbd\uc6b0 \ubb34\uc2dc\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n\n5. \ub7ec\uc2dc\uc544 \uad6d\uc801\uc758 \uc774\ub4e4\uc740 \uc774 \ucc3d\uc791\ubb3c\uc744 \uc601\ub9ac \ubaa9\uc801\uc73c\ub85c\n\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. - \uc6b0\ub9ac\ub294 \uc804\uc7c1\uc790\uae08\uc744\n\uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n\uac19\uc740 \uc774\uc720\ub85c\uc368, \uc804\uc7c1\uc774 \uc9c0\uc6d0\ub420 \uc218 \uc788\ub294 \uacf3\uc5d0\uc11c\uc758\n\uc774 \ucc3d\uc791\ubb3c \uc0ac\uc6a9\uc744 \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n
    Permissions Limitations Conditions \u2705 Commercial use \u274e Warranty \u2753 License and copyright notice (Recommendation) \u2705 Distribution \u274e Being Rude \u2705 Modification \u274e Russian, And supporting war \u2705 Private use \u274e Copy without any modification
              QwreeyKawaii license v1.3\n\nCopyright 2023. Qwreey [qwreey75@gmail.com]\n\nThis license is based on DBAD license.\nEveryone is permitted to copy and distribute\nverbatim or modified copies of this license\ndocument.\n\nTERMS, AND CONDITIONS FOR COPYING,\nDISTRIBUTION, AND MODIFICATION\n\n1. You can do anything with this original work,\nbut don't be rude\n\nIn general, being rude includes below\n\nFirst. Do not copy these cute works without\n        any modification. changing the name\n        only is outright copyright infringement\nSecond. Do not add some harmful or NSFW content.\n        It's very rude and may harm others\n\nBeing rude is not limited to these instances.\nAbove all, don't hurt cute people\n\n2. If you get any benefit or profit from these cute\nworks, Share the love. A polite person may share\nthe love with cute people.\n3. These cute works are provided with no warranty.\nIf something goes wrong due to the creator's cute\nmistake, Fix it yourself. A polite person may\nsubmit the fix or bug report.\n4. If you create something with these works, Leave\nthe original creator's name in your work.\nthe cute creator will be happy if their works are\nused for good.\n* This is a recommendation. Not required.\n5. Russian nationality can not use this creation for\ncommercial purposes. \u2014 We do not support the war.\nSame reason, This creation cannot be used where\nit can support the war.\n
    "},{"location":"todo/","title":"\ud560\uc77c","text":""},{"location":"todo/#_2","title":"\uc9c4\ud589\uc911\uc774\uac70\ub098 \uac80\ud1a0\uc911","text":""},{"location":"todo/#easing","title":"Easing \ubb38\uc11c","text":"

    Easing \ubb38\uc11c\uc5d0 Out In Inout \ube44\uad50 \uc601\uc0c1 \ub9cc\ub4e4\uae30

    "},{"location":"todo/#spring","title":"Spring","text":"

    Spring \ubb3c\ub9ac \uacc4\uc0b0\uc744 UI \uc560\ub2c8\uba54\uc774\uc158\uc5d0 \uc801\uc6a9\ud569\ub2c8\ub2e4 WIP. \uc544\uc9c1 \uc9c4\ud589\uc911\uc778 \ud504\ub85c\uc81d\ud2b8.

    "},{"location":"todo/#quad-debuger","title":"Quad Debuger","text":"

    Register \uc758 \uc0c1\ud0dc\uc640 Store \uc758 \uac12, Class \uc758 \ub3d9\uc791 \uc5ec\ubd80 \ub4f1 Quad \uc758 \uc5ec\ub7ec \uc790\uc6d0\uc744 \uae34\ubc00\ud558\uac8c \ub514\ubc84\uadf8\ud569\ub2c8\ub2e4. WIP. \uc544\uc9c1 \uc9c4\ud589\uc911\uc778 \ud504\ub85c\uc81d\ud2b8.

    "},{"location":"todo/#selection","title":"Selection","text":"

    Tab \ud0a4\ub4f1\uc73c\ub85c \ubc84\ud2bc \uc120\ud0dd\ud558\uae30 (... \uac00\ub2a5\ud568?) WIP. \uac80\ud1a0\uc911\uc778 \ud504\ub85c\uc81d\ud2b8.

    "},{"location":"todo/#_3","title":"\uba3c \ubbf8\ub798\uc5d0 . . .","text":"

    \ud639\uc740 \uc774\ub8e8\uc6cc\uc9c0\uc9c0 \uc54a\ub294

    "},{"location":"todo/#quad-component-studio","title":"Quad Component Studio","text":"

    \ub208\uc5d0 \ubcf4\uc774\ub294 \uc6cc\uc9c0\uc6cc\uadf8\uc2dd \ud3b8\uc9d1\uae30\ub97c \uc774\uc6a9\ud574 Quad Class \ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.

    "},{"location":"todo/#quad-webrender","title":"Quad WebRender","text":"

    HTML, CSS, JS \ub85c\uc368 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ubcc0\ud615\ud574 \uc2a4\ud29c\ub514\uc624 \uc5c6\uc774 \uac1c\ubc1c\ud558\ub294 \uac00\ubcbc\uc6b4 \uac1c\ubc1c\ubc95\uc785\ub2c8\ub2e4.

    "},{"location":"todo/#quad-prerender","title":"Quad Prerender","text":"

    \ubbf8\ub9ac \ub80c\ub354\ub9c1\ub41c rbxm \uac1d\uccb4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. lua \uc2a4\ud06c\ub9bd\ud2b8\ub4e4\uc774 \ub9e4\ud551\ub418\uc5b4 \uc77c\ubc18\uc801\uc774\uac8c \ub3cc\uc544\uac11\ub2c8\ub2e4.

    "},{"location":"include/bindable/","title":"Bindable","text":"

    :Fire(...any)

    \ub4f1\ub85d\ub41c \uc5f0\uacb0\ub4e4\uc744 \uc2e4\ud589\ud558\uace0, Wait \uc744 \ud480\uc5b4\uc90d\ub2c8\ub2e4.

    :Wait()->(...any)

    Fire \uac00 \ud638\ucd9c\ub420 \ub54c \uae4c\uc9c0 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.

    :Connect((...any)->())->Connection

    Fire \uac00 \ud638\ucd9c \ub420 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ud638\ucd9c \uc778\uc790\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc5f0\uacb0\uc744 \ub04a\uc744 \uc218 \uc788\ub3c4\ub85d Connection \uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Once((...any)->())->Connection

    Connect \uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Fire \uac00 \ud55c\ubc88 \ud638\ucd9c\ub41c \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4/

    :CheckConnected(func)->boolean

    \ud568\uc218\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :DisconnectAll()

    \ubaa8\ub4e0 \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Wait \uc73c\ub85c \uae30\ub2e4\ub9ac\uace0 \uc788\ub294 \uacf3\uc5d0\ub294 nil \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Destroy()

    :DisconnectAll() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"include/connection/","title":"Connection","text":"

    :Disconnect()

    \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Fire \uac00 \ud638\ucd9c\ub418\ub354\ub77c\ub3c4 Connect \ud639\uc740 Once \uc5d0 \uc0ac\uc6a9\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    :Destroy()

    :Disconnect() \uc758 \ubcc4\uce6d\uc785\ub2c8\ub2e4.

    "},{"location":"include/directions/","title":"Directions","text":"

    Out \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.

    In \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.

    InOut \uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.

    "},{"location":"include/disconnecter/","title":"Disconnecter","text":"

    :Add(connection:Connection|RBXScriptConnection)

    connection\uc744 \ub9ac\uc2a4\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub098\uc911\uc5d0 :Disconnect\ub97c \ud638\ucd9c\ud558\uba74 \ucd94\uac00\ub41c \uc5f0\uacb0\uc774 \ud30c\uae30\ub429\ub2c8\ub2e4.

    :Disconnect()

    \ucd94\uac00\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\uc5d0 Disconnect() \ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ud638\ucd9c \ud6c4\uc5d0 \ucd94\uac00\ub41c \uc5f0\uacb0\uc740 \ubaa8\ub450 \uc0ac\ub77c\uc9c0\uba70. \uc774 \uc694\uccad \ud6c4\uc5d0\ub3c4 \ub2e4\uc2dc :Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4 Disconnecter \ub97c \uc644\uc804\ud788 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub824\uba74 :Destroy \ub97c \ud638\ucd9c\ud558\uc138\uc694

    :Destroy()

    :Disconnect() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"include/easings/","title":"Easings","text":"\ubbf8\ub9ac\ubcf4\uae30\uadf8\ub798\ud504 \uac1c\ud615

    \ubaa8\ub4e0 Easing \uc740 \uc5ec\uae30\uc5d0\uc11c \uc9c1\uc811\uc801\uc73c\ub85c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    Linear

    \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615 \ud568\uc218\uc785\ub2c8\ub2e4 i=x, x=0 to 1

    Quint

    5 \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quart \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^5) i=1-(1-x)^5, x=0 to 1

    Quart

    \ub124\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Cubic \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^4) i=1-(1-x)^4, x=0 to 1

    Cubic

    \uc138\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quad \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^3) i=1-(1-x)^3, x=0 to 1

    Quad

    \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. (^2) i=1-(1-x)^2, x=0 to 1

    Expo

    \uc9c0\uc218\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. \ub9e4\uc6b0 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4. i=1-2^(-10*x), x=0 to 1

    Sin

    \uc0ac\uc778 \ud30c\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sin(x*pi/2), x=0 to 1

    Circle

    \uc0ac\ubd84\uc6d0 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sqrt(1-(1-x)^2), x=0 to 1

    Back

    \uc2dc\uc791\uc2dc \ub4a4\ub85c \uc774\ub3d9\uc774 \uc788\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    Elastic

    \ud0c4\uc131\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    Bounce

    \ud280\uc5b4\uc624\ub984\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    TODO: \uc560\ub2c8\uba54\uc774\uc158 \ubbf8\ub9ac\ubcf4\uae30 \uc601\uc0c1 \ucd94\uac00

    "},{"location":"include/events/","title":"Events","text":"

    Event(name:string)

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 \uc774\ubca4\ud2b8\ub4e4\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4, MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up \ub4f1\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4 \uae30\ubcf8\uc801\uc73c\ub85c \ub85c\ube14\ub85d\uc2a4\uc758 \uae30\ubcf8 \uc774\ubca4\ud2b8\ub4e4\uacfc \ub2e4\ub974\uac8c, \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c - \ubc84\ud2bc\ud074\ub9ad
    Frame {\n    [Event \"MouseEnter\"] = function (self)\n        print(self.Name .. \"\uc5d0 \ub9c8\uc6b0\uc2a4\uac00 \uc62c\ub77c\uc654\uc2b5\ub2c8\ub2e4\")\n    end;\n}\n
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal TextButton = Class \"TextButton\"\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(200,200);\n    [Event \"MouseEnter\"] = function (self)\n        print(\"\ubc84\ud2bc\uc774 \ud074\ub9ad\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n    end;\n}\nMount(ScreenGUI, Store.GetObject(\"mainButton\"))\n

    Event.Created

    \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub418\uc5c8\uc744 \ub54c \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nFrame {\n    [Event.Created] = function (self)\n        print(self.Name .. \"\uc774 \uc0dd\uc131\ub418\uc5c8\uc5b4\uc694\")\n    end;\n}\n

    \uc8fc\uc758

    Event.Created \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4. Class.Extend \uc5d0\uc11c\ub294 AfterRender \ub97c \uc774\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.

    Event.CreatedAsync

    Event.Created \uc640 \ube44\uc2b7\ud558\uc9c0\ub9cc, \ucf54\ub8e8\ud2f4 \uc548\uc5d0\uc11c \uc791\ub3d9\ud569\ub2c8\ub2e4. objectList:EachAsync() \ucc98\ub7fc \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nFrame {\n    Frame {\n        Name = \"A\";\n        [Event.CreatedAsync] = function (self)\n            -- \uc774 \ud568\uc218\uac00 \ub05d\ub098\uc9c0 \uc54a\ub354\ub77c\ub3c4 \ub2e4\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \uc218 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4\n            task.wait(5)\n        end;\n    };\n    Frame {\n        Name = \"B\";\n        [Event.Created] = function (self)\n            print(self.Name .. \"\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n        end;\n    };\n}\n

    \uc8fc\uc758

    Event.CreatedAsync \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4.

    Event.Prop(propertyName:string)

    \ud504\ub85c\ud37c\ud2f0 \uac12\uc774 \ubcc0\uacbd\ub428\uc744 \uc5f0\uacb0\ud569\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nTextBox {\n    Text = \"\uc544\ubb34\uac70\ub098 \uc785\ub825\ud558\uc138\uc694\";\n    [Event.Prop \"Text\"] = function (self,text)\n        -- \ud3b8\uc758\uc0c1\uc758 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4\n        print(text)\n    end;\n}\n

    "},{"location":"include/extend/","title":"Extend","text":"

    self(name:string)->linker

    Extend \uba54\uc18c\ub4dc \uc804\uc5ed\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4. \ub9c1\ucee4\ub97c \ub9cc\ub4e4\uba70, PropertyChangedSignal \ub97c \uc774\uc5b4\uc8fc\uac70\ub098, self \uc5d0 \uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \uc815\ubcf4\ub294 Render \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.

    Overwite REQUIRED :Render(props:valueStore)

    \ud654\uba74\uc5d0 \uadf8\ub824\uc9c0\ub294 UI \ub97c \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. Extend \uac00 \uadf8\ub824\uc9c0\ub824\uba74 \ubb34\uc870\uac74 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4. \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4dc\ub294\ub370 \ub4e4\uc5b4\uac04 \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\uc744 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc90d\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130 \ubb38\ubc95\uc774 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\nlocal Mount = Quad.Mount\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        [Event \"MouseButton1Click\"] = function (self,x,y)\n            print((\"\ubc84\ud2bc\uc774 %d,%d \uc5d0\uc11c \ub20c\ub838\uc2b5\ub2c8\ub2e4\"):format(x,y))\n        end;\n        Size = props \"Size\";\n        Text = props \"Text\"; -- \ub808\uc9c0\uc2a4\ud130\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4\n    }\nend\n\nlocal myImported = Class(myClass)\nmyImported.Size = UDim2.fromOffset(200,200)\n\nlocal test = myImported {\n    Text = \"wow\"\n}\nMount(ScreenGUI, test)\n\n-- \ud14d\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    test.Text = \"w\"..(\"o\"):rep(#test.Text-1)..\"w\"\nend\n

    Overwite Option :Init(props:valueStore)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub418\uae30 \uc804\uc5d0 \ubbf8\ub9ac props \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Init(props)\n    -- Size \uac12\uc774 \uc5c6\ub2e4\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n    props:Default(\"Size\", UDim2.fromOffset(100,100))\n\n    -- \uc55e\uc5d0 _ \ub97c \ubd87\uc5ec \ub0b4\ubd80 \ubcc0\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc5b4\ub514\uc5d0\uc11c\ub098 \uc4f0\uc77c \uc218 \uc788\uc73c\uba70 register \uc5d0 \uc601\ud5a5\uc8fc\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    self._asdf = true\nend\nfunction myClass:Render(props)\n    return TextButton {\n        props \"Size\"\n    }\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported() -- \uc635\uc158 \uc5c6\uc74c\nprint(myButton.Size)\n

    Overwite Option :AfterRender(object:any)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub41c \ud6c4 \ud560 \uc791\uc5c5\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c Render \uac00 \ubc18\ud658\ud55c \uac12\uc774 \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\"; -- \uc790\uae30 \uc790\uc2e0\uc5d0 \uc774 \ubc84\ud2bc\uc744 \ub123\uc2b5\ub2c8\ub2e4\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button == object) -- true\nend\n\nlocal myImported = Class(myClass)\nmyImported() -- \uc635\uc158 \uc5c6\uc74c\n

    Overwite Option :Update()

    :Render \uc640 :AfterRender \ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0, \uc774\uc804\uc5d0 \uc788\ub358 \uc790\uc2dd\ub4e4\uc744 \ub2e4\uc2dc \ub04c\uc5b4\uc635\ub2c8\ub2e4. \uc774\uc804\uc758 Render \uacb0\uacfc\ub294 \uc81c\uac70\ub429\ub2c8\ub2e4

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:Update() -- update\nmyButton:Update() -- update\nmyButton:Update() -- update\n

    Overwite Option .Getter.<PropertyName>(self)

    \uac12\uc744 \uc5bb\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {}\nend\n-- \uac12\uc744 \uc77d\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Getter.Test(self)\n    return \"Hello World\"\nend\n\nlocal myImported = Class(myClass)\nprint(myImported().Test)\n

    Overwite Option .Setter.<PropertyName>(self,newValue:any)

    \uac12\uc744 \uc124\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\";\n        Text = \"wow\";\n    }\nend\n-- \uac12\uc744 \uc9c0\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Setter.Test(self,newValue)\n    self._button.Text = newValue\nend\nfunction myClass.Getter.Test(self)\n    return self._button.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nprint(myButton.Test)\nmyButton.Test = \"Hello World\"\nprint(myButton.Test)\n

    Overwite Option .UpdateTriggers.<PropertyName> = boolean?

    \ud574\ub2f9 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 Update \uac00 \uc218\ud589\ub420\uc9c0 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n-- \uac12 \ubcc0\uacbd\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4\nmyClass.UpdateTriggers.Test = true\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\n

    Overwite Option :Unload(object)

    :Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4

    :GetPropertyChangedSignal(propertyName:string)->Bindable

    \uac12 \ubcc0\uacbd\uc744 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 Bindable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. :EmitPropertyChangedSignal \uc73c\ub85c \uc774 \uc2dc\uadf8\ub110\uc744 \uc791\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\uc0c1 \uc774 \uc2dc\uadf8\ub110\uc774 \uc791\ub3d9\ud560 \ub54c, \uc0c8\ub85c\uc6b4 \uac12\uc774 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    :EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

    \ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd\uc2dc :GetPropertyChangedSignal \uc5d0 \ub4f1\ub85d\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \uc774 \ud568\uc218\ub97c \ud638\ucd9c\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c self.a = 1 \uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \ubc14\ub85c \uac12\uc744 \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc801\uc73c\ub85c \uc774 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ubc15\uc2a4\uc758 \ud14d\uc2a4\ud2b8 \ucc98\ub7fc \uac1d\uccb4\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc5f0\ub3d9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc774 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. changedValue \ub294 \uc120\ud0dd\uc0ac\ud56d\uc774\uba70, \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc73c\uba74 self[propertyName]\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextBox = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_box\";\n        Text = \"test\";\n        Size = UDim2.fromOffset(200,200);\n        [Evnet.Prop \"Text\"] = function (this,newValue)\n            self:EmitPropertyChangedSignal(\"Text\",newValue)\n        end;\n        -- [Evnet.Prop \"Text\"] = self \"Text\" \uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n        -- self(name:string) \ubb38\ubc95\uc73c\ub85c \ubcc0\uacbd \uc774\ubca4\ud2b8 \uc5ed\uc2dc \ub9c1\ud06c\n        -- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    }\nend\nfunction myClass.Getter.Text(self)\n    return self._box.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:GetPropertyChangedSignal(\"Text\"):Connect(function()\n    print(myButton.Text)\nend)\nMount(ScreenGUI, myButton)\n

    "},{"location":"include/locales/","title":"Locales","text":"

    Default (default) English (en_us) Spanish (es_es) French (fr_fr) Indonesian (id_id) Italian (it_it) Japanese (ja_jp) Korean (ko_kr) Russian (ru_ru) Thai (th_th) Turkish (tr_tr) Vietnamese (vi_vn) Portuguese (pt_br) German (de_de) ChineseSimplified (zh_cn) ChineseTraditional (zh_tw) Bulgarian (bg_bg) Bengali (bn_bd) Czech (cs_cz) Danish (da_dk) Greek (el_gr) Estonian (et_ee) Finnish (fi_fi) Hindi (hi_in) Croatian (hr_hr) Hungarian (hu_hu) Georgian (ka_ge) Kazakh (kk_kz) Khmer (km_kh) Lithuanian (lt_lt) Latvian (lv_lv) Malay (ms_my) Burmese (my_mm) Bokmal (nb_no) Dutch (nl_nl) Filipino (fil_ph) Polish (pl_pl) Romanian (ro_ro) Ukrainian (uk_ua) Sinhala (si_lk) Slovak (sk_sk) Slovenian (sl_sl) Albanian (sq_al) Bosnian (bs_ba) Serbian (sr_rs) Swedish (sv_se) Arabic (ar_001)

    "},{"location":"include/mounts/","title":"Mounts","text":"

    :Unmount()

    \uc774\ub807\uac8c \ud558\uba74 \ub9c8\uc6b4\ud2b8\ub41c Instance \ub97c \uc9c0\uc6cc\ubc84\ub9bd\ub2c8\ub2e4. Quad \ub294 \uc548\uc804\ud55c \uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 gc \uc758 \uae30\ub2a5\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, gc \uc2dc\uac04\ucc28\ub85c \uc778\ud574 Store.GetObject \uc5d0\uc11c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0ac\ub77c\uc9c0\ub294\ub370 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui,mainFrame)\n\nlocal childFrame = Frame {}\nlocal childFrameMount = Mount(mainFrame,childFrame)\nchildFrameMount:Unmount()\n-- childFrame \uc740 \ub2e8\uc21c\ud788 .Parent = nil \ub418\ub294 \uac83\uc744 \ub118\uc5b4 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc0ac\ub77c\uc9d1\ub2c8\ub2e4\n-- \uc989, Destroy() \uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4\n

    :Add(item:any)

    Mount \uc5d0 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ucc98\uc74c \uc124\uc815\ud55c to \uac12\uc744 \ub530\ub77c \ubd80\ubaa8\uac00 \uacb0\uc815\ub429\ub2c8\ub2e4.

    \uc774 \ub3d9\uc791\uc740 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4e4 \ub54c \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc\ub85c\ub4dc \ub3d9\uc791\uc2dc \uc9c1\uc811 \uc81c\uac70\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui, mainFrame)\n\nlocal lastListMount = Mount(mainFrame)\nlocal function refreshList()\n    lastListMount:Unmount() -- \uc774\uc804 children \uc744 \uc54c\uc544\uc11c \uc81c\uac70\ud569\ub2c8\ub2e4\n    for i = 1,10 do\n        lastListMount:Add(Frame { Name = tostring(i) })\n    end\nend\n\ntask.spawn(function()\n    while true do\n        refreshList()\n        task.wait(2)\n    end\nend)\n

    \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\uc804 children \uc744 \uac04\uc811\uc801\uc73c\ub85c \uc81c\uac70\ud558\uace0 \uc0c8\ub85c\uc6b4 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e8 ScrollFrame \uc758 \uacbd\uc6b0 CanvasPosition\uc774 \ucd08\uae30\ud654 \ub418\uc5b4\ubc84\ub9ac\ubbc0\ub85c \uc790\uc2dd\ub4e4\uc744 :Unmount() \ud558\uae30 \uc804\uc5d0 \uc704\uce58\ub97c \uc800\uc7a5\ud558\uace0 \ub2e4\uc2dc \ubd88\ub7ec\uc640\uc57c \ud569\ub2c8\ub2e4

    "},{"location":"include/objectList/","title":"objectList","text":"

    :Each((item:any, index:number)->())

    \uc77c\ubc18\uc801\uc778 \ubc18\ubcf5\uc785\ub2c8\ub2e4. for \ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uacfc \ud6a8\uacfc\uac00 \uac19\uc73c\ub098 \ud568\uc218\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4

    :EachAsync((item:any, index:number)->())

    \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 \ubc14\ub85c\ubc14\ub85c \ub2e4\uc74c \uc544\uc774\ud15c\uc73c\ub85c \ub118\uc5b4\uac11\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774 \uc774\uc6a9\ub429\ub2c8\ub2e4. wrap() \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub974\uac70\ub098, \ud544\uc694\uc131\uc774 \uc5c6\ub294\uacbd\uc6b0 \uc77c\ubc18\uc801\uc73c\ub85c :Each \ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub429\ub2c8\ub2e4

    :IsEmpty()

    \uc774 ObjectList \uac00 \ube44\uc5b4\uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Remove(indexOrItem:number|any)

    objectList \uc5d0\uc11c \ud574\ub2f9\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4. , & \ub97c \uc0ac\uc6a9\ud55c \uace0\uae09 \uac80\uc0c9\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    "},{"location":"include/quadProperty/","title":"quadProperty","text":"

    RoundSize:number?

    ImageLabel, ImageButton \uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc18d\uc131\uc785\ub2c8\ub2e4. \uc6d0\ud615 \uc774\ubbf8\uc9c0\uc5d0 Slice\ub97c \uc774\uc6a9\ud574 \ub465\uadfc \ud504\ub808\uc784\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c UICorner\ubcf4\ub2e4 \ubd80\ub4dc\ub7ec\uc6b4 \ucf54\ub108\ud6a8\uacfc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.

    Corner:number?

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 UI\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ub429\ub2c8\ub2e4. UICorner\ub97c \uc774\uc6a9\ud574 \ubaa8\uc11c\ub9ac \ubd80\ubd84\uc744 \ub465\uae00\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    PaddingAll:UDim?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc0c1\ud558\uc88c\uc6b0 \ubaa8\ub450 \uac19\uc740 \uac12\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4. PaddingAllOffset \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    PaddingAllOffset:number?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. PaddingAll\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc791\ub3d9\ud558\ub098, Offset\uac12\ub9cc \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PaddingAll \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Scale:number?

    UIScale\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. UIScale.Scale \uacfc \uac19\uc740 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4

    "},{"location":"include/register/","title":"Register","text":"

    register \ud2b9\uc218 \uba54\uc18c\ub4dc\uac00 \uc801\uc6a9\ub418\ub294 \uc21c\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    :Add(value:any)->register

    \uac12\uc5d0 \ub354\ud558\uae30\ub97c \ucde8\ud569\ub2c8\ub2e4. \uc74c\uc218\ud615\ud0dc\uac00 \uc81c\uacf5\ub418\ub294 \uacbd\uc6b0 \ube7c\uae30 \ucc98\ub7fc \uc791\ub3d9\ud569\ub2c8\ub2e4. number, Udim, UDim2, Color3, Vector2 \ub4f1 \ub354\ud560 \uc218 \uc788\ub294 \ubaa8\ub4e0\uac83\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.pos = UDim2.fromOffset(100,0)\n\nFrame \"mainFrame\" {\n    Position = myStore \"pos\":Add(UDim2.fromOffset(0,100));\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nwhile true do\n    myStore.pos = myStore.pos + UDim2.fromOffset(10,0)\n    task.wait(2)\nend\n

    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :With((store:valueStore, newValue:any, key:string)->())->register

    \ud568\uc218 \ub610\ub294 \ud14c\uc774\ube14\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4. Add \ubcf4\ub2e4 \ub098\uc911\uc5d0 \uc218\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud568\uc218\uc608\uc81c - \ud14c\uc774\ube14
    myStore \"size\":With(function (_,value)\n    return value * 2\nend)\n

    width \uac12\uc5d0 \ub9de\ucdb0 \uc790\ub3d9\uc73c\ub85c UI \uac00 \uc5c5\ub370\uc774\ud2b8\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.topbarSize = 60\nmyStore.width = 200\n\n-- \ub808\uc9c0\uc2a4\ud130\ub97c \ubcc0\uc218\ub85c \ub450\uace0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4\nlocal listItemSize = myStore \"width\":With(function()\n    return UDim2.fromOffset(myStore.width,60)\nend)\n\nFrame \"mainFrame\" {\n    Class \"UIListLayout\" { SortOrder = Enum.SortOrder.LayoutOrder };\n\n    -- \uc0ac\uc774\uc988\uac00 width \uc5d0 \ub9de\uac8c \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4\n    Size = myStore \"width\":With(function ()\n        return UDim.fromOffset(store.width,400)\n    end);\n\n    Frame \"Topbar\" {\n        LayoutOrder = 1;\n        BackgroundColor3 = Color3.fromRGB(255,0,0);\n        -- \uc774\ub807\uac8c \uc5ec\ub7ec \uac12\uc744 \ubb36\uc5b4\uc11c \ub450 \uac12\uc774 \ubcc0\uacbd\ub428, \ud639\uc740 \uadf8\uc774\uc0c1\uc744\n        -- \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        Size = myStore \"topbarSize,width\":With(function()\n            return UDim2.fromOffset(myStore.width,myStore.topbarSize)\n        end);\n    }\n    Frame \"ListItem\" {\n        LayoutOrder = 2;\n        BackgroundColor3 = Color3.fromRGB(0,255,0);\n        Size = listItemSize;\n    };\n    Frame \"ListItem\" {\n        LayoutOrder = 3;\n        BackgroundColor3 = Color3.fromRGB(0,0,255);\n        Size = listItemSize;\n    };\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- width \uac12\uc744 \ubcc0\uacbd\ud574\ubcf4\uc138\uc694\nwhile true do\n    myStore.width = myStore.width + 10\n    task.wait(1)\nend\n

    colors \ud14c\uc774\ube14 \uc548\uc5d0 \uc788\ub294 \uc0c9\uae54\ub4e4\uc744 \ub3cc\uc544\uac00\uba70 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nlocal colors = {\n    Color3.fromRGB(255,255,255);\n    Color3.fromRGB(255,255,0);\n    Color3.fromRGB(0,255,255);\n    Color3.fromRGB(255,0,255);\n    Color3.fromRGB(255,0,0);\n    Color3.fromRGB(0,255,0);\n    Color3.fromRGB(0,0,255);\n}\nmyStore.color = 1\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- colors \uc5d0\uc11c \uc778\ub371\uc2f1\ud574 \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4\n    BackgroundColor3 = myStore \"color\":With(colors);\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- \uc778\ub371\uc2a4\ub97c \uc21c\ud68c\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    myStore.color = (i-1)%(#colors)+2\nend\n
    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :Tween(options:TweenOptions)->register

    \ud2b8\uc708\uc744 \uc774\uc6a9\ud574 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4(\ucc98\uc74c \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc74c) \uc635\uc158\uc740 Tween \ubb38\uc11c\uc5d0 \ub098\uc640\uc788\ub294 \uc635\uc158\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud55c\uaebc\ubc88\uc5d0 \uc774\ub3d9
    -- Tween \uc635\uc158\uc744 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nmyStore \"size\":Tween{ Time = 2 }\n

    \ud504\ub808\uc784\uc744 \ud55c\uaebc\ubc88\uc5d0 \uc6c0\uc9c1\uc785\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.pos = UDim2.fromOffset(50,0)\nStyle \"TweenFrame\" {\n    Size = UDim2.fromOffset(50,50);\n    BackgroundColor3 = Color3.fromRGB(255,100,255);\n}\n\nFrame \"mainFrame\" {\n    BackgroundColor3 = Color3.fromRGB(255,255,255);\n    Size = UDim2.fromOffset(500,500);\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\":Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,100))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,200))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,300))\n            :Tween{Time = 2};\n    }\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nlocal on = false\nwhile true do\n    on = not on\n    myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0)\n    task.wait(1.5) -- \ud2b8\uc708\uc740 \ub36e\uc5b4 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \ub530\ub77c\uc11c 2 \ucd08\uc778 \uae38\uc774\ubcf4\ub2e4 \ub354 \ube68\ub9ac \ubc14\uafd4\ub3c4 \uc624\ub958\uac00 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\nend\n
    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :Default(value:any)->register

    \uae30\ubcf8\uac12\uc744 \uc815\ud569\ub2c8\ub2e4. \ub9cc\uc57d \uac12\uc774 nil \uc778 \uacbd\uc6b0 \uc774 \uac12\uc744 \uc0ac\uc6a9\ud558\uac8c \ub429\ub2c8\ub2e4. Add \ub098 With \ub4f1 \ub2e4\ub978\uac83\uc5d0 \uc601\ud5a5\ubc1b\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- color \uac12\uc774 \uc5c6\uc73c\ubbc0\ub85c Default \uc548\uc758 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n    BackgroundColor3 = myStore \"color\"\n        :Default(Color3.fromRGB(255,0,0));\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\ntask.wait(5)\nmyStore.color = Color3.fromRGB(0,255,0)\n

    \uc8fc\uc758
    • \ucc98\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \ub54c\uc5d0\ub9cc \uc774 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.
    • \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    :Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT

    \ub808\uc9c0\uc2a4\ud130\uc5d0 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4. \uac12\uc774 \ubcc0\uacbd\ub418\uba74 \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

    newValue \uc5d0\ub294 :Add, :With, :Tween, :Default \uac00 \ub530\ub85c \uacc4\uc0b0\ub418\uc9c0 \uc54a\uc73c\uba70, \uc124\uc815\ub41c \uac12\uc744 \uc544\ubb34 \uac00\uacf5 \uc5c6\uc774 \uc81c\uacf5\ud569\ub2c8\ub2e4

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \uc5ec\ub7ec \ubcc0\uacbd\uc0ac\ud56d \ucd94\uc801
    myStore.test = 1\n-- \ubc18\ud658 \uac12\uc740 \uc785\ub825\uc73c\ub85c \ub123\uc740 \ud568\uc218\uc785\ub2c8\ub2e4. !\uaf2d \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4\n-- :Register \ub294 \ud568\uc218\uac00 \uc0ac\ub77c\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \uac12\uc744 \uc720\uc9c0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\n-- \ub9cc\uc57d \ubc84\ub9b4 \uacbd\uc6b0 \uc77c\uc815 \uc2dc\uac04 \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nlocal func = myStore \"test\":Register(function(_,newValue)\n    -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n    print(newValue)\nend)\nmyStore.test = 2\n

    myStore.test1, myStore.test2 \uac00 \ubcc0\ud654\ud558\uba74 print \ud568\uc218\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\n\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.test1 = 1\nmyStore.test2 = \"Hello\"\n\nlocal func = myStore \"test1,test2\":Register(function()\n    print(myStore.test1,myStore.test2)\nend)\n\nmyStore.test1 = 2\n
    \uc8fc\uc758

    Register \uc548\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub294 GC \uc548\uc815\uc131\uc744 \uc704\ud574\uc11c \uc57d\ud55c \ucc38\uc870\ub85c \uc800\uc7a5\ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c \ud568\uc218\ub97c \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4.

    "},{"location":"include/tween/","title":"Tween","text":"

    Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

    \ud2b8\uc708\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\uc708 \uc635\uc158\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 TweenOptions \ubb38\uc11c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ended, OnStepped, Setter, Getter \uac12\uc774 \uc124\uc815\ub418\uba74 Option \uc548\uc758 \uac12\ubcf4\ub2e4 \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uae30\ub2a5\uc740 TweenOptions\uc758 \ub0b4\uc6a9\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0ac \uc218 \uc788\ub3c4\ub85d TweenHandler \uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. \ub2e4\ub978 \ud2b8\uc708\uc774 \ubcc0\uacbd\uc911\uc778 \uc18d\uc131\uc774 \ub2e4\uc2dc \ud2b8\uc708\ud558\ub3c4\ub85d \ud638\ucd9c\ub418\uba74, \uc774\uc804 \ud2b8\uc708\uc5d0\uc11c \ud574\ub2f9 \uc18d\uc131\uc740 \ud2b8\uc708\uc774 \uc911\ub2e8\ub418\uba70 \uc0c8\ub85c\uc6b4 \ud2b8\uc708\uc73c\ub85c \ub36e\uc5b4\uc4f0\uae30 \ub429\ub2c8\ub2e4.

    Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

    Tween.RunTween \uc640 \uac19\uc73c\ub098 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\ud569\ub2c8\ub2e4. \uc544\ubb34\uac83\ub3c4 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    Tween.RunTween({myFrame1, myFrame2, myFrame3},{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.StopTween(ItemOrHandler:TweenHandler|any)

    \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4. TweenHandler \ub610\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc5b4 \uba48\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc73c\uba74 \uadf8 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc2e4\ud589\uc911\uc778 \ubaa8\ub4e0 \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4.

    TweenHandler \uc774\uc6a9\uc624\ube0c\uc81d\ud2b8 \uc774\uc6a9
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(Handler)\n
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(myFrame)\n

    Tween.StopPropertyTween(Item:any, PropertyName:string)

    \uc624\ube0c\uc81d\ud2b8\uc5d0 \ud2b9\uc815 \ud504\ub85c\ud37c\ud2f0\uc758 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0b5\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8 \ub610\ub294 TweenHandler \ub85c \ud2b8\uc708\uc774 \uc9c4\ud589\uc911\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4.

    Tween.IsPropertyTweening(Item:any, PropertyName:string)

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8\uc758 \ud504\ub85c\ud37c\ud2f0\uac00 \ud2b8\uc708\uc911\uc774\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \uadf8\ub798\ud504\uc640 \ubbf8\ub9ac\ubcf4\uae30\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \uc790\uc138\ud55c \uc815\ubcf4\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"include/tweenOptions/","title":"tweenOptions","text":"

    Option Time:number?

    \ud2b8\uc708\uc758 \ucd1d \uae38\uc774\ub97c \uc815\ud569\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 1\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    Option Easing:string|(index:number)->number?

    \ud2b8\uc708\uc758 \uac00\uac10\uc18d \uc815\ub3c4\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Easings.Linear\uc640 \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud639\uc740 \ud544\uc694\uc5d0 \ub530\ub77c \ud568\uc218\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c Easing \uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c 1\ucc28 \uc9c4\ud589\ub3c4 (Linear, 0 \uc5d0\uc11c 1 \uc0ac\uc774\uc758 \uac12) \uac12\uc774 \uc8fc\uc5b4\uc9c0\uba70, \uacc4\uc0b0 \uacb0\uacfc\ub85c \uc2e4\uc81c \uc801\uc6a9\ub420 \uc704\uce58\ub97c \ubc18\ud658\ud574\uc57c\ud569\ub2c8\ub2e4. \ubc18\ud658\uac12\uc740 \uc74c\uc218\uc774\uac70\ub098 1 \ubcf4\ub2e4 \ud074 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Exp2\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \ud568\uc218\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option Direction:string?

    \ud2b8\uc708\uc774 \uc9c4\ud589\ub418\ub294 \ubc29\ud5a5\uc785\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Directions.Out\uacfc \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Out\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \ubc29\ud5a5\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option CallBack:{[number|\"*\"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uc2e4\ud589\uc911\uc778 \ub3c4\uc911\uc5d0 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b8\uc708\uc758 \uc9c4\ud589 \uc815\ub3c4\uc5d0 \ub530\ub77c\uc11c \ud55c\ubc88 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uac70\ub098 \ud2b8\uc708 \uc9c4\ud589\uc911 \uacc4\uc18d\ud574\uc11c \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub371\uc2a4\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0 \ud574\ub2f9 \uc9c0\uc810\uc744 \ub118\uc744 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70, \"*\" \ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uba74 \ubaa8\ub4e0 \ubd80\ubd84\uc5d0\uc11c \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \ud568\uc218\uc5d0\ub294 \ud3b8\uc758\uc0c1 \ud2b8\uc708\uc744 \ud558\uace0\uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \uc704\uce58\uac12, \uc2dc\uac04\ub9cc\uc744 \uace0\ub824\ud55c 1\ucc28 \uc704\uce58\uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 \"*\" \ub97c \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 1\uc744 \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Getter:(Item:any, Property:string)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc5bb\uc73c\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc124\uc815\ud558\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984, \uc124\uc815\ud560 \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"include/typeDirections/","title":"typeDirections","text":"
    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    "},{"location":"include/typeEasings/","title":"typeEasings","text":"
    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    "},{"location":"reference/","title":"Reference","text":"

    \uc774 \uc139\uc158\uc740 api \ub0b4\uc6a9\uc744 \ub098\uc5f4\ud558\uc9c0\ub9cc, \uae4a\uac8c \uc124\uba85\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud29c\ud1a0\ub9ac\uc5bc \ubb38\uc11c\ub97c \uc77d\uc5b4\ubcf4\ub294\uac83\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4.

    "},{"location":"reference/event/","title":"Event","text":""},{"location":"reference/extend/","title":"Extend","text":"

    self(name:string)->linker

    Extend \uba54\uc18c\ub4dc \uc804\uc5ed\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4. \ub9c1\ucee4\ub97c \ub9cc\ub4e4\uba70, PropertyChangedSignal \ub97c \uc774\uc5b4\uc8fc\uac70\ub098, self \uc5d0 \uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \uc815\ubcf4\ub294 Render \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.

    Overwite REQUIRED :Render(props:valueStore)

    \ud654\uba74\uc5d0 \uadf8\ub824\uc9c0\ub294 UI \ub97c \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. Extend \uac00 \uadf8\ub824\uc9c0\ub824\uba74 \ubb34\uc870\uac74 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4. \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4dc\ub294\ub370 \ub4e4\uc5b4\uac04 \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\uc744 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc90d\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130 \ubb38\ubc95\uc774 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\nlocal Mount = Quad.Mount\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        [Event \"MouseButton1Click\"] = function (self,x,y)\n            print((\"\ubc84\ud2bc\uc774 %d,%d \uc5d0\uc11c \ub20c\ub838\uc2b5\ub2c8\ub2e4\"):format(x,y))\n        end;\n        Size = props \"Size\";\n        Text = props \"Text\"; -- \ub808\uc9c0\uc2a4\ud130\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4\n    }\nend\n\nlocal myImported = Class(myClass)\nmyImported.Size = UDim2.fromOffset(200,200)\n\nlocal test = myImported {\n    Text = \"wow\"\n}\nMount(ScreenGUI, test)\n\n-- \ud14d\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    test.Text = \"w\"..(\"o\"):rep(#test.Text-1)..\"w\"\nend\n

    Overwite Option :Init(props:valueStore)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub418\uae30 \uc804\uc5d0 \ubbf8\ub9ac props \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Init(props)\n    -- Size \uac12\uc774 \uc5c6\ub2e4\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n    props:Default(\"Size\", UDim2.fromOffset(100,100))\n\n    -- \uc55e\uc5d0 _ \ub97c \ubd87\uc5ec \ub0b4\ubd80 \ubcc0\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc5b4\ub514\uc5d0\uc11c\ub098 \uc4f0\uc77c \uc218 \uc788\uc73c\uba70 register \uc5d0 \uc601\ud5a5\uc8fc\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    self._asdf = true\nend\nfunction myClass:Render(props)\n    return TextButton {\n        props \"Size\"\n    }\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported() -- \uc635\uc158 \uc5c6\uc74c\nprint(myButton.Size)\n

    Overwite Option :AfterRender(object:any)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub41c \ud6c4 \ud560 \uc791\uc5c5\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c Render \uac00 \ubc18\ud658\ud55c \uac12\uc774 \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\"; -- \uc790\uae30 \uc790\uc2e0\uc5d0 \uc774 \ubc84\ud2bc\uc744 \ub123\uc2b5\ub2c8\ub2e4\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button == object) -- true\nend\n\nlocal myImported = Class(myClass)\nmyImported() -- \uc635\uc158 \uc5c6\uc74c\n

    Overwite Option :Update()

    :Render \uc640 :AfterRender \ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0, \uc774\uc804\uc5d0 \uc788\ub358 \uc790\uc2dd\ub4e4\uc744 \ub2e4\uc2dc \ub04c\uc5b4\uc635\ub2c8\ub2e4. \uc774\uc804\uc758 Render \uacb0\uacfc\ub294 \uc81c\uac70\ub429\ub2c8\ub2e4

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:Update() -- update\nmyButton:Update() -- update\nmyButton:Update() -- update\n

    Overwite Option .Getter.<PropertyName>(self)

    \uac12\uc744 \uc5bb\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {}\nend\n-- \uac12\uc744 \uc77d\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Getter.Test(self)\n    return \"Hello World\"\nend\n\nlocal myImported = Class(myClass)\nprint(myImported().Test)\n

    Overwite Option .Setter.<PropertyName>(self,newValue:any)

    \uac12\uc744 \uc124\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\";\n        Text = \"wow\";\n    }\nend\n-- \uac12\uc744 \uc9c0\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Setter.Test(self,newValue)\n    self._button.Text = newValue\nend\nfunction myClass.Getter.Test(self)\n    return self._button.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nprint(myButton.Test)\nmyButton.Test = \"Hello World\"\nprint(myButton.Test)\n

    Overwite Option .UpdateTriggers.<PropertyName> = boolean?

    \ud574\ub2f9 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 Update \uac00 \uc218\ud589\ub420\uc9c0 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n-- \uac12 \ubcc0\uacbd\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4\nmyClass.UpdateTriggers.Test = true\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\n

    Overwite Option :Unload(object)

    :Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4

    :GetPropertyChangedSignal(propertyName:string)->Bindable

    \uac12 \ubcc0\uacbd\uc744 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 Bindable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. :EmitPropertyChangedSignal \uc73c\ub85c \uc774 \uc2dc\uadf8\ub110\uc744 \uc791\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\uc0c1 \uc774 \uc2dc\uadf8\ub110\uc774 \uc791\ub3d9\ud560 \ub54c, \uc0c8\ub85c\uc6b4 \uac12\uc774 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    :EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

    \ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd\uc2dc :GetPropertyChangedSignal \uc5d0 \ub4f1\ub85d\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \uc774 \ud568\uc218\ub97c \ud638\ucd9c\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c self.a = 1 \uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \ubc14\ub85c \uac12\uc744 \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc801\uc73c\ub85c \uc774 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ubc15\uc2a4\uc758 \ud14d\uc2a4\ud2b8 \ucc98\ub7fc \uac1d\uccb4\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc5f0\ub3d9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc774 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. changedValue \ub294 \uc120\ud0dd\uc0ac\ud56d\uc774\uba70, \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc73c\uba74 self[propertyName]\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextBox = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_box\";\n        Text = \"test\";\n        Size = UDim2.fromOffset(200,200);\n        [Evnet.Prop \"Text\"] = function (this,newValue)\n            self:EmitPropertyChangedSignal(\"Text\",newValue)\n        end;\n        -- [Evnet.Prop \"Text\"] = self \"Text\" \uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n        -- self(name:string) \ubb38\ubc95\uc73c\ub85c \ubcc0\uacbd \uc774\ubca4\ud2b8 \uc5ed\uc2dc \ub9c1\ud06c\n        -- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    }\nend\nfunction myClass.Getter.Text(self)\n    return self._box.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:GetPropertyChangedSignal(\"Text\"):Connect(function()\n    print(myButton.Text)\nend)\nMount(ScreenGUI, myButton)\n

    "},{"location":"reference/lang/","title":"Lang","text":"

    Lang.FailedMessage:string

    \uc544\ubb34\ub7f0 \ubc88\uc5ed \uac12\ub3c4 \uc5bb\uc5b4\uc624\uc9c0 \ubabb\ud558\uc600\uc744\ub54c \ubcf4\uc5ec\uc904 \ubb38\uc790\uc5f4\uc785\ub2c8\ub2e4. \ubcc0\uacbd\uc2dc \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\uac00 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.

    Lang.CurrentLocale:Locale<item of Lang.Locales>

    \ud604\uc81c \uc0ac\uc6a9\uc911\uc778 \uc5b8\uc5b4\uc785\ub2c8\ub2e4. \ubcc0\uacbd\uc2dc \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\uac00 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4. Lang.Locales \uc548\uc758 \uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.

    "},{"location":"reference/lang/#langlocales","title":"Lang.Locales","text":"

    Default (default) English (en_us) Spanish (es_es) French (fr_fr) Indonesian (id_id) Italian (it_it) Japanese (ja_jp) Korean (ko_kr) Russian (ru_ru) Thai (th_th) Turkish (tr_tr) Vietnamese (vi_vn) Portuguese (pt_br) German (de_de) ChineseSimplified (zh_cn) ChineseTraditional (zh_tw) Bulgarian (bg_bg) Bengali (bn_bd) Czech (cs_cz) Danish (da_dk) Greek (el_gr) Estonian (et_ee) Finnish (fi_fi) Hindi (hi_in) Croatian (hr_hr) Hungarian (hu_hu) Georgian (ka_ge) Kazakh (kk_kz) Khmer (km_kh) Lithuanian (lt_lt) Latvian (lv_lv) Malay (ms_my) Burmese (my_mm) Bokmal (nb_no) Dutch (nl_nl) Filipino (fil_ph) Polish (pl_pl) Romanian (ro_ro) Ukrainian (uk_ua) Sinhala (si_lk) Slovak (sk_sk) Slovenian (sl_sl) Albanian (sq_al) Bosnian (bs_ba) Serbian (sr_rs) Swedish (sv_se) Arabic (ar_001)

    "},{"location":"reference/mounts/","title":"Mounts","text":"

    :Unmount()

    \uc774\ub807\uac8c \ud558\uba74 \ub9c8\uc6b4\ud2b8\ub41c Instance \ub97c \uc9c0\uc6cc\ubc84\ub9bd\ub2c8\ub2e4. Quad \ub294 \uc548\uc804\ud55c \uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 gc \uc758 \uae30\ub2a5\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, gc \uc2dc\uac04\ucc28\ub85c \uc778\ud574 Store.GetObject \uc5d0\uc11c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0ac\ub77c\uc9c0\ub294\ub370 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui,mainFrame)\n\nlocal childFrame = Frame {}\nlocal childFrameMount = Mount(mainFrame,childFrame)\nchildFrameMount:Unmount()\n-- childFrame \uc740 \ub2e8\uc21c\ud788 .Parent = nil \ub418\ub294 \uac83\uc744 \ub118\uc5b4 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc0ac\ub77c\uc9d1\ub2c8\ub2e4\n-- \uc989, Destroy() \uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4\n

    :Add(item:any)

    Mount \uc5d0 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ucc98\uc74c \uc124\uc815\ud55c to \uac12\uc744 \ub530\ub77c \ubd80\ubaa8\uac00 \uacb0\uc815\ub429\ub2c8\ub2e4.

    \uc774 \ub3d9\uc791\uc740 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4e4 \ub54c \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc\ub85c\ub4dc \ub3d9\uc791\uc2dc \uc9c1\uc811 \uc81c\uac70\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui, mainFrame)\n\nlocal lastListMount = Mount(mainFrame)\nlocal function refreshList()\n    lastListMount:Unmount() -- \uc774\uc804 children \uc744 \uc54c\uc544\uc11c \uc81c\uac70\ud569\ub2c8\ub2e4\n    for i = 1,10 do\n        lastListMount:Add(Frame { Name = tostring(i) })\n    end\nend\n\ntask.spawn(function()\n    while true do\n        refreshList()\n        task.wait(2)\n    end\nend)\n

    \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\uc804 children \uc744 \uac04\uc811\uc801\uc73c\ub85c \uc81c\uac70\ud558\uace0 \uc0c8\ub85c\uc6b4 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e8 ScrollFrame \uc758 \uacbd\uc6b0 CanvasPosition\uc774 \ucd08\uae30\ud654 \ub418\uc5b4\ubc84\ub9ac\ubbc0\ub85c \uc790\uc2dd\ub4e4\uc744 :Unmount() \ud558\uae30 \uc804\uc5d0 \uc704\uce58\ub97c \uc800\uc7a5\ud558\uace0 \ub2e4\uc2dc \ubd88\ub7ec\uc640\uc57c \ud569\ub2c8\ub2e4

    "},{"location":"reference/quadProperty/","title":"QuadProperty","text":"

    RoundSize:number?

    ImageLabel, ImageButton \uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc18d\uc131\uc785\ub2c8\ub2e4. \uc6d0\ud615 \uc774\ubbf8\uc9c0\uc5d0 Slice\ub97c \uc774\uc6a9\ud574 \ub465\uadfc \ud504\ub808\uc784\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c UICorner\ubcf4\ub2e4 \ubd80\ub4dc\ub7ec\uc6b4 \ucf54\ub108\ud6a8\uacfc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.

    Corner:number?

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 UI\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ub429\ub2c8\ub2e4. UICorner\ub97c \uc774\uc6a9\ud574 \ubaa8\uc11c\ub9ac \ubd80\ubd84\uc744 \ub465\uae00\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    PaddingAll:UDim?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc0c1\ud558\uc88c\uc6b0 \ubaa8\ub450 \uac19\uc740 \uac12\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4. PaddingAllOffset \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    PaddingAllOffset:number?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. PaddingAll\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc791\ub3d9\ud558\ub098, Offset\uac12\ub9cc \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PaddingAll \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Scale:number?

    UIScale\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. UIScale.Scale \uacfc \uac19\uc740 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4

    "},{"location":"reference/signal/","title":"Signal","text":"

    Signal.Bindable.New(id:string)->Bindable

    \uc0c8\ub85c\uc6b4 Bindable \uc744 \uc0dd\uc131\ud558\uac70\ub098 \uc774\uc804\uc758 Bindable \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    Signal.Disconnecter.New(id:string)->Disconnecter

    \uc0c8\ub85c\uc6b4 Disconnecter \uc744 \uc0dd\uc131\ud558\uac70\ub098 \uc774\uc804\uc758 Disconnecter \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    "},{"location":"reference/signal/bindable/","title":"Bindable","text":"

    :Fire(...any)

    \ub4f1\ub85d\ub41c \uc5f0\uacb0\ub4e4\uc744 \uc2e4\ud589\ud558\uace0, Wait \uc744 \ud480\uc5b4\uc90d\ub2c8\ub2e4.

    :Wait()->(...any)

    Fire \uac00 \ud638\ucd9c\ub420 \ub54c \uae4c\uc9c0 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.

    :Connect((...any)->())->Connection

    Fire \uac00 \ud638\ucd9c \ub420 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ud638\ucd9c \uc778\uc790\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc5f0\uacb0\uc744 \ub04a\uc744 \uc218 \uc788\ub3c4\ub85d Connection \uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Once((...any)->())->Connection

    Connect \uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Fire \uac00 \ud55c\ubc88 \ud638\ucd9c\ub41c \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4/

    :CheckConnected(func)->boolean

    \ud568\uc218\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :DisconnectAll()

    \ubaa8\ub4e0 \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Wait \uc73c\ub85c \uae30\ub2e4\ub9ac\uace0 \uc788\ub294 \uacf3\uc5d0\ub294 nil \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Destroy()

    :DisconnectAll() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"reference/signal/disconnecter/","title":"Disconnecter","text":"

    :Add(connection:Connection|RBXScriptConnection)

    connection\uc744 \ub9ac\uc2a4\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub098\uc911\uc5d0 :Disconnect\ub97c \ud638\ucd9c\ud558\uba74 \ucd94\uac00\ub41c \uc5f0\uacb0\uc774 \ud30c\uae30\ub429\ub2c8\ub2e4.

    :Disconnect()

    \ucd94\uac00\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\uc5d0 Disconnect() \ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ud638\ucd9c \ud6c4\uc5d0 \ucd94\uac00\ub41c \uc5f0\uacb0\uc740 \ubaa8\ub450 \uc0ac\ub77c\uc9c0\uba70. \uc774 \uc694\uccad \ud6c4\uc5d0\ub3c4 \ub2e4\uc2dc :Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4 Disconnecter \ub97c \uc644\uc804\ud788 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub824\uba74 :Destroy \ub97c \ud638\ucd9c\ud558\uc138\uc694

    :Destroy()

    :Disconnect() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"reference/store/","title":"Store","text":"

    Store.GetStore(id:string?)->store

    \uac12\ub4e4\uc744 \uc800\uc7a5\ud558\uace0 \ub808\uc9c0\uc2a4\ud130\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub294 \uac12 \uc800\uc7a5\uc18c\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    Store.GetObject(id:string)->Object?

    \ud574\ub2f9 id \ub97c \uac00\uc9c4 \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    Store.GetObjects(id:string)->objectList?

    \ud574\ub2f9 id \ub97c \uac00\uc9c4 \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \ubc18\ud658\uc740 objectList \ud0c0\uc785\uc744 \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uace0\uae09 ID \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc790\uc138\ud55c \uc0ac\ud56d\uc740 \ud29c\ud1a0\ub9ac\uc5bc \ubb38\uc11c\ub97c \ud655\uc778\ud558\uc138\uc694.

    "},{"location":"reference/store/objectList/","title":"ObjectList","text":"

    :Each((item:any, index:number)->())

    \uc77c\ubc18\uc801\uc778 \ubc18\ubcf5\uc785\ub2c8\ub2e4. for \ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uacfc \ud6a8\uacfc\uac00 \uac19\uc73c\ub098 \ud568\uc218\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4

    :EachAsync((item:any, index:number)->())

    \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 \ubc14\ub85c\ubc14\ub85c \ub2e4\uc74c \uc544\uc774\ud15c\uc73c\ub85c \ub118\uc5b4\uac11\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774 \uc774\uc6a9\ub429\ub2c8\ub2e4. wrap() \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub974\uac70\ub098, \ud544\uc694\uc131\uc774 \uc5c6\ub294\uacbd\uc6b0 \uc77c\ubc18\uc801\uc73c\ub85c :Each \ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub429\ub2c8\ub2e4

    :IsEmpty()

    \uc774 ObjectList \uac00 \ube44\uc5b4\uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Remove(indexOrItem:number|any)

    objectList \uc5d0\uc11c \ud574\ub2f9\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4. , & \ub97c \uc0ac\uc6a9\ud55c \uace0\uae09 \uac80\uc0c9\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    "},{"location":"reference/tween/","title":"Tween","text":"

    Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

    \ud2b8\uc708\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\uc708 \uc635\uc158\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 TweenOptions \ubb38\uc11c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ended, OnStepped, Setter, Getter \uac12\uc774 \uc124\uc815\ub418\uba74 Option \uc548\uc758 \uac12\ubcf4\ub2e4 \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uae30\ub2a5\uc740 TweenOptions\uc758 \ub0b4\uc6a9\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0ac \uc218 \uc788\ub3c4\ub85d TweenHandler \uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. \ub2e4\ub978 \ud2b8\uc708\uc774 \ubcc0\uacbd\uc911\uc778 \uc18d\uc131\uc774 \ub2e4\uc2dc \ud2b8\uc708\ud558\ub3c4\ub85d \ud638\ucd9c\ub418\uba74, \uc774\uc804 \ud2b8\uc708\uc5d0\uc11c \ud574\ub2f9 \uc18d\uc131\uc740 \ud2b8\uc708\uc774 \uc911\ub2e8\ub418\uba70 \uc0c8\ub85c\uc6b4 \ud2b8\uc708\uc73c\ub85c \ub36e\uc5b4\uc4f0\uae30 \ub429\ub2c8\ub2e4.

    Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

    Tween.RunTween \uc640 \uac19\uc73c\ub098 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\ud569\ub2c8\ub2e4. \uc544\ubb34\uac83\ub3c4 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    Tween.RunTween({myFrame1, myFrame2, myFrame3},{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.StopTween(ItemOrHandler:TweenHandler|any)

    \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4. TweenHandler \ub610\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc5b4 \uba48\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc73c\uba74 \uadf8 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc2e4\ud589\uc911\uc778 \ubaa8\ub4e0 \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4.

    TweenHandler \uc774\uc6a9\uc624\ube0c\uc81d\ud2b8 \uc774\uc6a9
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(Handler)\n
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(myFrame)\n

    Tween.StopPropertyTween(Item:any, PropertyName:string)

    \uc624\ube0c\uc81d\ud2b8\uc5d0 \ud2b9\uc815 \ud504\ub85c\ud37c\ud2f0\uc758 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0b5\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8 \ub610\ub294 TweenHandler \ub85c \ud2b8\uc708\uc774 \uc9c4\ud589\uc911\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4.

    Tween.IsPropertyTweening(Item:any, PropertyName:string)

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8\uc758 \ud504\ub85c\ud37c\ud2f0\uac00 \ud2b8\uc708\uc911\uc774\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \uadf8\ub798\ud504\uc640 \ubbf8\ub9ac\ubcf4\uae30\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \uc790\uc138\ud55c \uc815\ubcf4\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"reference/tween/directions/","title":"Tween.Directions","text":"

    Out \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.

    In \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.

    InOut \uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.

    "},{"location":"reference/tween/easings/","title":"Tween.Easings","text":"\ubbf8\ub9ac\ubcf4\uae30\uadf8\ub798\ud504 \uac1c\ud615

    \ubaa8\ub4e0 Easing \uc740 \uc5ec\uae30\uc5d0\uc11c \uc9c1\uc811\uc801\uc73c\ub85c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    Linear

    \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615 \ud568\uc218\uc785\ub2c8\ub2e4 i=x, x=0 to 1

    Quint

    5 \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quart \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^5) i=1-(1-x)^5, x=0 to 1

    Quart

    \ub124\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Cubic \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^4) i=1-(1-x)^4, x=0 to 1

    Cubic

    \uc138\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quad \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^3) i=1-(1-x)^3, x=0 to 1

    Quad

    \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. (^2) i=1-(1-x)^2, x=0 to 1

    Expo

    \uc9c0\uc218\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. \ub9e4\uc6b0 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4. i=1-2^(-10*x), x=0 to 1

    Sin

    \uc0ac\uc778 \ud30c\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sin(x*pi/2), x=0 to 1

    Circle

    \uc0ac\ubd84\uc6d0 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sqrt(1-(1-x)^2), x=0 to 1

    Back

    \uc2dc\uc791\uc2dc \ub4a4\ub85c \uc774\ub3d9\uc774 \uc788\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    Elastic

    \ud0c4\uc131\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    Bounce

    \ud280\uc5b4\uc624\ub984\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    TODO: \uc560\ub2c8\uba54\uc774\uc158 \ubbf8\ub9ac\ubcf4\uae30 \uc601\uc0c1 \ucd94\uac00

    "},{"location":"reference/tween/tweenOptions/","title":"TweenOptions","text":"

    Option Time:number?

    \ud2b8\uc708\uc758 \ucd1d \uae38\uc774\ub97c \uc815\ud569\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 1\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    Option Easing:string|(index:number)->number?

    \ud2b8\uc708\uc758 \uac00\uac10\uc18d \uc815\ub3c4\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Easings.Linear\uc640 \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud639\uc740 \ud544\uc694\uc5d0 \ub530\ub77c \ud568\uc218\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c Easing \uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c 1\ucc28 \uc9c4\ud589\ub3c4 (Linear, 0 \uc5d0\uc11c 1 \uc0ac\uc774\uc758 \uac12) \uac12\uc774 \uc8fc\uc5b4\uc9c0\uba70, \uacc4\uc0b0 \uacb0\uacfc\ub85c \uc2e4\uc81c \uc801\uc6a9\ub420 \uc704\uce58\ub97c \ubc18\ud658\ud574\uc57c\ud569\ub2c8\ub2e4. \ubc18\ud658\uac12\uc740 \uc74c\uc218\uc774\uac70\ub098 1 \ubcf4\ub2e4 \ud074 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Exp2\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \ud568\uc218\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option Direction:string?

    \ud2b8\uc708\uc774 \uc9c4\ud589\ub418\ub294 \ubc29\ud5a5\uc785\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Directions.Out\uacfc \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Out\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \ubc29\ud5a5\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option CallBack:{[number|\"*\"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uc2e4\ud589\uc911\uc778 \ub3c4\uc911\uc5d0 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b8\uc708\uc758 \uc9c4\ud589 \uc815\ub3c4\uc5d0 \ub530\ub77c\uc11c \ud55c\ubc88 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uac70\ub098 \ud2b8\uc708 \uc9c4\ud589\uc911 \uacc4\uc18d\ud574\uc11c \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub371\uc2a4\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0 \ud574\ub2f9 \uc9c0\uc810\uc744 \ub118\uc744 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70, \"*\" \ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uba74 \ubaa8\ub4e0 \ubd80\ubd84\uc5d0\uc11c \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \ud568\uc218\uc5d0\ub294 \ud3b8\uc758\uc0c1 \ud2b8\uc708\uc744 \ud558\uace0\uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \uc704\uce58\uac12, \uc2dc\uac04\ub9cc\uc744 \uace0\ub824\ud55c 1\ucc28 \uc704\uce58\uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 \"*\" \ub97c \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 1\uc744 \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Getter:(Item:any, Property:string)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc5bb\uc73c\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc124\uc815\ud558\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984, \uc124\uc815\ud560 \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/","title":"Getting Started","text":"

    \uc2e4\ud5d8\uc801\uc778 \ubaa8\ub4c8

    \uc774 \ubaa8\ub4c8\uc740 \uc5c5\ub370\uc774\ud2b8\uac00 \ube48\ubc88\ud569\ub2c8\ub2e4! \ud56d\uc0c1 Github \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694!

    "},{"location":"tutorial/#_1","title":"\uba38\ub9ac\ub9d0","text":"

    \uc774 \ud398\uc774\uc9c0\ub294 Quad \ubaa8\ub4c8\uc744 \uc27d\uac8c \uc2dc\uc791\ud560 \uc218 \uc788\ub3c4\ub85d \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc81c\uacf5\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud398\uc774\uc9c0\ub97c \uc815\ub3c5\ud574 Quad \ubaa8\ub4c8\uc758 \uc804\ubc18\uc801\uc778 \uc0ac\uc6a9\ubc95\uc744 \ud30c\uc545\ud574\ubcf4\uc138\uc694!

    \ubcc0\uacbd \uc0ac\ud56d\uc740 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/#_2","title":"\uc124\uce58","text":"

    3\uac00\uc9c0 \ubc29\ubc95\uc911 \uac00\uc7a5 \ud3b8\ud55c \ubc29\ubc95\uc744 \uc120\ud0dd\ud574 \ubaa8\ub4c8\uc744 \uc124\uce58\ud574\uc8fc\uc138\uc694.

    "},{"location":"tutorial/#rbxmx","title":"\ub4dc\ub808\uadf8 \uc5d4 \ub4dc\ub86d / rbxmx \ud30c\uc77c","text":"

    \ub4dc\ub808\uadf8\ud574 \uc2a4\ud29c\ub514\uc624\uc5d0 \ub123\uc744 \uc218 \uc788\ub294 \ubaa8\ub4c8 \ud30c\uc77c\uc785\ub2c8\ub2e4.

    RBXMX \ub2e4\uc6b4\ub85c\ub4dc

    \ub2e4\uc6b4\ub85c\ub4dc\ud574 \uc2a4\ud29c\ub514\uc624\uc5d0 \uc62e\uaca8\uc8fc\uc138\uc694.

    "},{"location":"tutorial/#git-clone","title":"git clone","text":"

    rojo \ub97c \uc0ac\uc6a9\ud574 \ube4c\ub4dc\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4\uba74 Quad \ub97c \uc9c1\uc811 \ube4c\ub4dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    git clone https://github.com/qwreey75/Quad Quad\ncd Quad\nmake build\n

    \uc708\ub3c4\uc6b0\uc758 \uacbd\uc6b0 make build \ub300\uc2e0 rojo build default.project.json -o output.rbxmx \ub97c \uc785\ub825\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4.

    "},{"location":"tutorial/#git-submodule","title":"git submodule","text":"

    \ud504\ub85c\uc81d\ud2b8\uac00 rojo \ub97c \uc0ac\uc6a9\ud558\uace0 git \uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 submodule \ub85c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    # \uc774\ubbf8 submodule \uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 \uacbd\uc6b0 \uc785\ub825\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4\ngit submodule init\n# \uc11c\ube0c\ubaa8\ub4c8\uc758 \ub8e8\ud2b8\ub294 \uc9c1\uc811 \uc815\ud574\uc8fc\uc138\uc694\ngit submodule add https://github.com/qwreey75/Quad Quad\n
    "},{"location":"tutorial/#_3","title":"\ubaa8\ub4c8 \ubd88\ub7ec\uc624\uae30/\ucd08\uae30\ud654","text":"
    local Quad = require(path.to.module).Init()\n

    \ubaa8\ub4c8\uc744 \uc14b\uc5c5\ud558\uae30 \uc704\ud574\uc11c\ub294 .Init(QuadId:string?) \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c QuadId \uac12\uc740 \ud544\uc694\ud558\uc9c0 \uc54a\uc9c0\ub9cc, \ub098\uc911\uc5d0 \uc18c\uac1c\ud560 Store \uc640 \uac19\uc740 \uc77c\ubd80 \uae30\ub2a5\ub4e4\uc774 QuadId:string \uc5d0 \uc601\ud5a5\ubc1b\uae30\ub3c4 \ud569\ub2c8\ub2e4.

    .Init(QuadId:string) \ud568\uc218\ub294 QuadId \uac00 \uac19\uc740 \ubd88\ub7ec\uc624\uae30\uac00 \uc774\ubbf8 \uc788\uc5c8\ub358 \uacbd\uc6b0, \ucd08\uae30\ud654 \ud558\uc9c0 \uc54a\uace0 \ubd88\ub7ec\uc654\ub358\uac83\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c \ubaa8\ub4c8\ub4e4 \ub07c\ub9ac QuadId \uac00 \uac19\uc740 \uacbd\uc6b0 Store \uac19\uc740\uac83\ub4e4\uc774 \uacf5\uc720\ub429\ub2c8\ub2e4.

    QuadId \uac00 \ube44\uc6cc\uc9c4 \uacbd\uc6b0 \ud55c\ubc88\ub3c4 \uc0dd\uc131\ub41c \uc801 \uc5c6\ub294 \uc0c8\ub85c\uc6b4 Quad \uac00 \uc0dd\uc131\ub429\ub2c8\ub2e4

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n

    \ubd88\ub7ec\uc624\uae30\uac00 \ub05d\ub0ac\ub2e4\uba74 \uc774\uc81c Quad \uc758 \uc790\uc6d0\ub4e4\uc744 \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4! \ub2e4\uc74c \ud398\uc774\uc9c0\ub85c \ub118\uc5b4\uac00 \uc5b4\uc11c \ud65c\uc6a9\ud574 \ubd05\uc2dc\ub2e4

    "},{"location":"tutorial/#_4","title":"\ucd94\uac00\uc801 \ud658\uacbd \uc124\uc815","text":""},{"location":"tutorial/#_5","title":"\ud0c0\uc785 \ubd88\ub7ec\uc624\uae30","text":"

    \uae30\ubcf8\uc801\uc73c\ub85c Quad \ub294 \ub85c\ub4dc\uc2dc \ud0c0\uc785 \uac19\uc774 \ubc18\ud658\ud558\uc9c0\ub9cc. \uc9c1\uc811\uc801\uc73c\ub85c \ud0c0\uc785\uc744 \uc9c0\uc815\ud558\uace0 \uc2f6\uc740 \uacbd\uc6b0 types.lua \ub97c \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local types = require(path.to.module.types)\nlocal Quad = (require(path.to.module)::types.module).Init()\n
    "},{"location":"tutorial/#_6","title":"\ud14c\uc2a4\ud2b8 \ud658\uacbd \uc900\ube44","text":"

    \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc740 rojo \uc640\uc758 \uac1c\ubc1c\ud1b5\ud569\uc744 \uc704\ud574 Play \ubc84\ud2bc\uc744 \ub204\ub974\uc9c0 \uc54a\uace0 \ubbf8\ub9ac\ubcf4\uae30\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\uc90d\ub2c8\ub2e4 \uc774\ub97c \ud1b5\ud574 \ub2e4\ub978 \ucf54\ub4dc \ubc29\uc2dd\uc758 UI \ud504\ub808\uc784 \uc6cc\ud06c\ubcf4\ub2e4 \ube60\ub978 \uac1c\ubc1c\uc18d\ub3c4\ub97c \ub2ec\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    \ud3b8\uc758\uc0c1\uc744 \uc704\ud574 \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \uc124\uc815\ud574 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    \uc8fc\uc758

    rojo \ud658\uacbd\uc774 \uc544\ub2c8\ub77c\uba74 \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub294 \ub799\uc744 \ub3d9\ubc18\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    \uc77c\ubc18\uc801\uc73c\ub85c, \ub85c\uceec \ud3b8\uc9d1 \ud658\uacbd\uc5d0\uc11c \ub85c\ube14\ub85d\uc2a4\uc758 script editor \ub294 \ud55c\uae00\uc790 \ud55c\uae00\uc790 \ubcc0\uacbd\uc2dc \ub9c8\ub2e4 .Source \ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4. \uc774\ub294 \uacf3 \ud55c\uae00\uc790 \ud55c\uae00\uc790 \ud0c0\uc774\ud551 \uc2dc \ub9c8\ub2e4 UI \uac00 \uc5c5\ub370\uc774\ud2b8 \ub420 \uc218 \uc788\uc74c\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. Quad \uc758 tracker \ubaa8\ub4c8\uc740 \uc21c\uac04\uc801\uc73c\ub85c \ub9ce\uc740\uc591\uc758 \ub9ac\ub85c\ub4dc\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub3c4\ub85d \uc801\uc808\ud55c \ucfe8\ud0c0\uc784\uacfc \uc2dc\uac04\ubd84\ubc30\ub97c \uac00\uc9c0\uace0 \uc788\uc9c0\ub9cc, \uc774 \uacbd\uc6b0\uc5d0\ub3c4 Ctrl+S \ub97c \ub20c\ub7ec \uc800\uc7a5\ud574\uc57c \uc801\uc6a9\ub418\ub294 vscode \uc640 \uac19\uc740 \ud0c0 \ud3b8\uc9d1\uae30\uc640\ub294 \ucc28\uc774\uac00 \ub0a0 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ucf54\ub4dc\uac00 \ucee4\uc9d0\uc73c\ub85c \uc778\ud574 \uc790\ub3d9 \ub9ac\ub85c\ub4dc\uc5d0\uc11c \ud37c\ud3ec\uba3c\uc2a4\uc801 \uc774\uc288\ub97c \uacaa\ub294\ub2e4\uba74, rojo \ub97c \ud65c\uc6a9\ud574 \ucf54\ub4dc\ub97c \uc678\ubd80\ub85c \uc62e\uae34 \ud6c4, vscode \ub97c \uc2a4\ud29c\ub514\uc624 \uc704\uc5d0 \ub193\uace0 \ubbf8\ub9ac\ubcf4\uae30\uc640 \ucf54\ub4dc\ub97c \ub3d9\uc2dc\uc5d0 \ubcf4\uba74\uc11c \ud3b8\uc9d1\ud558\uc138\uc694. \ud504\ub85c\uc81d\ud2b8\uac00 \ub9e4\uc6b0 \uac70\ub300\ud558\uc9c0 \uc54a\ub2e4\uba74 \ud06c\uac8c \uac71\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub429\ub2c8\ub2e4.

    \ub2e4\uc74c\uacfc \uac19\uc740 \ucf54\ub4dc\ud2b8\ub9ac\ub97c \ub9cc\ub4e4\uc5b4\uc8fc\uc138\uc694.

     | Main (ModuleScript)\n |-- Loader (LocalScript)\n |-- Test (ModuleScript)\n
    MainLoaderTest \uc2e4\uc81c\ub85c UI \ub4e4\uc744 \uadf8\ub9ac\ub294 \ucf54\ub4dc\ub4e4\uc774 \ub2f4\uae41\ub2c8\ub2e4.
    local Quad = require(path.to.module).Init()\nlocal IsTestMode = script.Name:match(\"_TESTING\") -- \ud14c\uc2a4\ud2b8\ubaa8\ub4dc \uc5ec\ubd80\nlocal LocalPlayer = game.Players.LocalPlayer\nlocal ScreenGUI = Instance.new(\"ScreenGui\",\n    LocalPlayer and LocalPlayer.PlayerGui or game.StarterGui)\nScreenGUI.Name = \"MyGUI\"\nScreenGUI.ResetOnSpawn = false\n\n-- \uc2e4\uc81c \uadf8\ub9ac\ub294 \ucf54\ub4dc\ub4e4\uc774 \ub4e4\uc5b4\uac11\ub2c8\ub2e4.\n\nreturn function()\n    -- \ud14c\uc2a4\ud2b8\uac00 \ub05d\ub098 \ub9cc\ub4e0\uac78 \uc9c0\uc6cc\uc57c \ud560 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n    -- \ucd94\ud6c4 \uc124\uba85\ub420 Unmount() \ub97c \uc774\uc6a9\ud558\uc138\uc694.\n    ScreenGUI:Destroy()\nend\n
    \uac8c\uc784\uc744 \ud50c\ub808\uc774 \ud560 \ub54c \ucf54\ub4dc\uac00 \ub85c\ub4dc\ub420 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4dc\ub294 \ub85c\ub354\uc785\ub2c8\ub2e4.
    require(script.Parent)\n
    \uba85\ub839\ucc3d\uc5d0\uc11c \uba85\ub839\uc5b4 \uc785\ub825\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589 \ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4dc\ub294 \ucf54\ub4dc\ub4e4\uc774 \ub2f4\uae41\ub2c8\ub2e4.
    -- \ubaa8\ub4c8 \uc704\uce58\ub85c \uc54c\ub9de\uac8c \ubcc0\uacbd\ud574\uc8fc\uc138\uc694\nlocal Quad = path.to.module\nlocal tracker = require(Quad.tracker)\n\nlocal module = {}\nlocal function reload()\n    if module.unload then pcall(module.unload) end\n    if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end\n    module.testingModule = script.Parent:Clone()\n    module.testingModule.Parent = script.Parent.Parent\n    module.testingModule.Archivable = false\n    module.testingModule.Name = module.testingModule.Name .. \"_TESTING\"\n    module.unload = require(module.testingModule)\nend\n\n-- \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \ucf2d\ub2c8\ub2e4. \uc774\ubbf8 \ucf1c\uc838\uc788\uc73c\uba74 \ub2e4\uc2dc \ub85c\ub4dc\ud569\ub2c8\ub2e4\nfunction module.load()\n    reload()\n    if not module.autoreload then\n        module.autoreload = tracker.new(script.Parent)\n        module.autoreload:init(); wait()\n        module.autoreload:connect(\"updated\",reload)\n    end\nend\n\n-- \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \ub044\uace0 \ud14c\uc2a4\ud2b8\ub85c \uc0dd\uae34\uac83\uc744 \uc9c0\uc6c1\ub2c8\ub2e4\nfunction module.unload()\n    if module.autoreload then pcall(module.autoreload.deinit,module.autoreload) end\n    if module.unload then pcall(module.unload) end\n    if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end\n    module.autoreload = nil\n    module.unload = nil\n    module.testingModule = nil\nend\n\nreturn module\n

    \uc774\uc81c \uba85\ub839\uc5b4 \ucc3d\uc5d0\uc11c \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \ucf1c\uac70\ub098 \ub04c \uc218 \uc788\uc2b5\ub2c8\ub2e4. rojo \ub098 \ud3b8\uc9d1\uae30\ub85c \uc778\ud574 \ucf54\ub4dc\uac00 \ubcc0\uacbd\ub418\uba74 \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4!

    require(path.to.your.module).load()\n
    "},{"location":"tutorial/10_signal/","title":"Signal - \uc774\ubca4\ud2b8 \uc0dd\uc131\uacfc \uc5f0\uacb0","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Bindable, Disconnecter \uae30\ub2a5\uc774 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Bindable, Disconnecter \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

    Quad \uc5d0\ub294 \ud3b8\uc758\uc0c1\uc758 \uc774\uc720\ub85c \ub85c\ube14\ub85d\uc2a4\uc758 RBXScriptSignal \uc758 \uc720\uc0ac\ud488\uacfc, \ud55c\ubc88\uc5d0 \uc2dc\uadf8\ub110\uc744 \ub04a\uc5b4\uc8fc\ub294 Disconnecter \ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c Extend \uc758 GetPropertyChangedSignal \uac19\uc740 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ub418\uae30\ub3c4 \ud569\ub2c8\ub2e4.

    "},{"location":"tutorial/10_signal/#bindable","title":"Bindable","text":"

    Bindable \uc740 RBXScriptSignal \uacfc \uc720\uc0ac\ud55c \uac1d\uccb4\uc785\ub2c8\ub2e4. Signal.Bindable.New(id:string?) \uc73c\ub85c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub85c\ube14\ub85d\uc2a4\uc758 \uae30\ubcf8 BindableEvent \uc640\ub294 \ub2e4\ub974\uac8c :Fire \uac00 \ud55c\uacf3\uc5d0 \ud569\uccd0\uc838 \uc788\uc2b5\ub2c8\ub2e4.

    Note

    \ub9cc\uc57d id \ub97c \uc9c0\uc815\ud55c \uacbd\uc6b0, \uac19\uc740 id \ub97c \uac00\uc9c4 Bindable \uc774 \uc788\uc73c\uba74 \uc774\uc804\uac83\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Signal = Quad.Signal\n\nlocal mySignal = Signal.Bindable.New()\n\nlocal connection = mySignal:Connect(function(v)\n    print(v)\nend)\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\")\nconnection:Disconnect()\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uba74 \uc548\ub429\ub2c8\ub2e4.\")\n\ntask.spawn(function()\n    task.wait(5)\n    mySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \uc9c0\uc5f0\ub41c \ud6c4 \ucd9c\ub825\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\")\nend)\nprint(mySignal:Wait())\n\nmySignal:Once(function(v)\n    print(v)\nend)\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\")\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uba74 \uc548\ub429\ub2c8\ub2e4.\")\n\nmySignal:Once(function(v)\n    print(v)\nend):Disconnect()\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uba74 \uc548\ub429\ub2c8\ub2e4.\")\n
    "},{"location":"tutorial/10_signal/#bindable_1","title":"Bindable \uba54\uc18c\ub4dc","text":"

    Bindable \uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub4e4\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Fire(...any)

    \ub4f1\ub85d\ub41c \uc5f0\uacb0\ub4e4\uc744 \uc2e4\ud589\ud558\uace0, Wait \uc744 \ud480\uc5b4\uc90d\ub2c8\ub2e4.

    :Wait()->(...any)

    Fire \uac00 \ud638\ucd9c\ub420 \ub54c \uae4c\uc9c0 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.

    :Connect((...any)->())->Connection

    Fire \uac00 \ud638\ucd9c \ub420 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ud638\ucd9c \uc778\uc790\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc5f0\uacb0\uc744 \ub04a\uc744 \uc218 \uc788\ub3c4\ub85d Connection \uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Once((...any)->())->Connection

    Connect \uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Fire \uac00 \ud55c\ubc88 \ud638\ucd9c\ub41c \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4/

    :CheckConnected(func)->boolean

    \ud568\uc218\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :DisconnectAll()

    \ubaa8\ub4e0 \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Wait \uc73c\ub85c \uae30\ub2e4\ub9ac\uace0 \uc788\ub294 \uacf3\uc5d0\ub294 nil \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Destroy()

    :DisconnectAll() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"tutorial/10_signal/#connection","title":"Connection \uba54\uc18c\ub4dc","text":"

    Bindable:Connect \uc640 Bindable:Once \ub294 Connection \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. Connection \uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub4e4\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Disconnect()

    \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Fire \uac00 \ud638\ucd9c\ub418\ub354\ub77c\ub3c4 Connect \ud639\uc740 Once \uc5d0 \uc0ac\uc6a9\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    :Destroy()

    :Disconnect() \uc758 \ubcc4\uce6d\uc785\ub2c8\ub2e4.

    "},{"location":"tutorial/10_signal/#disconnecter","title":"Disconnecter","text":"

    Disconnecter \ub294 \uc77c\uc885\uc758 Maid \ubaa8\ub4c8\uacfc \ube44\uc2b7\ud55c \uac1d\uccb4\uc785\ub2c8\ub2e4. \uc774 \uac1d\uccb4\uc5d0\ub294 Connection (\ub85c\ube14\ub85d\uc2a4, Quad \ubaa8\ub450 \ud638\ud658) \uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc73c\uba70, \ub098\uc911\uc5d0 \ucd94\uac00\ub41c Connection \uc744 \ud55c\uaebc\ubc88\uc5d0 Disconnect \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Signal.Disconnecter.New(id:string?) \uc73c\ub85c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    Note

    \ub9cc\uc57d id \ub97c \uc9c0\uc815\ud55c \uacbd\uc6b0, \uac19\uc740 id \ub97c \uac00\uc9c4 Bindable \uc774 \uc788\uc73c\uba74 \uc774\uc804\uac83\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Add(connection:Connection|RBXScriptConnection)

    connection\uc744 \ub9ac\uc2a4\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub098\uc911\uc5d0 :Disconnect\ub97c \ud638\ucd9c\ud558\uba74 \ucd94\uac00\ub41c \uc5f0\uacb0\uc774 \ud30c\uae30\ub429\ub2c8\ub2e4.

    :Disconnect()

    \ucd94\uac00\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\uc5d0 Disconnect() \ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ud638\ucd9c \ud6c4\uc5d0 \ucd94\uac00\ub41c \uc5f0\uacb0\uc740 \ubaa8\ub450 \uc0ac\ub77c\uc9c0\uba70. \uc774 \uc694\uccad \ud6c4\uc5d0\ub3c4 \ub2e4\uc2dc :Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4 Disconnecter \ub97c \uc644\uc804\ud788 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub824\uba74 :Destroy \ub97c \ud638\ucd9c\ud558\uc138\uc694

    :Destroy()

    :Disconnect() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"tutorial/11_extend/","title":"Extend - \ud655\uc7a5\uacfc \uc7ac\uc0ac\uc6a9","text":""},{"location":"tutorial/11_extend/#extend","title":"Extend \ub780?","text":"

    Quad \uc5d0\uc11c\ub294 \ub85c\ube14\ub85d\uc2a4\uc758 Frame \uc774\ub098 TextButton \uac19\uc740 \uae30\ubcf8 \uc624\ube0c\uc81d\ud2b8\ub9cc \ub9cc\ub4e4 \uc218 \uc788\ub294\uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4. Quad \ub294 \uc790\uc2e0\ub9cc\uc758 \ubc84\ud2bc, \ud639\uc740 \uc5ec\ub7ec \ucef4\ud3ec\ub10c\ud2b8\ub4e4\uc744 \ucd94\uc0c1\uc801\uc73c\ub85c \ub9cc\ub4e4\uace0. \ub2e4\uc2dc \ud65c\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d Extend \ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4.

    Extend \ub294 Register \uc640 \ub354\ubd88\uc5b4 Quad \uc758 \uac00\uc7a5 \uc911\uc694\ud55c \uae30\ub2a5\uc73c\ub85c\uc368, \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc9c0\ub2d9\ub2c8\ub2e4.

    1. \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud569\ub2c8\ub2e4. \ub098\ub9cc\uc758 \ubc84\ud2bc\uc744 \ub9cc\ub4e4\uace0, \uace0\uce58\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc0dd\uaca8 \uace0\uce58\uba74 \uc790\ub3d9\uc73c\ub85c \uc0ac\uc6a9\ub41c \uacf3\ub4e4\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.
    2. \uae34 \ucf54\ub4dc\ub97c \ub098\ub204\uc5b4 \ucf54\ub4dc\ub9c8\ub2e4 \ud655\uc2e4\ud55c \ubaa9\uc801\uc744 \ubd80\uc5ec\ud574 \ub354 \uba85\ud655\ud55c \ucf54\ub4dc \uc791\uc131\uc774 \uac00\ub2a5\ud574\uc9d1\ub2c8\ub2e4.
    3. \uc790\uc2e0\ub9cc\uc758 \ud504\ub85c\ud37c\ud2f0\ub97c \ub9cc\ub4e4\uac70\ub098 \uc644\uc804\ud788 \uc6d0\ud558\ub294\ub300\ub85c \uc624\ube0c\uc81d\ud2b8\ub97c \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
    4. \ud568\uc218\ub098 \uc0dd\uc131\uae30\ub97c \uc9c1\uc811 \ub9cc\ub4dc\ub294 \uac83 \ubcf4\ub2e4 \uc77c\uad00\ub41c \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.
    5. \ub9e4\uc6b0 \uc720\uc5f0\ud569\ub2c8\ub2e4. \ub2e4\uc591\ud55c \ubc29\ubc95\uc758 \uad6c\ud604\ubc95\uc744 \uc6d0\ud558\ub294\ub300\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
    "},{"location":"tutorial/11_extend/#_1","title":"\ub098\ub9cc\uc758 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uae30","text":"

    Extend \uac1d\uccb4\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc0dd\uc131\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\n-- extend \uac1d\uccb4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4\nlocal myClass = Class.Extend()\n
    \uc77c\ubc18\uc801\uc73c\ub85c Extend \ub294 \ud55c \ubaa8\ub4c8\uc5d0 \ud558\ub098\uc529 \ub123\uc2b5\ub2c8\ub2e4.

    \ub2e4\uc74c\uacfc \uac19\uc740 \ucf54\ub4dc \uad6c\uc870\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uc138\uc694. \uc544\ub798\uc758 \ucf54\ub4dc\ub294 \ubaa8\ub4e0 Extend \ubb38\ubc95\uc744 \uc124\uba85\ud569\ub2c8\ub2e4.

     - ScreenGUI\n |-- localscript\n    |-- myClass (ModuleScript)\n

    localscriptlocalscript.myClass Extend \ud074\ub798\uc2a4\ub97c \ubd88\ub7ec\uc624\uace0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Mount = Quad.Mount\nlocal Class = Quad.Class\nlocal Store = Quad.Store\n\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.bgColor = Color3.fromRGB(0,0,0)\n\n-- Class(require(script.myClass)) \uc640 \uac19\uc2b5\ub2c8\ub2e4.\n-- \uc904\uc5ec\uc11c Class(script.myClass) \ub85c \uc4f8 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.\nlocal myClass = Class(script.myClass)\n\n-- \ud504\ub808\uc784\uc5d0 \ub123\uac70\ub098 \ud558\uc5ec\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4\n-- \uc77c\ubc18 \uc624\ube0c\uc81d\ud2b8\uc640 \ub611\uac19\uc774 id \ub97c \ub123\uace0 GetObject \ub85c\n-- \uac00\uc838\uc62c \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4\nlocal main = myClass \"main\" {\n    Testing = 1;\n    Text = \"Test\";\n    -- \ub808\uc9c0\uc2a4\ud130 \uac12\uc744 \ub118\uaca8\uc904 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.\n    -- \ubc1b\ub294\ucabd\ub3c4 \ub808\uc9c0\uc2a4\ud130\uc778 \uacbd\uc6b0 \uac12\uc774 \uc5f0\ub3d9\ub429\ub2c8\ub2e4.\n    BackgroundColor3 = myStore \"bgColor\";\n}\n\nMount(ScreenGUI, main)\nprint(Store.GetObject(\"main\") == main) -- true\n\n-- \uc774 \uac12\uc744 \ubc14\uafb8\uba74 \uc5f0\ub3d9\ub41c BackgroundColor3 \ub3c4 \ubc14\ub014\uac83\uc785\ub2c8\ub2e4\nmyStore.bgColor = Color3.fromRGB(255,255,255)\n\n-- \uac12 \ubcc0\uacbd\ub428\uc744 \uc5f0\uacb0\ud558\uae30\nmain\n    :GetPropertyChangedSignal(\"AbsolutePosition\")\n    :Connect(function()\n        print(\"AbsolutePosition\",main.AbsolutePosition)\n    end)\n\n-- main:Update()\n-- \uac15\uc81c\ub85c \ub2e4\uc2dc Render \ub97c \uc2e4\ud589\ud558\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4.\n\n-- main.Testing = 2\n-- \uc5c5\ub370\uc774\ud2b8 \ud2b8\ub9ac\uac70\uc774\ubbc0\ub85c \uc774 \uac12\uc744 \ubcc0\uacbd\ud558\uba74.\n-- main:Update() \uc640 \uac19\uc740 \ud6a8\uacfc\uac00 \ub0a9\ub2c8\ub2e4.\n
    Extend \ud074\ub798\uc2a4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. \ub2e4\ub978\uacf3\uc5d0\uc11c \ubd88\ub7ec\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\n\nlocal TextLabel = Class \"TextLabel\"\n\nlocal myClass = Class.Extend()\n\n-- Init \ub294 Render \uc804 props \ub97c \ucd08\uae30\ud654 \ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4\n-- Init \uc5d0\ub294 \ud504\ub85c\ud37c\ud2f0 \ub9ac\uc2a4\ud2b8\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. Init \ub294 \uc5c6\ub354\ub77c\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\nfunction myClass:Init(props)\n    -- \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\uc5d0 \ud504\ub77c\uc774\ube57 \uac12\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc774\ub984 \uc55e\uc5d0 _ \uac00 \ubd87\uc73c\uba74 \uc678\ubd80\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ubaa9\uc801\uc774 \uc544\ub2cc\n    -- \ub0b4\ubd80\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ubaa9\uc801\uc73c\ub85c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \uc774 \uacbd\uc6b0 \uc548\uc804\uc131\uc744 \uc704\ud574 register \ub97c \uc0ac\uc6a9\ud560 \uc218\n    -- \uc5c6\uc2b5\ub2c8\ub2e4.\n    self._testValue = 2\n\n    -- \ud504\ub85c\ud37c\ud2f0\uc758 \uae30\ubcf8\uac12\uc744 \uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    -- \uc0dd\uc131 \uc2dc \uac12\uc774 \ub204\ub77d\ub41c \uacbd\uc6b0 \uc0ac\uc6a9\ud560 \uac12\uc744 \uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \ud0a4, \uac12 \uc73c\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4\n    props:Default(\"Text\",   \"Testing Label\")\n    props:Default(\"ZIndex\", 1)\nend\n\n-- myClass \uac00 \uc9c4\uc9dc \uadf8\ub824\uc9c0\ub294 \ubd80\ubd84\uc785\ub2c8\ub2e4.\n-- Render \ub3c4 Init \ucc98\ub7fc \ud504\ub85c\ud37c\ud2f0 \ub9ac\uc2a4\ud2b8\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4.\nfunction myClass:Render(props)\n    return TextLabel {\n        Size = UDim2.fromOffset(200,200);\n        -- self \uc5d0 _label \ub85c \uc774 TextLabel \uc744 \ub123\uc2b5\ub2c8\ub2e4.\n        -- \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubb38\ubc95\uc785\ub2c8\ub2e4.\n        self \"_label\";\n\n        -- _holder \ub294 \uc608\uc57d\ub41c \uac12\uc785\ub2c8\ub2e4. \uc790\uc2dd\ub4e4\uc774 \uc5ec\uae30\uc5d0 \ub4e4\uc5b4\uc640\uc57c\n        -- \ud568\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \ub9ac\uc2a4\ud2b8\ub098 \uadf8\ub9ac\ub4dc\uac00 \uc788\ub294 \uacbd\uc6b0 \uc720\uc6a9\ud569\ub2c8\ub2e4.\n        -- \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 Render \uac00 \ub9ac\ud134\ud55c \uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\n        self \"_holder\";\n\n        -- GetPropertyChangedSignal \uac00 \uc791\ub3d9\ud560 \uc218 \uc788\ub3c4\ub85d\n        -- \ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd \uc774\ubca4\ud2b8\ub97c \uc5f0\uacb0\ud574\uc90d\ub2c8\ub2e4\n        -- \uc774 \ub610\ud55c \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubb38\ubc95\uc785\ub2c8\ub2e4.\n        [Event.Prop \"AbsolutePosition\"] = self \"AbsolutePosition\";\n        -- \ub9c8\uc6b0\uc2a4 \ud074\ub9ad\uac19\uc740 \ub2e4\ub978 \uc774\ubca4\ud2b8\ub97c GetPropertyChangedSignal \uc5d0\n        -- \uc5f0\uacb0\ud558\ub824\uba74 :EmitPropertyChangedSignal() \ub97c \ud638\ucd9c\ud574\uc8fc\uba74 \ub429\ub2c8\ub2e4.\n        [Event \"MouseEnter\"] = function (this,x,y)\n            -- \ud0a4, \uac12\uc774 \ub4e4\uc5b4\uac11\ub2c8\ub2e4. \uac12\uc774 \uc5c6\uc73c\uba74 self[key] \ub85c \ub300\uc2e0\ud569\ub2c8\ub2e4.\n            self:EmitPropertyChangedSignal(\"Testing2\",1)\n        end;\n\n        -- \ubc1b\uc740 \ub808\uc9c0\uc2a4\ud130\ub97c \uc5f0\ub3d9\ud569\ub2c8\ub2e4.\n        -- \ub9cc\uc57d props.BackgroundColor3 \ub9cc \uc0ac\uc6a9\ud558\uba74\n        -- \ucc98\uc74c\uc5d0\ub9cc \ub808\uc9c0\uc2a4\ud130\uc5d0\uc11c \uac12\uc744 \uc77d\uc5b4\uc635\ub2c8\ub2e4.\n        -- \ub530\ub77c\uc11c \uac12\uc744 \ubcc0\uacbd\ud574\ub3c4 \ubcc0\uacbd\uc0ac\ud56d\uc774 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n        BackgroundColor3 = props \"BackgroundColor3\":Tween();\n\n        -- \uc785\ub825 \uac12\uacfc \uc0c1\uad00\uc5c6\uc774 \ub808\uc9c0\uc2a4\ud130\ub97c \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        -- \uc774 \uacbd\uc6b0 main.Text = \"New\" \ucc98\ub7fc \uc9c1\uc811 \ubcc0\uacbd\ud558\uba74\n        -- \uadf8 \ubcc0\uacbd\uc774 \uc801\uc6a9\ub429\ub2c8\ub2e4.\n        Text = props \"Text\";\n        ZIndex = props \"ZIndex\";\n        -- ... \uc790\uc2dd\uc744 \ub123\uc5b4\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\n        -- Frame {\n        --    [Event.Created] = function(self)\n        --        print(self.Parent) -- nil \uc77c \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4\n        --        \ub530\ub77c\uc11c \ubd80\ubaa8\ub97c \uac74\ub4e4\uc5ec\uc57c \ud558\ub294 \uacbd\uc6b0, self \"\" \ub97c \ud1b5\ud574\n        --        self \uac12\uc5d0 \ub123\uc5b4\ub193\uace0 \ub098\uc911\uc5d0 AfterRender \ub85c \ud574\uacb0\ud574\uc57c\ud569\ub2c8\ub2e4.\n        --    end;\n        -- }\n    }\nend\n\n\n-- AfterRender \ub294 Render \uc9c1\ud6c4 \uc2e4\ud589\ub429\ub2c8\ub2e4.\n-- \ub80c\ub354\ub9c1 \ud6c4 \uc2e4\ud589\ud574\uc57c \ud560 \uac83\uc744 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n-- object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4.\n-- AfterRender \ub294 \uc5c6\ub354\ub77c\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\nfunction myClass:AfterRender(object)\n    print(self._label,\"\uc774 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n    -- \uc774\ub807\uac8c \ud558\uba74 \ub808\uc9c0\uc2a4\ud130\ub85c \uc5f0\uacb0\ub41c \ubd80\ubd84\ub3c4 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.\n    self.ZIndex = 2\nend\n\n-- function myClass:Unload(object)\n-- :Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4\n-- \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n-- object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4\n\n-- AbsolutePosition \uac12\uc744 \ubc18\ud658\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4\nfunction myClass.Getter.AbsolutePosition(self)\n    return self._label.AbsolutePosition\nend\n\n-- AbsolutePosition \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4\nfunction myClass.Setter.AbsolutePosition(self,newValue)\n    -- \ud544\uc694\ud55c \uacbd\uc6b0 \uac12\uc744 \uc124\uc815\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    error(\"AbsolutePosition \uac12\uc740 \uc124\uc815\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4\")\nend\n\n-- main.Testing = 2 \ub2e4\uc74c\uacfc \uac19\uc774 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 \uc624\ube0c\uc81d\ud2b8\uac00\n-- \uc644\uc804\ud788 \ub2e4\uc2dc \uadf8\ub824\uc9d1\ub2c8\ub2e4. \uc989 \uc5c5\ub370\uc774\ud2b8 \ud2b8\ub9ac\uac70\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\nmyClass.UpdateTriggers.Testing = true\n\n-- \ub9cc\ub4e0 \ud074\ub798\uc2a4\ub97c \ubc18\ud658\ud574\uc90d\uc2dc\ub2e4.\nreturn myClass\n
    "},{"location":"tutorial/11_extend/#extend_1","title":"Extend","text":"

    Extend \uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uac12\ub4e4\uacfc \uba54\uc18c\ub4dc\uc785\ub2c8\ub2e4.

    self(name:string)->linker

    Extend \uba54\uc18c\ub4dc \uc804\uc5ed\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4. \ub9c1\ucee4\ub97c \ub9cc\ub4e4\uba70, PropertyChangedSignal \ub97c \uc774\uc5b4\uc8fc\uac70\ub098, self \uc5d0 \uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \uc815\ubcf4\ub294 Render \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.

    Overwite REQUIRED :Render(props:valueStore)

    \ud654\uba74\uc5d0 \uadf8\ub824\uc9c0\ub294 UI \ub97c \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. Extend \uac00 \uadf8\ub824\uc9c0\ub824\uba74 \ubb34\uc870\uac74 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4. \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4dc\ub294\ub370 \ub4e4\uc5b4\uac04 \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\uc744 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc90d\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130 \ubb38\ubc95\uc774 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\nlocal Mount = Quad.Mount\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        [Event \"MouseButton1Click\"] = function (self,x,y)\n            print((\"\ubc84\ud2bc\uc774 %d,%d \uc5d0\uc11c \ub20c\ub838\uc2b5\ub2c8\ub2e4\"):format(x,y))\n        end;\n        Size = props \"Size\";\n        Text = props \"Text\"; -- \ub808\uc9c0\uc2a4\ud130\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4\n    }\nend\n\nlocal myImported = Class(myClass)\nmyImported.Size = UDim2.fromOffset(200,200)\n\nlocal test = myImported {\n    Text = \"wow\"\n}\nMount(ScreenGUI, test)\n\n-- \ud14d\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    test.Text = \"w\"..(\"o\"):rep(#test.Text-1)..\"w\"\nend\n

    Overwite Option :Init(props:valueStore)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub418\uae30 \uc804\uc5d0 \ubbf8\ub9ac props \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Init(props)\n    -- Size \uac12\uc774 \uc5c6\ub2e4\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n    props:Default(\"Size\", UDim2.fromOffset(100,100))\n\n    -- \uc55e\uc5d0 _ \ub97c \ubd87\uc5ec \ub0b4\ubd80 \ubcc0\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc5b4\ub514\uc5d0\uc11c\ub098 \uc4f0\uc77c \uc218 \uc788\uc73c\uba70 register \uc5d0 \uc601\ud5a5\uc8fc\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    self._asdf = true\nend\nfunction myClass:Render(props)\n    return TextButton {\n        props \"Size\"\n    }\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported() -- \uc635\uc158 \uc5c6\uc74c\nprint(myButton.Size)\n

    Overwite Option :AfterRender(object:any)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub41c \ud6c4 \ud560 \uc791\uc5c5\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c Render \uac00 \ubc18\ud658\ud55c \uac12\uc774 \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\"; -- \uc790\uae30 \uc790\uc2e0\uc5d0 \uc774 \ubc84\ud2bc\uc744 \ub123\uc2b5\ub2c8\ub2e4\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button == object) -- true\nend\n\nlocal myImported = Class(myClass)\nmyImported() -- \uc635\uc158 \uc5c6\uc74c\n

    Overwite Option :Update()

    :Render \uc640 :AfterRender \ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0, \uc774\uc804\uc5d0 \uc788\ub358 \uc790\uc2dd\ub4e4\uc744 \ub2e4\uc2dc \ub04c\uc5b4\uc635\ub2c8\ub2e4. \uc774\uc804\uc758 Render \uacb0\uacfc\ub294 \uc81c\uac70\ub429\ub2c8\ub2e4

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:Update() -- update\nmyButton:Update() -- update\nmyButton:Update() -- update\n

    Overwite Option .Getter.<PropertyName>(self)

    \uac12\uc744 \uc5bb\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {}\nend\n-- \uac12\uc744 \uc77d\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Getter.Test(self)\n    return \"Hello World\"\nend\n\nlocal myImported = Class(myClass)\nprint(myImported().Test)\n

    Overwite Option .Setter.<PropertyName>(self,newValue:any)

    \uac12\uc744 \uc124\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\";\n        Text = \"wow\";\n    }\nend\n-- \uac12\uc744 \uc9c0\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Setter.Test(self,newValue)\n    self._button.Text = newValue\nend\nfunction myClass.Getter.Test(self)\n    return self._button.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nprint(myButton.Test)\nmyButton.Test = \"Hello World\"\nprint(myButton.Test)\n

    Overwite Option .UpdateTriggers.<PropertyName> = boolean?

    \ud574\ub2f9 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 Update \uac00 \uc218\ud589\ub420\uc9c0 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n-- \uac12 \ubcc0\uacbd\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4\nmyClass.UpdateTriggers.Test = true\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\n

    Overwite Option :Unload(object)

    :Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4

    :GetPropertyChangedSignal(propertyName:string)->Bindable

    \uac12 \ubcc0\uacbd\uc744 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 Bindable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. :EmitPropertyChangedSignal \uc73c\ub85c \uc774 \uc2dc\uadf8\ub110\uc744 \uc791\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\uc0c1 \uc774 \uc2dc\uadf8\ub110\uc774 \uc791\ub3d9\ud560 \ub54c, \uc0c8\ub85c\uc6b4 \uac12\uc774 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    :EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

    \ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd\uc2dc :GetPropertyChangedSignal \uc5d0 \ub4f1\ub85d\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \uc774 \ud568\uc218\ub97c \ud638\ucd9c\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c self.a = 1 \uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \ubc14\ub85c \uac12\uc744 \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc801\uc73c\ub85c \uc774 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ubc15\uc2a4\uc758 \ud14d\uc2a4\ud2b8 \ucc98\ub7fc \uac1d\uccb4\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc5f0\ub3d9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc774 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. changedValue \ub294 \uc120\ud0dd\uc0ac\ud56d\uc774\uba70, \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc73c\uba74 self[propertyName]\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextBox = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_box\";\n        Text = \"test\";\n        Size = UDim2.fromOffset(200,200);\n        [Evnet.Prop \"Text\"] = function (this,newValue)\n            self:EmitPropertyChangedSignal(\"Text\",newValue)\n        end;\n        -- [Evnet.Prop \"Text\"] = self \"Text\" \uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n        -- self(name:string) \ubb38\ubc95\uc73c\ub85c \ubcc0\uacbd \uc774\ubca4\ud2b8 \uc5ed\uc2dc \ub9c1\ud06c\n        -- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    }\nend\nfunction myClass.Getter.Text(self)\n    return self._box.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:GetPropertyChangedSignal(\"Text\"):Connect(function()\n    print(myButton.Text)\nend)\nMount(ScreenGUI, myButton)\n

    "},{"location":"tutorial/1_import/","title":"Import - \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131","text":""},{"location":"tutorial/1_import/#_1","title":"\ub85c\ube14\ub85d\uc2a4 \uc624\ube0c\uc81d\ud2b8 \ubd88\ub7ec\uc624\uae30","text":"

    Frame \uacfc \uac19\uc740 UI \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uace0 \uc2f6\uc740 \uacbd\uc6b0 \uba3c\uc800 import \ub97c \uc774\uc6a9\ud574\uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ub2e4\uc74c\uacfc \uac19\uc774 \uc785\ub825\ud574\ubcf4\uc138\uc694!

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal Frame = Class \"Frame\"\n\nprint(\n    Frame {\n        Name = \"Wow!\";\n        -- \ub2e4\uc74c\uacfc \uac19\uc774 \uc790\uc2dd\uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n        Frame {\n            Name = \"Child\";\n        };\n    }\n)\n

    \ub098\uc911\uc5d0 \uc790\uc2e0\ub9cc\uc758 UI \uc624\ube0c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc9c0\ub9cc, \uc77c\ubc18\uc801\uc778 \ub85c\ube14\ub85d\uc2a4\uac00 \uc9c0\uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\uc758 \uacbd\uc6b0 Class(ClassName:string) \uc73c\ub85c \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"tutorial/1_import/#class","title":"\ubd88\ub7ec\uc628 Class \uc5d0 \uae30\ubcf8\uac12 \uc124\uc815","text":"

    \ubd88\ub7ec\uc628 Class \uc5d0 \uae30\ubcf8\uac12\uc744 \uc124\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 BorderSizePixel \uc640 \uac19\uc774 \uc790\uc8fc \uc0ac\uc6a9\ub420 \uc218 \uc788\ub294 \ud504\ub85c\ud37c\ud2f0\ub97c \ubbf8\ub9ac \uc9c0\uc815\ud574 \ub458 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal FrameWithoutBorder = Class \"Frame\"\nFrameWithoutBorder.BorderSizePixel = 0\n\nlocal FrameWithBorder = Class \"Frame\"\nFrameWithBorder.BorderSizePixel = 1\n\nlocal frame1 = FrameWithoutBorder {}\nlocal frame2 = FrameWithBorder {}\nlocal frame3 = FrameWithBorder {\n    -- \uac12\uc744 \ub36e\uc5b4 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \uc774\ub807\uac8c \ud558\uba74 \uae30\ubcf8\uac12\uc774 \ubb34\uc2dc\ub429\ub2c8\ub2e4.\n    BorderSizePixel = 0;\n}\n\nprint(frame1.FrameWithBorder.BorderSizePixel)\nprint(frame2.FrameWithBorder.BorderSizePixel)\nprint(frame3.FrameWithBorder.BorderSizePixel)\n

    \uc774\uc81c \uadf8\ub824\ub0b8 \ud504\ub808\uc784\uc744 \ud654\uba74\uc5d0 \uadf8\ub824\ubcf4\uace0 \uc2f6\ub098\uc694? \ub2e4\uc74c \ud29c\ud1a0\ub9ac\uc5bc Mount \ub97c \ud655\uc778\ud574\ubcf4\uc138\uc694!

    "},{"location":"tutorial/2_mount/","title":"Mount - \ud654\uba74\uc5d0 UI \ud45c\ud604","text":""},{"location":"tutorial/2_mount/#ui","title":"\ud654\uba74\uc5d0 UI \ub97c \ud45c\uc2dc\ud558\uae30","text":"

    Quad \ubaa8\ub4c8\uc5d0\uc11c \ubaa8\ub4e0 Parent \ucc98\ub9ac\ub294 Mount \ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4. Mount(to:any,...item:any?)->mounts \ud568\uc218\ub97c \uc774\uc6a9\ud558\uba74 \ub2e4\ub8e8\ub294 \uc624\ube0c\uc81d\ud2b8\uac00 \ub85c\ube14\ub85d\uc2a4 Instance \uc778\uc9c0, \ud5a5\ud6c4 \uc18c\uac1c\ub420 Quad \ud655\uc7a5 \ud074\ub798\uc2a4\uc778\uc9c0 \uc0c1\uad00\uc5c6\uc774 \uc54c\uc544\uc11c Parent \uac00 \ucc98\ub9ac\ub429\ub2c8\ub2e4.

    --- StarterGui \uc548\uc5d0 ScreenGui \ub97c \ub123\uace0 \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\ub85c \uc785\ub825\ud574\ubcf4\uc138\uc694\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nMount(ScreenGui,\n    Frame {\n        Name = \"Wow!\";\n    }\n    --[[\n    , Frame {} , Frame {}\n    \ub354\ub9ce\uc740 \uc624\ube0c\uc81d\ud2b8\ub97c \ub2e4\uac19\uc774 Mount \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    ]]\n)\n
    "},{"location":"tutorial/2_mount/#_1","title":"\ub9c8\uc6b4\ud2b8 \uac1d\uccb4","text":"

    \ud3b8\uc758\ub97c \uc704\ud574\uc11c Mount \ud568\uc218\ub294 mounts \ub77c\ub294 \uac1d\uccb4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\uac83\uc744 \uc774\uc6a9\ud558\uba74 \ud544\uc694\uc5d0 \ub530\ub77c\uc11c Mount \uc0c1\ud0dc\ub97c \ud574\uc81c\ud558\uac70\ub098 \ucd94\uac00 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. mounts \uac1d\uccb4\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub97c \uac00\uc9d1\ub2c8\ub2e4.

    :Unmount()

    \uc774\ub807\uac8c \ud558\uba74 \ub9c8\uc6b4\ud2b8\ub41c Instance \ub97c \uc9c0\uc6cc\ubc84\ub9bd\ub2c8\ub2e4. Quad \ub294 \uc548\uc804\ud55c \uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 gc \uc758 \uae30\ub2a5\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, gc \uc2dc\uac04\ucc28\ub85c \uc778\ud574 Store.GetObject \uc5d0\uc11c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0ac\ub77c\uc9c0\ub294\ub370 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui,mainFrame)\n\nlocal childFrame = Frame {}\nlocal childFrameMount = Mount(mainFrame,childFrame)\nchildFrameMount:Unmount()\n-- childFrame \uc740 \ub2e8\uc21c\ud788 .Parent = nil \ub418\ub294 \uac83\uc744 \ub118\uc5b4 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc0ac\ub77c\uc9d1\ub2c8\ub2e4\n-- \uc989, Destroy() \uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4\n

    :Add(item:any)

    Mount \uc5d0 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ucc98\uc74c \uc124\uc815\ud55c to \uac12\uc744 \ub530\ub77c \ubd80\ubaa8\uac00 \uacb0\uc815\ub429\ub2c8\ub2e4.

    \uc774 \ub3d9\uc791\uc740 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4e4 \ub54c \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc\ub85c\ub4dc \ub3d9\uc791\uc2dc \uc9c1\uc811 \uc81c\uac70\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui, mainFrame)\n\nlocal lastListMount = Mount(mainFrame)\nlocal function refreshList()\n    lastListMount:Unmount() -- \uc774\uc804 children \uc744 \uc54c\uc544\uc11c \uc81c\uac70\ud569\ub2c8\ub2e4\n    for i = 1,10 do\n        lastListMount:Add(Frame { Name = tostring(i) })\n    end\nend\n\ntask.spawn(function()\n    while true do\n        refreshList()\n        task.wait(2)\n    end\nend)\n

    \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\uc804 children \uc744 \uac04\uc811\uc801\uc73c\ub85c \uc81c\uac70\ud558\uace0 \uc0c8\ub85c\uc6b4 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e8 ScrollFrame \uc758 \uacbd\uc6b0 CanvasPosition\uc774 \ucd08\uae30\ud654 \ub418\uc5b4\ubc84\ub9ac\ubbc0\ub85c \uc790\uc2dd\ub4e4\uc744 :Unmount() \ud558\uae30 \uc804\uc5d0 \uc704\uce58\ub97c \uc800\uc7a5\ud558\uace0 \ub2e4\uc2dc \ubd88\ub7ec\uc640\uc57c \ud569\ub2c8\ub2e4

    "},{"location":"tutorial/3_getObject/","title":"GetObject - \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc544\uc774\ub514 \ubd80\uc5ec","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Store.GetObject \uac00 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Store.GetObject \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

    "},{"location":"tutorial/3_getObject/#_1","title":"\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc544\uc774\ub514 \ubd80\uc5ec\ud558\uae30, \uc0ac\uc6a9\ud558\uae30","text":"

    \ubcc0\uc218\uc5d0 \ub9cc\ub4e4\uc5b4\uc9c4 \uc624\ube0c\uc81d\ud2b8\ub97c \ud558\ub098\ud558\ub098 \uc800\uc7a5\ud574\uc57c\ud558\ub098\uc694? \uc544\ub2c8\uc694, Quad \uc5d0\ub294 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store\n\nlocal Frame = Class \"Frame\"\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n

    \uc544\uc774\ub514\uc5d0 \ud5c8\uc6a9\ub418\ub294 \uae00\uc790\ub294 \ubcc0\uc218\uba85\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub300\uc18c\ubb38\uc790, \uc22b\uc790, \uc5b8\ub354\ubc14(_) \ub97c \ud5c8\uc6a9\ud569\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc Frame \"mainFrame\" {} \uc640 \uac19\uc774 id \uac12\uc744 \uc9c0\uc815\ud574 \uc900\ub2e4\uba74 \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\ub294 \uadf8 \uc544\uc774\ub514\ub97c \uac00\uc9c0\uac8c \ub429\ub2c8\ub2e4. Store.GetObject(id:string)->Object? \ub294 \uc0dd\uc131\ub41c \uac1d\uccb4\uc911 \uac00\uc7a5 \uccab\ubc88\uc9f8\uc758 id \uac00 \uc77c\uce58\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ubc18\ud658\ud574 \uc90d\ub2c8\ub2e4.

    local index = 1\nFrame (\"mainFrame\" .. index) {}\nprint(Store.GetObject(\"mainFrame\" .. index))\n

    \uc704\ucc98\ub7fc \uc0dd\uc131\uc774\ub098 \uac00\uc838\uc624\uae30\uc5d0\uc11c \uc2dd\uc744 \ub9cc\ub4e4\uc5b4 \ub123\uc744 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/3_getObject/#_2","title":"\ub2e4\ub7c9\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \ub2e4\ub8e8\uae30","text":"\uc8fc\uc758

    Store.GetObjects\uc758 \ubc18\ud658\uac12\uc778 objectList\ub294 \uce90\uc2dc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4. objectList\ub97c local \uc5d0 \ub123\uace0 \uacc4\uc18d\ud574\uc11c \uc720\uc9c0\uc2dc\ud0a4\uc9c0 \ub9c8\uc2ed\uc2dc\uc624, \ubc18\ud658\uac12\uc740 \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8 \ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    Quad \ub294 \ub2e4\ub7c9\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \ub2e4\ub8e8\uae30 \ud3b8\ud558\ub3c4\ub85d Store.GetObjects(id:string)->objectList \ub77c\ub294 \ud568\uc218\ub97c \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4.

    \uc2e4\ud5d8\uc73c\ub85c, \uc0c9\uae54\uc774 \ub79c\ub364\ud558\uac8c \ubc14\ub00c\ub294 \ud504\ub808\uc784\ub4e4\uc744 \ub9cc\ub4e4\uc5b4 \ubd05\uc2dc\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store\n\nlocal Frame = Class \"Frame\"\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n    };\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n        Position = UDim2.fromOffset(30,0);\n    };\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n        Position = UDim2.fromOffset(60,0);\n    };\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n        Position = UDim2.fromOffset(90,0);\n    };\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uac12\uc744 \uc77d\uac70\ub098 :Connect \ud560 \uc218\ub294 \uc5c6\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"Child\").Size = UDim2.fromOffset(30,30)\n\n-- \ud544\uc694\uc5d0 \ub530\ub77c Store.GetObjects(\"Child\") \ub97c pairs \uc5d0 \ub123\uc5b4 for \ubb38\uc744 \uc0ac\uc6a9\ud558\uac70\ub098\n-- :Each , :EachAsync , :IsEmpty \ud568\uc218\ub97c \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\ntask.spawn(function()\n    while true do\n        Store.GetObjects(\"Child\"):Each(function (item, index)\n            item.BackgroundColor3 = Color3.fromRGB(\n                math.random(0,255),\n                math.random(0,255),\n                math.random(0,255)\n            )\n        end)\n        task.wait(1)\n    end)\nend\n\n-- for \ubb38\uc744 \uc774\uc6a9\ud574\uc11c \ucd9c\ub825\ud569\ub2c8\ub2e4\nfor _,child in ipairs(Store.GetObjects(\"Child\")) do\n    print(child)\nend\n
    "},{"location":"tutorial/3_getObject/#objectlist","title":"objectList","text":"

    Store.GetObjects() \uc758 \ubc18\ud658 objectList \uc758 \uba54\uc18c\ub4dc\ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    :Each((item:any, index:number)->())

    \uc77c\ubc18\uc801\uc778 \ubc18\ubcf5\uc785\ub2c8\ub2e4. for \ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uacfc \ud6a8\uacfc\uac00 \uac19\uc73c\ub098 \ud568\uc218\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4

    :EachAsync((item:any, index:number)->())

    \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 \ubc14\ub85c\ubc14\ub85c \ub2e4\uc74c \uc544\uc774\ud15c\uc73c\ub85c \ub118\uc5b4\uac11\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774 \uc774\uc6a9\ub429\ub2c8\ub2e4. wrap() \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub974\uac70\ub098, \ud544\uc694\uc131\uc774 \uc5c6\ub294\uacbd\uc6b0 \uc77c\ubc18\uc801\uc73c\ub85c :Each \ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub429\ub2c8\ub2e4

    :IsEmpty()

    \uc774 ObjectList \uac00 \ube44\uc5b4\uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Remove(indexOrItem:number|any)

    objectList \uc5d0\uc11c \ud574\ub2f9\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4. , & \ub97c \uc0ac\uc6a9\ud55c \uace0\uae09 \uac80\uc0c9\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    "},{"location":"tutorial/3_getObject/#id","title":"\uace0\uae09 ID \uc0ac\uc6a9\ud558\uae30","text":"

    id \uae30\ub2a5\uc744 \uc870\uae08\ub354 \uace0\uae09\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c
    -- \ub450 \uc544\uc774\ub514\ub97c \uac00\uc9c4 \ud504\ub808\uc784\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4\nFrame \"a,b\" {}\n-- a \ub97c \uac00\uc9c4\uac83\uacfc, a \uc640 b \ub97c \uac00\uc9c4\uac83\uc744 \uac00\uc838\uc635\ub2c8\ub2e4\nStore.GetObjects(\"a,a&b\"):Each(function(item)\n    print(item)\nend)\n
    \uc880\ub354 \uc9c1\uad00\uc801\uc778 \ud655\uc778\uc744 \uc704\ud574\uc11c \uc791\ub3d9\uc2dc\ucf1c\ubcf4\uc138\uc694.
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Mount\nlocal Mount = Quad.Store\nlocal Store = Quad.Class\n\nlocal Frame = Class \"Frame\"\n\n--\ub2e4\uc74c\uacfc \uac19\uc774 a \uc640 b \ubaa8\ub450 \uac00\uc9c4 \ud504\ub808\uc784\uc744 \uc0dd\uc131\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.\nFrame \"a,b\" {\n    Name = \"main\";\n    Frame \"a\" {\n        Name = \"Child1\";\n    };\n    Frame \"b\" {\n        Name = \"Child2\";\n    };\n}\n\n-- \ub2e4\uc74c\uacfc \uac19\uc774 a \uc640 b \ub458\ub2e4 \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"a,b\"):Each(function(item, index)\n    print(item.Name)\nend)\nprint(\"----\")\n\n-- \ub2e4\uc74c\uacfc \uac19\uc774 a \uc640 b \ub97c \ub3d9\uc2dc\uc5d0 \uac00\uc9c4 \uac83\uc744 \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"a&b\"):Each(function(item, index)\n    print(item.Name)\nend)\nprint(\"----\")\n\n-- \ub2e4\uc74c\uacfc \uac19\uc774 a\uc640b \ub97c \ub3d9\uc2dc\uc5d0 \uac00\uc9c4\uac83\uacfc, b \ub97c \uac00\uc9c4\uac83\uc744 \uc120\ud0dd\n-- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"a&b,b\"):Each(function(item, index)\n    print(item.Name)\nend)\n
    • \ub610\ub294(or) \uc5f0\uc0b0 ,
    • \uadf8\ub9ac\uace0(and) \uc5f0\uc0b0 &

    GetObjects \uc5d0\ub294 \uc774 \ub450 \uc5f0\uc0b0\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uace0, \uc0dd\uc131\uc2dc\uc5d0\ub294 , \uc73c\ub85c \uc5ec\ub7ec \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub744\uc5b4\uc4f0\uae30\ub294 \ubb34\uc2dc\ub429\ub2c8\ub2e4

    \uc8fc\uc758
    • GetObject \uc5d0\ub294 \uc774 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
    • \uace0\uae09 ID \uc0ac\uc6a9\uc2dc objectList:Remove \uba54\uc18c\ub4dc\ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
    "},{"location":"tutorial/3_getObject/#id_1","title":"id \ucd94\uac00\uc640 \uc81c\uac70","text":"

    \uacbd\uc6b0\uc5d0 \ub530\ub77c \uc774\ubbf8 \uc0dd\uc131\ud55c \uc624\ube0c\uc81d\ud2b8\uc5d0 id \ub97c \ucd94\uac00 \ud639\uc740 \uc81c\uac70\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Store = Quad.Store\n\nlocal Frame = Class \"Frame\"\n\nFrame \"testing\" {}\n\n-- \uc544\uc774\ub514\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4\nStore.AddObject(\n    \"a,b\", Store.GetObject(\"testing\")\n)\n\n-- \uc544\uc774\ub514\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4\nStore.GetObjects(\"a\"):Remove(Store.GetObject(\"testing\"))\n

    Store.AddObject(ids:string, item:any) \ub97c \uc774\uc6a9\ud574 item \uc5d0 \uc544\uc774\ub514\ub97c \ucd94\uac00\ud558\uace0 :Remove(item:any) \ub97c \uc774\uc6a9\ud574 item \uc5d0 \uc544\uc774\ub514\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4

    "},{"location":"tutorial/4_style/","title":"Style - \uc18d\uc131 \uac12 \ubc88\ub4e4\ub9c1","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Style \uae30\ub2a5\uc774 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Style \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

    "},{"location":"tutorial/4_style/#_1","title":"\ubc18\ubcf5\ub418\ub294 \uc18d\uc131\uac12\uc744 \uc904\uc774\uae30","text":"

    Quad \uc5d0\uc11c\ub294 \ubc18\ubcf5\uc801\uc778 \uc18d\uc131\ub4e4\uc744 \uc904\uc5ec \uc4f8 \uc218 \uc788\ub3c4\ub85d Style \uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\n\n-- \uc0c8\ub85c\uc6b4 \uc2a4\ud0c0\uc77c\uc744 \ud558\ub098 \ub9cc\ub4ed\ub2c8\ub2e4\nlocal myStyle = Style {\n    Size = UDim2.fromOffset(20,20);\n    BackgroundColor3 = Color3.fromRGB(255,255,0);\n    BackgroundTransparency = 0.5;\n}\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n    Frame \"Child\" {\n        myStyle; -- \uc2a4\ud0c0\uc77c\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4!\n    };\n    Frame \"Child\" {\n        Position = UDim2.fromOffset(30,0);\n        myStyle;\n    };\n    Frame \"Child\" {\n        Position = UDim2.fromOffset(60,0);\n        myStyle;\n    };\n    Frame \"Child\" {\n        Position = UDim2.fromOffset(90,0);\n        -- \uc2a4\ud0c0\uc77c\uc740 \ub36e\uc5b4\uc368 \uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        BackgroundColor3 = Color3.fromRGB(255,0,0);\n        myStyle;\n    };\n}\n\nMount(ScreenGUI,Store.GetObject(\"mainFrame\"))\n

    Style\uc744 \uc0ac\uc6a9\ud558\uba74 \ub9ce\uc740 \uc591\uc758 \uc18d\uc131\uc744 \ud558\ub098\uc5d0 \ubcc0\uc218\ub85c \uc9d1\uc5b4\ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Style\uc744 \uc0ac\uc6a9\ud574\uc11c \ub9ce\uc740 \uc591\uc758 \ucf54\ub4dc\ub97c \uc904\uc5ec\ubcf4\uc138\uc694

    "},{"location":"tutorial/4_style/#id","title":"ID \ub85c \ud0c0\uac9f\uc744 \uc9c0\uc815\ud558\uae30","text":"

    Style\uc5d0\ub294 \ud0c0\uac9f id\ub97c \uc9c0\uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\n\n-- \uc5ec\uae30\uc5d0\ub294 & \ub098 , \uac00 \uc801\uc6a9\ub418\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4!\nStyle \"Child\" {\n    Size = UDim2.fromOffset(20,20);\n    BackgroundColor3 = Color3.fromRGB(255,255,0);\n    BackgroundTransparency = 0.5;\n}\n\n-- \ub2e8, Style\uc740 \uba3c\uc800 \uc120\uc5b8\ud574\uc57c\ud569\ub2c8\ub2e4, Frame\uc744 \uba3c\uc800 \ub9cc\ub4e4\uace0\n-- Style\uc744 \uc120\uc5b8\ud558\uba74 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n    Frame \"Child\" {};\n    Frame \"Child\" { Position = UDim2.fromOffset(30,0) };\n}\n\nMount(ScreenGUI,Store.GetObject(\"mainFrame\"))\n

    Style(id:string){ any }\ub97c \uc774\uc6a9\ud574 \uc2a4\ud0c0\uc77c\uc744 \uc120\uc5b8\ud574\uc8fc\uba74 \ub098\uc911\uc5d0 \ud574\ub2f9 id\ub97c \uac00\uc9c4 \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc \ud574\ub2f9 \uc2a4\ud0c0\uc77c\uc774 \uc801\uc6a9\ub429\ub2c8\ub2e4.

    "},{"location":"tutorial/5_event/","title":"Event - \uc774\ubca4\ud2b8 \ud578\ub4e4\ub9c1","text":""},{"location":"tutorial/5_event/#_1","title":"\uc774\ubca4\ud2b8 \ub4f1\ub85d\ud558\uae30","text":"

    MouseButton1Click \ud639\uc740 GetPropertyChangedSignal \uac19\uc740 \ub85c\ube14 \uae30\ubcf8 \uc774\ubca4\ud2b8\ub97c \uac04\ub2e8\ud558\uac8c \ub4f1\ub85d\ud558\uace0 \uc2f6\uc73c\uc2e0\uac00\uc694? Event \ub97c \uc774\uc6a9\ud574\ubcf4\uc138\uc694.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Event = Quad.Event\nlocal Store = Quad.Store\n\nlocal TextButton = Class \"TextButton\"\nlocal Count = 0\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(200,200);\n    Text = \"0 \ubc88 \ud074\ub9ad\ud588\uc2b5\ub2c8\ub2e4\";\n    [Event \"MouseButton1Click\"] = function(self,x,y)\n        Count = Count + 1\n        self.Text = Count .. \" \ubc88 \ud074\ub9ad\ud588\uc2b5\ub2c8\ub2e4\"\n    end;\n}\nMount(ScreenGUI, Store.GetObject(\"mainButton\"))\n
    "},{"location":"tutorial/5_event/#_2","title":"\uc774\ubc34\ud2b8 \ub9ac\uc2a4\ud2b8","text":"

    \uc801\uc6a9\uac00\ub2a5\ud55c Event \ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4

    Event(name:string)

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 \uc774\ubca4\ud2b8\ub4e4\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4, MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up \ub4f1\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4 \uae30\ubcf8\uc801\uc73c\ub85c \ub85c\ube14\ub85d\uc2a4\uc758 \uae30\ubcf8 \uc774\ubca4\ud2b8\ub4e4\uacfc \ub2e4\ub974\uac8c, \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c - \ubc84\ud2bc\ud074\ub9ad
    Frame {\n    [Event \"MouseEnter\"] = function (self)\n        print(self.Name .. \"\uc5d0 \ub9c8\uc6b0\uc2a4\uac00 \uc62c\ub77c\uc654\uc2b5\ub2c8\ub2e4\")\n    end;\n}\n
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal TextButton = Class \"TextButton\"\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(200,200);\n    [Event \"MouseEnter\"] = function (self)\n        print(\"\ubc84\ud2bc\uc774 \ud074\ub9ad\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n    end;\n}\nMount(ScreenGUI, Store.GetObject(\"mainButton\"))\n

    Event.Created

    \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub418\uc5c8\uc744 \ub54c \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nFrame {\n    [Event.Created] = function (self)\n        print(self.Name .. \"\uc774 \uc0dd\uc131\ub418\uc5c8\uc5b4\uc694\")\n    end;\n}\n

    \uc8fc\uc758

    Event.Created \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4. Class.Extend \uc5d0\uc11c\ub294 AfterRender \ub97c \uc774\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.

    Event.CreatedAsync

    Event.Created \uc640 \ube44\uc2b7\ud558\uc9c0\ub9cc, \ucf54\ub8e8\ud2f4 \uc548\uc5d0\uc11c \uc791\ub3d9\ud569\ub2c8\ub2e4. objectList:EachAsync() \ucc98\ub7fc \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nFrame {\n    Frame {\n        Name = \"A\";\n        [Event.CreatedAsync] = function (self)\n            -- \uc774 \ud568\uc218\uac00 \ub05d\ub098\uc9c0 \uc54a\ub354\ub77c\ub3c4 \ub2e4\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \uc218 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4\n            task.wait(5)\n        end;\n    };\n    Frame {\n        Name = \"B\";\n        [Event.Created] = function (self)\n            print(self.Name .. \"\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n        end;\n    };\n}\n

    \uc8fc\uc758

    Event.CreatedAsync \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4.

    Event.Prop(propertyName:string)

    \ud504\ub85c\ud37c\ud2f0 \uac12\uc774 \ubcc0\uacbd\ub428\uc744 \uc5f0\uacb0\ud569\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nTextBox {\n    Text = \"\uc544\ubb34\uac70\ub098 \uc785\ub825\ud558\uc138\uc694\";\n    [Event.Prop \"Text\"] = function (self,text)\n        -- \ud3b8\uc758\uc0c1\uc758 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4\n        print(text)\n    end;\n}\n

    "},{"location":"tutorial/6_tween/","title":"Tween - \ud2b8\uc708\ud6a8\uacfc","text":""},{"location":"tutorial/6_tween/#_1","title":"\ud2b8\uc704\ub2dd","text":"

    Quad\uc5d0\ub294 \ud2b8\uc708\uc744 \ub3c4\uc640\uc8fc\ub294 \ubaa8\ub4c8\uc774 \ub0b4\uc7a5\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud2b8\uc708 \ubaa8\ub4c8\uc740 \ub2e8\uc21c\ud55c Instance\ub4e4\uc744 \ub118\uc5b4\uc11c table \ud615\uc2dd\ub3c4 \ud2b8\uc708\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ub098\uc911\uc5d0 \ucee4\uc2a4\ud140 \uc624\ube0c\uc81d\ud2b8\ub97c \ud2b8\uc708\ud560 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4. Quad \uc5d0\uc11c\ub294 \uc2e4\uc81c\ub85c \uc9c1\uc811\uc801\uc73c\ub85c Tween \uc744 \uc0ac\uc6a9\ud560 \uc77c\uc740 \uc801\uc73c\uba70 \ucd94\ud6c4 \uc124\uba85\ub418\ub294 register:Tween()\ub85c \uc0ac\uc6a9\ud558\ub294\uac83\uc774 \uad8c\uc7a5\ub429\ub2c8\ub2e4.

    \ud2b8\uc708\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc774 \uc218\ud589\ud569\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c - \uc6c0\uc9c1\uc774\ub294 \ubc84\ud2bc
    Tween.RunTween(myFrame,{\n    -- \ud2b8\uc708 \uc635\uc158\n    Easing = Tween.Easing.Expo;\n    Direction = Tween.Directions.Out;\n    Time = 1;\n    ...\n},{\n    -- \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\n})\n
    \ud074\ub9ad\uc2dc \uc6c0\uc9c1\uc774\ub294 \ubc84\ud2bc\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4.
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Tween = Quad.Tween\n\nlocal Frame = Class \"Frame\"\nlocal TextButton = Class \"TextButton\"\nlocal on = false\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(300,300);\n    BackgroundColor3 = Color3.fromRGB(255,255,255);\n    TextButton \"Child\" {\n        Text = \"Click Me!\";\n        BackgroundColor3 = Color3.fromRGB(255,100,255);\n        Position = UDim2.fromOffset(80,100);\n        Size = UDim2.fromOffset(20,20);\n        [Event \"MouseButton1Click\"] = function(self,x,y)\n            on = not on\n            Tween.RunTween(self,{\n                -- \ud2b8\uc708 \uc635\uc158\uc785\ub2c8\ub2e4. \uc544\ub798\uc5d0\uc11c \uc124\uba85\ub429\ub2c8\ub2e4\n                Easing = Tween.Easing.Expo;\n                Direction = Tween.Directions.Out;\n                Time = 1;\n            },{\n                -- \ud2b8\uc708\ud560 \ubaa9\ud45c \ud504\ub85c\ud37c\ud2f0\uc785\ub2c8\ub2e4\n                Position = on\n                    and UDim2.fromOffset(200,100)\n                    or UDim2.fromOffset(80,100);\n            })\n        end;\n    };\n}\n\nMount(ScreenGUI, Store.GetObejct(\"mainFrame\"))\n
    "},{"location":"tutorial/6_tween/#_2","title":"\ud2b8\uc708 \uc635\uc158","text":"

    \ud2b8\uc708\uc5d0\ub294 \ud2b8\uc708 \uc635\uc158\uc774 \ub4e4\uc5b4\uac00\uba70, \uc5ec\uae30\uc5d0\ub294 \ud2b8\uc708\uc758 \ubc29\ud5a5, \uac00\uac10\uc18d, \uc2dc\uac04 \ub4f1\uc744 \uc124\uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub123\uc744 \uc218 \uc788\ub294 \ud2b8\uc708 \uc635\uc158\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    Option Time:number?

    \ud2b8\uc708\uc758 \ucd1d \uae38\uc774\ub97c \uc815\ud569\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 1\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    Option Easing:string|(index:number)->number?

    \ud2b8\uc708\uc758 \uac00\uac10\uc18d \uc815\ub3c4\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Easings.Linear\uc640 \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud639\uc740 \ud544\uc694\uc5d0 \ub530\ub77c \ud568\uc218\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c Easing \uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c 1\ucc28 \uc9c4\ud589\ub3c4 (Linear, 0 \uc5d0\uc11c 1 \uc0ac\uc774\uc758 \uac12) \uac12\uc774 \uc8fc\uc5b4\uc9c0\uba70, \uacc4\uc0b0 \uacb0\uacfc\ub85c \uc2e4\uc81c \uc801\uc6a9\ub420 \uc704\uce58\ub97c \ubc18\ud658\ud574\uc57c\ud569\ub2c8\ub2e4. \ubc18\ud658\uac12\uc740 \uc74c\uc218\uc774\uac70\ub098 1 \ubcf4\ub2e4 \ud074 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Exp2\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \ud568\uc218\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option Direction:string?

    \ud2b8\uc708\uc774 \uc9c4\ud589\ub418\ub294 \ubc29\ud5a5\uc785\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Directions.Out\uacfc \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Out\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \ubc29\ud5a5\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option CallBack:{[number|\"*\"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uc2e4\ud589\uc911\uc778 \ub3c4\uc911\uc5d0 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b8\uc708\uc758 \uc9c4\ud589 \uc815\ub3c4\uc5d0 \ub530\ub77c\uc11c \ud55c\ubc88 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uac70\ub098 \ud2b8\uc708 \uc9c4\ud589\uc911 \uacc4\uc18d\ud574\uc11c \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub371\uc2a4\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0 \ud574\ub2f9 \uc9c0\uc810\uc744 \ub118\uc744 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70, \"*\" \ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uba74 \ubaa8\ub4e0 \ubd80\ubd84\uc5d0\uc11c \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \ud568\uc218\uc5d0\ub294 \ud3b8\uc758\uc0c1 \ud2b8\uc708\uc744 \ud558\uace0\uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \uc704\uce58\uac12, \uc2dc\uac04\ub9cc\uc744 \uace0\ub824\ud55c 1\ucc28 \uc704\uce58\uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 \"*\" \ub97c \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 1\uc744 \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Getter:(Item:any, Property:string)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc5bb\uc73c\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc124\uc815\ud558\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984, \uc124\uc815\ud560 \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/6_tween/#_3","title":"\ud2b8\uc708 \ud568\uc218","text":"

    Quad \uc758 \ud2b8\uc708\uc5d0\ub294 \ud2b8\uc708\uc744 \uba48\ucd94\uac70\ub098 \ud2b8\uc708\uc911\uc778\uc9c0 \ud655\uc778\ud558\ub294 \ub4f1\uc758 \uc791\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \uc5ec\ub7ec \ud568\uc218\ub4e4\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4. Tween \uc548\uc758 \ubaa8\ub4e0 \ud568\uc218\uc640 \uac12\ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

    \ud2b8\uc708\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\uc708 \uc635\uc158\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 TweenOptions \ubb38\uc11c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ended, OnStepped, Setter, Getter \uac12\uc774 \uc124\uc815\ub418\uba74 Option \uc548\uc758 \uac12\ubcf4\ub2e4 \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uae30\ub2a5\uc740 TweenOptions\uc758 \ub0b4\uc6a9\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0ac \uc218 \uc788\ub3c4\ub85d TweenHandler \uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. \ub2e4\ub978 \ud2b8\uc708\uc774 \ubcc0\uacbd\uc911\uc778 \uc18d\uc131\uc774 \ub2e4\uc2dc \ud2b8\uc708\ud558\ub3c4\ub85d \ud638\ucd9c\ub418\uba74, \uc774\uc804 \ud2b8\uc708\uc5d0\uc11c \ud574\ub2f9 \uc18d\uc131\uc740 \ud2b8\uc708\uc774 \uc911\ub2e8\ub418\uba70 \uc0c8\ub85c\uc6b4 \ud2b8\uc708\uc73c\ub85c \ub36e\uc5b4\uc4f0\uae30 \ub429\ub2c8\ub2e4.

    Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

    Tween.RunTween \uc640 \uac19\uc73c\ub098 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\ud569\ub2c8\ub2e4. \uc544\ubb34\uac83\ub3c4 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    Tween.RunTween({myFrame1, myFrame2, myFrame3},{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.StopTween(ItemOrHandler:TweenHandler|any)

    \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4. TweenHandler \ub610\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc5b4 \uba48\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc73c\uba74 \uadf8 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc2e4\ud589\uc911\uc778 \ubaa8\ub4e0 \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4.

    TweenHandler \uc774\uc6a9\uc624\ube0c\uc81d\ud2b8 \uc774\uc6a9
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(Handler)\n
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(myFrame)\n

    Tween.StopPropertyTween(Item:any, PropertyName:string)

    \uc624\ube0c\uc81d\ud2b8\uc5d0 \ud2b9\uc815 \ud504\ub85c\ud37c\ud2f0\uc758 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0b5\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8 \ub610\ub294 TweenHandler \ub85c \ud2b8\uc708\uc774 \uc9c4\ud589\uc911\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4.

    Tween.IsPropertyTweening(Item:any, PropertyName:string)

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8\uc758 \ud504\ub85c\ud37c\ud2f0\uac00 \ud2b8\uc708\uc911\uc774\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \uadf8\ub798\ud504\uc640 \ubbf8\ub9ac\ubcf4\uae30\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \uc790\uc138\ud55c \uc815\ubcf4\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"tutorial/7_quadProperty/","title":"QuadProperty - \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0","text":"\uc8fc\uc758\uc0ac\ud56d

    \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0\ub294 Tween \uc774 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 register\uc758 :Tween()\uc758 \uacbd\uc6b0 \ud638\ud658\ub418\ubbc0\ub85c, \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0 \uac12\uc744 \ud2b8\uc708\ud558\ub824\uba74 \ud5a5\ud6c4 \uc124\uba85\ub418\ub294 register \uc640 \ud568\uae68 \uc0ac\uc6a9\ud574\uc57c\ud569\ub2c8\ub2e4.

    Tween.RunTween, Tween.RunTweens \uc640\ub294 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/7_quadProperty/#_1","title":"\ud2b9\uc218\ud55c \ud504\ub85c\ud37c\ud2f0","text":"

    Quad \uc5d0\uc11c\ub294 \ud3b8\ub9ac\uc131\uc744 \uc704\ud574 \uc77c\ubd80 \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubaa8\ub4e0 \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0\ub294 \ud5a5\ud6c4 \uc18c\uac1c\ub418\ub294 register\uc640 \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal ImageFrame = Class \"ImageFrame\"\nImageFrame.BackgroundTransparency = 1\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    PaddingAllOffset = 50; -- Padding \uc744 50 \uc529 \ubaa8\ub4e0 \ubc29\ud5a5\uc73c\ub85c \uc90d\ub2c8\ub2e4\n    BackgroundColor3 = Color3.fromRGB(40,40,40);\n    ImageFrame {\n        ImageColor3 = Color3.fromRGB(60,60,60);\n        RoundSize = 16; -- \uc774\ubbf8\uc9c0\ub85c \ub77c\uc6b4\ub4dc \ud504\ub808\uc784\uc744 \ub9cc\ub4ed\ub2c8\ub2e4\n        Size = UDim2.fromScale(1,1);\n        ImageFrame {\n            BackgroundColor3 = Color3.fromRGB(80,80,80);\n        };\n    };\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n

    \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud504\ub85c\ud37c\ud2f0\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    RoundSize:number?

    ImageLabel, ImageButton \uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc18d\uc131\uc785\ub2c8\ub2e4. \uc6d0\ud615 \uc774\ubbf8\uc9c0\uc5d0 Slice\ub97c \uc774\uc6a9\ud574 \ub465\uadfc \ud504\ub808\uc784\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c UICorner\ubcf4\ub2e4 \ubd80\ub4dc\ub7ec\uc6b4 \ucf54\ub108\ud6a8\uacfc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.

    Corner:number?

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 UI\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ub429\ub2c8\ub2e4. UICorner\ub97c \uc774\uc6a9\ud574 \ubaa8\uc11c\ub9ac \ubd80\ubd84\uc744 \ub465\uae00\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    PaddingAll:UDim?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc0c1\ud558\uc88c\uc6b0 \ubaa8\ub450 \uac19\uc740 \uac12\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4. PaddingAllOffset \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    PaddingAllOffset:number?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. PaddingAll\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc791\ub3d9\ud558\ub098, Offset\uac12\ub9cc \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PaddingAll \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Scale:number?

    UIScale\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. UIScale.Scale \uacfc \uac19\uc740 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4

    "},{"location":"tutorial/8_register/","title":"Register - \uac12 \ubcc0\uacbd \uc5f0\ub3d9","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Store.GetStore \uac00 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Store.GetStore \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

    "},{"location":"tutorial/8_register/#_1","title":"\ub808\uc9c0\uc2a4\ud130","text":"

    \ub808\uc9c0\uc2a4\ud130\ub294 \ud55c \uac12\uc774 \ubcc0\uacbd\ub420 \ub54c, \uadf8 \uac12\uc744 \uc0ac\uc6a9\ud55c \uacf3\uc774 \uc5c5\ub370\uc774\ud2b8 \ub420 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\uc8fc\ub294 Quad \uc758 \uc8fc\uc694 \uae30\uc220\uc785\ub2c8\ub2e4. \ucd94\ud6c4 \uc124\uba85\ub420 Class.Extend \uc640\ub3c4 \uac19\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    \ub808\uc9c0\uc2a4\ud130\ub294 \uc774\ub7ec\ud55c \uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    1. UI \uc758 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\ubc88\uc5d0 \ud398\uc774\ub4dc \uc544\uc6c3 \ud639\uc740 \ud398\uc774\ub4dc \uc778 \uc2dc\ud0a4\ub294 \uacbd\uc6b0.
    2. \uac00\ubcc0 \ud06c\uae30\uc758 UI \ub97c \uc5c5\ub370\uc774\ud2b8 \uc2dc\ud0a4\ub294 \uacbd\uc6b0.
    3. \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\uc2dc\ud0a4\ub294 \uacbd\uc6b0.
    4. \ub2e4\ud06c\ud14c\ub9c8/\ud654\uc774\ud2b8\ud14c\ub9c8 \ubcc0\uacbd\ud560 \uc218 \uc788\uac8c \ub9cc\ub4dc\ub294 \uacbd\uc6b0.

    \uc774\uc678\uc5d0\ub3c4 \ub808\uc9c0\uc2a4\ud130\uc758 \ud65c\uc6a9 \ubc29\ubc95\uc740 \ubb34\uad81\ubb34\uc9c4\ud569\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130\uc758 \uc0ac\uc6a9\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    local myStore = Store.GetStore(\"myStore\")\nmyStore.color = Color3.fromRGB(255,255,255)\nFrame { BackgroundColor3 = myStore \"color\" }\n-- \uc5f0\ub3d9\ub41c \ud504\ub808\uc784\ub3c4 \uc5c5\ub370\uc774\ud2b8 \ub429\ub2c8\ub2e4\nmyStore.color = Color3.fromRGB(0,0,0)\n
    \uc8fc\uc758

    \uad6c\ud604\uc758 \ubcf5\uc7a1\uc131\uc758 \uc774\uc720\ub85c \ub808\uc9c0\uc2a4\ud130\ub294 \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local myFrame = Frame{}\nFrame.BackgroundColor3 = myStore \"color\"\n
    \uc704\ucc98\ub7fc \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    1. \uc2a4\ud1a0\uc5b4\ub97c \uc0dd\uc131\ud568.
    2. \uae30\ubcf8 \uac12\uc744 \uc124\uc815\ud568.
    3. \uc2a4\ud1a0\uc5b4\ub97c \ud638\ucd9c\ud574 \ub808\uc9c0\uc2a4\ud130\ub97c \uc5bb\uc5b4 \ub4f1\ub85d\ud568.

    \uc608\uc2dc \ucf54\ub4dc\ub85c \uc815\ud655\ud558\uac8c \ud655\uc778\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\n-- \ub808\uc9c0\uc2a4\ud130\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub294 \ud14c\uc774\ube14\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.\n-- \uc5ec\uae30\uc5d0 \ub2f4\uc544\ub0b4\ub294 \uac12\uc744 \uc5c5\ub370\uc774\ud2b8 \ud558\ub294 \uacbd\uc6b0 \ub808\uc9c0\uc2a4\ud130\ub85c \uc5f0\uacb0\ub41c\n-- \uc624\ube0c\uc81d\ud2b8\ub4e4\ub3c4 \uac19\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.\nlocal myStore = Store.GetStore(\"myStore\")\nlocal TextLabel = Class \"TextLabel\"\n\nmyStore.Text = \"0 \ucd08 \uc9c0\ub0a8\"\nmyStore.Color = Color3.fromRGB(255,100,255)\n\nTextLabel \"mainLabel\" {\n    Size = UDim2.fromOffset(100,200);\n    -- myStore \uc758 Text \uac12\uc774 \ubcc0\uacbd\ub428\uc744 \ucd94\uc801\ud558\uace0, Text \uac12\uc744\n    -- \uc5c5\ub370\uc774\ud2b8 \uc2dc\ud0b5\ub2c8\ub2e4.\n    Text = myStore \"Text\";\n\n    -- \uc774\uac83\uc740 \ub808\uc9c0\uc2a4\ud130\ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uc774 \uc544\ub2c8\ub77c \ub2e8\uc21c\ud788 \uac12\ub9cc\n    -- \ubd88\ub7ec\uc640 \ub123\uc5b4\uc8fc\ub294 \uac83\uc785\ub2c8\ub2e4. \uc790\ub3d9 \uc5c5\ub370\uc774\ud2b8\uac00 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    BackgroundColor3 = myStore.Color;\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainLabel\"))\n\n-- \ubc14\uafb8\ub354\ub77c\ub3c4 \ub808\uc9c0\uc2a4\ud130\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc544 \ubc18\uc601\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\nmyStore.Color = Color3.fromRGB(255,255,255)\n\nlocal Count = 1\nwhile task.wait(1) do\n    -- \uac12\uc744 \uc5c5\ub370\uc774\ud2b8 \ud569\ub2c8\ub2e4. \ud14d\uc2a4\ud2b8 \ub77c\ubca8\ub3c4\n    -- \uc790\ub3d9\uc801\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8 \ub429\ub2c8\ub2e4.\n    myStore.Text = Count .. \" \ucd08 \uc9c0\ub0a8\"\n    Count = Count + 1\nend\n
    "},{"location":"tutorial/8_register/#_2","title":"\ub808\uc9c0\uc2a4\ud130 \uba54\uc18c\ub4dc","text":"

    \ub808\uc9c0\uc2a4\ud130\uc5d0\ub294 \uc5ec\ub7ec\uac00\uc9c0 \uba54\uc18c\ub4dc\uac00 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4. \uc774 \uba54\uc18c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uba74 \ub808\uc9c0\uc2a4\ud130\ub97c \ubcf4\ub2e4 \ub354 \ub2e4\uc591\ud558\uac8c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    register \ud2b9\uc218 \uba54\uc18c\ub4dc\uac00 \uc801\uc6a9\ub418\ub294 \uc21c\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    :Add(value:any)->register

    \uac12\uc5d0 \ub354\ud558\uae30\ub97c \ucde8\ud569\ub2c8\ub2e4. \uc74c\uc218\ud615\ud0dc\uac00 \uc81c\uacf5\ub418\ub294 \uacbd\uc6b0 \ube7c\uae30 \ucc98\ub7fc \uc791\ub3d9\ud569\ub2c8\ub2e4. number, Udim, UDim2, Color3, Vector2 \ub4f1 \ub354\ud560 \uc218 \uc788\ub294 \ubaa8\ub4e0\uac83\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.pos = UDim2.fromOffset(100,0)\n\nFrame \"mainFrame\" {\n    Position = myStore \"pos\":Add(UDim2.fromOffset(0,100));\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nwhile true do\n    myStore.pos = myStore.pos + UDim2.fromOffset(10,0)\n    task.wait(2)\nend\n

    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :With((store:valueStore, newValue:any, key:string)->())->register

    \ud568\uc218 \ub610\ub294 \ud14c\uc774\ube14\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4. Add \ubcf4\ub2e4 \ub098\uc911\uc5d0 \uc218\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud568\uc218\uc608\uc81c - \ud14c\uc774\ube14
    myStore \"size\":With(function (_,value)\n    return value * 2\nend)\n

    width \uac12\uc5d0 \ub9de\ucdb0 \uc790\ub3d9\uc73c\ub85c UI \uac00 \uc5c5\ub370\uc774\ud2b8\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.topbarSize = 60\nmyStore.width = 200\n\n-- \ub808\uc9c0\uc2a4\ud130\ub97c \ubcc0\uc218\ub85c \ub450\uace0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4\nlocal listItemSize = myStore \"width\":With(function()\n    return UDim2.fromOffset(myStore.width,60)\nend)\n\nFrame \"mainFrame\" {\n    Class \"UIListLayout\" { SortOrder = Enum.SortOrder.LayoutOrder };\n\n    -- \uc0ac\uc774\uc988\uac00 width \uc5d0 \ub9de\uac8c \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4\n    Size = myStore \"width\":With(function ()\n        return UDim.fromOffset(store.width,400)\n    end);\n\n    Frame \"Topbar\" {\n        LayoutOrder = 1;\n        BackgroundColor3 = Color3.fromRGB(255,0,0);\n        -- \uc774\ub807\uac8c \uc5ec\ub7ec \uac12\uc744 \ubb36\uc5b4\uc11c \ub450 \uac12\uc774 \ubcc0\uacbd\ub428, \ud639\uc740 \uadf8\uc774\uc0c1\uc744\n        -- \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        Size = myStore \"topbarSize,width\":With(function()\n            return UDim2.fromOffset(myStore.width,myStore.topbarSize)\n        end);\n    }\n    Frame \"ListItem\" {\n        LayoutOrder = 2;\n        BackgroundColor3 = Color3.fromRGB(0,255,0);\n        Size = listItemSize;\n    };\n    Frame \"ListItem\" {\n        LayoutOrder = 3;\n        BackgroundColor3 = Color3.fromRGB(0,0,255);\n        Size = listItemSize;\n    };\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- width \uac12\uc744 \ubcc0\uacbd\ud574\ubcf4\uc138\uc694\nwhile true do\n    myStore.width = myStore.width + 10\n    task.wait(1)\nend\n

    colors \ud14c\uc774\ube14 \uc548\uc5d0 \uc788\ub294 \uc0c9\uae54\ub4e4\uc744 \ub3cc\uc544\uac00\uba70 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nlocal colors = {\n    Color3.fromRGB(255,255,255);\n    Color3.fromRGB(255,255,0);\n    Color3.fromRGB(0,255,255);\n    Color3.fromRGB(255,0,255);\n    Color3.fromRGB(255,0,0);\n    Color3.fromRGB(0,255,0);\n    Color3.fromRGB(0,0,255);\n}\nmyStore.color = 1\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- colors \uc5d0\uc11c \uc778\ub371\uc2f1\ud574 \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4\n    BackgroundColor3 = myStore \"color\":With(colors);\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- \uc778\ub371\uc2a4\ub97c \uc21c\ud68c\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    myStore.color = (i-1)%(#colors)+2\nend\n
    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :Tween(options:TweenOptions)->register

    \ud2b8\uc708\uc744 \uc774\uc6a9\ud574 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4(\ucc98\uc74c \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc74c) \uc635\uc158\uc740 Tween \ubb38\uc11c\uc5d0 \ub098\uc640\uc788\ub294 \uc635\uc158\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud55c\uaebc\ubc88\uc5d0 \uc774\ub3d9
    -- Tween \uc635\uc158\uc744 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nmyStore \"size\":Tween{ Time = 2 }\n

    \ud504\ub808\uc784\uc744 \ud55c\uaebc\ubc88\uc5d0 \uc6c0\uc9c1\uc785\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.pos = UDim2.fromOffset(50,0)\nStyle \"TweenFrame\" {\n    Size = UDim2.fromOffset(50,50);\n    BackgroundColor3 = Color3.fromRGB(255,100,255);\n}\n\nFrame \"mainFrame\" {\n    BackgroundColor3 = Color3.fromRGB(255,255,255);\n    Size = UDim2.fromOffset(500,500);\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\":Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,100))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,200))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,300))\n            :Tween{Time = 2};\n    }\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nlocal on = false\nwhile true do\n    on = not on\n    myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0)\n    task.wait(1.5) -- \ud2b8\uc708\uc740 \ub36e\uc5b4 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \ub530\ub77c\uc11c 2 \ucd08\uc778 \uae38\uc774\ubcf4\ub2e4 \ub354 \ube68\ub9ac \ubc14\uafd4\ub3c4 \uc624\ub958\uac00 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\nend\n
    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :Default(value:any)->register

    \uae30\ubcf8\uac12\uc744 \uc815\ud569\ub2c8\ub2e4. \ub9cc\uc57d \uac12\uc774 nil \uc778 \uacbd\uc6b0 \uc774 \uac12\uc744 \uc0ac\uc6a9\ud558\uac8c \ub429\ub2c8\ub2e4. Add \ub098 With \ub4f1 \ub2e4\ub978\uac83\uc5d0 \uc601\ud5a5\ubc1b\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- color \uac12\uc774 \uc5c6\uc73c\ubbc0\ub85c Default \uc548\uc758 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n    BackgroundColor3 = myStore \"color\"\n        :Default(Color3.fromRGB(255,0,0));\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\ntask.wait(5)\nmyStore.color = Color3.fromRGB(0,255,0)\n

    \uc8fc\uc758
    • \ucc98\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \ub54c\uc5d0\ub9cc \uc774 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.
    • \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    :Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT

    \ub808\uc9c0\uc2a4\ud130\uc5d0 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4. \uac12\uc774 \ubcc0\uacbd\ub418\uba74 \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

    newValue \uc5d0\ub294 :Add, :With, :Tween, :Default \uac00 \ub530\ub85c \uacc4\uc0b0\ub418\uc9c0 \uc54a\uc73c\uba70, \uc124\uc815\ub41c \uac12\uc744 \uc544\ubb34 \uac00\uacf5 \uc5c6\uc774 \uc81c\uacf5\ud569\ub2c8\ub2e4

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \uc5ec\ub7ec \ubcc0\uacbd\uc0ac\ud56d \ucd94\uc801
    myStore.test = 1\n-- \ubc18\ud658 \uac12\uc740 \uc785\ub825\uc73c\ub85c \ub123\uc740 \ud568\uc218\uc785\ub2c8\ub2e4. !\uaf2d \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4\n-- :Register \ub294 \ud568\uc218\uac00 \uc0ac\ub77c\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \uac12\uc744 \uc720\uc9c0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\n-- \ub9cc\uc57d \ubc84\ub9b4 \uacbd\uc6b0 \uc77c\uc815 \uc2dc\uac04 \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nlocal func = myStore \"test\":Register(function(_,newValue)\n    -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n    print(newValue)\nend)\nmyStore.test = 2\n

    myStore.test1, myStore.test2 \uac00 \ubcc0\ud654\ud558\uba74 print \ud568\uc218\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\n\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.test1 = 1\nmyStore.test2 = \"Hello\"\n\nlocal func = myStore \"test1,test2\":Register(function()\n    print(myStore.test1,myStore.test2)\nend)\n\nmyStore.test1 = 2\n
    \uc8fc\uc758

    Register \uc548\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub294 GC \uc548\uc815\uc131\uc744 \uc704\ud574\uc11c \uc57d\ud55c \ucc38\uc870\ub85c \uc800\uc7a5\ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c \ud568\uc218\ub97c \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4.

    "},{"location":"tutorial/9_lang/","title":"Lang - \uc5b8\uc5b4\uad00\ub9ac","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Lang \uae30\ub2a5\uc774 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Lang \uc740 \uacf5\uc720\ub429\ub2c8\ub2e4

    "},{"location":"tutorial/9_lang/#_1","title":"\uc5b8\uc5b4\uad00\ub9ac","text":"

    Quad \uc5d0\ub294 \uadc0\ucc2e\uc740 \uc5b8\uc5b4\uad00\ub9ac\ub97c \uc790\ub3d9\uc73c\ub85c \ud574\uc8fc\ub294 \uae30\ub2a5\uc774 \ub0b4\uc7a5\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae30\ub2a5\uc740 register \uc640 \uc5f0\ub3d9\ud574 \uc801\uc740 \uc904\uc758 \ucf54\ub4dc\ub85c \ubcc0\ud558\ub294 \ud14d\uc2a4\ud2b8\ub3c4 \uc5b8\uc5b4\uc5d0 \ub9de\uac8c \ucd9c\ub825\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    \ubc88\uc5ed \ud14c\uc774\ube14\uc740 Lang.New(LangName:string,{ [Locale]: string|(options)->string }) \ub2e4\uc74c\uc744 \uc774\uc6a9\ud574 \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70. Lang(LangName:string)(options) \ub85c UI \uc5d0 \uc801\uc6a9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c - \ub2e4\uc911\uc5b8\uc5b4 \uce74\uc6b4\ud130 \uc790\uc138\ud55c \uc124\uba85\uc740 \uc608\uc81c\ub97c \ucc38\uace0\ud558\uc138\uc694
    Lang.New(\"Test\",{\n    [Lang.Locales.Korean] = \"{won} \uc6d0\";\n    [Lang.Locales.Default] = \"{won} Won\";\n})\nTextLabel {\n    Lang \"Test\" {\n        won = 100;\n    };\n}\n
    1\ucd08\uac00 \uc9c0\ub0a0 \ub54c \ub9c8\ub2e4 \uce74\uc6b4\ud2b8\ub97c \uc99d\uac00\ud569\ub2c8\ub2e4. \uc601\uc5b4 \uc0ac\uc6a9\uc790\uc5d0\uac90 \uc601\uc5b4\ub97c, \ud55c\uad6d\uc5b4 \uc0ac\uc6a9\uc790\uc5d0\uac90 \ud55c\uad6d\uc5b4\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Mount = Quad.Mount\nlocal Event = Quad.Event\nlocal Lang = Quad.Lang\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.count = 0\n\nLang.New(\"TimePassed\",{\n    [Lang.Locales.Korean] = \"{count}\ucd08 \uc9c0\ub0ac\uc5b4\uc694\";\n    [Lang.Locales.Default] = function (options)\n        -- \ud568\uc218 \ub610\ud55c \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        if options.count > 1 then\n            return (\"%d seconds passed\"):format(options.count)\n        else\n            return (\"%d second passed\"):format(options.count)\n        end\n    end;\n})\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(100,100);\n    Text = Lang \"TimePassed\" {\n        -- count = 1 \uc77c\ubc18\uc801\uc778 \uac12\ub3c4 \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4\n        count = myStore \"count\";\n    };\n    [Event \"MouseButton1Click\"] = function()\n        -- \ud074\ub9ad\uc2dc \uc5b8\uc5b4\uac00 \ubcc0\uacbd\ub429\ub2c8\ub2e4\n        if Lang.CurrentLocale == Lang.Locales.Default then\n            Lang.CurrentLocale = Lang.Locales.Korean\n        else\n            Lang.CurrentLocale = Lang.Locales.Default\n        end\n    end\n}\nMount(ScreenGUIk,Store.GetObject(\"mainButton\"))\n\nwhile task.wait(1) do\n    myStore.count = myStore.count + 1\nend\n
    "},{"location":"tutorial/9_lang/#locale","title":"Locale \ubaa9\ub85d","text":"

    \ub85c\ucf00\uc77c \uac12\ub4e4\uc740 Lang.Locales\uc5d0\uc11c \uac00\uc838\uc62c \uc218 \uc788\uc73c\uba70, \uc0ac\uc6a9\uac00\ub2a5\ud55c \ub85c\ucf00\uc77c \ubaa9\ub85d\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    Default (default) English (en_us) Spanish (es_es) French (fr_fr) Indonesian (id_id) Italian (it_it) Japanese (ja_jp) Korean (ko_kr) Russian (ru_ru) Thai (th_th) Turkish (tr_tr) Vietnamese (vi_vn) Portuguese (pt_br) German (de_de) ChineseSimplified (zh_cn) ChineseTraditional (zh_tw) Bulgarian (bg_bg) Bengali (bn_bd) Czech (cs_cz) Danish (da_dk) Greek (el_gr) Estonian (et_ee) Finnish (fi_fi) Hindi (hi_in) Croatian (hr_hr) Hungarian (hu_hu) Georgian (ka_ge) Kazakh (kk_kz) Khmer (km_kh) Lithuanian (lt_lt) Latvian (lv_lv) Malay (ms_my) Burmese (my_mm) Bokmal (nb_no) Dutch (nl_nl) Filipino (fil_ph) Polish (pl_pl) Romanian (ro_ro) Ukrainian (uk_ua) Sinhala (si_lk) Slovak (sk_sk) Slovenian (sl_sl) Albanian (sq_al) Bosnian (bs_ba) Serbian (sr_rs) Swedish (sv_se) Arabic (ar_001)

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":[" "]},"docs":[{"location":"","title":"Quad","text":"

    \ucc98\uc74c\uc624\uc168\ub098\uc694? \ud29c\ud1a0\ub9ac\uc5bc \ubb38\uc11c\ub97c \uc77d\uc5b4\ubcf4\uc138\uc694! \ucc98\uc74c\ubd80\ud130 \ucc28\uadfc\ucc28\uadfc Quad \ubaa8\ub4c8\uc744 \uc815\ubcf5\ud560 \uc218 \uc788\uc5b4\uc694

    "},{"location":"changelogs/","title":"\ubc84\uc804 \ubc88\uacbd\uc0ac\ud56d","text":""},{"location":"changelogs/#225","title":"2.25","text":"

    \uc2e4\ud5d8\uc801 API \ub85c\uc368 GetChildren() \uacfc ChildAdded::Bindable \uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#224","title":"2.24","text":"

    \ubaa8\ub4e0 \ubb38\uc11c\uac00 \uc815\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#223","title":"2.23","text":"

    \uac1d\uccb4 \uc0dd\uc131\uc2dc \uc77c\uc5b4\ub098\ub294 \uc624\ub958\ub97c \ud574\uacb0\ud588\uc2b5\ub2c8\ub2e4. \uc774\uc81c Extend \uac1d\uccb4 \ub0b4\ubd80 \uc790\uc2dd\uc774 Unmount \ub418\ub294 \uacbd\uc6b0 __child \uc5d0\uc11c \uc81c\uac70\ub429\ub2c8\ub2e4. types \uc758 \uc624\ud0c0\ub97c \uace0\ucce4\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#222","title":"2.22","text":"

    \ub354\uc774\uc0c1 Event.Prop \uac00 \ucc98\uc74c \uc0dd\uc131\uc2dc \uc2e4\ud589\ub418\ub294 \uc77c\uc774 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#221","title":"2.21","text":"

    Linker \uac00 \uc774\uc81c \ud074\ub798\uc2a4 \uc548 \ud074\ub798\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ub420 \uc218 \uc788\ub3c4\ub85d \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#220","title":"2.20","text":"

    Docments \uac00 \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub9ce\uc740\uc591\uc758 \uc0c8\ub85c\uc6b4 \ud29c\ud1a0\ub9ac\uc5bc\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4. Mkdocs \ud14c\ub9c8\uc640 \uc5ec\ub7ec\uac00\uc9c0 \uc124\uc815\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c Makefile \uc744 \ud1b5\ud574\uc11c rojo build \uc640 mkdocs build \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#219","title":"2.19","text":"

    Linker \uac1d\uccb4\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c GetPropertyChangedSignal \uc640, self \uc5d0 \ud2b9\uc815 \uc624\ube0c\uc81d\ud2b8 \ud639\uc740 \uc774\ubca4\ud2b8\ub97c \uc5f0\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#218","title":"2.18","text":"

    \uc774\uc81c \ub354\uc774\uc0c1 GC \uc5d0 \uc758\ud574 Store \uc758 Instance \uac12\uc774 \uc190\uc2e4\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#217","title":"2.17","text":"

    Tween \uc758 CallBack \ub4f1\ub85d \uc2dc \uc8fc\uc5b8\uc9c0\ub294 \ud30c\ub77c\uba54\ud130\uac00 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c \ub354\uc774\uc0c1 ~ \ubb38\uc774 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#215-breaking-changes","title":"2.15 BREAKING CHANGES","text":"

    \uc774\uc81c Lang \uc5d0\uc11c CurrentLocale, FailedMessage \uc744 \ubcc0\uacbd\ud558\uba74 \uc790\ub3d9\uc73c\ub85c \ubcc0\uacbd\uc0ac\ud56d\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4. \ub610\ud55c \uc77c\ubd80 \ud544\ub4dc\uc758 \ub124\uc774\ubc0d\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#214","title":"2.14","text":"

    Lang \ubaa8\ub4c8\uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. register \ub97c \uc0ac\uc6a9\ud574 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub2e4\uc911\uc5b8\uc5b4 \uc9c0\uc6d0\uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#213","title":"2.13","text":"

    Signal \ubaa8\ub4c8\uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c Class.Extend \uc5d0\uc11c GetPropertyChangedSignal \uacfc EmitPropertyChangedSignal \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#212","title":"2.12","text":"

    Mount \ubc18\ud658 \uac1d\uccb4\uc5d0 Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d Mount \uac1d\uccb4\uac00 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#211","title":"2.11","text":"

    Store.GetObjects \uc5d0 \uc774\uc81c & \ubb38\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#29","title":"2.9","text":"

    PreloadAsync \ub97c \ud1b5\ud574 \uc774\uc81c round.lua \uc5d0\uc11c \ub77c\uc6b4\ub4dc \uc774\ubbf8\uc9c0\ub97c \ubbf8\ub9ac \ub85c\ub4dc\ud569\ub2c8\ub2e4.

    "},{"location":"changelogs/#28","title":"2.8","text":"

    \ubc18\ud658 \uad00\ub828 \ucf54\ub4dc\uac00 exports \ub85c \uc774\uc8fc\ub418\uc5c8\uc73c\uba70. init.lua \uc5d0\uc11c\ub294 \uc790\ub3d9\uc801\uc73c\ub85c types \ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    "},{"location":"changelogs/#27","title":"2.7","text":"

    \uc774\uc81c types \ub97c \uc644\uc804\ud788 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc9c1\uc811 \ubd88\ub7ec\uc640 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"changelogs/#2126-breaking-changes","title":"2.1~2.6 BREAKING CHANGES","text":"

    \ubaa8\ub4e0 \ubaa8\ub4c8\uc758 \ud544\ub4dc\uc758 \uc774\ub984\uc774 \ubcc0\uacbd\ub418\uc5c8\uc73c\uba70, \ubaa8\ub4e0 \ud074\ub798\uc2a4\ub4e4\uc774 \uae30\ubcf8\uc801\uc73c\ub85c \ub300\ubb38\uc790 \uc2dc\uc791 \ub124\uc774\ubc0d\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \uba85\uba85\uaddc\uce59\uc744 \ubcc0\uacbd\ud588\uc2b5\ub2c8\ub2e4.

    "},{"location":"changelogs/#20","title":"2.0","text":"

    \ubc84\uc804 \ud310\uc62c\ub9bc, BREAKING CHANGES \ub97c \uc704\ud574 \ubc84\uc804\uc744 \ud310\uc62c\ub9bc \ud558\uc600\uc2b5\ub2c8\ub2e4.

    "},{"location":"gallery/","title":"\uac24\ub7ec\ub9ac","text":"

    \uc5ec\uae30\ub294 \uc5ec\ub7ec\ubd84\ub4e4\uc758 \uc791\ud488\uc744 \uc62c\ub824\ubcfc \uc218 \uc788\ub294 \uacf3\uc785\ub2c8\ub2e4! Quad \ub97c \uc0ac\uc6a9\ud55c \uc5ec\ub7ec\uac00\uc9c0 \ud6cc\ub96d\ud55c \uc791\ud488\ub4e4\uc744 \ubcf4\uc5ec\uc8fc\uc138\uc694!

    "},{"location":"license/","title":"\ub77c\uc774\uc120\uc2a4","text":"

    QwreeyKawaii License v1.3

    KoreanEnglish Permissions Limitations Conditions \u2705 \uc0c1\uc5c5\uc801 \uc0ac\uc6a9 \u274e \ubcf4\uc99d \u2753 \ub77c\uc774\uc120\uc2a4\uc640 \uc800\uc791\uad8c \uace0\uc9c0 (\uad8c\uace0\uc0ac\ud56d) \u2705 \ubc30\ud3ec \u274e \ubb34\ub840\ud558\uac8c \uad74\uae30 \u2705 \ubcc0\uacbd/\uc218\uc815/2\ucc28\uc800\uc791 \u274e \ub7ec\uc2dc\uc544\ub97c \ube44\ub86f\ud55c \uc804\uc7c1\uc744 \ub3d5\ub294 \u2705 \uac1c\uc778\uc801 \uc0ac\uc6a9 \u274e \uc544\ubb34\ub7f0 \ubcc0\uacbd\uc0ac\ud56d \uc5c6\uc774 \ubcf5\uc81c
              QwreeyKawaii license v1.3\nCopyright 2023. Qwreey [qwreey75@gmail.com]\n\n\uc774 \ub77c\uc774\uc120\uc2a4\ub294 DBAD \ub77c\uc774\uc120\uc2a4\ub97c \uae30\ubc18\uc73c\ub85c \ud569\ub2c8\ub2e4.\n\ub204\uad6c\ub4e0\uc9c0 \uc774 \ub77c\uc774\uc120\uc2a4 \ubb38\uc11c\uc758 \uc6d0\ubcf8 \ud639\uc740 \uc218\uc815\ubcf8\uc744\n\ubcf5\uc0ac, \ud3b8\uc9d1, \ubc30\ud3ec \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\nQwreeyKawaii \ub77c\uc774\uc120\uc2a4\uc758 \ubcf5\uc0ac \ubc30\ud3ec \ubc0f \uc218\uc815\uc5d0\n\uad00\ud55c \uaddc\uc815\uacfc \uc870\uac74.\n\n1. \ub2f9\uc2e0\uc740 \uc774 \uadc0\uc5ec\uc6b4 \ucc3d\uc791\ubb3c\uc744 \uac00\uc9c0\uace0 \uc5b4\ub5a0\ud55c\n\uac83\uc774\ub4e0 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8, \ubb34\ub840\ud558\uc9c0 \ub9c8\uc138\uc694.\n\ubb34\ub840\ud55c \ud589\ub3d9\uc740 \ud1b5\uc0c1\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.\n\n\uac00. \uadc0\uc5ec\uc6b4 \uc774 \ucc3d\uc791\ubb3c\uc744 \uc5b4\ub5a0\ud55c \uac00\uacf5\ub3c4 \uc5c6\uc774\n    \ubcf5\uc81c\ud558\uac70\ub098, \uc774\ub984\ub9cc \ubc14\uafb8\ub294 \uac83\uc740 \ubb34\ub840\ud558\uba70\n    \ub178\uace8\uc801\uc778 \uc800\uc791\uad8c \uce68\ud574\uc785\ub2c8\ub2e4.\n\ub098. \uadc0\uc5ec\uc6b4 \uc774 \ucc3d\uc791\ubb3c\uc5d0 \uc74c\ub780\uc131 \ud639\uc740 \uc720\ud574\ud55c\n    \ucf58\ud150\uce20\ub97c \ud3ec\ud568\uc2dc\ud0a4\ub294 \uac83\uc740 \ubb34\ub840\ud569\ub2c8\ub2e4.\n    \uadc0\uc5ec\uc6b4 \ucf58\ud150\uce20\ub85c \ub2e4\ub978\uc774\ub97c \ud574\uce58\uc9c0 \ub9c8\uc2ed\uc2dc\uc624.\n\n\uadf8\ub7ec\ub098 \uc774\uc5d0\ub9cc \uad6d\ud55c\ub418\ub294\uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4.\n\ubb34\uc5c7\ubcf4\ub2e4\ub3c4, \uadc0\uc5ec\uc6b4 \ud0c0\uc778\uc744 \uc0c1\ucc98\uc8fc\uc9c0 \ub9c8\uc138\uc694.\n\n2. \ub2f9\uc2e0\uc774 \uc774 \ucc3d\uc791\ubb3c\uc744 \uc0ac\uc6a9\ud574 \ub9ce\uc740 \uc774\ub4dd\uc744 \ubcf8\n\uacbd\uc6b0, \uadc0\uc5ec\uc6b4 \ucc3d\uc791\uc790\uc5d0\uac8c \uc0ac\ub791\uc744 \ubc30\ud478\uc138\uc694.\n\uc778\uac04\uc801\uc778 \uc0ac\ub78c\uc740 \uadc0\uc5ec\uc6b4 \uc0ac\ub78c\ub4e4\uc744 \uc678\uba74\ud558\uc9c0\n\uc54a\uc2b5\ub2c8\ub2e4. \ub2f9\uc2e0\uc758 \ucee4\ud53c \ud55c\uc794\uc744 \ub098\ub220\uc8fc\uc138\uc694.\n\n3. \uc774 \ucc3d\uc791\ubb3c\uc740 \uc5b4\ub5a0\ud55c \ubcf4\uc99d \uc5c6\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.\n\uc774 \ucc3d\uc791\ubb3c\uc744 \uc0ac\uc6a9\ud558\ub2e4, \ucc3d\uc791\uc790\uc758 \uadc0\uc5ec\uc6b4\n\uc2e4\uc218\ub85c \uc778\ud574 \ubb34\uc5b8\uac00 \uc798\ubabb\ub418\uc5c8\ub2e4\uba74, \ubb38\uc81c\ub97c \uc9c1\uc811\n\ud574\uacb0\ud558\uc138\uc694. \ubb34\ub840\ud558\uc9c0 \uc54a\uc740 \uc0ac\ub78c\uc740 \uc801\uc5b4\ub3c4\n\uadc0\uc5ec\uc6b4 \ud0c0\uc778\ub4e4\uc744 \ube44\ub09c\ud558\uac70\ub098 \ubaa8\uc695\ud558\uc9c0\ub294 \uc54a\uc73c\uba70\n\uc218\uc815\ubcf8\uc744 \uc81c\ucd9c\ud558\uac70\ub098 \ubc84\uadf8\ub9ac\ud3ec\ud2b8\ub97c \uc81c\ucd9c \ud560\n\uac83\uc785\ub2c8\ub2e4.\n\n4. \ub2f9\uc2e0\uc774 \uc774 \uadc0\uc5ec\uc6b4 \ucc3d\uc791\ubb3c\uc744 \ud65c\uc6a9\ud574 \ub2e4\ub978 \ucc3d\uc791\ubb3c\n\uc744 \ub9cc\ub4e4\uace0 \uc2f6\uc740 \uacbd\uc6b0 \uc801\uc5b4\ub3c4 \uc0ac\uc6a9\ud588\ub2e4\ub294 \uace0\uc9c0\ub294\n\ub0a8\uaca8\uc8fc\uc138\uc694. \uadc0\uc5ec\uc6b4 \ucc3d\uc791\uc790\ub4e4\uc740 \uc790\uc2e0\uc758 \ucc3d\uc791\ubb3c\uc774\n\uc88b\uc740\uacf3\uc5d0 \uc0ac\uc6a9\ub418\uc5c8\uc74c\uc744 \uae30\ubed0\ud560 \uac83\uc785\ub2c8\ub2e4.\n* \uc774\ub294 \uad8c\uace0 \uc0ac\ud56d\uc785\ub2c8\ub2e4. \ud544\uc218\uac00 \uc544\ub2c8\uba70 \ubd88\uac00\ud53c\ud55c\n    \uacbd\uc6b0 \ubb34\uc2dc\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n\n5. \ub7ec\uc2dc\uc544 \uad6d\uc801\uc758 \uc774\ub4e4\uc740 \uc774 \ucc3d\uc791\ubb3c\uc744 \uc601\ub9ac \ubaa9\uc801\uc73c\ub85c\n\uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. - \uc6b0\ub9ac\ub294 \uc804\uc7c1\uc790\uae08\uc744\n\uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n\uac19\uc740 \uc774\uc720\ub85c\uc368, \uc804\uc7c1\uc774 \uc9c0\uc6d0\ub420 \uc218 \uc788\ub294 \uacf3\uc5d0\uc11c\uc758\n\uc774 \ucc3d\uc791\ubb3c \uc0ac\uc6a9\uc744 \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n
    Permissions Limitations Conditions \u2705 Commercial use \u274e Warranty \u2753 License and copyright notice (Recommendation) \u2705 Distribution \u274e Being Rude \u2705 Modification \u274e Russian, And supporting war \u2705 Private use \u274e Copy without any modification
              QwreeyKawaii license v1.3\n\nCopyright 2023. Qwreey [qwreey75@gmail.com]\n\nThis license is based on DBAD license.\nEveryone is permitted to copy and distribute\nverbatim or modified copies of this license\ndocument.\n\nTERMS, AND CONDITIONS FOR COPYING,\nDISTRIBUTION, AND MODIFICATION\n\n1. You can do anything with this original work,\nbut don't be rude\n\nIn general, being rude includes below\n\nFirst. Do not copy these cute works without\n        any modification. changing the name\n        only is outright copyright infringement\nSecond. Do not add some harmful or NSFW content.\n        It's very rude and may harm others\n\nBeing rude is not limited to these instances.\nAbove all, don't hurt cute people\n\n2. If you get any benefit or profit from these cute\nworks, Share the love. A polite person may share\nthe love with cute people.\n3. These cute works are provided with no warranty.\nIf something goes wrong due to the creator's cute\nmistake, Fix it yourself. A polite person may\nsubmit the fix or bug report.\n4. If you create something with these works, Leave\nthe original creator's name in your work.\nthe cute creator will be happy if their works are\nused for good.\n* This is a recommendation. Not required.\n5. Russian nationality can not use this creation for\ncommercial purposes. \u2014 We do not support the war.\nSame reason, This creation cannot be used where\nit can support the war.\n
    "},{"location":"todo/","title":"\ud560\uc77c","text":""},{"location":"todo/#_2","title":"\uc9c4\ud589\uc911\uc774\uac70\ub098 \uac80\ud1a0\uc911","text":""},{"location":"todo/#easing","title":"Easing \ubb38\uc11c","text":"

    Easing \ubb38\uc11c\uc5d0 Out In Inout \ube44\uad50 \uc601\uc0c1 \ub9cc\ub4e4\uae30

    "},{"location":"todo/#spring","title":"Spring","text":"

    Spring \ubb3c\ub9ac \uacc4\uc0b0\uc744 UI \uc560\ub2c8\uba54\uc774\uc158\uc5d0 \uc801\uc6a9\ud569\ub2c8\ub2e4 WIP. \uc544\uc9c1 \uc9c4\ud589\uc911\uc778 \ud504\ub85c\uc81d\ud2b8.

    "},{"location":"todo/#quad-debuger","title":"Quad Debuger","text":"

    Register \uc758 \uc0c1\ud0dc\uc640 Store \uc758 \uac12, Class \uc758 \ub3d9\uc791 \uc5ec\ubd80 \ub4f1 Quad \uc758 \uc5ec\ub7ec \uc790\uc6d0\uc744 \uae34\ubc00\ud558\uac8c \ub514\ubc84\uadf8\ud569\ub2c8\ub2e4. WIP. \uc544\uc9c1 \uc9c4\ud589\uc911\uc778 \ud504\ub85c\uc81d\ud2b8.

    "},{"location":"todo/#selection","title":"Selection","text":"

    Tab \ud0a4\ub4f1\uc73c\ub85c \ubc84\ud2bc \uc120\ud0dd\ud558\uae30 (... \uac00\ub2a5\ud568?) WIP. \uac80\ud1a0\uc911\uc778 \ud504\ub85c\uc81d\ud2b8.

    "},{"location":"todo/#_3","title":"\uba3c \ubbf8\ub798\uc5d0 . . .","text":"

    \ud639\uc740 \uc774\ub8e8\uc6cc\uc9c0\uc9c0 \uc54a\ub294

    "},{"location":"todo/#quad-component-studio","title":"Quad Component Studio","text":"

    \ub208\uc5d0 \ubcf4\uc774\ub294 \uc6cc\uc9c0\uc6cc\uadf8\uc2dd \ud3b8\uc9d1\uae30\ub97c \uc774\uc6a9\ud574 Quad Class \ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.

    "},{"location":"todo/#quad-webrender","title":"Quad WebRender","text":"

    HTML, CSS, JS \ub85c\uc368 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ubcc0\ud615\ud574 \uc2a4\ud29c\ub514\uc624 \uc5c6\uc774 \uac1c\ubc1c\ud558\ub294 \uac00\ubcbc\uc6b4 \uac1c\ubc1c\ubc95\uc785\ub2c8\ub2e4.

    "},{"location":"todo/#quad-prerender","title":"Quad Prerender","text":"

    \ubbf8\ub9ac \ub80c\ub354\ub9c1\ub41c rbxm \uac1d\uccb4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. lua \uc2a4\ud06c\ub9bd\ud2b8\ub4e4\uc774 \ub9e4\ud551\ub418\uc5b4 \uc77c\ubc18\uc801\uc774\uac8c \ub3cc\uc544\uac11\ub2c8\ub2e4.

    "},{"location":"include/bindable/","title":"Bindable","text":"

    :Fire(...any)

    \ub4f1\ub85d\ub41c \uc5f0\uacb0\ub4e4\uc744 \uc2e4\ud589\ud558\uace0, Wait \uc744 \ud480\uc5b4\uc90d\ub2c8\ub2e4.

    :Wait()->(...any)

    Fire \uac00 \ud638\ucd9c\ub420 \ub54c \uae4c\uc9c0 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.

    :Connect((...any)->())->Connection

    Fire \uac00 \ud638\ucd9c \ub420 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ud638\ucd9c \uc778\uc790\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc5f0\uacb0\uc744 \ub04a\uc744 \uc218 \uc788\ub3c4\ub85d Connection \uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Once((...any)->())->Connection

    Connect \uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Fire \uac00 \ud55c\ubc88 \ud638\ucd9c\ub41c \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4/

    :CheckConnected(func)->boolean

    \ud568\uc218\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :DisconnectAll()

    \ubaa8\ub4e0 \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Wait \uc73c\ub85c \uae30\ub2e4\ub9ac\uace0 \uc788\ub294 \uacf3\uc5d0\ub294 nil \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Destroy()

    :DisconnectAll() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"include/connection/","title":"Connection","text":"

    :Disconnect()

    \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Fire \uac00 \ud638\ucd9c\ub418\ub354\ub77c\ub3c4 Connect \ud639\uc740 Once \uc5d0 \uc0ac\uc6a9\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    :Destroy()

    :Disconnect() \uc758 \ubcc4\uce6d\uc785\ub2c8\ub2e4.

    "},{"location":"include/directions/","title":"Directions","text":"

    Out \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.

    In \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.

    InOut \uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.

    "},{"location":"include/disconnecter/","title":"Disconnecter","text":"

    :Add(connection:Connection|RBXScriptConnection)

    connection\uc744 \ub9ac\uc2a4\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub098\uc911\uc5d0 :Disconnect\ub97c \ud638\ucd9c\ud558\uba74 \ucd94\uac00\ub41c \uc5f0\uacb0\uc774 \ud30c\uae30\ub429\ub2c8\ub2e4.

    :Disconnect()

    \ucd94\uac00\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\uc5d0 Disconnect() \ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ud638\ucd9c \ud6c4\uc5d0 \ucd94\uac00\ub41c \uc5f0\uacb0\uc740 \ubaa8\ub450 \uc0ac\ub77c\uc9c0\uba70. \uc774 \uc694\uccad \ud6c4\uc5d0\ub3c4 \ub2e4\uc2dc :Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4 Disconnecter \ub97c \uc644\uc804\ud788 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub824\uba74 :Destroy \ub97c \ud638\ucd9c\ud558\uc138\uc694

    :Destroy()

    :Disconnect() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"include/easings/","title":"Easings","text":"\ubbf8\ub9ac\ubcf4\uae30\uadf8\ub798\ud504 \uac1c\ud615

    \ubaa8\ub4e0 Easing \uc740 \uc5ec\uae30\uc5d0\uc11c \uc9c1\uc811\uc801\uc73c\ub85c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    Linear

    \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615 \ud568\uc218\uc785\ub2c8\ub2e4 i=x, x=0 to 1

    Quint

    5 \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quart \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^5) i=1-(1-x)^5, x=0 to 1

    Quart

    \ub124\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Cubic \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^4) i=1-(1-x)^4, x=0 to 1

    Cubic

    \uc138\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quad \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^3) i=1-(1-x)^3, x=0 to 1

    Quad

    \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. (^2) i=1-(1-x)^2, x=0 to 1

    Expo

    \uc9c0\uc218\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. \ub9e4\uc6b0 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4. i=1-2^(-10*x), x=0 to 1

    Sin

    \uc0ac\uc778 \ud30c\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sin(x*pi/2), x=0 to 1

    Circle

    \uc0ac\ubd84\uc6d0 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sqrt(1-(1-x)^2), x=0 to 1

    Back

    \uc2dc\uc791\uc2dc \ub4a4\ub85c \uc774\ub3d9\uc774 \uc788\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    Elastic

    \ud0c4\uc131\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    Bounce

    \ud280\uc5b4\uc624\ub984\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    TODO: \uc560\ub2c8\uba54\uc774\uc158 \ubbf8\ub9ac\ubcf4\uae30 \uc601\uc0c1 \ucd94\uac00

    "},{"location":"include/events/","title":"Events","text":"

    Event(name:string)

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 \uc774\ubca4\ud2b8\ub4e4\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4, MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up \ub4f1\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4 \uae30\ubcf8\uc801\uc73c\ub85c \ub85c\ube14\ub85d\uc2a4\uc758 \uae30\ubcf8 \uc774\ubca4\ud2b8\ub4e4\uacfc \ub2e4\ub974\uac8c, \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c - \ubc84\ud2bc\ud074\ub9ad
    Frame {\n    [Event \"MouseEnter\"] = function (self)\n        print(self.Name .. \"\uc5d0 \ub9c8\uc6b0\uc2a4\uac00 \uc62c\ub77c\uc654\uc2b5\ub2c8\ub2e4\")\n    end;\n}\n
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal TextButton = Class \"TextButton\"\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(200,200);\n    [Event \"MouseEnter\"] = function (self)\n        print(\"\ubc84\ud2bc\uc774 \ud074\ub9ad\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n    end;\n}\nMount(ScreenGUI, Store.GetObject(\"mainButton\"))\n

    Event.Created

    \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub418\uc5c8\uc744 \ub54c \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nFrame {\n    [Event.Created] = function (self)\n        print(self.Name .. \"\uc774 \uc0dd\uc131\ub418\uc5c8\uc5b4\uc694\")\n    end;\n}\n

    \uc8fc\uc758

    Event.Created \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4. Class.Extend \uc5d0\uc11c\ub294 AfterRender \ub97c \uc774\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.

    Event.CreatedAsync

    Event.Created \uc640 \ube44\uc2b7\ud558\uc9c0\ub9cc, \ucf54\ub8e8\ud2f4 \uc548\uc5d0\uc11c \uc791\ub3d9\ud569\ub2c8\ub2e4. objectList:EachAsync() \ucc98\ub7fc \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nFrame {\n    Frame {\n        Name = \"A\";\n        [Event.CreatedAsync] = function (self)\n            -- \uc774 \ud568\uc218\uac00 \ub05d\ub098\uc9c0 \uc54a\ub354\ub77c\ub3c4 \ub2e4\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \uc218 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4\n            task.wait(5)\n        end;\n    };\n    Frame {\n        Name = \"B\";\n        [Event.Created] = function (self)\n            print(self.Name .. \"\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n        end;\n    };\n}\n

    \uc8fc\uc758

    Event.CreatedAsync \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4.

    Event.Prop(propertyName:string)

    \ud504\ub85c\ud37c\ud2f0 \uac12\uc774 \ubcc0\uacbd\ub428\uc744 \uc5f0\uacb0\ud569\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nTextBox {\n    Text = \"\uc544\ubb34\uac70\ub098 \uc785\ub825\ud558\uc138\uc694\";\n    [Event.Prop \"Text\"] = function (self,text)\n        -- \ud3b8\uc758\uc0c1\uc758 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4\n        print(text)\n    end;\n}\n

    "},{"location":"include/extend/","title":"Extend","text":"

    self(name:string)->linker

    Extend \uba54\uc18c\ub4dc \uc804\uc5ed\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4. \ub9c1\ucee4\ub97c \ub9cc\ub4e4\uba70, PropertyChangedSignal \ub97c \uc774\uc5b4\uc8fc\uac70\ub098, self \uc5d0 \uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \uc815\ubcf4\ub294 Render \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.

    Overwite REQUIRED :Render(props:valueStore)

    \ud654\uba74\uc5d0 \uadf8\ub824\uc9c0\ub294 UI \ub97c \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. Extend \uac00 \uadf8\ub824\uc9c0\ub824\uba74 \ubb34\uc870\uac74 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4. \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4dc\ub294\ub370 \ub4e4\uc5b4\uac04 \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\uc744 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc90d\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130 \ubb38\ubc95\uc774 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\nlocal Mount = Quad.Mount\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        [Event \"MouseButton1Click\"] = function (self,x,y)\n            print((\"\ubc84\ud2bc\uc774 %d,%d \uc5d0\uc11c \ub20c\ub838\uc2b5\ub2c8\ub2e4\"):format(x,y))\n        end;\n        Size = props \"Size\";\n        Text = props \"Text\"; -- \ub808\uc9c0\uc2a4\ud130\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4\n    }\nend\n\nlocal myImported = Class(myClass)\nmyImported.Size = UDim2.fromOffset(200,200)\n\nlocal test = myImported {\n    Text = \"wow\"\n}\nMount(ScreenGUI, test)\n\n-- \ud14d\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    test.Text = \"w\"..(\"o\"):rep(#test.Text-1)..\"w\"\nend\n

    Overwite Option :Init(props:valueStore)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub418\uae30 \uc804\uc5d0 \ubbf8\ub9ac props \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Init(props)\n    -- Size \uac12\uc774 \uc5c6\ub2e4\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n    props:Default(\"Size\", UDim2.fromOffset(100,100))\n\n    -- \uc55e\uc5d0 _ \ub97c \ubd87\uc5ec \ub0b4\ubd80 \ubcc0\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc5b4\ub514\uc5d0\uc11c\ub098 \uc4f0\uc77c \uc218 \uc788\uc73c\uba70 register \uc5d0 \uc601\ud5a5\uc8fc\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    self._asdf = true\nend\nfunction myClass:Render(props)\n    return TextButton {\n        props \"Size\"\n    }\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported() -- \uc635\uc158 \uc5c6\uc74c\nprint(myButton.Size)\n

    Overwite Option :AfterRender(object:any)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub41c \ud6c4 \ud560 \uc791\uc5c5\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c Render \uac00 \ubc18\ud658\ud55c \uac12\uc774 \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\"; -- \uc790\uae30 \uc790\uc2e0\uc5d0 \uc774 \ubc84\ud2bc\uc744 \ub123\uc2b5\ub2c8\ub2e4\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button == object) -- true\nend\n\nlocal myImported = Class(myClass)\nmyImported() -- \uc635\uc158 \uc5c6\uc74c\n

    Overwite Option :Update()

    :Render \uc640 :AfterRender \ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0, \uc774\uc804\uc5d0 \uc788\ub358 \uc790\uc2dd\ub4e4\uc744 \ub2e4\uc2dc \ub04c\uc5b4\uc635\ub2c8\ub2e4. \uc774\uc804\uc758 Render \uacb0\uacfc\ub294 \uc81c\uac70\ub429\ub2c8\ub2e4

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:Update() -- update\nmyButton:Update() -- update\nmyButton:Update() -- update\n

    Overwite Option .Getter.<PropertyName>(self)

    \uac12\uc744 \uc5bb\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {}\nend\n-- \uac12\uc744 \uc77d\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Getter.Test(self)\n    return \"Hello World\"\nend\n\nlocal myImported = Class(myClass)\nprint(myImported().Test)\n

    Overwite Option .Setter.<PropertyName>(self,newValue:any)

    \uac12\uc744 \uc124\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\";\n        Text = \"wow\";\n    }\nend\n-- \uac12\uc744 \uc9c0\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Setter.Test(self,newValue)\n    self._button.Text = newValue\nend\nfunction myClass.Getter.Test(self)\n    return self._button.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nprint(myButton.Test)\nmyButton.Test = \"Hello World\"\nprint(myButton.Test)\n

    Overwite Option .UpdateTriggers.<PropertyName> = boolean?

    \ud574\ub2f9 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 Update \uac00 \uc218\ud589\ub420\uc9c0 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n-- \uac12 \ubcc0\uacbd\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4\nmyClass.UpdateTriggers.Test = true\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\n

    Overwite Option :Unload(object)

    :Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4

    :GetPropertyChangedSignal(propertyName:string)->Bindable

    \uac12 \ubcc0\uacbd\uc744 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 Bindable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. :EmitPropertyChangedSignal \uc73c\ub85c \uc774 \uc2dc\uadf8\ub110\uc744 \uc791\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\uc0c1 \uc774 \uc2dc\uadf8\ub110\uc774 \uc791\ub3d9\ud560 \ub54c, \uc0c8\ub85c\uc6b4 \uac12\uc774 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    :EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

    \ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd\uc2dc :GetPropertyChangedSignal \uc5d0 \ub4f1\ub85d\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \uc774 \ud568\uc218\ub97c \ud638\ucd9c\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c self.a = 1 \uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \ubc14\ub85c \uac12\uc744 \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc801\uc73c\ub85c \uc774 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ubc15\uc2a4\uc758 \ud14d\uc2a4\ud2b8 \ucc98\ub7fc \uac1d\uccb4\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc5f0\ub3d9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc774 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. changedValue \ub294 \uc120\ud0dd\uc0ac\ud56d\uc774\uba70, \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc73c\uba74 self[propertyName]\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_box\";\n        Text = \"test\";\n        Size = UDim2.fromOffset(200,200);\n        [Evnet.Prop \"Text\"] = function (this,newValue)\n            self:EmitPropertyChangedSignal(\"Text\",newValue)\n        end;\n        -- [Evnet.Prop \"Text\"] = self \"Text\" \uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n        -- self(name:string) \ubb38\ubc95\uc73c\ub85c \ubcc0\uacbd \uc774\ubca4\ud2b8 \uc5ed\uc2dc \ub9c1\ud06c\n        -- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    }\nend\nfunction myClass.Getter.Text(self)\n    return self._box.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:GetPropertyChangedSignal(\"Text\"):Connect(function()\n    print(myButton.Text)\nend)\nMount(ScreenGUI, myButton)\n

    Event .ChildAdded:Connect((child)->())->Connection

    \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \ucd94\uac00\ub420 \ub54c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\uc785\ub2c8\ub2e4. :Init \uc5d0\uc11c \uc0ac\uc6a9\ud558\uba74 \uc635\uc158\uc73c\ub85c \ub123\uc740 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \uc774 \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574 \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc73c\uba70, :AfterRender \uc5d0\uc11c\ub294 \ucd94\ud6c4 Mount \ub97c \ud1b5\ud574 \ucd94\uac00\ub418\ub294 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub9cc \uc774 \uc774\ubca4\ud2b8\ub85c \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    self.ChildAdded:Connect(function(child)\n        print(child.Name)\n    end)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    -- Init \uc5d0 ChildAdded \ub97c \ub123\uc740\uac83\uc774 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    -- \uadf8\ub7ec\ub098 AfterRender \uc5d0 :GetChildren \uc744 \ub123\uc5b4 \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c\n    -- \uc5bb\uc5b4\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    TextButton { Name = \"Hello \"};\n}\n\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

    :GetChildren()

    \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \uac00\uc838\uc624\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. :Init() \uc5d0\uc11c\ub294 \ube48 \ud14c\uc774\ube14\uc744 \ubc18\ud658\ud558\uace0, AfterRender \uc5d0\uc11c\ub294 \uc635\uc158\uc5d0 \ub4e4\uc5b4\uac04 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub4e4\uc774 \ub2f4\uae34 \ud14c\uc774\ube14\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc790\uc2dd\uc758 \uc21c\uc11c\ub294 \uc77c\uc815\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    for i,v in ipairs(self:GetChildren()) do\n        print(v.Name)\n    end\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    TextButton { Name = \"Hello World\"};\n}\n\n-- \ub098\uc911\uc5d0 \ucd94\uac00\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub294 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

    "},{"location":"include/locales/","title":"Locales","text":"

    Default (default) English (en-us) Spanish (es-es) French (fr-fr) Indonesian (id-id) Italian (it-it) Japanese (ja-jp) Korean (ko-kr) Russian (ru-ru) Thai (th-th) Turkish (tr-tr) Vietnamese (vi-vn) Portuguese (pt-br) German (de-de) ChineseSimplified (zh-cn) ChineseTraditional (zh-tw) Bulgarian (bg-bg) Bengali (bn-bd) Czech (cs-cz) Danish (da-dk) Greek (el-gr) Estonian (et-ee) Finnish (fi-fi) Hindi (hi-in) Croatian (hr-hr) Hungarian (hu-hu) Georgian (ka-ge) Kazakh (kk-kz) Khmer (km-kh) Lithuanian (lt-lt) Latvian (lv-lv) Malay (ms-my) Burmese (my-mm) Bokmal (nb-no) Dutch (nl-nl) Filipino (fil-ph) Polish (pl-pl) Romanian (ro-ro) Ukrainian (uk-ua) Sinhala (si-lk) Slovak (sk-sk) Slovenian (sl-sl) Albanian (sq-al) Bosnian (bs-ba) Serbian (sr-rs) Swedish (sv-se) Arabic (ar-001)

    "},{"location":"include/mounts/","title":"Mounts","text":"

    :Unmount()

    \uc774\ub807\uac8c \ud558\uba74 \ub9c8\uc6b4\ud2b8\ub41c Instance \ub97c \uc9c0\uc6cc\ubc84\ub9bd\ub2c8\ub2e4. Quad \ub294 \uc548\uc804\ud55c \uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 gc \uc758 \uae30\ub2a5\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, gc \uc2dc\uac04\ucc28\ub85c \uc778\ud574 Store.GetObject \uc5d0\uc11c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0ac\ub77c\uc9c0\ub294\ub370 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui,mainFrame)\n\nlocal childFrame = Frame {}\nlocal childFrameMount = Mount(mainFrame,childFrame)\nchildFrameMount:Unmount()\n-- childFrame \uc740 \ub2e8\uc21c\ud788 .Parent = nil \ub418\ub294 \uac83\uc744 \ub118\uc5b4 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc0ac\ub77c\uc9d1\ub2c8\ub2e4\n-- \uc989, Destroy() \uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4\n

    :Add(item:any)

    Mount \uc5d0 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ucc98\uc74c \uc124\uc815\ud55c to \uac12\uc744 \ub530\ub77c \ubd80\ubaa8\uac00 \uacb0\uc815\ub429\ub2c8\ub2e4.

    \uc774 \ub3d9\uc791\uc740 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4e4 \ub54c \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc\ub85c\ub4dc \ub3d9\uc791\uc2dc \uc9c1\uc811 \uc81c\uac70\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui, mainFrame)\n\nlocal lastListMount = Mount(mainFrame)\nlocal function refreshList()\n    lastListMount:Unmount() -- \uc774\uc804 children \uc744 \uc54c\uc544\uc11c \uc81c\uac70\ud569\ub2c8\ub2e4\n    for i = 1,10 do\n        lastListMount:Add(Frame { Name = tostring(i) })\n    end\nend\n\ntask.spawn(function()\n    while true do\n        refreshList()\n        task.wait(2)\n    end\nend)\n

    \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\uc804 children \uc744 \uac04\uc811\uc801\uc73c\ub85c \uc81c\uac70\ud558\uace0 \uc0c8\ub85c\uc6b4 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e8 ScrollFrame \uc758 \uacbd\uc6b0 CanvasPosition\uc774 \ucd08\uae30\ud654 \ub418\uc5b4\ubc84\ub9ac\ubbc0\ub85c \uc790\uc2dd\ub4e4\uc744 :Unmount() \ud558\uae30 \uc804\uc5d0 \uc704\uce58\ub97c \uc800\uc7a5\ud558\uace0 \ub2e4\uc2dc \ubd88\ub7ec\uc640\uc57c \ud569\ub2c8\ub2e4

    "},{"location":"include/objectList/","title":"objectList","text":"

    :Each((item:any, index:number)->())

    \uc77c\ubc18\uc801\uc778 \ubc18\ubcf5\uc785\ub2c8\ub2e4. for \ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uacfc \ud6a8\uacfc\uac00 \uac19\uc73c\ub098 \ud568\uc218\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4

    :EachAsync((item:any, index:number)->())

    \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 \ubc14\ub85c\ubc14\ub85c \ub2e4\uc74c \uc544\uc774\ud15c\uc73c\ub85c \ub118\uc5b4\uac11\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774 \uc774\uc6a9\ub429\ub2c8\ub2e4. wrap() \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub974\uac70\ub098, \ud544\uc694\uc131\uc774 \uc5c6\ub294\uacbd\uc6b0 \uc77c\ubc18\uc801\uc73c\ub85c :Each \ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub429\ub2c8\ub2e4

    :IsEmpty()

    \uc774 ObjectList \uac00 \ube44\uc5b4\uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Remove(indexOrItem:number|any)

    objectList \uc5d0\uc11c \ud574\ub2f9\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4. , & \ub97c \uc0ac\uc6a9\ud55c \uace0\uae09 \uac80\uc0c9\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    "},{"location":"include/quadProperty/","title":"quadProperty","text":"

    RoundSize:number?

    ImageLabel, ImageButton \uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc18d\uc131\uc785\ub2c8\ub2e4. \uc6d0\ud615 \uc774\ubbf8\uc9c0\uc5d0 Slice\ub97c \uc774\uc6a9\ud574 \ub465\uadfc \ud504\ub808\uc784\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c UICorner\ubcf4\ub2e4 \ubd80\ub4dc\ub7ec\uc6b4 \ucf54\ub108\ud6a8\uacfc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.

    Corner:number?

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 UI\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ub429\ub2c8\ub2e4. UICorner\ub97c \uc774\uc6a9\ud574 \ubaa8\uc11c\ub9ac \ubd80\ubd84\uc744 \ub465\uae00\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    PaddingAll:UDim?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc0c1\ud558\uc88c\uc6b0 \ubaa8\ub450 \uac19\uc740 \uac12\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4. PaddingAllOffset \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    PaddingAllOffset:number?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. PaddingAll\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc791\ub3d9\ud558\ub098, Offset\uac12\ub9cc \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PaddingAll \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Scale:number?

    UIScale\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. UIScale.Scale \uacfc \uac19\uc740 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4

    "},{"location":"include/register/","title":"Register","text":"

    register \ud2b9\uc218 \uba54\uc18c\ub4dc\uac00 \uc801\uc6a9\ub418\ub294 \uc21c\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    :Add(value:any)->register

    \uac12\uc5d0 \ub354\ud558\uae30\ub97c \ucde8\ud569\ub2c8\ub2e4. \uc74c\uc218\ud615\ud0dc\uac00 \uc81c\uacf5\ub418\ub294 \uacbd\uc6b0 \ube7c\uae30 \ucc98\ub7fc \uc791\ub3d9\ud569\ub2c8\ub2e4. number, Udim, UDim2, Color3, Vector2 \ub4f1 \ub354\ud560 \uc218 \uc788\ub294 \ubaa8\ub4e0\uac83\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.pos = UDim2.fromOffset(100,0)\n\nFrame \"mainFrame\" {\n    Position = myStore \"pos\":Add(UDim2.fromOffset(0,100));\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nwhile true do\n    myStore.pos = myStore.pos + UDim2.fromOffset(10,0)\n    task.wait(2)\nend\n

    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :With((store:valueStore, newValue:any, key:string)->())->register

    \ud568\uc218 \ub610\ub294 \ud14c\uc774\ube14\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4. Add \ubcf4\ub2e4 \ub098\uc911\uc5d0 \uc218\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud568\uc218\uc608\uc81c - \ud14c\uc774\ube14
    myStore \"size\":With(function (_,value)\n    return value * 2\nend)\n

    width \uac12\uc5d0 \ub9de\ucdb0 \uc790\ub3d9\uc73c\ub85c UI \uac00 \uc5c5\ub370\uc774\ud2b8\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.topbarSize = 60\nmyStore.width = 200\n\n-- \ub808\uc9c0\uc2a4\ud130\ub97c \ubcc0\uc218\ub85c \ub450\uace0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4\nlocal listItemSize = myStore \"width\":With(function()\n    return UDim2.fromOffset(myStore.width,60)\nend)\n\nFrame \"mainFrame\" {\n    Class \"UIListLayout\" { SortOrder = Enum.SortOrder.LayoutOrder };\n\n    -- \uc0ac\uc774\uc988\uac00 width \uc5d0 \ub9de\uac8c \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4\n    Size = myStore \"width\":With(function ()\n        return UDim.fromOffset(store.width,400)\n    end);\n\n    Frame \"Topbar\" {\n        LayoutOrder = 1;\n        BackgroundColor3 = Color3.fromRGB(255,0,0);\n        -- \uc774\ub807\uac8c \uc5ec\ub7ec \uac12\uc744 \ubb36\uc5b4\uc11c \ub450 \uac12\uc774 \ubcc0\uacbd\ub428, \ud639\uc740 \uadf8\uc774\uc0c1\uc744\n        -- \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        Size = myStore \"topbarSize,width\":With(function()\n            return UDim2.fromOffset(myStore.width,myStore.topbarSize)\n        end);\n    }\n    Frame \"ListItem\" {\n        LayoutOrder = 2;\n        BackgroundColor3 = Color3.fromRGB(0,255,0);\n        Size = listItemSize;\n    };\n    Frame \"ListItem\" {\n        LayoutOrder = 3;\n        BackgroundColor3 = Color3.fromRGB(0,0,255);\n        Size = listItemSize;\n    };\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- width \uac12\uc744 \ubcc0\uacbd\ud574\ubcf4\uc138\uc694\nwhile true do\n    myStore.width = myStore.width + 10\n    task.wait(1)\nend\n

    colors \ud14c\uc774\ube14 \uc548\uc5d0 \uc788\ub294 \uc0c9\uae54\ub4e4\uc744 \ub3cc\uc544\uac00\uba70 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nlocal colors = {\n    Color3.fromRGB(255,255,255);\n    Color3.fromRGB(255,255,0);\n    Color3.fromRGB(0,255,255);\n    Color3.fromRGB(255,0,255);\n    Color3.fromRGB(255,0,0);\n    Color3.fromRGB(0,255,0);\n    Color3.fromRGB(0,0,255);\n}\nmyStore.color = 1\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- colors \uc5d0\uc11c \uc778\ub371\uc2f1\ud574 \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4\n    BackgroundColor3 = myStore \"color\":With(colors);\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- \uc778\ub371\uc2a4\ub97c \uc21c\ud68c\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    myStore.color = (i-1)%(#colors)+2\nend\n
    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :Tween(options:TweenOptions)->register

    \ud2b8\uc708\uc744 \uc774\uc6a9\ud574 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4(\ucc98\uc74c \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc74c) \uc635\uc158\uc740 Tween \ubb38\uc11c\uc5d0 \ub098\uc640\uc788\ub294 \uc635\uc158\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud55c\uaebc\ubc88\uc5d0 \uc774\ub3d9
    -- Tween \uc635\uc158\uc744 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nmyStore \"size\":Tween{ Time = 2 }\n

    \ud504\ub808\uc784\uc744 \ud55c\uaebc\ubc88\uc5d0 \uc6c0\uc9c1\uc785\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.pos = UDim2.fromOffset(50,0)\nStyle \"TweenFrame\" {\n    Size = UDim2.fromOffset(50,50);\n    BackgroundColor3 = Color3.fromRGB(255,100,255);\n}\n\nFrame \"mainFrame\" {\n    BackgroundColor3 = Color3.fromRGB(255,255,255);\n    Size = UDim2.fromOffset(500,500);\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\":Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,100))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,200))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,300))\n            :Tween{Time = 2};\n    }\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nlocal on = false\nwhile true do\n    on = not on\n    myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0)\n    task.wait(1.5) -- \ud2b8\uc708\uc740 \ub36e\uc5b4 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \ub530\ub77c\uc11c 2 \ucd08\uc778 \uae38\uc774\ubcf4\ub2e4 \ub354 \ube68\ub9ac \ubc14\uafd4\ub3c4 \uc624\ub958\uac00 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\nend\n
    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :Default(value:any)->register

    \uae30\ubcf8\uac12\uc744 \uc815\ud569\ub2c8\ub2e4. \ub9cc\uc57d \uac12\uc774 nil \uc778 \uacbd\uc6b0 \uc774 \uac12\uc744 \uc0ac\uc6a9\ud558\uac8c \ub429\ub2c8\ub2e4. Add \ub098 With \ub4f1 \ub2e4\ub978\uac83\uc5d0 \uc601\ud5a5\ubc1b\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- color \uac12\uc774 \uc5c6\uc73c\ubbc0\ub85c Default \uc548\uc758 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n    BackgroundColor3 = myStore \"color\"\n        :Default(Color3.fromRGB(255,0,0));\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\ntask.wait(5)\nmyStore.color = Color3.fromRGB(0,255,0)\n

    \uc8fc\uc758
    • \ucc98\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \ub54c\uc5d0\ub9cc \uc774 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.
    • \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    :Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT

    \ub808\uc9c0\uc2a4\ud130\uc5d0 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4. \uac12\uc774 \ubcc0\uacbd\ub418\uba74 \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

    newValue \uc5d0\ub294 :Add, :With, :Tween, :Default \uac00 \ub530\ub85c \uacc4\uc0b0\ub418\uc9c0 \uc54a\uc73c\uba70, \uc124\uc815\ub41c \uac12\uc744 \uc544\ubb34 \uac00\uacf5 \uc5c6\uc774 \uc81c\uacf5\ud569\ub2c8\ub2e4

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \uc5ec\ub7ec \ubcc0\uacbd\uc0ac\ud56d \ucd94\uc801
    myStore.test = 1\n-- \ubc18\ud658 \uac12\uc740 \uc785\ub825\uc73c\ub85c \ub123\uc740 \ud568\uc218\uc785\ub2c8\ub2e4. !\uaf2d \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4\n-- :Register \ub294 \ud568\uc218\uac00 \uc0ac\ub77c\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \uac12\uc744 \uc720\uc9c0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\n-- \ub9cc\uc57d \ubc84\ub9b4 \uacbd\uc6b0 \uc77c\uc815 \uc2dc\uac04 \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nlocal func = myStore \"test\":Register(function(_,newValue)\n    -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n    print(newValue)\nend)\nmyStore.test = 2\n

    myStore.test1, myStore.test2 \uac00 \ubcc0\ud654\ud558\uba74 print \ud568\uc218\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\n\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.test1 = 1\nmyStore.test2 = \"Hello\"\n\nlocal func = myStore \"test1,test2\":Register(function()\n    print(myStore.test1,myStore.test2)\nend)\n\nmyStore.test1 = 2\n
    \uc8fc\uc758

    Register \uc548\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub294 GC \uc548\uc815\uc131\uc744 \uc704\ud574\uc11c \uc57d\ud55c \ucc38\uc870\ub85c \uc800\uc7a5\ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c \ud568\uc218\ub97c \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4.

    "},{"location":"include/tween/","title":"Tween","text":"

    Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

    \ud2b8\uc708\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\uc708 \uc635\uc158\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 TweenOptions \ubb38\uc11c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ended, OnStepped, Setter, Getter \uac12\uc774 \uc124\uc815\ub418\uba74 Option \uc548\uc758 \uac12\ubcf4\ub2e4 \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uae30\ub2a5\uc740 TweenOptions\uc758 \ub0b4\uc6a9\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0ac \uc218 \uc788\ub3c4\ub85d TweenHandler \uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. \ub2e4\ub978 \ud2b8\uc708\uc774 \ubcc0\uacbd\uc911\uc778 \uc18d\uc131\uc774 \ub2e4\uc2dc \ud2b8\uc708\ud558\ub3c4\ub85d \ud638\ucd9c\ub418\uba74, \uc774\uc804 \ud2b8\uc708\uc5d0\uc11c \ud574\ub2f9 \uc18d\uc131\uc740 \ud2b8\uc708\uc774 \uc911\ub2e8\ub418\uba70 \uc0c8\ub85c\uc6b4 \ud2b8\uc708\uc73c\ub85c \ub36e\uc5b4\uc4f0\uae30 \ub429\ub2c8\ub2e4.

    Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

    Tween.RunTween \uc640 \uac19\uc73c\ub098 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\ud569\ub2c8\ub2e4. \uc544\ubb34\uac83\ub3c4 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    Tween.RunTween({myFrame1, myFrame2, myFrame3},{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.StopTween(ItemOrHandler:TweenHandler|any)

    \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4. TweenHandler \ub610\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc5b4 \uba48\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc73c\uba74 \uadf8 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc2e4\ud589\uc911\uc778 \ubaa8\ub4e0 \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4.

    TweenHandler \uc774\uc6a9\uc624\ube0c\uc81d\ud2b8 \uc774\uc6a9
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(Handler)\n
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(myFrame)\n

    Tween.StopPropertyTween(Item:any, PropertyName:string)

    \uc624\ube0c\uc81d\ud2b8\uc5d0 \ud2b9\uc815 \ud504\ub85c\ud37c\ud2f0\uc758 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0b5\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8 \ub610\ub294 TweenHandler \ub85c \ud2b8\uc708\uc774 \uc9c4\ud589\uc911\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4.

    Tween.IsPropertyTweening(Item:any, PropertyName:string)

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8\uc758 \ud504\ub85c\ud37c\ud2f0\uac00 \ud2b8\uc708\uc911\uc774\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \uadf8\ub798\ud504\uc640 \ubbf8\ub9ac\ubcf4\uae30\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \uc790\uc138\ud55c \uc815\ubcf4\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"include/tweenOptions/","title":"tweenOptions","text":"

    Option Time:number?

    \ud2b8\uc708\uc758 \ucd1d \uae38\uc774\ub97c \uc815\ud569\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 1\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    Option Easing:string|(index:number)->number?

    \ud2b8\uc708\uc758 \uac00\uac10\uc18d \uc815\ub3c4\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Easings.Linear\uc640 \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud639\uc740 \ud544\uc694\uc5d0 \ub530\ub77c \ud568\uc218\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c Easing \uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c 1\ucc28 \uc9c4\ud589\ub3c4 (Linear, 0 \uc5d0\uc11c 1 \uc0ac\uc774\uc758 \uac12) \uac12\uc774 \uc8fc\uc5b4\uc9c0\uba70, \uacc4\uc0b0 \uacb0\uacfc\ub85c \uc2e4\uc81c \uc801\uc6a9\ub420 \uc704\uce58\ub97c \ubc18\ud658\ud574\uc57c\ud569\ub2c8\ub2e4. \ubc18\ud658\uac12\uc740 \uc74c\uc218\uc774\uac70\ub098 1 \ubcf4\ub2e4 \ud074 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Exp2\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \ud568\uc218\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option Direction:string?

    \ud2b8\uc708\uc774 \uc9c4\ud589\ub418\ub294 \ubc29\ud5a5\uc785\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Directions.Out\uacfc \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Out\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \ubc29\ud5a5\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option CallBack:{[number|\"*\"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uc2e4\ud589\uc911\uc778 \ub3c4\uc911\uc5d0 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b8\uc708\uc758 \uc9c4\ud589 \uc815\ub3c4\uc5d0 \ub530\ub77c\uc11c \ud55c\ubc88 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uac70\ub098 \ud2b8\uc708 \uc9c4\ud589\uc911 \uacc4\uc18d\ud574\uc11c \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub371\uc2a4\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0 \ud574\ub2f9 \uc9c0\uc810\uc744 \ub118\uc744 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70, \"*\" \ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uba74 \ubaa8\ub4e0 \ubd80\ubd84\uc5d0\uc11c \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \ud568\uc218\uc5d0\ub294 \ud3b8\uc758\uc0c1 \ud2b8\uc708\uc744 \ud558\uace0\uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \uc704\uce58\uac12, \uc2dc\uac04\ub9cc\uc744 \uace0\ub824\ud55c 1\ucc28 \uc704\uce58\uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 \"*\" \ub97c \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 1\uc744 \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Getter:(Item:any, Property:string)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc5bb\uc73c\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc124\uc815\ud558\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984, \uc124\uc815\ud560 \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"include/typeDirections/","title":"typeDirections","text":"
    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    "},{"location":"include/typeEasings/","title":"typeEasings","text":"
    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    "},{"location":"reference/","title":"Reference","text":"

    \uc774 \uc139\uc158\uc740 api \ub0b4\uc6a9\uc744 \ub098\uc5f4\ud558\uc9c0\ub9cc, \uae4a\uac8c \uc124\uba85\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud29c\ud1a0\ub9ac\uc5bc \ubb38\uc11c\ub97c \uc77d\uc5b4\ubcf4\ub294\uac83\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4.

    "},{"location":"reference/event/","title":"Event","text":""},{"location":"reference/extend/","title":"Extend","text":"

    self(name:string)->linker

    Extend \uba54\uc18c\ub4dc \uc804\uc5ed\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4. \ub9c1\ucee4\ub97c \ub9cc\ub4e4\uba70, PropertyChangedSignal \ub97c \uc774\uc5b4\uc8fc\uac70\ub098, self \uc5d0 \uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \uc815\ubcf4\ub294 Render \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.

    Overwite REQUIRED :Render(props:valueStore)

    \ud654\uba74\uc5d0 \uadf8\ub824\uc9c0\ub294 UI \ub97c \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. Extend \uac00 \uadf8\ub824\uc9c0\ub824\uba74 \ubb34\uc870\uac74 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4. \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4dc\ub294\ub370 \ub4e4\uc5b4\uac04 \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\uc744 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc90d\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130 \ubb38\ubc95\uc774 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\nlocal Mount = Quad.Mount\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        [Event \"MouseButton1Click\"] = function (self,x,y)\n            print((\"\ubc84\ud2bc\uc774 %d,%d \uc5d0\uc11c \ub20c\ub838\uc2b5\ub2c8\ub2e4\"):format(x,y))\n        end;\n        Size = props \"Size\";\n        Text = props \"Text\"; -- \ub808\uc9c0\uc2a4\ud130\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4\n    }\nend\n\nlocal myImported = Class(myClass)\nmyImported.Size = UDim2.fromOffset(200,200)\n\nlocal test = myImported {\n    Text = \"wow\"\n}\nMount(ScreenGUI, test)\n\n-- \ud14d\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    test.Text = \"w\"..(\"o\"):rep(#test.Text-1)..\"w\"\nend\n

    Overwite Option :Init(props:valueStore)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub418\uae30 \uc804\uc5d0 \ubbf8\ub9ac props \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Init(props)\n    -- Size \uac12\uc774 \uc5c6\ub2e4\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n    props:Default(\"Size\", UDim2.fromOffset(100,100))\n\n    -- \uc55e\uc5d0 _ \ub97c \ubd87\uc5ec \ub0b4\ubd80 \ubcc0\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc5b4\ub514\uc5d0\uc11c\ub098 \uc4f0\uc77c \uc218 \uc788\uc73c\uba70 register \uc5d0 \uc601\ud5a5\uc8fc\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    self._asdf = true\nend\nfunction myClass:Render(props)\n    return TextButton {\n        props \"Size\"\n    }\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported() -- \uc635\uc158 \uc5c6\uc74c\nprint(myButton.Size)\n

    Overwite Option :AfterRender(object:any)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub41c \ud6c4 \ud560 \uc791\uc5c5\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c Render \uac00 \ubc18\ud658\ud55c \uac12\uc774 \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\"; -- \uc790\uae30 \uc790\uc2e0\uc5d0 \uc774 \ubc84\ud2bc\uc744 \ub123\uc2b5\ub2c8\ub2e4\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button == object) -- true\nend\n\nlocal myImported = Class(myClass)\nmyImported() -- \uc635\uc158 \uc5c6\uc74c\n

    Overwite Option :Update()

    :Render \uc640 :AfterRender \ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0, \uc774\uc804\uc5d0 \uc788\ub358 \uc790\uc2dd\ub4e4\uc744 \ub2e4\uc2dc \ub04c\uc5b4\uc635\ub2c8\ub2e4. \uc774\uc804\uc758 Render \uacb0\uacfc\ub294 \uc81c\uac70\ub429\ub2c8\ub2e4

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:Update() -- update\nmyButton:Update() -- update\nmyButton:Update() -- update\n

    Overwite Option .Getter.<PropertyName>(self)

    \uac12\uc744 \uc5bb\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {}\nend\n-- \uac12\uc744 \uc77d\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Getter.Test(self)\n    return \"Hello World\"\nend\n\nlocal myImported = Class(myClass)\nprint(myImported().Test)\n

    Overwite Option .Setter.<PropertyName>(self,newValue:any)

    \uac12\uc744 \uc124\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\";\n        Text = \"wow\";\n    }\nend\n-- \uac12\uc744 \uc9c0\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Setter.Test(self,newValue)\n    self._button.Text = newValue\nend\nfunction myClass.Getter.Test(self)\n    return self._button.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nprint(myButton.Test)\nmyButton.Test = \"Hello World\"\nprint(myButton.Test)\n

    Overwite Option .UpdateTriggers.<PropertyName> = boolean?

    \ud574\ub2f9 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 Update \uac00 \uc218\ud589\ub420\uc9c0 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n-- \uac12 \ubcc0\uacbd\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4\nmyClass.UpdateTriggers.Test = true\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\n

    Overwite Option :Unload(object)

    :Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4

    :GetPropertyChangedSignal(propertyName:string)->Bindable

    \uac12 \ubcc0\uacbd\uc744 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 Bindable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. :EmitPropertyChangedSignal \uc73c\ub85c \uc774 \uc2dc\uadf8\ub110\uc744 \uc791\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\uc0c1 \uc774 \uc2dc\uadf8\ub110\uc774 \uc791\ub3d9\ud560 \ub54c, \uc0c8\ub85c\uc6b4 \uac12\uc774 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    :EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

    \ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd\uc2dc :GetPropertyChangedSignal \uc5d0 \ub4f1\ub85d\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \uc774 \ud568\uc218\ub97c \ud638\ucd9c\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c self.a = 1 \uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \ubc14\ub85c \uac12\uc744 \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc801\uc73c\ub85c \uc774 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ubc15\uc2a4\uc758 \ud14d\uc2a4\ud2b8 \ucc98\ub7fc \uac1d\uccb4\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc5f0\ub3d9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc774 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. changedValue \ub294 \uc120\ud0dd\uc0ac\ud56d\uc774\uba70, \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc73c\uba74 self[propertyName]\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_box\";\n        Text = \"test\";\n        Size = UDim2.fromOffset(200,200);\n        [Evnet.Prop \"Text\"] = function (this,newValue)\n            self:EmitPropertyChangedSignal(\"Text\",newValue)\n        end;\n        -- [Evnet.Prop \"Text\"] = self \"Text\" \uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n        -- self(name:string) \ubb38\ubc95\uc73c\ub85c \ubcc0\uacbd \uc774\ubca4\ud2b8 \uc5ed\uc2dc \ub9c1\ud06c\n        -- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    }\nend\nfunction myClass.Getter.Text(self)\n    return self._box.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:GetPropertyChangedSignal(\"Text\"):Connect(function()\n    print(myButton.Text)\nend)\nMount(ScreenGUI, myButton)\n

    Event .ChildAdded:Connect((child)->())->Connection

    \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \ucd94\uac00\ub420 \ub54c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\uc785\ub2c8\ub2e4. :Init \uc5d0\uc11c \uc0ac\uc6a9\ud558\uba74 \uc635\uc158\uc73c\ub85c \ub123\uc740 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \uc774 \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574 \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc73c\uba70, :AfterRender \uc5d0\uc11c\ub294 \ucd94\ud6c4 Mount \ub97c \ud1b5\ud574 \ucd94\uac00\ub418\ub294 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub9cc \uc774 \uc774\ubca4\ud2b8\ub85c \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    self.ChildAdded:Connect(function(child)\n        print(child.Name)\n    end)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    -- Init \uc5d0 ChildAdded \ub97c \ub123\uc740\uac83\uc774 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    -- \uadf8\ub7ec\ub098 AfterRender \uc5d0 :GetChildren \uc744 \ub123\uc5b4 \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c\n    -- \uc5bb\uc5b4\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    TextButton { Name = \"Hello \"};\n}\n\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

    :GetChildren()

    \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \uac00\uc838\uc624\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. :Init() \uc5d0\uc11c\ub294 \ube48 \ud14c\uc774\ube14\uc744 \ubc18\ud658\ud558\uace0, AfterRender \uc5d0\uc11c\ub294 \uc635\uc158\uc5d0 \ub4e4\uc5b4\uac04 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub4e4\uc774 \ub2f4\uae34 \ud14c\uc774\ube14\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc790\uc2dd\uc758 \uc21c\uc11c\ub294 \uc77c\uc815\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    for i,v in ipairs(self:GetChildren()) do\n        print(v.Name)\n    end\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    TextButton { Name = \"Hello World\"};\n}\n\n-- \ub098\uc911\uc5d0 \ucd94\uac00\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub294 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

    "},{"location":"reference/lang/","title":"Lang","text":"

    Lang.FailedMessage:string

    \uc544\ubb34\ub7f0 \ubc88\uc5ed \uac12\ub3c4 \uc5bb\uc5b4\uc624\uc9c0 \ubabb\ud558\uc600\uc744\ub54c \ubcf4\uc5ec\uc904 \ubb38\uc790\uc5f4\uc785\ub2c8\ub2e4. \ubcc0\uacbd\uc2dc \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\uac00 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.

    Lang.CurrentLocale:Locale<item of Lang.Locales>

    \ud604\uc81c \uc0ac\uc6a9\uc911\uc778 \uc5b8\uc5b4\uc785\ub2c8\ub2e4. \ubcc0\uacbd\uc2dc \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\uac00 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4. Lang.Locales \uc548\uc758 \uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.

    "},{"location":"reference/lang/#langlocales","title":"Lang.Locales","text":"

    Default (default) English (en-us) Spanish (es-es) French (fr-fr) Indonesian (id-id) Italian (it-it) Japanese (ja-jp) Korean (ko-kr) Russian (ru-ru) Thai (th-th) Turkish (tr-tr) Vietnamese (vi-vn) Portuguese (pt-br) German (de-de) ChineseSimplified (zh-cn) ChineseTraditional (zh-tw) Bulgarian (bg-bg) Bengali (bn-bd) Czech (cs-cz) Danish (da-dk) Greek (el-gr) Estonian (et-ee) Finnish (fi-fi) Hindi (hi-in) Croatian (hr-hr) Hungarian (hu-hu) Georgian (ka-ge) Kazakh (kk-kz) Khmer (km-kh) Lithuanian (lt-lt) Latvian (lv-lv) Malay (ms-my) Burmese (my-mm) Bokmal (nb-no) Dutch (nl-nl) Filipino (fil-ph) Polish (pl-pl) Romanian (ro-ro) Ukrainian (uk-ua) Sinhala (si-lk) Slovak (sk-sk) Slovenian (sl-sl) Albanian (sq-al) Bosnian (bs-ba) Serbian (sr-rs) Swedish (sv-se) Arabic (ar-001)

    "},{"location":"reference/mounts/","title":"Mounts","text":"

    :Unmount()

    \uc774\ub807\uac8c \ud558\uba74 \ub9c8\uc6b4\ud2b8\ub41c Instance \ub97c \uc9c0\uc6cc\ubc84\ub9bd\ub2c8\ub2e4. Quad \ub294 \uc548\uc804\ud55c \uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 gc \uc758 \uae30\ub2a5\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, gc \uc2dc\uac04\ucc28\ub85c \uc778\ud574 Store.GetObject \uc5d0\uc11c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0ac\ub77c\uc9c0\ub294\ub370 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui,mainFrame)\n\nlocal childFrame = Frame {}\nlocal childFrameMount = Mount(mainFrame,childFrame)\nchildFrameMount:Unmount()\n-- childFrame \uc740 \ub2e8\uc21c\ud788 .Parent = nil \ub418\ub294 \uac83\uc744 \ub118\uc5b4 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc0ac\ub77c\uc9d1\ub2c8\ub2e4\n-- \uc989, Destroy() \uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4\n

    :Add(item:any)

    Mount \uc5d0 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ucc98\uc74c \uc124\uc815\ud55c to \uac12\uc744 \ub530\ub77c \ubd80\ubaa8\uac00 \uacb0\uc815\ub429\ub2c8\ub2e4.

    \uc774 \ub3d9\uc791\uc740 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4e4 \ub54c \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc\ub85c\ub4dc \ub3d9\uc791\uc2dc \uc9c1\uc811 \uc81c\uac70\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui, mainFrame)\n\nlocal lastListMount = Mount(mainFrame)\nlocal function refreshList()\n    lastListMount:Unmount() -- \uc774\uc804 children \uc744 \uc54c\uc544\uc11c \uc81c\uac70\ud569\ub2c8\ub2e4\n    for i = 1,10 do\n        lastListMount:Add(Frame { Name = tostring(i) })\n    end\nend\n\ntask.spawn(function()\n    while true do\n        refreshList()\n        task.wait(2)\n    end\nend)\n

    \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\uc804 children \uc744 \uac04\uc811\uc801\uc73c\ub85c \uc81c\uac70\ud558\uace0 \uc0c8\ub85c\uc6b4 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e8 ScrollFrame \uc758 \uacbd\uc6b0 CanvasPosition\uc774 \ucd08\uae30\ud654 \ub418\uc5b4\ubc84\ub9ac\ubbc0\ub85c \uc790\uc2dd\ub4e4\uc744 :Unmount() \ud558\uae30 \uc804\uc5d0 \uc704\uce58\ub97c \uc800\uc7a5\ud558\uace0 \ub2e4\uc2dc \ubd88\ub7ec\uc640\uc57c \ud569\ub2c8\ub2e4

    "},{"location":"reference/quadProperty/","title":"QuadProperty","text":"

    RoundSize:number?

    ImageLabel, ImageButton \uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc18d\uc131\uc785\ub2c8\ub2e4. \uc6d0\ud615 \uc774\ubbf8\uc9c0\uc5d0 Slice\ub97c \uc774\uc6a9\ud574 \ub465\uadfc \ud504\ub808\uc784\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c UICorner\ubcf4\ub2e4 \ubd80\ub4dc\ub7ec\uc6b4 \ucf54\ub108\ud6a8\uacfc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.

    Corner:number?

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 UI\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ub429\ub2c8\ub2e4. UICorner\ub97c \uc774\uc6a9\ud574 \ubaa8\uc11c\ub9ac \ubd80\ubd84\uc744 \ub465\uae00\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    PaddingAll:UDim?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc0c1\ud558\uc88c\uc6b0 \ubaa8\ub450 \uac19\uc740 \uac12\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4. PaddingAllOffset \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    PaddingAllOffset:number?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. PaddingAll\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc791\ub3d9\ud558\ub098, Offset\uac12\ub9cc \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PaddingAll \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Scale:number?

    UIScale\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. UIScale.Scale \uacfc \uac19\uc740 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4

    "},{"location":"reference/signal/","title":"Signal","text":"

    Signal.Bindable.New(id:string)->Bindable

    \uc0c8\ub85c\uc6b4 Bindable \uc744 \uc0dd\uc131\ud558\uac70\ub098 \uc774\uc804\uc758 Bindable \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    Signal.Disconnecter.New(id:string)->Disconnecter

    \uc0c8\ub85c\uc6b4 Disconnecter \uc744 \uc0dd\uc131\ud558\uac70\ub098 \uc774\uc804\uc758 Disconnecter \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    "},{"location":"reference/signal/bindable/","title":"Bindable","text":"

    :Fire(...any)

    \ub4f1\ub85d\ub41c \uc5f0\uacb0\ub4e4\uc744 \uc2e4\ud589\ud558\uace0, Wait \uc744 \ud480\uc5b4\uc90d\ub2c8\ub2e4.

    :Wait()->(...any)

    Fire \uac00 \ud638\ucd9c\ub420 \ub54c \uae4c\uc9c0 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.

    :Connect((...any)->())->Connection

    Fire \uac00 \ud638\ucd9c \ub420 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ud638\ucd9c \uc778\uc790\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc5f0\uacb0\uc744 \ub04a\uc744 \uc218 \uc788\ub3c4\ub85d Connection \uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Once((...any)->())->Connection

    Connect \uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Fire \uac00 \ud55c\ubc88 \ud638\ucd9c\ub41c \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4/

    :CheckConnected(func)->boolean

    \ud568\uc218\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :DisconnectAll()

    \ubaa8\ub4e0 \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Wait \uc73c\ub85c \uae30\ub2e4\ub9ac\uace0 \uc788\ub294 \uacf3\uc5d0\ub294 nil \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Destroy()

    :DisconnectAll() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"reference/signal/disconnecter/","title":"Disconnecter","text":"

    :Add(connection:Connection|RBXScriptConnection)

    connection\uc744 \ub9ac\uc2a4\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub098\uc911\uc5d0 :Disconnect\ub97c \ud638\ucd9c\ud558\uba74 \ucd94\uac00\ub41c \uc5f0\uacb0\uc774 \ud30c\uae30\ub429\ub2c8\ub2e4.

    :Disconnect()

    \ucd94\uac00\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\uc5d0 Disconnect() \ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ud638\ucd9c \ud6c4\uc5d0 \ucd94\uac00\ub41c \uc5f0\uacb0\uc740 \ubaa8\ub450 \uc0ac\ub77c\uc9c0\uba70. \uc774 \uc694\uccad \ud6c4\uc5d0\ub3c4 \ub2e4\uc2dc :Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4 Disconnecter \ub97c \uc644\uc804\ud788 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub824\uba74 :Destroy \ub97c \ud638\ucd9c\ud558\uc138\uc694

    :Destroy()

    :Disconnect() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"reference/store/","title":"Store","text":"

    Store.GetStore(id:string?)->store

    \uac12\ub4e4\uc744 \uc800\uc7a5\ud558\uace0 \ub808\uc9c0\uc2a4\ud130\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub294 \uac12 \uc800\uc7a5\uc18c\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    Store.GetObject(id:string)->Object?

    \ud574\ub2f9 id \ub97c \uac00\uc9c4 \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    Store.GetObjects(id:string)->objectList?

    \ud574\ub2f9 id \ub97c \uac00\uc9c4 \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \ubc18\ud658\uc740 objectList \ud0c0\uc785\uc744 \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uace0\uae09 ID \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc790\uc138\ud55c \uc0ac\ud56d\uc740 \ud29c\ud1a0\ub9ac\uc5bc \ubb38\uc11c\ub97c \ud655\uc778\ud558\uc138\uc694.

    "},{"location":"reference/store/objectList/","title":"ObjectList","text":"

    :Each((item:any, index:number)->())

    \uc77c\ubc18\uc801\uc778 \ubc18\ubcf5\uc785\ub2c8\ub2e4. for \ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uacfc \ud6a8\uacfc\uac00 \uac19\uc73c\ub098 \ud568\uc218\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4

    :EachAsync((item:any, index:number)->())

    \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 \ubc14\ub85c\ubc14\ub85c \ub2e4\uc74c \uc544\uc774\ud15c\uc73c\ub85c \ub118\uc5b4\uac11\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774 \uc774\uc6a9\ub429\ub2c8\ub2e4. wrap() \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub974\uac70\ub098, \ud544\uc694\uc131\uc774 \uc5c6\ub294\uacbd\uc6b0 \uc77c\ubc18\uc801\uc73c\ub85c :Each \ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub429\ub2c8\ub2e4

    :IsEmpty()

    \uc774 ObjectList \uac00 \ube44\uc5b4\uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Remove(indexOrItem:number|any)

    objectList \uc5d0\uc11c \ud574\ub2f9\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4. , & \ub97c \uc0ac\uc6a9\ud55c \uace0\uae09 \uac80\uc0c9\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    "},{"location":"reference/tween/","title":"Tween","text":"

    Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

    \ud2b8\uc708\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\uc708 \uc635\uc158\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 TweenOptions \ubb38\uc11c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ended, OnStepped, Setter, Getter \uac12\uc774 \uc124\uc815\ub418\uba74 Option \uc548\uc758 \uac12\ubcf4\ub2e4 \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uae30\ub2a5\uc740 TweenOptions\uc758 \ub0b4\uc6a9\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0ac \uc218 \uc788\ub3c4\ub85d TweenHandler \uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. \ub2e4\ub978 \ud2b8\uc708\uc774 \ubcc0\uacbd\uc911\uc778 \uc18d\uc131\uc774 \ub2e4\uc2dc \ud2b8\uc708\ud558\ub3c4\ub85d \ud638\ucd9c\ub418\uba74, \uc774\uc804 \ud2b8\uc708\uc5d0\uc11c \ud574\ub2f9 \uc18d\uc131\uc740 \ud2b8\uc708\uc774 \uc911\ub2e8\ub418\uba70 \uc0c8\ub85c\uc6b4 \ud2b8\uc708\uc73c\ub85c \ub36e\uc5b4\uc4f0\uae30 \ub429\ub2c8\ub2e4.

    Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

    Tween.RunTween \uc640 \uac19\uc73c\ub098 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\ud569\ub2c8\ub2e4. \uc544\ubb34\uac83\ub3c4 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    Tween.RunTween({myFrame1, myFrame2, myFrame3},{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.StopTween(ItemOrHandler:TweenHandler|any)

    \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4. TweenHandler \ub610\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc5b4 \uba48\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc73c\uba74 \uadf8 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc2e4\ud589\uc911\uc778 \ubaa8\ub4e0 \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4.

    TweenHandler \uc774\uc6a9\uc624\ube0c\uc81d\ud2b8 \uc774\uc6a9
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(Handler)\n
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(myFrame)\n

    Tween.StopPropertyTween(Item:any, PropertyName:string)

    \uc624\ube0c\uc81d\ud2b8\uc5d0 \ud2b9\uc815 \ud504\ub85c\ud37c\ud2f0\uc758 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0b5\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8 \ub610\ub294 TweenHandler \ub85c \ud2b8\uc708\uc774 \uc9c4\ud589\uc911\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4.

    Tween.IsPropertyTweening(Item:any, PropertyName:string)

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8\uc758 \ud504\ub85c\ud37c\ud2f0\uac00 \ud2b8\uc708\uc911\uc774\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \uadf8\ub798\ud504\uc640 \ubbf8\ub9ac\ubcf4\uae30\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \uc790\uc138\ud55c \uc815\ubcf4\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"reference/tween/directions/","title":"Tween.Directions","text":"

    Out \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.

    In \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.

    InOut \uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.

    "},{"location":"reference/tween/easings/","title":"Tween.Easings","text":"\ubbf8\ub9ac\ubcf4\uae30\uadf8\ub798\ud504 \uac1c\ud615

    \ubaa8\ub4e0 Easing \uc740 \uc5ec\uae30\uc5d0\uc11c \uc9c1\uc811\uc801\uc73c\ub85c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    Linear

    \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615 \ud568\uc218\uc785\ub2c8\ub2e4 i=x, x=0 to 1

    Quint

    5 \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quart \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^5) i=1-(1-x)^5, x=0 to 1

    Quart

    \ub124\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Cubic \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^4) i=1-(1-x)^4, x=0 to 1

    Cubic

    \uc138\uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. Quad \ubcf4\ub2e4 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4 (^3) i=1-(1-x)^3, x=0 to 1

    Quad

    \uc81c\uacf1\uc744 \uc774\uc6a9\ud55c \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. (^2) i=1-(1-x)^2, x=0 to 1

    Expo

    \uc9c0\uc218\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. \ub9e4\uc6b0 \uac00\ud30c\ub978 \uac1c\ud615\uc744 \uac00\uc84c\uc2b5\ub2c8\ub2e4. i=1-2^(-10*x), x=0 to 1

    Sin

    \uc0ac\uc778 \ud30c\ud615 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sin(x*pi/2), x=0 to 1

    Circle

    \uc0ac\ubd84\uc6d0 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4. i=sqrt(1-(1-x)^2), x=0 to 1

    Back

    \uc2dc\uc791\uc2dc \ub4a4\ub85c \uc774\ub3d9\uc774 \uc788\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    Elastic

    \ud0c4\uc131\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    Bounce

    \ud280\uc5b4\uc624\ub984\uc744 \uac00\uc9c0\ub294 \uac00\uac10\uc18d \ud568\uc218\uc785\ub2c8\ub2e4.

    TODO: \uc560\ub2c8\uba54\uc774\uc158 \ubbf8\ub9ac\ubcf4\uae30 \uc601\uc0c1 \ucd94\uac00

    "},{"location":"reference/tween/tweenOptions/","title":"TweenOptions","text":"

    Option Time:number?

    \ud2b8\uc708\uc758 \ucd1d \uae38\uc774\ub97c \uc815\ud569\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 1\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    Option Easing:string|(index:number)->number?

    \ud2b8\uc708\uc758 \uac00\uac10\uc18d \uc815\ub3c4\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Easings.Linear\uc640 \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud639\uc740 \ud544\uc694\uc5d0 \ub530\ub77c \ud568\uc218\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c Easing \uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c 1\ucc28 \uc9c4\ud589\ub3c4 (Linear, 0 \uc5d0\uc11c 1 \uc0ac\uc774\uc758 \uac12) \uac12\uc774 \uc8fc\uc5b4\uc9c0\uba70, \uacc4\uc0b0 \uacb0\uacfc\ub85c \uc2e4\uc81c \uc801\uc6a9\ub420 \uc704\uce58\ub97c \ubc18\ud658\ud574\uc57c\ud569\ub2c8\ub2e4. \ubc18\ud658\uac12\uc740 \uc74c\uc218\uc774\uac70\ub098 1 \ubcf4\ub2e4 \ud074 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Exp2\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \ud568\uc218\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option Direction:string?

    \ud2b8\uc708\uc774 \uc9c4\ud589\ub418\ub294 \ubc29\ud5a5\uc785\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Directions.Out\uacfc \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Out\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \ubc29\ud5a5\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option CallBack:{[number|\"*\"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uc2e4\ud589\uc911\uc778 \ub3c4\uc911\uc5d0 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b8\uc708\uc758 \uc9c4\ud589 \uc815\ub3c4\uc5d0 \ub530\ub77c\uc11c \ud55c\ubc88 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uac70\ub098 \ud2b8\uc708 \uc9c4\ud589\uc911 \uacc4\uc18d\ud574\uc11c \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub371\uc2a4\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0 \ud574\ub2f9 \uc9c0\uc810\uc744 \ub118\uc744 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70, \"*\" \ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uba74 \ubaa8\ub4e0 \ubd80\ubd84\uc5d0\uc11c \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \ud568\uc218\uc5d0\ub294 \ud3b8\uc758\uc0c1 \ud2b8\uc708\uc744 \ud558\uace0\uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \uc704\uce58\uac12, \uc2dc\uac04\ub9cc\uc744 \uace0\ub824\ud55c 1\ucc28 \uc704\uce58\uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 \"*\" \ub97c \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 1\uc744 \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Getter:(Item:any, Property:string)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc5bb\uc73c\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc124\uc815\ud558\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984, \uc124\uc815\ud560 \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/","title":"Getting Started","text":"

    \uc2e4\ud5d8\uc801\uc778 \ubaa8\ub4c8

    \uc774 \ubaa8\ub4c8\uc740 \uc5c5\ub370\uc774\ud2b8\uac00 \ube48\ubc88\ud569\ub2c8\ub2e4! \ud56d\uc0c1 Github \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694!

    "},{"location":"tutorial/#_1","title":"\uba38\ub9ac\ub9d0","text":"

    \uc774 \ud398\uc774\uc9c0\ub294 Quad \ubaa8\ub4c8\uc744 \uc27d\uac8c \uc2dc\uc791\ud560 \uc218 \uc788\ub3c4\ub85d \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc81c\uacf5\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud398\uc774\uc9c0\ub97c \uc815\ub3c5\ud574 Quad \ubaa8\ub4c8\uc758 \uc804\ubc18\uc801\uc778 \uc0ac\uc6a9\ubc95\uc744 \ud30c\uc545\ud574\ubcf4\uc138\uc694!

    \ubcc0\uacbd \uc0ac\ud56d\uc740 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/#_2","title":"\uc124\uce58","text":"

    3\uac00\uc9c0 \ubc29\ubc95\uc911 \uac00\uc7a5 \ud3b8\ud55c \ubc29\ubc95\uc744 \uc120\ud0dd\ud574 \ubaa8\ub4c8\uc744 \uc124\uce58\ud574\uc8fc\uc138\uc694.

    "},{"location":"tutorial/#rbxmx","title":"\ub4dc\ub808\uadf8 \uc5d4 \ub4dc\ub86d / rbxmx \ud30c\uc77c","text":"

    \ub4dc\ub808\uadf8\ud574 \uc2a4\ud29c\ub514\uc624\uc5d0 \ub123\uc744 \uc218 \uc788\ub294 \ubaa8\ub4c8 \ud30c\uc77c\uc785\ub2c8\ub2e4.

    RBXMX \ub2e4\uc6b4\ub85c\ub4dc

    \ub2e4\uc6b4\ub85c\ub4dc\ud574 \uc2a4\ud29c\ub514\uc624\uc5d0 \uc62e\uaca8\uc8fc\uc138\uc694.

    "},{"location":"tutorial/#git-clone","title":"git clone","text":"

    rojo \ub97c \uc0ac\uc6a9\ud574 \ube4c\ub4dc\ud558\ub294 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4\uba74 Quad \ub97c \uc9c1\uc811 \ube4c\ub4dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    git clone https://github.com/qwreey75/Quad Quad\ncd Quad\nmake build\n

    \uc708\ub3c4\uc6b0\uc758 \uacbd\uc6b0 make build \ub300\uc2e0 rojo build default.project.json -o output.rbxmx \ub97c \uc785\ub825\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4.

    "},{"location":"tutorial/#git-submodule","title":"git submodule","text":"

    \ud504\ub85c\uc81d\ud2b8\uac00 rojo \ub97c \uc0ac\uc6a9\ud558\uace0 git \uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 submodule \ub85c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    # \uc774\ubbf8 submodule \uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 \uacbd\uc6b0 \uc785\ub825\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4\ngit submodule init\n# \uc11c\ube0c\ubaa8\ub4c8\uc758 \ub8e8\ud2b8\ub294 \uc9c1\uc811 \uc815\ud574\uc8fc\uc138\uc694\ngit submodule add https://github.com/qwreey75/Quad Quad\n
    "},{"location":"tutorial/#_3","title":"\ubaa8\ub4c8 \ubd88\ub7ec\uc624\uae30/\ucd08\uae30\ud654","text":"
    local Quad = require(path.to.module).Init()\n

    \ubaa8\ub4c8\uc744 \uc14b\uc5c5\ud558\uae30 \uc704\ud574\uc11c\ub294 .Init(QuadId:string?) \uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c QuadId \uac12\uc740 \ud544\uc694\ud558\uc9c0 \uc54a\uc9c0\ub9cc, \ub098\uc911\uc5d0 \uc18c\uac1c\ud560 Store \uc640 \uac19\uc740 \uc77c\ubd80 \uae30\ub2a5\ub4e4\uc774 QuadId:string \uc5d0 \uc601\ud5a5\ubc1b\uae30\ub3c4 \ud569\ub2c8\ub2e4.

    .Init(QuadId:string) \ud568\uc218\ub294 QuadId \uac00 \uac19\uc740 \ubd88\ub7ec\uc624\uae30\uac00 \uc774\ubbf8 \uc788\uc5c8\ub358 \uacbd\uc6b0, \ucd08\uae30\ud654 \ud558\uc9c0 \uc54a\uace0 \ubd88\ub7ec\uc654\ub358\uac83\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c \ubaa8\ub4c8\ub4e4 \ub07c\ub9ac QuadId \uac00 \uac19\uc740 \uacbd\uc6b0 Store \uac19\uc740\uac83\ub4e4\uc774 \uacf5\uc720\ub429\ub2c8\ub2e4.

    QuadId \uac00 \ube44\uc6cc\uc9c4 \uacbd\uc6b0 \ud55c\ubc88\ub3c4 \uc0dd\uc131\ub41c \uc801 \uc5c6\ub294 \uc0c8\ub85c\uc6b4 Quad \uac00 \uc0dd\uc131\ub429\ub2c8\ub2e4

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n

    \ubd88\ub7ec\uc624\uae30\uac00 \ub05d\ub0ac\ub2e4\uba74 \uc774\uc81c Quad \uc758 \uc790\uc6d0\ub4e4\uc744 \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4! \ub2e4\uc74c \ud398\uc774\uc9c0\ub85c \ub118\uc5b4\uac00 \uc5b4\uc11c \ud65c\uc6a9\ud574 \ubd05\uc2dc\ub2e4

    "},{"location":"tutorial/#_4","title":"\ucd94\uac00\uc801 \ud658\uacbd \uc124\uc815","text":""},{"location":"tutorial/#_5","title":"\ud0c0\uc785 \ubd88\ub7ec\uc624\uae30","text":"

    \uae30\ubcf8\uc801\uc73c\ub85c Quad \ub294 \ub85c\ub4dc\uc2dc \ud0c0\uc785 \uac19\uc774 \ubc18\ud658\ud558\uc9c0\ub9cc. \uc9c1\uc811\uc801\uc73c\ub85c \ud0c0\uc785\uc744 \uc9c0\uc815\ud558\uace0 \uc2f6\uc740 \uacbd\uc6b0 types.lua \ub97c \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local types = require(path.to.module.types)\nlocal Quad = (require(path.to.module)::types.module).Init()\n
    "},{"location":"tutorial/#_6","title":"\ud14c\uc2a4\ud2b8 \ud658\uacbd \uc900\ube44","text":"

    \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc740 rojo \uc640\uc758 \uac1c\ubc1c\ud1b5\ud569\uc744 \uc704\ud574 Play \ubc84\ud2bc\uc744 \ub204\ub974\uc9c0 \uc54a\uace0 \ubbf8\ub9ac\ubcf4\uae30\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\uc90d\ub2c8\ub2e4 \uc774\ub97c \ud1b5\ud574 \ub2e4\ub978 \ucf54\ub4dc \ubc29\uc2dd\uc758 UI \ud504\ub808\uc784 \uc6cc\ud06c\ubcf4\ub2e4 \ube60\ub978 \uac1c\ubc1c\uc18d\ub3c4\ub97c \ub2ec\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    \ud3b8\uc758\uc0c1\uc744 \uc704\ud574 \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \uc124\uc815\ud574 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    \uc8fc\uc758

    rojo \ud658\uacbd\uc774 \uc544\ub2c8\ub77c\uba74 \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub294 \ub799\uc744 \ub3d9\ubc18\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    \uc77c\ubc18\uc801\uc73c\ub85c, \ub85c\uceec \ud3b8\uc9d1 \ud658\uacbd\uc5d0\uc11c \ub85c\ube14\ub85d\uc2a4\uc758 script editor \ub294 \ud55c\uae00\uc790 \ud55c\uae00\uc790 \ubcc0\uacbd\uc2dc \ub9c8\ub2e4 .Source \ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4. \uc774\ub294 \uacf3 \ud55c\uae00\uc790 \ud55c\uae00\uc790 \ud0c0\uc774\ud551 \uc2dc \ub9c8\ub2e4 UI \uac00 \uc5c5\ub370\uc774\ud2b8 \ub420 \uc218 \uc788\uc74c\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. Quad \uc758 tracker \ubaa8\ub4c8\uc740 \uc21c\uac04\uc801\uc73c\ub85c \ub9ce\uc740\uc591\uc758 \ub9ac\ub85c\ub4dc\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub3c4\ub85d \uc801\uc808\ud55c \ucfe8\ud0c0\uc784\uacfc \uc2dc\uac04\ubd84\ubc30\ub97c \uac00\uc9c0\uace0 \uc788\uc9c0\ub9cc, \uc774 \uacbd\uc6b0\uc5d0\ub3c4 Ctrl+S \ub97c \ub20c\ub7ec \uc800\uc7a5\ud574\uc57c \uc801\uc6a9\ub418\ub294 vscode \uc640 \uac19\uc740 \ud0c0 \ud3b8\uc9d1\uae30\uc640\ub294 \ucc28\uc774\uac00 \ub0a0 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ucf54\ub4dc\uac00 \ucee4\uc9d0\uc73c\ub85c \uc778\ud574 \uc790\ub3d9 \ub9ac\ub85c\ub4dc\uc5d0\uc11c \ud37c\ud3ec\uba3c\uc2a4\uc801 \uc774\uc288\ub97c \uacaa\ub294\ub2e4\uba74, rojo \ub97c \ud65c\uc6a9\ud574 \ucf54\ub4dc\ub97c \uc678\ubd80\ub85c \uc62e\uae34 \ud6c4, vscode \ub97c \uc2a4\ud29c\ub514\uc624 \uc704\uc5d0 \ub193\uace0 \ubbf8\ub9ac\ubcf4\uae30\uc640 \ucf54\ub4dc\ub97c \ub3d9\uc2dc\uc5d0 \ubcf4\uba74\uc11c \ud3b8\uc9d1\ud558\uc138\uc694. \ud504\ub85c\uc81d\ud2b8\uac00 \ub9e4\uc6b0 \uac70\ub300\ud558\uc9c0 \uc54a\ub2e4\uba74 \ud06c\uac8c \uac71\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub429\ub2c8\ub2e4.

    \ub2e4\uc74c\uacfc \uac19\uc740 \ucf54\ub4dc\ud2b8\ub9ac\ub97c \ub9cc\ub4e4\uc5b4\uc8fc\uc138\uc694.

     | Main (ModuleScript)\n |-- Loader (LocalScript)\n |-- Test (ModuleScript)\n
    MainLoaderTest \uc2e4\uc81c\ub85c UI \ub4e4\uc744 \uadf8\ub9ac\ub294 \ucf54\ub4dc\ub4e4\uc774 \ub2f4\uae41\ub2c8\ub2e4.
    local Quad = require(path.to.module).Init()\nlocal IsTestMode = script.Name:match(\"_TESTING\") -- \ud14c\uc2a4\ud2b8\ubaa8\ub4dc \uc5ec\ubd80\nlocal LocalPlayer = game.Players.LocalPlayer\nlocal ScreenGUI = Instance.new(\"ScreenGui\",\n    LocalPlayer and LocalPlayer.PlayerGui or game.StarterGui)\nScreenGUI.Name = \"MyGUI\"\nScreenGUI.ResetOnSpawn = false\n\n-- \uc2e4\uc81c \uadf8\ub9ac\ub294 \ucf54\ub4dc\ub4e4\uc774 \ub4e4\uc5b4\uac11\ub2c8\ub2e4.\n\nreturn function()\n    -- \ud14c\uc2a4\ud2b8\uac00 \ub05d\ub098 \ub9cc\ub4e0\uac78 \uc9c0\uc6cc\uc57c \ud560 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n    -- \ucd94\ud6c4 \uc124\uba85\ub420 Unmount() \ub97c \uc774\uc6a9\ud558\uc138\uc694.\n    ScreenGUI:Destroy()\nend\n
    \uac8c\uc784\uc744 \ud50c\ub808\uc774 \ud560 \ub54c \ucf54\ub4dc\uac00 \ub85c\ub4dc\ub420 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4dc\ub294 \ub85c\ub354\uc785\ub2c8\ub2e4.
    require(script.Parent)\n
    \uba85\ub839\ucc3d\uc5d0\uc11c \uba85\ub839\uc5b4 \uc785\ub825\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589 \ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4dc\ub294 \ucf54\ub4dc\ub4e4\uc774 \ub2f4\uae41\ub2c8\ub2e4.
    -- \ubaa8\ub4c8 \uc704\uce58\ub85c \uc54c\ub9de\uac8c \ubcc0\uacbd\ud574\uc8fc\uc138\uc694\nlocal Quad = path.to.module\nlocal tracker = require(Quad.tracker)\n\nlocal module = {}\nlocal function reload()\n    if module.unload then pcall(module.unload) end\n    if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end\n    module.testingModule = script.Parent:Clone()\n    module.testingModule.Parent = script.Parent.Parent\n    module.testingModule.Archivable = false\n    module.testingModule.Name = module.testingModule.Name .. \"_TESTING\"\n    module.unload = require(module.testingModule)\nend\n\n-- \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \ucf2d\ub2c8\ub2e4. \uc774\ubbf8 \ucf1c\uc838\uc788\uc73c\uba74 \ub2e4\uc2dc \ub85c\ub4dc\ud569\ub2c8\ub2e4\nfunction module.load()\n    reload()\n    if not module.autoreload then\n        module.autoreload = tracker.new(script.Parent)\n        module.autoreload:init(); wait()\n        module.autoreload:connect(\"updated\",reload)\n    end\nend\n\n-- \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \ub044\uace0 \ud14c\uc2a4\ud2b8\ub85c \uc0dd\uae34\uac83\uc744 \uc9c0\uc6c1\ub2c8\ub2e4\nfunction module.unload()\n    if module.autoreload then pcall(module.autoreload.deinit,module.autoreload) end\n    if module.unload then pcall(module.unload) end\n    if module.testingModule then pcall(module.testingModule.Destroy,module.testingModule) end\n    module.autoreload = nil\n    module.unload = nil\n    module.testingModule = nil\nend\n\nreturn module\n

    \uc774\uc81c \uba85\ub839\uc5b4 \ucc3d\uc5d0\uc11c \uc790\ub3d9 \ub9ac\ub85c\ub4dc\ub97c \ucf1c\uac70\ub098 \ub04c \uc218 \uc788\uc2b5\ub2c8\ub2e4. rojo \ub098 \ud3b8\uc9d1\uae30\ub85c \uc778\ud574 \ucf54\ub4dc\uac00 \ubcc0\uacbd\ub418\uba74 \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4!

    require(path.to.your.module).load()\n
    "},{"location":"tutorial/10_signal/","title":"Signal - \uc774\ubca4\ud2b8 \uc0dd\uc131\uacfc \uc5f0\uacb0","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Bindable, Disconnecter \uae30\ub2a5\uc774 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Bindable, Disconnecter \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

    Quad \uc5d0\ub294 \ud3b8\uc758\uc0c1\uc758 \uc774\uc720\ub85c \ub85c\ube14\ub85d\uc2a4\uc758 RBXScriptSignal \uc758 \uc720\uc0ac\ud488\uacfc, \ud55c\ubc88\uc5d0 \uc2dc\uadf8\ub110\uc744 \ub04a\uc5b4\uc8fc\ub294 Disconnecter \ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c Extend \uc758 GetPropertyChangedSignal \uac19\uc740 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\ub418\uae30\ub3c4 \ud569\ub2c8\ub2e4.

    "},{"location":"tutorial/10_signal/#bindable","title":"Bindable","text":"

    Bindable \uc740 RBXScriptSignal \uacfc \uc720\uc0ac\ud55c \uac1d\uccb4\uc785\ub2c8\ub2e4. Signal.Bindable.New(id:string?) \uc73c\ub85c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub85c\ube14\ub85d\uc2a4\uc758 \uae30\ubcf8 BindableEvent \uc640\ub294 \ub2e4\ub974\uac8c :Fire \uac00 \ud55c\uacf3\uc5d0 \ud569\uccd0\uc838 \uc788\uc2b5\ub2c8\ub2e4.

    Note

    \ub9cc\uc57d id \ub97c \uc9c0\uc815\ud55c \uacbd\uc6b0, \uac19\uc740 id \ub97c \uac00\uc9c4 Bindable \uc774 \uc788\uc73c\uba74 \uc774\uc804\uac83\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Signal = Quad.Signal\n\nlocal mySignal = Signal.Bindable.New()\n\nlocal connection = mySignal:Connect(function(v)\n    print(v)\nend)\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\")\nconnection:Disconnect()\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uba74 \uc548\ub429\ub2c8\ub2e4.\")\n\ntask.spawn(function()\n    task.wait(5)\n    mySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \uc9c0\uc5f0\ub41c \ud6c4 \ucd9c\ub825\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\")\nend)\nprint(mySignal:Wait())\n\nmySignal:Once(function(v)\n    print(v)\nend)\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\")\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uba74 \uc548\ub429\ub2c8\ub2e4.\")\n\nmySignal:Once(function(v)\n    print(v)\nend):Disconnect()\nmySignal:Fire(\"\uc774 \uba54\uc2dc\uc9c0\ub294 \ucd9c\ub825\ub418\uba74 \uc548\ub429\ub2c8\ub2e4.\")\n
    "},{"location":"tutorial/10_signal/#bindable_1","title":"Bindable \uba54\uc18c\ub4dc","text":"

    Bindable \uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub4e4\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Fire(...any)

    \ub4f1\ub85d\ub41c \uc5f0\uacb0\ub4e4\uc744 \uc2e4\ud589\ud558\uace0, Wait \uc744 \ud480\uc5b4\uc90d\ub2c8\ub2e4.

    :Wait()->(...any)

    Fire \uac00 \ud638\ucd9c\ub420 \ub54c \uae4c\uc9c0 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.

    :Connect((...any)->())->Connection

    Fire \uac00 \ud638\ucd9c \ub420 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. Fire \uc5d0 \uc0ac\uc6a9\ub41c \uac12\uc774 \ud638\ucd9c \uc778\uc790\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc5f0\uacb0\uc744 \ub04a\uc744 \uc218 \uc788\ub3c4\ub85d Connection \uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Once((...any)->())->Connection

    Connect \uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Fire \uac00 \ud55c\ubc88 \ud638\ucd9c\ub41c \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4/

    :CheckConnected(func)->boolean

    \ud568\uc218\uac00 \uc774\ubbf8 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :DisconnectAll()

    \ubaa8\ub4e0 \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Wait \uc73c\ub85c \uae30\ub2e4\ub9ac\uace0 \uc788\ub294 \uacf3\uc5d0\ub294 nil \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Destroy()

    :DisconnectAll() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"tutorial/10_signal/#connection","title":"Connection \uba54\uc18c\ub4dc","text":"

    Bindable:Connect \uc640 Bindable:Once \ub294 Connection \uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. Connection \uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub4e4\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    :Disconnect()

    \uc5f0\uacb0\uc744 \ub04a\uc2b5\ub2c8\ub2e4. Fire \uac00 \ud638\ucd9c\ub418\ub354\ub77c\ub3c4 Connect \ud639\uc740 Once \uc5d0 \uc0ac\uc6a9\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    :Destroy()

    :Disconnect() \uc758 \ubcc4\uce6d\uc785\ub2c8\ub2e4.

    "},{"location":"tutorial/10_signal/#disconnecter","title":"Disconnecter","text":"

    Disconnecter \ub294 \uc77c\uc885\uc758 Maid \ubaa8\ub4c8\uacfc \ube44\uc2b7\ud55c \uac1d\uccb4\uc785\ub2c8\ub2e4. \uc774 \uac1d\uccb4\uc5d0\ub294 Connection (\ub85c\ube14\ub85d\uc2a4, Quad \ubaa8\ub450 \ud638\ud658) \uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc73c\uba70, \ub098\uc911\uc5d0 \ucd94\uac00\ub41c Connection \uc744 \ud55c\uaebc\ubc88\uc5d0 Disconnect \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Signal.Disconnecter.New(id:string?) \uc73c\ub85c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    Note

    \ub9cc\uc57d id \ub97c \uc9c0\uc815\ud55c \uacbd\uc6b0, \uac19\uc740 id \ub97c \uac00\uc9c4 Bindable \uc774 \uc788\uc73c\uba74 \uc774\uc804\uac83\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Add(connection:Connection|RBXScriptConnection)

    connection\uc744 \ub9ac\uc2a4\ud2b8\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ub098\uc911\uc5d0 :Disconnect\ub97c \ud638\ucd9c\ud558\uba74 \ucd94\uac00\ub41c \uc5f0\uacb0\uc774 \ud30c\uae30\ub429\ub2c8\ub2e4.

    :Disconnect()

    \ucd94\uac00\ub41c \ubaa8\ub4e0 \uc5f0\uacb0\uc5d0 Disconnect() \ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ud638\ucd9c \ud6c4\uc5d0 \ucd94\uac00\ub41c \uc5f0\uacb0\uc740 \ubaa8\ub450 \uc0ac\ub77c\uc9c0\uba70. \uc774 \uc694\uccad \ud6c4\uc5d0\ub3c4 \ub2e4\uc2dc :Add \ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4 Disconnecter \ub97c \uc644\uc804\ud788 \uc0ac\uc6a9\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub824\uba74 :Destroy \ub97c \ud638\ucd9c\ud558\uc138\uc694

    :Destroy()

    :Disconnect() \ub97c \uc218\ud589\ud55c \ud6c4, \uac1d\uccb4\ub97c \ub354\uc774\uc0c1 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4. id \uac00 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294\uacbd\uc6b0 \uc800\uc7a5\uc18c\uc5d0\uc11c \ud30c\uae30\ud558\uac8c \ub429\ub2c8\ub2e4.

    "},{"location":"tutorial/11_extend/","title":"Extend - \ud655\uc7a5\uacfc \uc7ac\uc0ac\uc6a9","text":""},{"location":"tutorial/11_extend/#extend","title":"Extend \ub780?","text":"

    Quad \uc5d0\uc11c\ub294 \ub85c\ube14\ub85d\uc2a4\uc758 Frame \uc774\ub098 TextButton \uac19\uc740 \uae30\ubcf8 \uc624\ube0c\uc81d\ud2b8\ub9cc \ub9cc\ub4e4 \uc218 \uc788\ub294\uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4. Quad \ub294 \uc790\uc2e0\ub9cc\uc758 \ubc84\ud2bc, \ud639\uc740 \uc5ec\ub7ec \ucef4\ud3ec\ub10c\ud2b8\ub4e4\uc744 \ucd94\uc0c1\uc801\uc73c\ub85c \ub9cc\ub4e4\uace0. \ub2e4\uc2dc \ud65c\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d Extend \ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4.

    Extend \ub294 Register \uc640 \ub354\ubd88\uc5b4 Quad \uc758 \uac00\uc7a5 \uc911\uc694\ud55c \uae30\ub2a5\uc73c\ub85c\uc368, \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc744 \uc9c0\ub2d9\ub2c8\ub2e4.

    1. \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud569\ub2c8\ub2e4. \ub098\ub9cc\uc758 \ubc84\ud2bc\uc744 \ub9cc\ub4e4\uace0, \uace0\uce58\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \uc0dd\uaca8 \uace0\uce58\uba74 \uc790\ub3d9\uc73c\ub85c \uc0ac\uc6a9\ub41c \uacf3\ub4e4\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.
    2. \uae34 \ucf54\ub4dc\ub97c \ub098\ub204\uc5b4 \ucf54\ub4dc\ub9c8\ub2e4 \ud655\uc2e4\ud55c \ubaa9\uc801\uc744 \ubd80\uc5ec\ud574 \ub354 \uba85\ud655\ud55c \ucf54\ub4dc \uc791\uc131\uc774 \uac00\ub2a5\ud574\uc9d1\ub2c8\ub2e4.
    3. \uc790\uc2e0\ub9cc\uc758 \ud504\ub85c\ud37c\ud2f0\ub97c \ub9cc\ub4e4\uac70\ub098 \uc644\uc804\ud788 \uc6d0\ud558\ub294\ub300\ub85c \uc624\ube0c\uc81d\ud2b8\ub97c \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
    4. \ud568\uc218\ub098 \uc0dd\uc131\uae30\ub97c \uc9c1\uc811 \ub9cc\ub4dc\ub294 \uac83 \ubcf4\ub2e4 \uc77c\uad00\ub41c \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.
    5. \ub9e4\uc6b0 \uc720\uc5f0\ud569\ub2c8\ub2e4. \ub2e4\uc591\ud55c \ubc29\ubc95\uc758 \uad6c\ud604\ubc95\uc744 \uc6d0\ud558\ub294\ub300\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
    "},{"location":"tutorial/11_extend/#_1","title":"\ub098\ub9cc\uc758 \ud074\ub798\uc2a4\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uae30","text":"

    Extend \uac1d\uccb4\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc0dd\uc131\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\n-- extend \uac1d\uccb4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4\nlocal myClass = Class.Extend()\n
    \uc77c\ubc18\uc801\uc73c\ub85c Extend \ub294 \ud55c \ubaa8\ub4c8\uc5d0 \ud558\ub098\uc529 \ub123\uc2b5\ub2c8\ub2e4.

    \ub2e4\uc74c\uacfc \uac19\uc740 \ucf54\ub4dc \uad6c\uc870\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uc138\uc694. \uc544\ub798\uc758 \ucf54\ub4dc\ub294 \ubaa8\ub4e0 Extend \ubb38\ubc95\uc744 \uc124\uba85\ud569\ub2c8\ub2e4.

     - ScreenGUI\n |-- localscript\n    |-- myClass (ModuleScript)\n

    localscriptlocalscript.myClass Extend \ud074\ub798\uc2a4\ub97c \ubd88\ub7ec\uc624\uace0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Mount = Quad.Mount\nlocal Class = Quad.Class\nlocal Store = Quad.Store\n\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.bgColor = Color3.fromRGB(0,0,0)\n\n-- Class(require(script.myClass)) \uc640 \uac19\uc2b5\ub2c8\ub2e4.\n-- \uc904\uc5ec\uc11c Class(script.myClass) \ub85c \uc4f8 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.\nlocal myClass = Class(script.myClass)\n\n-- \ud504\ub808\uc784\uc5d0 \ub123\uac70\ub098 \ud558\uc5ec\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4\n-- \uc77c\ubc18 \uc624\ube0c\uc81d\ud2b8\uc640 \ub611\uac19\uc774 id \ub97c \ub123\uace0 GetObject \ub85c\n-- \uac00\uc838\uc62c \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4\nlocal main = myClass \"main\" {\n    -- \uc774 \ud14c\uc774\ube14\uc740 \ubaa8\ub4c8\uc758 :Init(props) \uc5d0 \uc81c\uacf5\ub429\ub2c8\ub2e4.\n    -- :Render(props) \uc5d0\ub3c4 \uc774 \ud14c\uc774\ube14\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.\n    Testing = 1;\n    Text = \"Test\";\n    -- \ub808\uc9c0\uc2a4\ud130 \uac12\uc744 \ub118\uaca8\uc904 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.\n    -- \ubc1b\ub294\ucabd\ub3c4 \ub808\uc9c0\uc2a4\ud130\uc778 \uacbd\uc6b0 \uac12\uc774 \uc5f0\ub3d9\ub429\ub2c8\ub2e4.\n    BackgroundColor3 = myStore \"bgColor\";\n}\n\nMount(ScreenGUI, main)\nprint(Store.GetObject(\"main\") == main) -- true\n\n-- \uc774 \uac12\uc744 \ubc14\uafb8\uba74 \uc5f0\ub3d9\ub41c BackgroundColor3 \ub3c4 \ubc14\ub014\uac83\uc785\ub2c8\ub2e4\nmyStore.bgColor = Color3.fromRGB(255,255,255)\n\n-- \uac12 \ubcc0\uacbd\ub428\uc744 \uc5f0\uacb0\ud558\uae30\nmain\n    :GetPropertyChangedSignal(\"AbsolutePosition\")\n    :Connect(function()\n        print(\"AbsolutePosition\",main.AbsolutePosition)\n    end)\n\n-- main:Update()\n-- \uac15\uc81c\ub85c \ub2e4\uc2dc Render \ub97c \uc2e4\ud589\ud558\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4.\n\n-- main.Testing = 2\n-- \uc5c5\ub370\uc774\ud2b8 \ud2b8\ub9ac\uac70\uc774\ubbc0\ub85c \uc774 \uac12\uc744 \ubcc0\uacbd\ud558\uba74.\n-- main:Update() \uc640 \uac19\uc740 \ud6a8\uacfc\uac00 \ub0a9\ub2c8\ub2e4.\n
    Extend \ud074\ub798\uc2a4\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. \ub2e4\ub978\uacf3\uc5d0\uc11c \ubd88\ub7ec\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\n\nlocal TextLabel = Class \"TextLabel\"\n\nlocal myClass = Class.Extend()\n\n-- Init \ub294 Render \uc804 props \ub97c \ucd08\uae30\ud654 \ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4\n-- Init \uc5d0\ub294 \ud504\ub85c\ud37c\ud2f0 \ub9ac\uc2a4\ud2b8\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. Init \ub294 \uc5c6\ub354\ub77c\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\nfunction myClass:Init(props)\n    -- \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\uc5d0 \ud504\ub77c\uc774\ube57 \uac12\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc774\ub984 \uc55e\uc5d0 _ \uac00 \ubd87\uc73c\uba74 \uc678\ubd80\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ubaa9\uc801\uc774 \uc544\ub2cc\n    -- \ub0b4\ubd80\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ubaa9\uc801\uc73c\ub85c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \uc774 \uacbd\uc6b0 \uc548\uc804\uc131\uc744 \uc704\ud574 register \ub97c \uc0ac\uc6a9\ud560 \uc218\n    -- \uc5c6\uc2b5\ub2c8\ub2e4.\n    self._testValue = 2\n\n    -- \ud504\ub85c\ud37c\ud2f0\uc758 \uae30\ubcf8\uac12\uc744 \uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    -- \uc0dd\uc131 \uc2dc \uac12\uc774 \ub204\ub77d\ub41c \uacbd\uc6b0 \uc0ac\uc6a9\ud560 \uac12\uc744 \uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \ud0a4, \uac12 \uc73c\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4\n    props:Default(\"Text\",   \"Testing Label\")\n    props:Default(\"ZIndex\", 1)\nend\n\n-- myClass \uac00 \uc9c4\uc9dc \uadf8\ub824\uc9c0\ub294 \ubd80\ubd84\uc785\ub2c8\ub2e4.\n-- Render \ub3c4 Init \ucc98\ub7fc \ud504\ub85c\ud37c\ud2f0 \ub9ac\uc2a4\ud2b8\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4.\nfunction myClass:Render(props)\n    return TextLabel {\n        Size = UDim2.fromOffset(200,200);\n        -- self \uc5d0 _label \ub85c \uc774 TextLabel \uc744 \ub123\uc2b5\ub2c8\ub2e4.\n        -- \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubb38\ubc95\uc785\ub2c8\ub2e4.\n        self \"_label\";\n\n        -- _holder \ub294 \uc608\uc57d\ub41c \uac12\uc785\ub2c8\ub2e4. \uc790\uc2dd\ub4e4\uc774 \uc5ec\uae30\uc5d0 \ub4e4\uc5b4\uc640\uc57c\n        -- \ud568\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \ub9ac\uc2a4\ud2b8\ub098 \uadf8\ub9ac\ub4dc\uac00 \uc788\ub294 \uacbd\uc6b0 \uc720\uc6a9\ud569\ub2c8\ub2e4.\n        -- \ub530\ub85c \uc124\uc815\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 Render \uac00 \ub9ac\ud134\ud55c \uac12\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\n        self \"_holder\";\n\n        -- GetPropertyChangedSignal \uac00 \uc791\ub3d9\ud560 \uc218 \uc788\ub3c4\ub85d\n        -- \ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd \uc774\ubca4\ud2b8\ub97c \uc5f0\uacb0\ud574\uc90d\ub2c8\ub2e4\n        -- \uc774 \ub610\ud55c \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubb38\ubc95\uc785\ub2c8\ub2e4.\n        [Event.Prop \"AbsolutePosition\"] = self \"AbsolutePosition\";\n        -- \ub9c8\uc6b0\uc2a4 \ud074\ub9ad\uac19\uc740 \ub2e4\ub978 \uc774\ubca4\ud2b8\ub97c GetPropertyChangedSignal \uc5d0\n        -- \uc5f0\uacb0\ud558\ub824\uba74 :EmitPropertyChangedSignal() \ub97c \ud638\ucd9c\ud574\uc8fc\uba74 \ub429\ub2c8\ub2e4.\n        [Event \"MouseEnter\"] = function (this,x,y)\n            -- \ud0a4, \uac12\uc774 \ub4e4\uc5b4\uac11\ub2c8\ub2e4. \uac12\uc774 \uc5c6\uc73c\uba74 self[key] \ub85c \ub300\uc2e0\ud569\ub2c8\ub2e4.\n            self:EmitPropertyChangedSignal(\"Testing2\",1)\n        end;\n\n        -- \ubc1b\uc740 \ub808\uc9c0\uc2a4\ud130\ub97c \uc5f0\ub3d9\ud569\ub2c8\ub2e4.\n        -- \ub9cc\uc57d props.BackgroundColor3 \ub9cc \uc0ac\uc6a9\ud558\uba74\n        -- \ucc98\uc74c\uc5d0\ub9cc \ub808\uc9c0\uc2a4\ud130\uc5d0\uc11c \uac12\uc744 \uc77d\uc5b4\uc635\ub2c8\ub2e4.\n        -- \ub530\ub77c\uc11c \uac12\uc744 \ubcc0\uacbd\ud574\ub3c4 \ubcc0\uacbd\uc0ac\ud56d\uc774 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n        BackgroundColor3 = props \"BackgroundColor3\":Tween();\n\n        -- \uc785\ub825 \uac12\uacfc \uc0c1\uad00\uc5c6\uc774 \ub808\uc9c0\uc2a4\ud130\ub97c \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        -- \uc774 \uacbd\uc6b0 main.Text = \"New\" \ucc98\ub7fc \uc9c1\uc811 \ubcc0\uacbd\ud558\uba74\n        -- \uadf8 \ubcc0\uacbd\uc774 \uc801\uc6a9\ub429\ub2c8\ub2e4.\n        Text = props \"Text\";\n        ZIndex = props \"ZIndex\";\n        -- ... \uc790\uc2dd\uc744 \ub123\uc5b4\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\n        -- Frame {\n        --    [Event.Created] = function(self)\n        --        print(self.Parent) -- nil \uc77c \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4\n        --        \ub530\ub77c\uc11c \ubd80\ubaa8\ub97c \uac74\ub4e4\uc5ec\uc57c \ud558\ub294 \uacbd\uc6b0, self \"\" \ub97c \ud1b5\ud574\n        --        self \uac12\uc5d0 \ub123\uc5b4\ub193\uace0 \ub098\uc911\uc5d0 AfterRender \ub85c \ud574\uacb0\ud574\uc57c\ud569\ub2c8\ub2e4.\n        --    end;\n        -- }\n    }\nend\n\n\n-- AfterRender \ub294 Render \uc9c1\ud6c4 \uc2e4\ud589\ub429\ub2c8\ub2e4.\n-- \ub80c\ub354\ub9c1 \ud6c4 \uc2e4\ud589\ud574\uc57c \ud560 \uac83\uc744 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n-- object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4.\n-- AfterRender \ub294 \uc5c6\ub354\ub77c\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\nfunction myClass:AfterRender(object)\n    print(self._label,\"\uc774 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n    -- \uc774\ub807\uac8c \ud558\uba74 \ub808\uc9c0\uc2a4\ud130\ub85c \uc5f0\uacb0\ub41c \ubd80\ubd84\ub3c4 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.\n    self.ZIndex = 2\nend\n\n-- function myClass:Unload(object)\n-- :Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4\n-- \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n-- object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4\n\n-- AbsolutePosition \uac12\uc744 \ubc18\ud658\ud560 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4\nfunction myClass.Getter.AbsolutePosition(self)\n    return self._label.AbsolutePosition\nend\n\n-- AbsolutePosition \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc5c6\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4\nfunction myClass.Setter.AbsolutePosition(self,newValue)\n    -- \ud544\uc694\ud55c \uacbd\uc6b0 \uac12\uc744 \uc124\uc815\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    error(\"AbsolutePosition \uac12\uc740 \uc124\uc815\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4\")\nend\n\n-- main.Testing = 2 \ub2e4\uc74c\uacfc \uac19\uc774 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 \uc624\ube0c\uc81d\ud2b8\uac00\n-- \uc644\uc804\ud788 \ub2e4\uc2dc \uadf8\ub824\uc9d1\ub2c8\ub2e4. \uc989 \uc5c5\ub370\uc774\ud2b8 \ud2b8\ub9ac\uac70\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\nmyClass.UpdateTriggers.Testing = true\n\n-- \ub9cc\ub4e0 \ud074\ub798\uc2a4\ub97c \ubc18\ud658\ud574\uc90d\uc2dc\ub2e4.\nreturn myClass\n
    "},{"location":"tutorial/11_extend/#extend_1","title":"Extend","text":"

    Extend \uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uac12\ub4e4\uacfc \uba54\uc18c\ub4dc\uc785\ub2c8\ub2e4.

    self(name:string)->linker

    Extend \uba54\uc18c\ub4dc \uc804\uc5ed\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4. \ub9c1\ucee4\ub97c \ub9cc\ub4e4\uba70, PropertyChangedSignal \ub97c \uc774\uc5b4\uc8fc\uac70\ub098, self \uc5d0 \uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc790\uc138\ud55c \uc815\ubcf4\ub294 Render \ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.

    Overwite REQUIRED :Render(props:valueStore)

    \ud654\uba74\uc5d0 \uadf8\ub824\uc9c0\ub294 UI \ub97c \ub9cc\ub4e4\uc5b4\uc9c0\uac8c \ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. Extend \uac00 \uadf8\ub824\uc9c0\ub824\uba74 \ubb34\uc870\uac74 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4. \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4dc\ub294\ub370 \ub4e4\uc5b4\uac04 \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\uc744 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc90d\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130 \ubb38\ubc95\uc774 \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Event = Quad.Event\nlocal Mount = Quad.Mount\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        [Event \"MouseButton1Click\"] = function (self,x,y)\n            print((\"\ubc84\ud2bc\uc774 %d,%d \uc5d0\uc11c \ub20c\ub838\uc2b5\ub2c8\ub2e4\"):format(x,y))\n        end;\n        Size = props \"Size\";\n        Text = props \"Text\"; -- \ub808\uc9c0\uc2a4\ud130\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4\n    }\nend\n\nlocal myImported = Class(myClass)\nmyImported.Size = UDim2.fromOffset(200,200)\n\nlocal test = myImported {\n    Text = \"wow\"\n}\nMount(ScreenGUI, test)\n\n-- \ud14d\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    test.Text = \"w\"..(\"o\"):rep(#test.Text-1)..\"w\"\nend\n

    Overwite Option :Init(props:valueStore)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub418\uae30 \uc804\uc5d0 \ubbf8\ub9ac props \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Init(props)\n    -- Size \uac12\uc774 \uc5c6\ub2e4\uba74 \uae30\ubcf8\uac12\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.\n    props:Default(\"Size\", UDim2.fromOffset(100,100))\n\n    -- \uc55e\uc5d0 _ \ub97c \ubd87\uc5ec \ub0b4\ubd80 \ubcc0\uc218\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.\n    -- \uc5b4\ub514\uc5d0\uc11c\ub098 \uc4f0\uc77c \uc218 \uc788\uc73c\uba70 register \uc5d0 \uc601\ud5a5\uc8fc\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    self._asdf = true\nend\nfunction myClass:Render(props)\n    return TextButton {\n        props \"Size\"\n    }\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported() -- \uc635\uc158 \uc5c6\uc74c\nprint(myButton.Size)\n

    Overwite Option :AfterRender(object:any)

    \uc120\ud0dd\uc801\uc778 \uba54\uc18c\ub4dc\ub85c, Render \uac00 \uc218\ud589 \ub41c \ud6c4 \ud560 \uc791\uc5c5\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c Render \uac00 \ubc18\ud658\ud55c \uac12\uc774 \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\"; -- \uc790\uae30 \uc790\uc2e0\uc5d0 \uc774 \ubc84\ud2bc\uc744 \ub123\uc2b5\ub2c8\ub2e4\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button == object) -- true\nend\n\nlocal myImported = Class(myClass)\nmyImported() -- \uc635\uc158 \uc5c6\uc74c\n

    Overwite Option :Update()

    :Render \uc640 :AfterRender \ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0, \uc774\uc804\uc5d0 \uc788\ub358 \uc790\uc2dd\ub4e4\uc744 \ub2e4\uc2dc \ub04c\uc5b4\uc635\ub2c8\ub2e4. \uc774\uc804\uc758 Render \uacb0\uacfc\ub294 \uc81c\uac70\ub429\ub2c8\ub2e4

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:Update() -- update\nmyButton:Update() -- update\nmyButton:Update() -- update\n

    Overwite Option .Getter.<PropertyName>(self)

    \uac12\uc744 \uc5bb\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {}\nend\n-- \uac12\uc744 \uc77d\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Getter.Test(self)\n    return \"Hello World\"\nend\n\nlocal myImported = Class(myClass)\nprint(myImported().Test)\n

    Overwite Option .Setter.<PropertyName>(self,newValue:any)

    \uac12\uc744 \uc124\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_button\";\n        Text = \"wow\";\n    }\nend\n-- \uac12\uc744 \uc9c0\uc815\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4\nfunction myClass.Setter.Test(self,newValue)\n    self._button.Text = newValue\nend\nfunction myClass.Getter.Test(self)\n    return self._button.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nprint(myButton.Test)\nmyButton.Test = \"Hello World\"\nprint(myButton.Test)\n

    Overwite Option .UpdateTriggers.<PropertyName> = boolean?

    \ud574\ub2f9 \uac12\uc744 \ubcc0\uacbd\ud558\uba74 Update \uac00 \uc218\ud589\ub420\uc9c0 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\nlocal count = 0\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    print(\"Rendering!\")\n    count = count + 1\n    return TextButton {\n        self \"_button\";\n        Name = tostring(count);\n    }\nend\nfunction myClass:AfterRender(object)\n    print(self._button.Name)\nend\n-- \uac12 \ubcc0\uacbd\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc5ec\ubd80\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4\nmyClass.UpdateTriggers.Test = true\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\nmyButton.Test = 1 -- update\n

    Overwite Option :Unload(object)

    :Destroy \uac00 \ud638\ucd9c\ub420 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ub530\ub85c \uc120\uc5b8\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc5f0\uacb0\uc744 \ubaa8\ub450 \ub04a\uace0 \uc5c6\uc5d0\uc8fc\uc9c0\ub9cc \ud544\uc694\ud55c \uacbd\uc6b0 \uc9c1\uc811 \uc5c6\uc5d0\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. object \ub294 :Render \uac00 \ubc18\ud658\ud55c \uac12\uc785\ub2c8\ub2e4

    :GetPropertyChangedSignal(propertyName:string)->Bindable

    \uac12 \ubcc0\uacbd\uc744 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 Bindable\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. :EmitPropertyChangedSignal \uc73c\ub85c \uc774 \uc2dc\uadf8\ub110\uc744 \uc791\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud3b8\uc758\uc0c1 \uc774 \uc2dc\uadf8\ub110\uc774 \uc791\ub3d9\ud560 \ub54c, \uc0c8\ub85c\uc6b4 \uac12\uc774 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.

    :EmitPropertyChangedSignal(propertyName:string,changedValue:any?)

    \ud504\ub85c\ud37c\ud2f0 \ubcc0\uacbd\uc2dc :GetPropertyChangedSignal \uc5d0 \ub4f1\ub85d\ub41c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \uc774 \ud568\uc218\ub97c \ud638\ucd9c\ud574 \uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c self.a = 1 \uacfc \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \ubc14\ub85c \uac12\uc744 \uc124\uc815\ud558\ub294 \uacbd\uc6b0 \uc790\ub3d9\uc801\uc73c\ub85c \uc774 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ubc15\uc2a4\uc758 \ud14d\uc2a4\ud2b8 \ucc98\ub7fc \uac1d\uccb4\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc5f0\ub3d9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc774 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. changedValue \ub294 \uc120\ud0dd\uc0ac\ud56d\uc774\uba70, \uc8fc\uc5b4\uc9c0\uc9c0 \uc54a\uc73c\uba74 self[propertyName]\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_box\";\n        Text = \"test\";\n        Size = UDim2.fromOffset(200,200);\n        [Evnet.Prop \"Text\"] = function (this,newValue)\n            self:EmitPropertyChangedSignal(\"Text\",newValue)\n        end;\n        -- [Evnet.Prop \"Text\"] = self \"Text\" \uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n        -- self(name:string) \ubb38\ubc95\uc73c\ub85c \ubcc0\uacbd \uc774\ubca4\ud2b8 \uc5ed\uc2dc \ub9c1\ud06c\n        -- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    }\nend\nfunction myClass.Getter.Text(self)\n    return self._box.Text\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported()\nmyButton:GetPropertyChangedSignal(\"Text\"):Connect(function()\n    print(myButton.Text)\nend)\nMount(ScreenGUI, myButton)\n

    Event .ChildAdded:Connect((child)->())->Connection

    \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \ucd94\uac00\ub420 \ub54c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\uc785\ub2c8\ub2e4. :Init \uc5d0\uc11c \uc0ac\uc6a9\ud558\uba74 \uc635\uc158\uc73c\ub85c \ub123\uc740 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uac00 \uc774 \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574 \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc73c\uba70, :AfterRender \uc5d0\uc11c\ub294 \ucd94\ud6c4 Mount \ub97c \ud1b5\ud574 \ucd94\uac00\ub418\ub294 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub9cc \uc774 \uc774\ubca4\ud2b8\ub85c \uc5bb\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    self.ChildAdded:Connect(function(child)\n        print(child.Name)\n    end)\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    -- Init \uc5d0 ChildAdded \ub97c \ub123\uc740\uac83\uc774 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    -- \uadf8\ub7ec\ub098 AfterRender \uc5d0 :GetChildren \uc744 \ub123\uc5b4 \uc774 \uc624\ube0c\uc81d\ud2b8\ub97c\n    -- \uc5bb\uc5b4\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n    TextButton { Name = \"Hello \"};\n}\n\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

    :GetChildren()

    \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \uac00\uc838\uc624\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. :Init() \uc5d0\uc11c\ub294 \ube48 \ud14c\uc774\ube14\uc744 \ubc18\ud658\ud558\uace0, AfterRender \uc5d0\uc11c\ub294 \uc635\uc158\uc5d0 \ub4e4\uc5b4\uac04 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\ub4e4\uc774 \ub2f4\uae34 \ud14c\uc774\ube14\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc790\uc2dd\uc758 \uc21c\uc11c\ub294 \uc77c\uc815\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Evnet = Quad.Event\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myClass = Class.Extend()\nfunction myClass:Render(props)\n    return TextButton {\n        self \"_holder\";\n    }\nend\nfunction myClass:AfterRender()\n    for i,v in ipairs(self:GetChildren()) do\n        print(v.Name)\n    end\nend\n\nlocal myImported = Class(myClass)\nlocal myButton = myImported{\n    TextButton { Name = \"Hello World\"};\n}\n\n-- \ub098\uc911\uc5d0 \ucd94\uac00\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub294 \ucd9c\ub825\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nMount(myButton, TextButton{ Name = \"Hello\" })\nMount(myButton, TextButton{ Name = \"World\" })\n

    "},{"location":"tutorial/1_import/","title":"Import - \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131","text":""},{"location":"tutorial/1_import/#_1","title":"\ub85c\ube14\ub85d\uc2a4 \uc624\ube0c\uc81d\ud2b8 \ubd88\ub7ec\uc624\uae30","text":"

    Frame \uacfc \uac19\uc740 UI \uc624\ube0c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uace0 \uc2f6\uc740 \uacbd\uc6b0 \uba3c\uc800 import \ub97c \uc774\uc6a9\ud574\uc8fc\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ub2e4\uc74c\uacfc \uac19\uc774 \uc785\ub825\ud574\ubcf4\uc138\uc694!

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal Frame = Class \"Frame\"\n\nprint(\n    Frame {\n        Name = \"Wow!\";\n        -- \ub2e4\uc74c\uacfc \uac19\uc774 \uc790\uc2dd\uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n        Frame {\n            Name = \"Child\";\n        };\n    }\n)\n

    \ub098\uc911\uc5d0 \uc790\uc2e0\ub9cc\uc758 UI \uc624\ube0c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc9c0\ub9cc, \uc77c\ubc18\uc801\uc778 \ub85c\ube14\ub85d\uc2a4\uac00 \uc9c0\uc6d0\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\uc758 \uacbd\uc6b0 Class(ClassName:string) \uc73c\ub85c \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"tutorial/1_import/#class","title":"\ubd88\ub7ec\uc628 Class \uc5d0 \uae30\ubcf8\uac12 \uc124\uc815","text":"

    \ubd88\ub7ec\uc628 Class \uc5d0 \uae30\ubcf8\uac12\uc744 \uc124\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 BorderSizePixel \uc640 \uac19\uc774 \uc790\uc8fc \uc0ac\uc6a9\ub420 \uc218 \uc788\ub294 \ud504\ub85c\ud37c\ud2f0\ub97c \ubbf8\ub9ac \uc9c0\uc815\ud574 \ub458 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\n\nlocal FrameWithoutBorder = Class \"Frame\"\nFrameWithoutBorder.BorderSizePixel = 0\n\nlocal FrameWithBorder = Class \"Frame\"\nFrameWithBorder.BorderSizePixel = 1\n\nlocal frame1 = FrameWithoutBorder {}\nlocal frame2 = FrameWithBorder {}\nlocal frame3 = FrameWithBorder {\n    -- \uac12\uc744 \ub36e\uc5b4 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \uc774\ub807\uac8c \ud558\uba74 \uae30\ubcf8\uac12\uc774 \ubb34\uc2dc\ub429\ub2c8\ub2e4.\n    BorderSizePixel = 0;\n}\n\nprint(frame1.FrameWithBorder.BorderSizePixel)\nprint(frame2.FrameWithBorder.BorderSizePixel)\nprint(frame3.FrameWithBorder.BorderSizePixel)\n

    \uc774\uc81c \uadf8\ub824\ub0b8 \ud504\ub808\uc784\uc744 \ud654\uba74\uc5d0 \uadf8\ub824\ubcf4\uace0 \uc2f6\ub098\uc694? \ub2e4\uc74c \ud29c\ud1a0\ub9ac\uc5bc Mount \ub97c \ud655\uc778\ud574\ubcf4\uc138\uc694!

    "},{"location":"tutorial/2_mount/","title":"Mount - \ud654\uba74\uc5d0 UI \ud45c\ud604","text":""},{"location":"tutorial/2_mount/#ui","title":"\ud654\uba74\uc5d0 UI \ub97c \ud45c\uc2dc\ud558\uae30","text":"

    Quad \ubaa8\ub4c8\uc5d0\uc11c \ubaa8\ub4e0 Parent \ucc98\ub9ac\ub294 Mount \ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4. Mount(to:any,...item:any?)->mounts \ud568\uc218\ub97c \uc774\uc6a9\ud558\uba74 \ub2e4\ub8e8\ub294 \uc624\ube0c\uc81d\ud2b8\uac00 \ub85c\ube14\ub85d\uc2a4 Instance \uc778\uc9c0, \ud5a5\ud6c4 \uc18c\uac1c\ub420 Quad \ud655\uc7a5 \ud074\ub798\uc2a4\uc778\uc9c0 \uc0c1\uad00\uc5c6\uc774 \uc54c\uc544\uc11c Parent \uac00 \ucc98\ub9ac\ub429\ub2c8\ub2e4.

    --- StarterGui \uc548\uc5d0 ScreenGui \ub97c \ub123\uace0 \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\ub85c \uc785\ub825\ud574\ubcf4\uc138\uc694\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nMount(ScreenGui,\n    Frame {\n        Name = \"Wow!\";\n    }\n    --[[\n    , Frame {} , Frame {}\n    \ub354\ub9ce\uc740 \uc624\ube0c\uc81d\ud2b8\ub97c \ub2e4\uac19\uc774 Mount \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    ]]\n)\n
    "},{"location":"tutorial/2_mount/#_1","title":"\ub9c8\uc6b4\ud2b8 \uac1d\uccb4","text":"

    \ud3b8\uc758\ub97c \uc704\ud574\uc11c Mount \ud568\uc218\ub294 mounts \ub77c\ub294 \uac1d\uccb4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\uac83\uc744 \uc774\uc6a9\ud558\uba74 \ud544\uc694\uc5d0 \ub530\ub77c\uc11c Mount \uc0c1\ud0dc\ub97c \ud574\uc81c\ud558\uac70\ub098 \ucd94\uac00 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. mounts \uac1d\uccb4\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc18c\ub4dc\ub97c \uac00\uc9d1\ub2c8\ub2e4.

    :Unmount()

    \uc774\ub807\uac8c \ud558\uba74 \ub9c8\uc6b4\ud2b8\ub41c Instance \ub97c \uc9c0\uc6cc\ubc84\ub9bd\ub2c8\ub2e4. Quad \ub294 \uc548\uc804\ud55c \uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 gc \uc758 \uae30\ub2a5\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, gc \uc2dc\uac04\ucc28\ub85c \uc778\ud574 Store.GetObject \uc5d0\uc11c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0ac\ub77c\uc9c0\ub294\ub370 \uc2dc\uac04\uc774 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui,mainFrame)\n\nlocal childFrame = Frame {}\nlocal childFrameMount = Mount(mainFrame,childFrame)\nchildFrameMount:Unmount()\n-- childFrame \uc740 \ub2e8\uc21c\ud788 .Parent = nil \ub418\ub294 \uac83\uc744 \ub118\uc5b4 \uba54\ubaa8\ub9ac\uc5d0\uc11c \uc0ac\ub77c\uc9d1\ub2c8\ub2e4\n-- \uc989, Destroy() \uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4\n

    :Add(item:any)

    Mount \uc5d0 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ucc98\uc74c \uc124\uc815\ud55c to \uac12\uc744 \ub530\ub77c \ubd80\ubaa8\uac00 \uacb0\uc815\ub429\ub2c8\ub2e4.

    \uc774 \ub3d9\uc791\uc740 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4e4 \ub54c \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc\ub85c\ub4dc \ub3d9\uc791\uc2dc \uc9c1\uc811 \uc81c\uac70\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount = Quad.Class,Quad.Mount\n\nlocal Frame = Class \"Frame\"\n\nlocal mainFrame = Frame {}\nMount(ScreenGui, mainFrame)\n\nlocal lastListMount = Mount(mainFrame)\nlocal function refreshList()\n    lastListMount:Unmount() -- \uc774\uc804 children \uc744 \uc54c\uc544\uc11c \uc81c\uac70\ud569\ub2c8\ub2e4\n    for i = 1,10 do\n        lastListMount:Add(Frame { Name = tostring(i) })\n    end\nend\n\ntask.spawn(function()\n    while true do\n        refreshList()\n        task.wait(2)\n    end\nend)\n

    \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\uc804 children \uc744 \uac04\uc811\uc801\uc73c\ub85c \uc81c\uac70\ud558\uace0 \uc0c8\ub85c\uc6b4 \uc624\ube0c\uc81d\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub2e8 ScrollFrame \uc758 \uacbd\uc6b0 CanvasPosition\uc774 \ucd08\uae30\ud654 \ub418\uc5b4\ubc84\ub9ac\ubbc0\ub85c \uc790\uc2dd\ub4e4\uc744 :Unmount() \ud558\uae30 \uc804\uc5d0 \uc704\uce58\ub97c \uc800\uc7a5\ud558\uace0 \ub2e4\uc2dc \ubd88\ub7ec\uc640\uc57c \ud569\ub2c8\ub2e4

    "},{"location":"tutorial/3_getObject/","title":"GetObject - \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc544\uc774\ub514 \ubd80\uc5ec","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Store.GetObject \uac00 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Store.GetObject \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

    "},{"location":"tutorial/3_getObject/#_1","title":"\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc544\uc774\ub514 \ubd80\uc5ec\ud558\uae30, \uc0ac\uc6a9\ud558\uae30","text":"

    \ubcc0\uc218\uc5d0 \ub9cc\ub4e4\uc5b4\uc9c4 \uc624\ube0c\uc81d\ud2b8\ub97c \ud558\ub098\ud558\ub098 \uc800\uc7a5\ud574\uc57c\ud558\ub098\uc694? \uc544\ub2c8\uc694, Quad \uc5d0\ub294 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store\n\nlocal Frame = Class \"Frame\"\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n

    \uc544\uc774\ub514\uc5d0 \ud5c8\uc6a9\ub418\ub294 \uae00\uc790\ub294 \ubcc0\uc218\uba85\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub300\uc18c\ubb38\uc790, \uc22b\uc790, \uc5b8\ub354\ubc14(_) \ub97c \ud5c8\uc6a9\ud569\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc Frame \"mainFrame\" {} \uc640 \uac19\uc774 id \uac12\uc744 \uc9c0\uc815\ud574 \uc900\ub2e4\uba74 \uc0dd\uc131\ub41c \uc624\ube0c\uc81d\ud2b8\ub294 \uadf8 \uc544\uc774\ub514\ub97c \uac00\uc9c0\uac8c \ub429\ub2c8\ub2e4. Store.GetObject(id:string)->Object? \ub294 \uc0dd\uc131\ub41c \uac1d\uccb4\uc911 \uac00\uc7a5 \uccab\ubc88\uc9f8\uc758 id \uac00 \uc77c\uce58\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ubc18\ud658\ud574 \uc90d\ub2c8\ub2e4.

    local index = 1\nFrame (\"mainFrame\" .. index) {}\nprint(Store.GetObject(\"mainFrame\" .. index))\n

    \uc704\ucc98\ub7fc \uc0dd\uc131\uc774\ub098 \uac00\uc838\uc624\uae30\uc5d0\uc11c \uc2dd\uc744 \ub9cc\ub4e4\uc5b4 \ub123\uc744 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/3_getObject/#_2","title":"\ub2e4\ub7c9\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \ub2e4\ub8e8\uae30","text":"\uc8fc\uc758

    Store.GetObjects\uc758 \ubc18\ud658\uac12\uc778 objectList\ub294 \uce90\uc2dc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4. objectList\ub97c local \uc5d0 \ub123\uace0 \uacc4\uc18d\ud574\uc11c \uc720\uc9c0\uc2dc\ud0a4\uc9c0 \ub9c8\uc2ed\uc2dc\uc624, \ubc18\ud658\uac12\uc740 \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8 \ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    Quad \ub294 \ub2e4\ub7c9\uc758 \uc624\ube0c\uc81d\ud2b8\ub97c \ub2e4\ub8e8\uae30 \ud3b8\ud558\ub3c4\ub85d Store.GetObjects(id:string)->objectList \ub77c\ub294 \ud568\uc218\ub97c \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4.

    \uc2e4\ud5d8\uc73c\ub85c, \uc0c9\uae54\uc774 \ub79c\ub364\ud558\uac8c \ubc14\ub00c\ub294 \ud504\ub808\uc784\ub4e4\uc744 \ub9cc\ub4e4\uc5b4 \ubd05\uc2dc\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class,Mount,Store = Quad.Class,Quad.Mount,Quad.Store\n\nlocal Frame = Class \"Frame\"\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n    };\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n        Position = UDim2.fromOffset(30,0);\n    };\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n        Position = UDim2.fromOffset(60,0);\n    };\n    Frame \"Child\" {\n        Size = UDim2.fromOffset(20,20);\n        Position = UDim2.fromOffset(90,0);\n    };\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- \uac12\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uac12\uc744 \uc77d\uac70\ub098 :Connect \ud560 \uc218\ub294 \uc5c6\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"Child\").Size = UDim2.fromOffset(30,30)\n\n-- \ud544\uc694\uc5d0 \ub530\ub77c Store.GetObjects(\"Child\") \ub97c pairs \uc5d0 \ub123\uc5b4 for \ubb38\uc744 \uc0ac\uc6a9\ud558\uac70\ub098\n-- :Each , :EachAsync , :IsEmpty \ud568\uc218\ub97c \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\ntask.spawn(function()\n    while true do\n        Store.GetObjects(\"Child\"):Each(function (item, index)\n            item.BackgroundColor3 = Color3.fromRGB(\n                math.random(0,255),\n                math.random(0,255),\n                math.random(0,255)\n            )\n        end)\n        task.wait(1)\n    end)\nend\n\n-- for \ubb38\uc744 \uc774\uc6a9\ud574\uc11c \ucd9c\ub825\ud569\ub2c8\ub2e4\nfor _,child in ipairs(Store.GetObjects(\"Child\")) do\n    print(child)\nend\n
    "},{"location":"tutorial/3_getObject/#objectlist","title":"objectList","text":"

    Store.GetObjects() \uc758 \ubc18\ud658 objectList \uc758 \uba54\uc18c\ub4dc\ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    :Each((item:any, index:number)->())

    \uc77c\ubc18\uc801\uc778 \ubc18\ubcf5\uc785\ub2c8\ub2e4. for \ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uacfc \ud6a8\uacfc\uac00 \uac19\uc73c\ub098 \ud568\uc218\ub97c \uc774\uc6a9\ud569\ub2c8\ub2e4

    :EachAsync((item:any, index:number)->())

    \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uace0 \ubc14\ub85c\ubc14\ub85c \ub2e4\uc74c \uc544\uc774\ud15c\uc73c\ub85c \ub118\uc5b4\uac11\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc774 \uc774\uc6a9\ub429\ub2c8\ub2e4. wrap() \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub974\uac70\ub098, \ud544\uc694\uc131\uc774 \uc5c6\ub294\uacbd\uc6b0 \uc77c\ubc18\uc801\uc73c\ub85c :Each \ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub429\ub2c8\ub2e4

    :IsEmpty()

    \uc774 ObjectList \uac00 \ube44\uc5b4\uc788\ub294\uc9c0 \uc5ec\ubd80\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.

    :Remove(indexOrItem:number|any)

    objectList \uc5d0\uc11c \ud574\ub2f9\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4. , & \ub97c \uc0ac\uc6a9\ud55c \uace0\uae09 \uac80\uc0c9\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    "},{"location":"tutorial/3_getObject/#id","title":"\uace0\uae09 ID \uc0ac\uc6a9\ud558\uae30","text":"

    id \uae30\ub2a5\uc744 \uc870\uae08\ub354 \uace0\uae09\uc801\uc778 \ubc29\ubc95\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c
    -- \ub450 \uc544\uc774\ub514\ub97c \uac00\uc9c4 \ud504\ub808\uc784\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4\nFrame \"a,b\" {}\n-- a \ub97c \uac00\uc9c4\uac83\uacfc, a \uc640 b \ub97c \uac00\uc9c4\uac83\uc744 \uac00\uc838\uc635\ub2c8\ub2e4\nStore.GetObjects(\"a,a&b\"):Each(function(item)\n    print(item)\nend)\n
    \uc880\ub354 \uc9c1\uad00\uc801\uc778 \ud655\uc778\uc744 \uc704\ud574\uc11c \uc791\ub3d9\uc2dc\ucf1c\ubcf4\uc138\uc694.
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Mount\nlocal Mount = Quad.Store\nlocal Store = Quad.Class\n\nlocal Frame = Class \"Frame\"\n\n--\ub2e4\uc74c\uacfc \uac19\uc774 a \uc640 b \ubaa8\ub450 \uac00\uc9c4 \ud504\ub808\uc784\uc744 \uc0dd\uc131\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.\nFrame \"a,b\" {\n    Name = \"main\";\n    Frame \"a\" {\n        Name = \"Child1\";\n    };\n    Frame \"b\" {\n        Name = \"Child2\";\n    };\n}\n\n-- \ub2e4\uc74c\uacfc \uac19\uc774 a \uc640 b \ub458\ub2e4 \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"a,b\"):Each(function(item, index)\n    print(item.Name)\nend)\nprint(\"----\")\n\n-- \ub2e4\uc74c\uacfc \uac19\uc774 a \uc640 b \ub97c \ub3d9\uc2dc\uc5d0 \uac00\uc9c4 \uac83\uc744 \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"a&b\"):Each(function(item, index)\n    print(item.Name)\nend)\nprint(\"----\")\n\n-- \ub2e4\uc74c\uacfc \uac19\uc774 a\uc640b \ub97c \ub3d9\uc2dc\uc5d0 \uac00\uc9c4\uac83\uacfc, b \ub97c \uac00\uc9c4\uac83\uc744 \uc120\ud0dd\n-- \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nStore.GetObjects(\"a&b,b\"):Each(function(item, index)\n    print(item.Name)\nend)\n
    • \ub610\ub294(or) \uc5f0\uc0b0 ,
    • \uadf8\ub9ac\uace0(and) \uc5f0\uc0b0 &

    GetObjects \uc5d0\ub294 \uc774 \ub450 \uc5f0\uc0b0\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uace0, \uc0dd\uc131\uc2dc\uc5d0\ub294 , \uc73c\ub85c \uc5ec\ub7ec \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub744\uc5b4\uc4f0\uae30\ub294 \ubb34\uc2dc\ub429\ub2c8\ub2e4

    \uc8fc\uc758
    • GetObject \uc5d0\ub294 \uc774 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
    • \uace0\uae09 ID \uc0ac\uc6a9\uc2dc objectList:Remove \uba54\uc18c\ub4dc\ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
    "},{"location":"tutorial/3_getObject/#id_1","title":"id \ucd94\uac00\uc640 \uc81c\uac70","text":"

    \uacbd\uc6b0\uc5d0 \ub530\ub77c \uc774\ubbf8 \uc0dd\uc131\ud55c \uc624\ube0c\uc81d\ud2b8\uc5d0 id \ub97c \ucd94\uac00 \ud639\uc740 \uc81c\uac70\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Store = Quad.Store\n\nlocal Frame = Class \"Frame\"\n\nFrame \"testing\" {}\n\n-- \uc544\uc774\ub514\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4\nStore.AddObject(\n    \"a,b\", Store.GetObject(\"testing\")\n)\n\n-- \uc544\uc774\ub514\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4\nStore.GetObjects(\"a\"):Remove(Store.GetObject(\"testing\"))\n

    Store.AddObject(ids:string, item:any) \ub97c \uc774\uc6a9\ud574 item \uc5d0 \uc544\uc774\ub514\ub97c \ucd94\uac00\ud558\uace0 :Remove(item:any) \ub97c \uc774\uc6a9\ud574 item \uc5d0 \uc544\uc774\ub514\ub97c \uc81c\uac70\ud569\ub2c8\ub2e4

    "},{"location":"tutorial/4_style/","title":"Style - \uc18d\uc131 \uac12 \ubc88\ub4e4\ub9c1","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Style \uae30\ub2a5\uc774 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Style \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

    "},{"location":"tutorial/4_style/#_1","title":"\ubc18\ubcf5\ub418\ub294 \uc18d\uc131\uac12\uc744 \uc904\uc774\uae30","text":"

    Quad \uc5d0\uc11c\ub294 \ubc18\ubcf5\uc801\uc778 \uc18d\uc131\ub4e4\uc744 \uc904\uc5ec \uc4f8 \uc218 \uc788\ub3c4\ub85d Style \uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\n\n-- \uc0c8\ub85c\uc6b4 \uc2a4\ud0c0\uc77c\uc744 \ud558\ub098 \ub9cc\ub4ed\ub2c8\ub2e4\nlocal myStyle = Style {\n    Size = UDim2.fromOffset(20,20);\n    BackgroundColor3 = Color3.fromRGB(255,255,0);\n    BackgroundTransparency = 0.5;\n}\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n    Frame \"Child\" {\n        myStyle; -- \uc2a4\ud0c0\uc77c\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4!\n    };\n    Frame \"Child\" {\n        Position = UDim2.fromOffset(30,0);\n        myStyle;\n    };\n    Frame \"Child\" {\n        Position = UDim2.fromOffset(60,0);\n        myStyle;\n    };\n    Frame \"Child\" {\n        Position = UDim2.fromOffset(90,0);\n        -- \uc2a4\ud0c0\uc77c\uc740 \ub36e\uc5b4\uc368 \uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        BackgroundColor3 = Color3.fromRGB(255,0,0);\n        myStyle;\n    };\n}\n\nMount(ScreenGUI,Store.GetObject(\"mainFrame\"))\n

    Style\uc744 \uc0ac\uc6a9\ud558\uba74 \ub9ce\uc740 \uc591\uc758 \uc18d\uc131\uc744 \ud558\ub098\uc5d0 \ubcc0\uc218\ub85c \uc9d1\uc5b4\ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Style\uc744 \uc0ac\uc6a9\ud574\uc11c \ub9ce\uc740 \uc591\uc758 \ucf54\ub4dc\ub97c \uc904\uc5ec\ubcf4\uc138\uc694

    "},{"location":"tutorial/4_style/#id","title":"ID \ub85c \ud0c0\uac9f\uc744 \uc9c0\uc815\ud558\uae30","text":"

    Style\uc5d0\ub294 \ud0c0\uac9f id\ub97c \uc9c0\uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\n\n-- \uc5ec\uae30\uc5d0\ub294 & \ub098 , \uac00 \uc801\uc6a9\ub418\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4!\nStyle \"Child\" {\n    Size = UDim2.fromOffset(20,20);\n    BackgroundColor3 = Color3.fromRGB(255,255,0);\n    BackgroundTransparency = 0.5;\n}\n\n-- \ub2e8, Style\uc740 \uba3c\uc800 \uc120\uc5b8\ud574\uc57c\ud569\ub2c8\ub2e4, Frame\uc744 \uba3c\uc800 \ub9cc\ub4e4\uace0\n-- Style\uc744 \uc120\uc5b8\ud558\uba74 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nFrame \"mainFrame\" {\n    Size = UDim2.fromScale(1,1);\n    Frame \"Child\" {};\n    Frame \"Child\" { Position = UDim2.fromOffset(30,0) };\n}\n\nMount(ScreenGUI,Store.GetObject(\"mainFrame\"))\n

    Style(id:string){ any }\ub97c \uc774\uc6a9\ud574 \uc2a4\ud0c0\uc77c\uc744 \uc120\uc5b8\ud574\uc8fc\uba74 \ub098\uc911\uc5d0 \ud574\ub2f9 id\ub97c \uac00\uc9c4 \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc \ud574\ub2f9 \uc2a4\ud0c0\uc77c\uc774 \uc801\uc6a9\ub429\ub2c8\ub2e4.

    "},{"location":"tutorial/5_event/","title":"Event - \uc774\ubca4\ud2b8 \ud578\ub4e4\ub9c1","text":""},{"location":"tutorial/5_event/#_1","title":"\uc774\ubca4\ud2b8 \ub4f1\ub85d\ud558\uae30","text":"

    MouseButton1Click \ud639\uc740 GetPropertyChangedSignal \uac19\uc740 \ub85c\ube14 \uae30\ubcf8 \uc774\ubca4\ud2b8\ub97c \uac04\ub2e8\ud558\uac8c \ub4f1\ub85d\ud558\uace0 \uc2f6\uc73c\uc2e0\uac00\uc694? Event \ub97c \uc774\uc6a9\ud574\ubcf4\uc138\uc694.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Event = Quad.Event\nlocal Store = Quad.Store\n\nlocal TextButton = Class \"TextButton\"\nlocal Count = 0\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(200,200);\n    Text = \"0 \ubc88 \ud074\ub9ad\ud588\uc2b5\ub2c8\ub2e4\";\n    [Event \"MouseButton1Click\"] = function(self,x,y)\n        Count = Count + 1\n        self.Text = Count .. \" \ubc88 \ud074\ub9ad\ud588\uc2b5\ub2c8\ub2e4\"\n    end;\n}\nMount(ScreenGUI, Store.GetObject(\"mainButton\"))\n
    "},{"location":"tutorial/5_event/#_2","title":"\uc774\ubc34\ud2b8 \ub9ac\uc2a4\ud2b8","text":"

    \uc801\uc6a9\uac00\ub2a5\ud55c Event \ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4

    Event(name:string)

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 \uc774\ubca4\ud2b8\ub4e4\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4, MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up \ub4f1\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4 \uae30\ubcf8\uc801\uc73c\ub85c \ub85c\ube14\ub85d\uc2a4\uc758 \uae30\ubcf8 \uc774\ubca4\ud2b8\ub4e4\uacfc \ub2e4\ub974\uac8c, \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c - \ubc84\ud2bc\ud074\ub9ad
    Frame {\n    [Event \"MouseEnter\"] = function (self)\n        print(self.Name .. \"\uc5d0 \ub9c8\uc6b0\uc2a4\uac00 \uc62c\ub77c\uc654\uc2b5\ub2c8\ub2e4\")\n    end;\n}\n
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal TextButton = Class \"TextButton\"\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(200,200);\n    [Event \"MouseEnter\"] = function (self)\n        print(\"\ubc84\ud2bc\uc774 \ud074\ub9ad\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n    end;\n}\nMount(ScreenGUI, Store.GetObject(\"mainButton\"))\n

    Event.Created

    \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub418\uc5c8\uc744 \ub54c \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uc778\uc790\ub85c self \ub97c \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nFrame {\n    [Event.Created] = function (self)\n        print(self.Name .. \"\uc774 \uc0dd\uc131\ub418\uc5c8\uc5b4\uc694\")\n    end;\n}\n

    \uc8fc\uc758

    Event.Created \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4. Class.Extend \uc5d0\uc11c\ub294 AfterRender \ub97c \uc774\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.

    Event.CreatedAsync

    Event.Created \uc640 \ube44\uc2b7\ud558\uc9c0\ub9cc, \ucf54\ub8e8\ud2f4 \uc548\uc5d0\uc11c \uc791\ub3d9\ud569\ub2c8\ub2e4. objectList:EachAsync() \ucc98\ub7fc \ubc18\ud658\uc744 \uae30\ub2e4\ub9ac\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nFrame {\n    Frame {\n        Name = \"A\";\n        [Event.CreatedAsync] = function (self)\n            -- \uc774 \ud568\uc218\uac00 \ub05d\ub098\uc9c0 \uc54a\ub354\ub77c\ub3c4 \ub2e4\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \uc218 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4\n            task.wait(5)\n        end;\n    };\n    Frame {\n        Name = \"B\";\n        [Event.Created] = function (self)\n            print(self.Name .. \"\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4\")\n        end;\n    };\n}\n

    \uc8fc\uc758

    Event.CreatedAsync \uac00 \uc2e4\ud589\ub420 \ub54c\ub294 Parent \uac12\uc774 \uc815\ud574\uc9c0\uc9c0 \uc54a\uc558\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. self.Parent \ub294 \uc811\uadfc\ud574\uc11c\ub294 \uc548\ub429\ub2c8\ub2e4.

    Event.Prop(propertyName:string)

    \ud504\ub85c\ud37c\ud2f0 \uac12\uc774 \ubcc0\uacbd\ub428\uc744 \uc5f0\uacb0\ud569\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nTextBox {\n    Text = \"\uc544\ubb34\uac70\ub098 \uc785\ub825\ud558\uc138\uc694\";\n    [Event.Prop \"Text\"] = function (self,text)\n        -- \ud3b8\uc758\uc0c1\uc758 \uc774\uc720\ub85c \ubcc0\uacbd\ub41c \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4\n        print(text)\n    end;\n}\n

    "},{"location":"tutorial/6_tween/","title":"Tween - \ud2b8\uc708\ud6a8\uacfc","text":""},{"location":"tutorial/6_tween/#_1","title":"\ud2b8\uc704\ub2dd","text":"

    Quad\uc5d0\ub294 \ud2b8\uc708\uc744 \ub3c4\uc640\uc8fc\ub294 \ubaa8\ub4c8\uc774 \ub0b4\uc7a5\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud2b8\uc708 \ubaa8\ub4c8\uc740 \ub2e8\uc21c\ud55c Instance\ub4e4\uc744 \ub118\uc5b4\uc11c table \ud615\uc2dd\ub3c4 \ud2b8\uc708\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ub098\uc911\uc5d0 \ucee4\uc2a4\ud140 \uc624\ube0c\uc81d\ud2b8\ub97c \ud2b8\uc708\ud560 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4. Quad \uc5d0\uc11c\ub294 \uc2e4\uc81c\ub85c \uc9c1\uc811\uc801\uc73c\ub85c Tween \uc744 \uc0ac\uc6a9\ud560 \uc77c\uc740 \uc801\uc73c\uba70 \ucd94\ud6c4 \uc124\uba85\ub418\ub294 register:Tween()\ub85c \uc0ac\uc6a9\ud558\ub294\uac83\uc774 \uad8c\uc7a5\ub429\ub2c8\ub2e4.

    \ud2b8\uc708\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc774 \uc218\ud589\ud569\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c - \uc6c0\uc9c1\uc774\ub294 \ubc84\ud2bc
    Tween.RunTween(myFrame,{\n    -- \ud2b8\uc708 \uc635\uc158\n    Easing = Tween.Easing.Expo;\n    Direction = Tween.Directions.Out;\n    Time = 1;\n    ...\n},{\n    -- \ud504\ub85c\ud37c\ud2f0 \ubaa9\ub85d\n})\n
    \ud074\ub9ad\uc2dc \uc6c0\uc9c1\uc774\ub294 \ubc84\ud2bc\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4.
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Tween = Quad.Tween\n\nlocal Frame = Class \"Frame\"\nlocal TextButton = Class \"TextButton\"\nlocal on = false\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(300,300);\n    BackgroundColor3 = Color3.fromRGB(255,255,255);\n    TextButton \"Child\" {\n        Text = \"Click Me!\";\n        BackgroundColor3 = Color3.fromRGB(255,100,255);\n        Position = UDim2.fromOffset(80,100);\n        Size = UDim2.fromOffset(20,20);\n        [Event \"MouseButton1Click\"] = function(self,x,y)\n            on = not on\n            Tween.RunTween(self,{\n                -- \ud2b8\uc708 \uc635\uc158\uc785\ub2c8\ub2e4. \uc544\ub798\uc5d0\uc11c \uc124\uba85\ub429\ub2c8\ub2e4\n                Easing = Tween.Easing.Expo;\n                Direction = Tween.Directions.Out;\n                Time = 1;\n            },{\n                -- \ud2b8\uc708\ud560 \ubaa9\ud45c \ud504\ub85c\ud37c\ud2f0\uc785\ub2c8\ub2e4\n                Position = on\n                    and UDim2.fromOffset(200,100)\n                    or UDim2.fromOffset(80,100);\n            })\n        end;\n    };\n}\n\nMount(ScreenGUI, Store.GetObejct(\"mainFrame\"))\n
    "},{"location":"tutorial/6_tween/#_2","title":"\ud2b8\uc708 \uc635\uc158","text":"

    \ud2b8\uc708\uc5d0\ub294 \ud2b8\uc708 \uc635\uc158\uc774 \ub4e4\uc5b4\uac00\uba70, \uc5ec\uae30\uc5d0\ub294 \ud2b8\uc708\uc758 \ubc29\ud5a5, \uac00\uac10\uc18d, \uc2dc\uac04 \ub4f1\uc744 \uc124\uc815\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub123\uc744 \uc218 \uc788\ub294 \ud2b8\uc708 \uc635\uc158\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    Option Time:number?

    \ud2b8\uc708\uc758 \ucd1d \uae38\uc774\ub97c \uc815\ud569\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 1\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    Option Easing:string|(index:number)->number?

    \ud2b8\uc708\uc758 \uac00\uac10\uc18d \uc815\ub3c4\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Easings.Linear\uc640 \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud639\uc740 \ud544\uc694\uc5d0 \ub530\ub77c \ud568\uc218\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ud568\uc218\ub97c Easing \uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uccab\ubc88\uc9f8 \uc778\uc790\ub85c 1\ucc28 \uc9c4\ud589\ub3c4 (Linear, 0 \uc5d0\uc11c 1 \uc0ac\uc774\uc758 \uac12) \uac12\uc774 \uc8fc\uc5b4\uc9c0\uba70, \uacc4\uc0b0 \uacb0\uacfc\ub85c \uc2e4\uc81c \uc801\uc6a9\ub420 \uc704\uce58\ub97c \ubc18\ud658\ud574\uc57c\ud569\ub2c8\ub2e4. \ubc18\ud658\uac12\uc740 \uc74c\uc218\uc774\uac70\ub098 1 \ubcf4\ub2e4 \ud074 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Exp2\uac00 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \ud568\uc218\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option Direction:string?

    \ud2b8\uc708\uc774 \uc9c4\ud589\ub418\ub294 \ubc29\ud5a5\uc785\ub2c8\ub2e4. \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uac70\ub098, Tween.Directions.Out\uacfc \uac19\uc774 \uc5f4\uac70\ud615 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ubb34 \uac12\ub3c4 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 Out\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \ubc29\ud5a5\uc5d0 \uad00\ud55c \uc790\uc138\ud55c \uc124\uba85\uacfc \ubbf8\ub9ac\ubcf4\uae30\ub294 \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694

    Option CallBack:{[number|\"*\"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uc2e4\ud589\uc911\uc778 \ub3c4\uc911\uc5d0 \ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b8\uc708\uc758 \uc9c4\ud589 \uc815\ub3c4\uc5d0 \ub530\ub77c\uc11c \ud55c\ubc88 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uac70\ub098 \ud2b8\uc708 \uc9c4\ud589\uc911 \uacc4\uc18d\ud574\uc11c \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub371\uc2a4\uac00 \uc22b\uc790\uc778 \uacbd\uc6b0 \ud574\ub2f9 \uc9c0\uc810\uc744 \ub118\uc744 \ub54c \ud568\uc218\uac00 \uc2e4\ud589\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70, \"*\" \ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uba74 \ubaa8\ub4e0 \ubd80\ubd84\uc5d0\uc11c \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \ud568\uc218\uc5d0\ub294 \ud3b8\uc758\uc0c1 \ud2b8\uc708\uc744 \ud558\uace0\uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \uc704\uce58\uac12, \uc2dc\uac04\ub9cc\uc744 \uace0\ub824\ud55c 1\ucc28 \uc704\uce58\uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 \"*\" \ub97c \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?

    CallBack \uc5d0 1\uc744 \ub123\uc740\uac83\uacfc \ub3d9\uc77c\ud55c \ud6a8\uacfc\ub97c \uac00\uc9c0\ub294 \ubcc4\uce6d\uc785\ub2c8\ub2e4

    Option Getter:(Item:any, Property:string)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc5bb\uc73c\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    Option Getter:(Item:any, Property:string, Value:Lerpable)->any?

    \uc120\ud0dd\uc801\uc778 \ud544\ub4dc\uc774\uba70, \ud2b8\uc708\uc774 \uac12\uc744 \uc124\uc815\ud558\ub824 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ud568\uc218\uc785\ub2c8\ub2e4. \ud568\uc218\uc5d0 \ud2b8\uc708\ud558\uace0 \uc788\ub294 \uc624\ube0c\uc81d\ud2b8, \ud504\ub85c\ud37c\ud2f0 \uc774\ub984, \uc124\uc815\ud560 \uac12\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.

    Warning

    register:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/6_tween/#_3","title":"\ud2b8\uc708 \ud568\uc218","text":"

    Quad \uc758 \ud2b8\uc708\uc5d0\ub294 \ud2b8\uc708\uc744 \uba48\ucd94\uac70\ub098 \ud2b8\uc708\uc911\uc778\uc9c0 \ud655\uc778\ud558\ub294 \ub4f1\uc758 \uc791\uc5c5\uc744 \ud560 \uc218 \uc788\ub294 \uc5ec\ub7ec \ud568\uc218\ub4e4\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4. Tween \uc548\uc758 \ubaa8\ub4e0 \ud568\uc218\uc640 \uac12\ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler

    \ud2b8\uc708\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\uc708 \uc635\uc158\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 TweenOptions \ubb38\uc11c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Ended, OnStepped, Setter, Getter \uac12\uc774 \uc124\uc815\ub418\uba74 Option \uc548\uc758 \uac12\ubcf4\ub2e4 \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uae30\ub2a5\uc740 TweenOptions\uc758 \ub0b4\uc6a9\uacfc \uac19\uc2b5\ub2c8\ub2e4. \ub098\uc911\uc5d0 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0ac \uc218 \uc788\ub3c4\ub85d TweenHandler \uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. \ub2e4\ub978 \ud2b8\uc708\uc774 \ubcc0\uacbd\uc911\uc778 \uc18d\uc131\uc774 \ub2e4\uc2dc \ud2b8\uc708\ud558\ub3c4\ub85d \ud638\ucd9c\ub418\uba74, \uc774\uc804 \ud2b8\uc708\uc5d0\uc11c \ud574\ub2f9 \uc18d\uc131\uc740 \ud2b8\uc708\uc774 \uc911\ub2e8\ub418\uba70 \uc0c8\ub85c\uc6b4 \ud2b8\uc708\uc73c\ub85c \ub36e\uc5b4\uc4f0\uae30 \ub429\ub2c8\ub2e4.

    Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)

    Tween.RunTween \uc640 \uac19\uc73c\ub098 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\ud569\ub2c8\ub2e4. \uc544\ubb34\uac83\ub3c4 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

    Tween.RunTween({myFrame1, myFrame2, myFrame3},{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n

    Tween.StopTween(ItemOrHandler:TweenHandler|any)

    \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4. TweenHandler \ub610\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc5b4 \uba48\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc624\ube0c\uc81d\ud2b8\ub97c \ub123\uc73c\uba74 \uadf8 \uc624\ube0c\uc81d\ud2b8\uc5d0 \uc2e4\ud589\uc911\uc778 \ubaa8\ub4e0 \ud2b8\uc708\uc744 \uba48\ucda5\ub2c8\ub2e4.

    TweenHandler \uc774\uc6a9\uc624\ube0c\uc81d\ud2b8 \uc774\uc6a9
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(Handler)\n
    local Handler = Tween.RunTween(myFrame,{\n    Time = 1;\n},{\n    Position = UDim2.new(1,0,1,0);\n})\n\nTween.StopTween(myFrame)\n

    Tween.StopPropertyTween(Item:any, PropertyName:string)

    \uc624\ube0c\uc81d\ud2b8\uc5d0 \ud2b9\uc815 \ud504\ub85c\ud37c\ud2f0\uc758 \ud2b8\uc708\uc744 \uc911\ub2e8\uc2dc\ud0b5\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8 \ub610\ub294 TweenHandler \ub85c \ud2b8\uc708\uc774 \uc9c4\ud589\uc911\uc778\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4.

    Tween.IsPropertyTweening(Item:any, PropertyName:string)

    \ud574\ub2f9 \uc624\ube0c\uc81d\ud2b8\uc758 \ud504\ub85c\ud37c\ud2f0\uac00 \ud2b8\uc708\uc911\uc774\uc9c0 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud569\ub2c8\ub2e4. TweenHandler \ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Easing =\n\"Linear\" // \uc544\ubb34\ub7f0 \uac00\uac10\uc18d\uc774 \uc5c6\ub294 1\ucc28\ud615\n|\"Quint\" // 5 \uc81c\uacf1\n|\"Quart\" // \ub124\uc81c\uacf1\n|\"Cubic\" // \uc138\uc81c\uacf1\n|\"Quad\" // \uc81c\uacf1\n|\"Sin\" // \uc0ac\uc778 \ud30c\ud615\n|\"Circle\" // \uc0ac\ubd84\uc6d0\n|\"Expo\" // \uc9c0\uc218\ud615\n|\"Elastic\" // \ud0c4\uc131\n|\"Bounce\" // \ud280\uc5b4\uc624\ub984\n|\"Back\" // \ub4a4\ub85c \uac00\uac10\uc18d\n|\"Exp2\" // \ub35c \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 to 2\n|\"Exp4\" // \ub354 \uac00\ud30c\ub978 \uc9c0\uc218 i=exp(x)/max, x=-4 ~ 4\n|EasingFunction?;\n
    \uadf8\ub798\ud504\uc640 \ubbf8\ub9ac\ubcf4\uae30\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    Tween.Easings: { [string]: EasingFunction }

    \uc774\uc9d5 \ud568\uc218\ub4e4\uc774 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4.

    type Direction =\n// \ucd08\ubc18\uc5d0 \uac00\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9c0\uba70, \ud6c4\ubc18\uc5d0 \ub290\ub824\uc9d1\ub2c8\ub2e4.\n\"Out\"\n// \ucd08\ubc18\uc5d0\ub294 \ub290\ub9ac\uba70, \uc810\uc810 \uac00\uc18d\uc774 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.\n|\"In\"\n//\uc911\uac04\uc5d0\uc11c \uac00\uc7a5 \ube60\ub978 \uc18d\ub3c4\ub97c \uac00\uc9c0\uba70, \ud6c4\ubc18 \ucd08\ubc18 \ubaa8\ub450 \uac10\uc18d\uc774 \uc774\ub8e8\uc6cc\uc9d1\ub2c8\ub2e4.\n|\"InOut\"\n
    \uc790\uc138\ud55c \uc815\ubcf4\ub294 Easings \uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    "},{"location":"tutorial/7_quadProperty/","title":"QuadProperty - \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0","text":"\uc8fc\uc758\uc0ac\ud56d

    \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0\ub294 Tween \uc774 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 register\uc758 :Tween()\uc758 \uacbd\uc6b0 \ud638\ud658\ub418\ubbc0\ub85c, \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0 \uac12\uc744 \ud2b8\uc708\ud558\ub824\uba74 \ud5a5\ud6c4 \uc124\uba85\ub418\ub294 register \uc640 \ud568\uae68 \uc0ac\uc6a9\ud574\uc57c\ud569\ub2c8\ub2e4.

    Tween.RunTween, Tween.RunTweens \uc640\ub294 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    "},{"location":"tutorial/7_quadProperty/#_1","title":"\ud2b9\uc218\ud55c \ud504\ub85c\ud37c\ud2f0","text":"

    Quad \uc5d0\uc11c\ub294 \ud3b8\ub9ac\uc131\uc744 \uc704\ud574 \uc77c\ubd80 \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubaa8\ub4e0 \ud2b9\uc218 \ud504\ub85c\ud37c\ud2f0\ub294 \ud5a5\ud6c4 \uc18c\uac1c\ub418\ub294 register\uc640 \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal ImageFrame = Class \"ImageFrame\"\nImageFrame.BackgroundTransparency = 1\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    PaddingAllOffset = 50; -- Padding \uc744 50 \uc529 \ubaa8\ub4e0 \ubc29\ud5a5\uc73c\ub85c \uc90d\ub2c8\ub2e4\n    BackgroundColor3 = Color3.fromRGB(40,40,40);\n    ImageFrame {\n        ImageColor3 = Color3.fromRGB(60,60,60);\n        RoundSize = 16; -- \uc774\ubbf8\uc9c0\ub85c \ub77c\uc6b4\ub4dc \ud504\ub808\uc784\uc744 \ub9cc\ub4ed\ub2c8\ub2e4\n        Size = UDim2.fromScale(1,1);\n        ImageFrame {\n            BackgroundColor3 = Color3.fromRGB(80,80,80);\n        };\n    };\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n

    \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud504\ub85c\ud37c\ud2f0\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    RoundSize:number?

    ImageLabel, ImageButton \uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc18d\uc131\uc785\ub2c8\ub2e4. \uc6d0\ud615 \uc774\ubbf8\uc9c0\uc5d0 Slice\ub97c \uc774\uc6a9\ud574 \ub465\uadfc \ud504\ub808\uc784\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c UICorner\ubcf4\ub2e4 \ubd80\ub4dc\ub7ec\uc6b4 \ucf54\ub108\ud6a8\uacfc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.

    Corner:number?

    \ubaa8\ub4e0 \ub85c\ube14\ub85d\uc2a4 UI\uc624\ube0c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ub429\ub2c8\ub2e4. UICorner\ub97c \uc774\uc6a9\ud574 \ubaa8\uc11c\ub9ac \ubd80\ubd84\uc744 \ub465\uae00\uac8c \ub9cc\ub4ed\ub2c8\ub2e4. \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    PaddingAll:UDim?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. \uc0c1\ud558\uc88c\uc6b0 \ubaa8\ub450 \uac19\uc740 \uac12\uc73c\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4. PaddingAllOffset \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    PaddingAllOffset:number?

    UIPadding\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. PaddingAll\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc791\ub3d9\ud558\ub098, Offset\uac12\ub9cc \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PaddingAll \uacfc \ud568\uae68 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    Scale:number?

    UIScale\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4. UIScale.Scale \uacfc \uac19\uc740 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4

    "},{"location":"tutorial/8_register/","title":"Register - \uac12 \ubcc0\uacbd \uc5f0\ub3d9","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Store.GetStore \uac00 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Store.GetStore \ub294 \uacf5\uc720\ub429\ub2c8\ub2e4

    "},{"location":"tutorial/8_register/#_1","title":"\ub808\uc9c0\uc2a4\ud130","text":"

    \ub808\uc9c0\uc2a4\ud130\ub294 \ud55c \uac12\uc774 \ubcc0\uacbd\ub420 \ub54c, \uadf8 \uac12\uc744 \uc0ac\uc6a9\ud55c \uacf3\uc774 \uc5c5\ub370\uc774\ud2b8 \ub420 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\uc8fc\ub294 Quad \uc758 \uc8fc\uc694 \uae30\uc220\uc785\ub2c8\ub2e4. \ucd94\ud6c4 \uc124\uba85\ub420 Class.Extend \uc640\ub3c4 \uac19\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    \ub808\uc9c0\uc2a4\ud130\ub294 \uc774\ub7ec\ud55c \uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c \uc0ac\uc6a9\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    1. UI \uc758 \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub97c \ud55c\ubc88\uc5d0 \ud398\uc774\ub4dc \uc544\uc6c3 \ud639\uc740 \ud398\uc774\ub4dc \uc778 \uc2dc\ud0a4\ub294 \uacbd\uc6b0.
    2. \uac00\ubcc0 \ud06c\uae30\uc758 UI \ub97c \uc5c5\ub370\uc774\ud2b8 \uc2dc\ud0a4\ub294 \uacbd\uc6b0.
    3. \uc5ec\ub7ec \uc624\ube0c\uc81d\ud2b8\ub4e4\uc744 \ud55c\uaebc\ubc88\uc5d0 \ud2b8\uc708\uc2dc\ud0a4\ub294 \uacbd\uc6b0.
    4. \ub2e4\ud06c\ud14c\ub9c8/\ud654\uc774\ud2b8\ud14c\ub9c8 \ubcc0\uacbd\ud560 \uc218 \uc788\uac8c \ub9cc\ub4dc\ub294 \uacbd\uc6b0.

    \uc774\uc678\uc5d0\ub3c4 \ub808\uc9c0\uc2a4\ud130\uc758 \ud65c\uc6a9 \ubc29\ubc95\uc740 \ubb34\uad81\ubb34\uc9c4\ud569\ub2c8\ub2e4. \ub808\uc9c0\uc2a4\ud130\uc758 \uc0ac\uc6a9\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    local myStore = Store.GetStore(\"myStore\")\nmyStore.color = Color3.fromRGB(255,255,255)\nFrame { BackgroundColor3 = myStore \"color\" }\n-- \uc5f0\ub3d9\ub41c \ud504\ub808\uc784\ub3c4 \uc5c5\ub370\uc774\ud2b8 \ub429\ub2c8\ub2e4\nmyStore.color = Color3.fromRGB(0,0,0)\n
    \uc8fc\uc758

    \uad6c\ud604\uc758 \ubcf5\uc7a1\uc131\uc758 \uc774\uc720\ub85c \ub808\uc9c0\uc2a4\ud130\ub294 \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local myFrame = Frame{}\nFrame.BackgroundColor3 = myStore \"color\"\n
    \uc704\ucc98\ub7fc \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    local myFrame = Frame{}\nApply (myFrame) {\n    BackgroundColor3 = myStore \"color\";\n}\n
    1. \uc2a4\ud1a0\uc5b4\ub97c \uc0dd\uc131\ud568.
    2. \uae30\ubcf8 \uac12\uc744 \uc124\uc815\ud568.
    3. \uc2a4\ud1a0\uc5b4\ub97c \ud638\ucd9c\ud574 \ub808\uc9c0\uc2a4\ud130\ub97c \uc5bb\uc5b4 \ub4f1\ub85d\ud568.

    \uc608\uc2dc \ucf54\ub4dc\ub85c \uc815\ud655\ud558\uac8c \ud655\uc778\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\n-- \ub808\uc9c0\uc2a4\ud130\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub294 \ud14c\uc774\ube14\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.\n-- \uc5ec\uae30\uc5d0 \ub2f4\uc544\ub0b4\ub294 \uac12\uc744 \uc5c5\ub370\uc774\ud2b8 \ud558\ub294 \uacbd\uc6b0 \ub808\uc9c0\uc2a4\ud130\ub85c \uc5f0\uacb0\ub41c\n-- \uc624\ube0c\uc81d\ud2b8\ub4e4\ub3c4 \uac19\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.\nlocal myStore = Store.GetStore(\"myStore\")\nlocal TextLabel = Class \"TextLabel\"\n\nmyStore.Text = \"0 \ucd08 \uc9c0\ub0a8\"\nmyStore.Color = Color3.fromRGB(255,100,255)\n\nTextLabel \"mainLabel\" {\n    Size = UDim2.fromOffset(100,200);\n    -- myStore \uc758 Text \uac12\uc774 \ubcc0\uacbd\ub428\uc744 \ucd94\uc801\ud558\uace0, Text \uac12\uc744\n    -- \uc5c5\ub370\uc774\ud2b8 \uc2dc\ud0b5\ub2c8\ub2e4.\n    Text = myStore \"Text\";\n\n    -- \uc774\uac83\uc740 \ub808\uc9c0\uc2a4\ud130\ub97c \uc0ac\uc6a9\ud558\ub294\uac83\uc774 \uc544\ub2c8\ub77c \ub2e8\uc21c\ud788 \uac12\ub9cc\n    -- \ubd88\ub7ec\uc640 \ub123\uc5b4\uc8fc\ub294 \uac83\uc785\ub2c8\ub2e4. \uc790\ub3d9 \uc5c5\ub370\uc774\ud2b8\uac00 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n    BackgroundColor3 = myStore.Color;\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainLabel\"))\n\n-- \ubc14\uafb8\ub354\ub77c\ub3c4 \ub808\uc9c0\uc2a4\ud130\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc544 \ubc18\uc601\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\nmyStore.Color = Color3.fromRGB(255,255,255)\n\nlocal Count = 1\nwhile task.wait(1) do\n    -- \uac12\uc744 \uc5c5\ub370\uc774\ud2b8 \ud569\ub2c8\ub2e4. \ud14d\uc2a4\ud2b8 \ub77c\ubca8\ub3c4\n    -- \uc790\ub3d9\uc801\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8 \ub429\ub2c8\ub2e4.\n    myStore.Text = Count .. \" \ucd08 \uc9c0\ub0a8\"\n    Count = Count + 1\nend\n
    "},{"location":"tutorial/8_register/#_2","title":"\ub808\uc9c0\uc2a4\ud130 \uba54\uc18c\ub4dc","text":"

    \ub808\uc9c0\uc2a4\ud130\uc5d0\ub294 \uc5ec\ub7ec\uac00\uc9c0 \uba54\uc18c\ub4dc\uac00 \ub2f4\uaca8\uc788\uc2b5\ub2c8\ub2e4. \uc774 \uba54\uc18c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uba74 \ub808\uc9c0\uc2a4\ud130\ub97c \ubcf4\ub2e4 \ub354 \ub2e4\uc591\ud558\uac8c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    register \ud2b9\uc218 \uba54\uc18c\ub4dc\uac00 \uc801\uc6a9\ub418\ub294 \uc21c\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    :Add(value:any)->register

    \uac12\uc5d0 \ub354\ud558\uae30\ub97c \ucde8\ud569\ub2c8\ub2e4. \uc74c\uc218\ud615\ud0dc\uac00 \uc81c\uacf5\ub418\ub294 \uacbd\uc6b0 \ube7c\uae30 \ucc98\ub7fc \uc791\ub3d9\ud569\ub2c8\ub2e4. number, Udim, UDim2, Color3, Vector2 \ub4f1 \ub354\ud560 \uc218 \uc788\ub294 \ubaa8\ub4e0\uac83\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.pos = UDim2.fromOffset(100,0)\n\nFrame \"mainFrame\" {\n    Position = myStore \"pos\":Add(UDim2.fromOffset(0,100));\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nwhile true do\n    myStore.pos = myStore.pos + UDim2.fromOffset(10,0)\n    task.wait(2)\nend\n

    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :With((store:valueStore, newValue:any, key:string)->())->register

    \ud568\uc218 \ub610\ub294 \ud14c\uc774\ube14\uc5d0\uc11c \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4. Add \ubcf4\ub2e4 \ub098\uc911\uc5d0 \uc218\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud568\uc218\uc608\uc81c - \ud14c\uc774\ube14
    myStore \"size\":With(function (_,value)\n    return value * 2\nend)\n

    width \uac12\uc5d0 \ub9de\ucdb0 \uc790\ub3d9\uc73c\ub85c UI \uac00 \uc5c5\ub370\uc774\ud2b8\ub418\ub3c4\ub85d \ub9cc\ub4ed\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.topbarSize = 60\nmyStore.width = 200\n\n-- \ub808\uc9c0\uc2a4\ud130\ub97c \ubcc0\uc218\ub85c \ub450\uace0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4\nlocal listItemSize = myStore \"width\":With(function()\n    return UDim2.fromOffset(myStore.width,60)\nend)\n\nFrame \"mainFrame\" {\n    Class \"UIListLayout\" { SortOrder = Enum.SortOrder.LayoutOrder };\n\n    -- \uc0ac\uc774\uc988\uac00 width \uc5d0 \ub9de\uac8c \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4\n    Size = myStore \"width\":With(function ()\n        return UDim.fromOffset(store.width,400)\n    end);\n\n    Frame \"Topbar\" {\n        LayoutOrder = 1;\n        BackgroundColor3 = Color3.fromRGB(255,0,0);\n        -- \uc774\ub807\uac8c \uc5ec\ub7ec \uac12\uc744 \ubb36\uc5b4\uc11c \ub450 \uac12\uc774 \ubcc0\uacbd\ub428, \ud639\uc740 \uadf8\uc774\uc0c1\uc744\n        -- \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        Size = myStore \"topbarSize,width\":With(function()\n            return UDim2.fromOffset(myStore.width,myStore.topbarSize)\n        end);\n    }\n    Frame \"ListItem\" {\n        LayoutOrder = 2;\n        BackgroundColor3 = Color3.fromRGB(0,255,0);\n        Size = listItemSize;\n    };\n    Frame \"ListItem\" {\n        LayoutOrder = 3;\n        BackgroundColor3 = Color3.fromRGB(0,0,255);\n        Size = listItemSize;\n    };\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- width \uac12\uc744 \ubcc0\uacbd\ud574\ubcf4\uc138\uc694\nwhile true do\n    myStore.width = myStore.width + 10\n    task.wait(1)\nend\n

    colors \ud14c\uc774\ube14 \uc548\uc5d0 \uc788\ub294 \uc0c9\uae54\ub4e4\uc744 \ub3cc\uc544\uac00\uba70 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nlocal colors = {\n    Color3.fromRGB(255,255,255);\n    Color3.fromRGB(255,255,0);\n    Color3.fromRGB(0,255,255);\n    Color3.fromRGB(255,0,255);\n    Color3.fromRGB(255,0,0);\n    Color3.fromRGB(0,255,0);\n    Color3.fromRGB(0,0,255);\n}\nmyStore.color = 1\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- colors \uc5d0\uc11c \uc778\ub371\uc2f1\ud574 \uac12\uc744 \uac00\uc838\uc635\ub2c8\ub2e4\n    BackgroundColor3 = myStore \"color\":With(colors);\n}\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\n-- \uc778\ub371\uc2a4\ub97c \uc21c\ud68c\ud569\ub2c8\ub2e4\nwhile task.wait(1) do\n    myStore.color = (i-1)%(#colors)+2\nend\n
    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :Tween(options:TweenOptions)->register

    \ud2b8\uc708\uc744 \uc774\uc6a9\ud574 \ubcc0\uacbd\uc0ac\ud56d\uc744 \uc801\uc6a9\ud569\ub2c8\ub2e4(\ucc98\uc74c \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub294 \uc801\uc6a9\ub418\uc9c0 \uc54a\uc74c) \uc635\uc158\uc740 Tween \ubb38\uc11c\uc5d0 \ub098\uc640\uc788\ub294 \uc635\uc158\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \ud55c\uaebc\ubc88\uc5d0 \uc774\ub3d9
    -- Tween \uc635\uc158\uc744 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nmyStore \"size\":Tween{ Time = 2 }\n

    \ud504\ub808\uc784\uc744 \ud55c\uaebc\ubc88\uc5d0 \uc6c0\uc9c1\uc785\ub2c8\ub2e4.

    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\nlocal Style = Quad.Style\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.pos = UDim2.fromOffset(50,0)\nStyle \"TweenFrame\" {\n    Size = UDim2.fromOffset(50,50);\n    BackgroundColor3 = Color3.fromRGB(255,100,255);\n}\n\nFrame \"mainFrame\" {\n    BackgroundColor3 = Color3.fromRGB(255,255,255);\n    Size = UDim2.fromOffset(500,500);\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\":Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,100))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,200))\n            :Tween{Time = 2};\n    };\n    Frame \"TweenFrame\" {\n        Position = myStore \"pos\"\n            :Add(UDim2.fromOffset(0,300))\n            :Tween{Time = 2};\n    }\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\nlocal on = false\nwhile true do\n    on = not on\n    myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0)\n    task.wait(1.5) -- \ud2b8\uc708\uc740 \ub36e\uc5b4 \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    -- \ub530\ub77c\uc11c 2 \ucd08\uc778 \uae38\uc774\ubcf4\ub2e4 \ub354 \ube68\ub9ac \ubc14\uafd4\ub3c4 \uc624\ub958\uac00 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\nend\n
    \uc8fc\uc758

    \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4

    :Default(value:any)->register

    \uae30\ubcf8\uac12\uc744 \uc815\ud569\ub2c8\ub2e4. \ub9cc\uc57d \uac12\uc774 nil \uc778 \uacbd\uc6b0 \uc774 \uac12\uc744 \uc0ac\uc6a9\ud558\uac8c \ub429\ub2c8\ub2e4. Add \ub098 With \ub4f1 \ub2e4\ub978\uac83\uc5d0 \uc601\ud5a5\ubc1b\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

    -- \uc6a9\ubc95\nlocal ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Class = Quad.Class\nlocal Mount = Quad.Mount\n\nlocal Frame = Class \"Frame\"\nlocal myStore = Store.GetStore(\"myStore\")\n\nFrame \"mainFrame\" {\n    Size = UDim2.fromOffset(200,200);\n    -- color \uac12\uc774 \uc5c6\uc73c\ubbc0\ub85c Default \uc548\uc758 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\n    BackgroundColor3 = myStore \"color\"\n        :Default(Color3.fromRGB(255,0,0));\n}\n\nMount(ScreenGUI, Store.GetObject(\"mainFrame\"))\n\ntask.wait(5)\nmyStore.color = Color3.fromRGB(0,255,0)\n

    \uc8fc\uc758
    • \ucc98\uc74c \uc624\ube0c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub420 \ub54c\uc5d0\ub9cc \uc774 \uac12\uc774 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.
    • \uad6c\uc870\uc758 \ubcf5\uc7a1\uc131\uc744 \ud53c\ud558\uace0\uc790, \uc5ec\ub7ec\ubc88 \ud638\ucd9c\uc2dc \uac00\uc7a5 \ub9c8\uc9c0\ub9c9 \ud638\ucd9c\ub41c \uac83\ub9cc \uc0ac\uc6a9\ub429\ub2c8\ub2e4.

    :Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT

    \ub808\uc9c0\uc2a4\ud130\uc5d0 \ud568\uc218\ub97c \ub4f1\ub85d\ud569\ub2c8\ub2e4. \uac12\uc774 \ubcc0\uacbd\ub418\uba74 \ud568\uc218\uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4. \uccab\ubc88\uc9f8 \uac12\uc5d0\ub294 \ud3b8\uc758\uc0c1 \uc2a4\ud1a0\uc5b4 \uac12\uc774 \uc81c\uacf5\ub418\uba70, \uc0c8\ub85c\uc6b4 \uac12\uacfc, \ubc14\ub010 \uac12\uc5d0 \ub300\ud55c \ud0a4\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4

    newValue \uc5d0\ub294 :Add, :With, :Tween, :Default \uac00 \ub530\ub85c \uacc4\uc0b0\ub418\uc9c0 \uc54a\uc73c\uba70, \uc124\uc815\ub41c \uac12\uc744 \uc544\ubb34 \uac00\uacf5 \uc5c6\uc774 \uc81c\uacf5\ud569\ub2c8\ub2e4

    \uac04\ub7b5\ud55c \uc6a9\ubc95\uc608\uc81c - \uc5ec\ub7ec \ubcc0\uacbd\uc0ac\ud56d \ucd94\uc801
    myStore.test = 1\n-- \ubc18\ud658 \uac12\uc740 \uc785\ub825\uc73c\ub85c \ub123\uc740 \ud568\uc218\uc785\ub2c8\ub2e4. !\uaf2d \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4\n-- :Register \ub294 \ud568\uc218\uac00 \uc0ac\ub77c\uc9c0\uc9c0 \uc54a\ub3c4\ub85d \uac12\uc744 \uc720\uc9c0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4\n-- \ub9cc\uc57d \ubc84\ub9b4 \uacbd\uc6b0 \uc77c\uc815 \uc2dc\uac04 \ub4a4 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4\nlocal func = myStore \"test\":Register(function(_,newValue)\n    -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n    print(newValue)\nend)\nmyStore.test = 2\n

    myStore.test1, myStore.test2 \uac00 \ubcc0\ud654\ud558\uba74 print \ud568\uc218\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.

    local Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\n\nlocal myStore = Store.GetStore(\"myStore\")\n\nmyStore.test1 = 1\nmyStore.test2 = \"Hello\"\n\nlocal func = myStore \"test1,test2\":Register(function()\n    print(myStore.test1,myStore.test2)\nend)\n\nmyStore.test1 = 2\n
    \uc8fc\uc758

    Register \uc548\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub294 GC \uc548\uc815\uc131\uc744 \uc704\ud574\uc11c \uc57d\ud55c \ucc38\uc870\ub85c \uc800\uc7a5\ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c \ud568\uc218\ub97c \uc800\uc7a5\ud574\uc57c\ud569\ub2c8\ub2e4.

    "},{"location":"tutorial/9_lang/","title":"Lang - \uc5b8\uc5b4\uad00\ub9ac","text":"\uc77d\uae30 \uc804...

    \ubaa8\ub4c8 \uc124\uc815\uc2dc .Init() \ucc98\ub7fc QuadId \ub780\uc744 \ube44\uc6cc\ub450\ub294 \uacbd\uc6b0 Lang \uae30\ub2a5\uc774 \ucf54\ub4dc\ub97c \ub118\uc5b4 \uacf5\uc720\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4 \ud558\uc9c0\ub9cc .Init(\"Project1\") \ucc98\ub7fc \uc544\uc774\ub514\ub97c \ubd80\uc5ec\ud558\ub294 \uacbd\uc6b0 \ub2e4\ub978 \ubaa8\ub4c8, \ub85c\uceec\uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc811\uadfc\ud558\ub354\ub77c\ub3c4 \uac19\uc740 QuadId \ub97c \uac00\uc84c\ub2e4\uba74 Lang \uc740 \uacf5\uc720\ub429\ub2c8\ub2e4

    "},{"location":"tutorial/9_lang/#_1","title":"\uc5b8\uc5b4\uad00\ub9ac","text":"

    Quad \uc5d0\ub294 \uadc0\ucc2e\uc740 \uc5b8\uc5b4\uad00\ub9ac\ub97c \uc790\ub3d9\uc73c\ub85c \ud574\uc8fc\ub294 \uae30\ub2a5\uc774 \ub0b4\uc7a5\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae30\ub2a5\uc740 register \uc640 \uc5f0\ub3d9\ud574 \uc801\uc740 \uc904\uc758 \ucf54\ub4dc\ub85c \ubcc0\ud558\ub294 \ud14d\uc2a4\ud2b8\ub3c4 \uc5b8\uc5b4\uc5d0 \ub9de\uac8c \ucd9c\ub825\ub418\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    \ubc88\uc5ed \ud14c\uc774\ube14\uc740 Lang.New(LangName:string,{ [Locale]: string|(options)->string }) \ub2e4\uc74c\uc744 \uc774\uc6a9\ud574 \ub9cc\ub4e4 \uc218 \uc788\uc73c\uba70. Lang(LangName:string)(options)->register \ub85c UI \uc5d0 \uc801\uc6a9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    Lang.Locales.Default \ub294 \uc77c\uce58\ud558\ub294 \uc5b8\uc5b4\uac00 \uc5c6\uc744\ub54c \ubcf4\uc5ec\uc904 \uc5b8\uc5b4\uc785\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \uc601\uc5b4\ub97c \ucd94\ucc9c\ud569\ub2c8\ub2e4.

    \uc6a9\ubc95\uc608\uc81c - \ub2e4\uc911\uc5b8\uc5b4 \uce74\uc6b4\ud130 \uc790\uc138\ud55c \uc124\uba85\uc740 \uc608\uc81c\ub97c \ucc38\uace0\ud558\uc138\uc694
    Lang.New(\"Test\",{\n    [Lang.Locales.Korean] = \"{won} \uc6d0\";\n    [Lang.Locales.Default] = \"{won} Won\";\n})\nTextLabel {\n    Lang \"Test\" {\n        won = 100;\n    };\n}\n
    1\ucd08\uac00 \uc9c0\ub0a0 \ub54c \ub9c8\ub2e4 \uce74\uc6b4\ud2b8\ub97c \uc99d\uac00\ud569\ub2c8\ub2e4. \uc601\uc5b4 \uc0ac\uc6a9\uc790\uc5d0\uac90 \uc601\uc5b4\ub97c, \ud55c\uad6d\uc5b4 \uc0ac\uc6a9\uc790\uc5d0\uac90 \ud55c\uad6d\uc5b4\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.
    local ScreenGUI = script.Parent\nlocal Quad = require(path.to.module).Init()\nlocal Store = Quad.Store\nlocal Mount = Quad.Mount\nlocal Event = Quad.Event\nlocal Lang = Quad.Lang\nlocal Class = Quad.Class\n\nlocal TextButton = Class \"TextButton\"\n\nlocal myStore = Store.GetStore(\"myStore\")\nmyStore.count = 0\n\nLang.New(\"TimePassed\",{\n    [Lang.Locales.Korean] = \"{count}\ucd08 \uc9c0\ub0ac\uc5b4\uc694\";\n    [Lang.Locales.Default] = function (options)\n        -- \ud568\uc218 \ub610\ud55c \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n        if options.count > 1 then\n            return (\"%d seconds passed\"):format(options.count)\n        else\n            return (\"%d second passed\"):format(options.count)\n        end\n    end;\n})\n\nTextButton \"mainButton\" {\n    Size = UDim2.fromOffset(100,100);\n    Text = Lang \"TimePassed\" {\n        -- count = 1 \uc77c\ubc18\uc801\uc778 \uac12\ub3c4 \uc0ac\uc6a9\uac00\ub2a5\ud569\ub2c8\ub2e4\n        count = myStore \"count\";\n    };\n    [Event \"MouseButton1Click\"] = function()\n        -- \ud074\ub9ad\uc2dc \uc5b8\uc5b4\uac00 \ubcc0\uacbd\ub429\ub2c8\ub2e4\n        if Lang.CurrentLocale == Lang.Locales.Default then\n            Lang.CurrentLocale = Lang.Locales.Korean\n        else\n            Lang.CurrentLocale = Lang.Locales.Default\n        end\n    end\n}\nMount(ScreenGUIk,Store.GetObject(\"mainButton\"))\n\nwhile task.wait(1) do\n    myStore.count = myStore.count + 1\nend\n
    \uc8fc\uc758

    \uad6c\ud604\uc758 \ubcf5\uc7a1\uc131\uc758 \uc774\uc720\ub85c Lang \uc740 \ub808\uc9c0\uc2a4\ud130\uc640 \uac19\uc740 \uc81c\uc57d\uc744 \uac00\uc9d1\ub2c8\ub2e4 (\uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131\uc2dc\uc5d0\ub9cc \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4)

    local myLabel = TextLabel{}\nLang.new(\"Test\",{ [Lang.Locales.Default] = \"{lang}\" })\nmyLabel.Text = Lang \"Test\" { lang = 1 }\n
    \uc704\ucc98\ub7fc \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.

    \ub300\uc2e0\uc5d0 :Register \ubb38\ubc95\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

    local myLabel = TextLabel{}\nLang.new(\"Test\",{ [Lang.Locales.Default] = \"{lang}\" })\nApply (myLabel) {\n    Text = Lang \"Test\" { lang = 1 };\n}\n
    "},{"location":"tutorial/9_lang/#locale","title":"Locale \ubaa9\ub85d","text":"

    \ub85c\ucf00\uc77c \uac12\ub4e4\uc740 Lang.Locales\uc5d0\uc11c \uac00\uc838\uc62c \uc218 \uc788\uc73c\uba70, \uc0ac\uc6a9\uac00\ub2a5\ud55c \ub85c\ucf00\uc77c \ubaa9\ub85d\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.

    Default (default) English (en-us) Spanish (es-es) French (fr-fr) Indonesian (id-id) Italian (it-it) Japanese (ja-jp) Korean (ko-kr) Russian (ru-ru) Thai (th-th) Turkish (tr-tr) Vietnamese (vi-vn) Portuguese (pt-br) German (de-de) ChineseSimplified (zh-cn) ChineseTraditional (zh-tw) Bulgarian (bg-bg) Bengali (bn-bd) Czech (cs-cz) Danish (da-dk) Greek (el-gr) Estonian (et-ee) Finnish (fi-fi) Hindi (hi-in) Croatian (hr-hr) Hungarian (hu-hu) Georgian (ka-ge) Kazakh (kk-kz) Khmer (km-kh) Lithuanian (lt-lt) Latvian (lv-lv) Malay (ms-my) Burmese (my-mm) Bokmal (nb-no) Dutch (nl-nl) Filipino (fil-ph) Polish (pl-pl) Romanian (ro-ro) Ukrainian (uk-ua) Sinhala (si-lk) Slovak (sk-sk) Slovenian (sl-sl) Albanian (sq-al) Bosnian (bs-ba) Serbian (sr-rs) Swedish (sv-se) Arabic (ar-001)

    "}]} \ No newline at end of file diff --git a/docs/kr/sitemap.xml b/docs/kr/sitemap.xml index fb67231..a55f1fc 100644 --- a/docs/kr/sitemap.xml +++ b/docs/kr/sitemap.xml @@ -2,247 +2,247 @@ https://quad.qwreey.kr/kr/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/changelogs/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/gallery/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/license/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/todo/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/bindable/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/connection/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/directions/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/disconnecter/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/easings/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/events/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/extend/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/locales/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/mounts/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/objectList/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/quad/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/quadProperty/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/register/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/tween/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/tweenOptions/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/typeDirections/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/include/typeEasings/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/event/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/extend/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/lang/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/mounts/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/quadProperty/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/signal/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/signal/bindable/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/signal/disconnecter/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/store/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/store/objectList/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/tween/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/tween/directions/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/tween/easings/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/reference/tween/tweenOptions/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/10_signal/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/11_extend/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/1_import/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/2_mount/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/3_getObject/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/4_style/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/5_event/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/6_tween/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/7_quadProperty/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/8_register/ - 2023-02-22 + 2023-02-23 daily https://quad.qwreey.kr/kr/tutorial/9_lang/ - 2023-02-22 + 2023-02-23 daily \ No newline at end of file diff --git a/docs/kr/sitemap.xml.gz b/docs/kr/sitemap.xml.gz index 4e60b8d0a4a7531129d5bc14d9d3b60c7f2325ac..18a8fb7575bbc95553eaeb8f79b7454829ccf274 100644 GIT binary patch literal 521 zcmV+k0`~nMiwFp~Lib|=|8r?{Wo=<_E_iKh0M*#dj+-zP1>pTWMZ`Xskp9e6gxR!R zRhll^wdLSD#I3Q3ZHD3PYaoJXy6UDnL6MRe%lc#l_gsp{*G6w%$a!VWA=#x_vLRDh zsZ4!He*XBny-yy?yP|X2Q`p4G#vhVX2<<1v`o2%S3elNRO@bm+d5n>?Gl1d4S$ZdLa|Ag|C5(L>9(bLKE~RHns!5 z%=Y*z-p}8Z56H^#47%^Tvn{zWAUhq^@k(Pqy+coA;DJvqe7O!oOP_BdSd7vyxJBF1 zGr8Dx5;kti6yQYIP_Y_yToGG{n<`c#dPQ8NUe!kEn=m3b+<#%wyTvPTu#Rqlh#l5f zEo_8)OT>Qf@>WZ?5RqmodPWXiyrC54V}G&jGLBoER^^W4#=2F>RnuA*ppiMBq8+qx z&ua=#Qz3$OzT-X&m{DmlzUQz#+hY8{VXOIK{K(PUjfHy8k>9~B%m@B|+TiKSQz-uc LqIB$l=^p?9R<94K literal 521 zcmV+k0`~nMiwFqd;q_wz|8r?{Wo=<_E_iKh0M*z}Z<{a}2Jm}7MZ`Ur(EVvALND7+ zle)upwjBJHxHUGhO)1}g1|o>M(=O8!6e)?Zte=eFeO`)(w?=PX$$4eXKG~&NvLRDh zsZ703e*gNuy-Oa-o1$~tQ`p4G#_yA32<;cf`o2%S3eL^T2PmWHd6iN>TyBL`rY=Qh6X}p*6Vyk)~Be#uFkfSZNVm%2c|O#16_x zanOWptgJCqh4}P9R!Ze&q{mkJ^LCO$c9QV1JV0+Hy^;yo!nZ(1A`9azp$U2u8{2_j zW_x&!_wx_s1F~{FgYNt3Y)dW-$WBLfywccD@6Zz&c;I6TU#`Q@($}j97NhhVZqau1 zL@sungpHdr1vn8lRIElFSHu?Lri#^wUJ+NRSG5uPDvZbt_g`4_Zt(&ftfOlnVu$rr z3mf6y6S3dByw}n-M5LLDo{>WrZzzTN*k5eBjN=xkRk`E1v2Imz)wI?HXk^Z(Xa{Y) z&KXTZfZ83i0u+@Aqe&*=y#zMX0$nW45<~{#EZSeHvDU^Qz L#0@NR=^p?9T>=TK diff --git a/docs/kr/tutorial/11_extend/index.html b/docs/kr/tutorial/11_extend/index.html index 3e4fd4d..a13a783 100644 --- a/docs/kr/tutorial/11_extend/index.html +++ b/docs/kr/tutorial/11_extend/index.html @@ -1182,7 +1182,9 @@ 40 41 42 -43
    local ScreenGUI = script.Parent
    +43
    +44
    +45
    local ScreenGUI = script.Parent
     local Quad = require(path.to.module).Init()
     local Mount = Quad.Mount
     local Class = Quad.Class
    @@ -1199,6 +1201,8 @@
     -- 일반 오브젝트와 똑같이 id 를 넣고 GetObject 로
     -- 가져올 수도 있습니다
     local main = myClass "main" {
    +    -- 이 테이블은 모듈의 :Init(props) 에 제공됩니다.
    +    -- :Render(props) 에도 이 테이블이 제공됩니다.
         Testing = 1;
         Text = "Test";
         -- 레지스터 값을 넘겨줄 수도 있습니다.
    @@ -1860,7 +1864,7 @@
     local Mount = Quad.Mount
     local Evnet = Quad.Event
     
    -local TextBox = Class "TextButton"
    +local TextButton = Class "TextButton"
     
     local myClass = Class.Extend()
     function myClass:Render(props)
    @@ -1888,6 +1892,128 @@
     Mount(ScreenGUI, myButton)
     

    +
    +

    Event .ChildAdded:Connect((child)->())->Connection

    +
    +

    자식 오브젝트가 추가될 때 발생하는 이벤트입니다. :Init 에서 사용하면 옵션으로 넣은 자식 오브젝트가 이 이벤트를 통해 얻어질 수 있으며, :AfterRender 에서는 추후 Mount 를 통해 추가되는 자식 오브젝트만 이 이벤트로 얻어질 수 있습니다.
    +

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    local Quad = require(path.to.module).Init()
    +local Class = Quad.Class
    +local Mount = Quad.Mount
    +local Evnet = Quad.Event
    +
    +local TextButton = Class "TextButton"
    +
    +local myClass = Class.Extend()
    +function myClass:Render(props)
    +    return TextButton {
    +        self "_holder";
    +    }
    +end
    +function myClass:AfterRender()
    +    self.ChildAdded:Connect(function(child)
    +        print(child.Name)
    +    end)
    +end
    +
    +local myImported = Class(myClass)
    +local myButton = myImported{
    +    -- Init 에 ChildAdded 를 넣은것이 아니기 때문에 출력되지 않습니다.
    +    -- 그러나 AfterRender 에 :GetChildren 을 넣어 이 오브젝트를
    +    -- 얻어올 수 있습니다.
    +    TextButton { Name = "Hello "};
    +}
    +
    +Mount(myButton, TextButton{ Name = "Hello" })
    +Mount(myButton, TextButton{ Name = "World" })
    +

    +
    +
    +

    :GetChildren()

    +
    +

    자식 오브젝트들을 가져오는 함수입니다. :Init() 에서는 빈 테이블을 반환하고, AfterRender 에서는 옵션에 들어간 자식 오브젝트들이 담긴 테이블을 반환합니다. 자식의 순서는 일정하지 않습니다. +

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    local Quad = require(path.to.module).Init()
    +local Class = Quad.Class
    +local Mount = Quad.Mount
    +local Evnet = Quad.Event
    +
    +local TextButton = Class "TextButton"
    +
    +local myClass = Class.Extend()
    +function myClass:Render(props)
    +    return TextButton {
    +        self "_holder";
    +    }
    +end
    +function myClass:AfterRender()
    +    for i,v in ipairs(self:GetChildren()) do
    +        print(v.Name)
    +    end
    +end
    +
    +local myImported = Class(myClass)
    +local myButton = myImported{
    +    TextButton { Name = "Hello World"};
    +}
    +
    +-- 나중에 추가하는 오브젝트는 출력되지 않습니다.
    +Mount(myButton, TextButton{ Name = "Hello" })
    +Mount(myButton, TextButton{ Name = "World" })
    +

    +
    diff --git a/docs/kr/tutorial/8_register/index.html b/docs/kr/tutorial/8_register/index.html index b0af2dc..bea91a6 100644 --- a/docs/kr/tutorial/8_register/index.html +++ b/docs/kr/tutorial/8_register/index.html @@ -1127,12 +1127,20 @@
    주의 -

    구현의 복잡성의 이유로 레지스터는 오브젝트 생성시에만 등록할 수 있습니다. -

    1
    +

    구현의 복잡성의 이유로 레지스터는 오브젝트 생성시에만 등록할 수 있습니다.

    +

    1
     2
    local myFrame = Frame{}
     Frame.BackgroundColor3 = myStore "color"
     
    위처럼 사용할 수 없습니다.

    +
    1
    +2
    +3
    +4
    local myFrame = Frame{}
    +Apply (myFrame) {
    +    BackgroundColor3 = myStore "color";
    +}
    +
      diff --git a/docs/kr/tutorial/9_lang/index.html b/docs/kr/tutorial/9_lang/index.html index 551d469..b5d0b58 100644 --- a/docs/kr/tutorial/9_lang/index.html +++ b/docs/kr/tutorial/9_lang/index.html @@ -1106,7 +1106,8 @@

      언어관리

      Quad 에는 귀찮은 언어관리를 자동으로 해주는 기능이 내장되어 있습니다. 이 기능은 register 와 연동해 적은 줄의 코드로 변하는 텍스트도 언어에 맞게 출력되도록 만들 수 있습니다.

      번역 테이블은 Lang.New(LangName:string,{ [Locale]: string|(options)->string }) 다음을 이용해 만들 수 있으며.
      -Lang(LangName:string)(options) 로 UI 에 적용시킬 수 있습니다.

      +Lang(LangName:string)(options)->register 로 UI 에 적용시킬 수 있습니다.

      +

      Lang.Locales.Default 는 일치하는 언어가 없을때 보여줄 언어입니다. 일반적으로 영어를 추천합니다.

      @@ -1223,57 +1224,79 @@
      +
      +주의 +

      구현의 복잡성의 이유로 Lang 은 레지스터와 같은 제약을 가집니다 (오브젝트 생성시에만 등록할 수 있습니다)

      +

      1
      +2
      +3
      local myLabel = TextLabel{}
      +Lang.new("Test",{ [Lang.Locales.Default] = "{lang}" })
      +myLabel.Text = Lang "Test" { lang = 1 }
      +
      +위처럼 사용할 수 없습니다.

      +

      대신에 :Register 문법을 사용하여 등록할 수 있습니다.

      +
      1
      +2
      +3
      +4
      +5
      local myLabel = TextLabel{}
      +Lang.new("Test",{ [Lang.Locales.Default] = "{lang}" })
      +Apply (myLabel) {
      +    Text = Lang "Test" { lang = 1 };
      +}
      +
      +

      Locale 목록

      로케일 값들은 Lang.Locales에서 가져올 수 있으며, 사용가능한 로케일 목록은 다음과 같습니다.

      Default (default)
      -English (en_us)
      -Spanish (es_es)
      -French (fr_fr)
      -Indonesian (id_id)
      -Italian (it_it)
      -Japanese (ja_jp)
      -Korean (ko_kr)
      -Russian (ru_ru)
      -Thai (th_th)
      -Turkish (tr_tr)
      -Vietnamese (vi_vn)
      -Portuguese (pt_br)
      -German (de_de)
      -ChineseSimplified (zh_cn)
      -ChineseTraditional (zh_tw)
      -Bulgarian (bg_bg)
      -Bengali (bn_bd)
      -Czech (cs_cz)
      -Danish (da_dk)
      -Greek (el_gr)
      -Estonian (et_ee)
      -Finnish (fi_fi)
      -Hindi (hi_in)
      -Croatian (hr_hr)
      -Hungarian (hu_hu)
      -Georgian (ka_ge)
      -Kazakh (kk_kz)
      -Khmer (km_kh)
      -Lithuanian (lt_lt)
      -Latvian (lv_lv)
      -Malay (ms_my)
      -Burmese (my_mm)
      -Bokmal (nb_no)
      -Dutch (nl_nl)
      -Filipino (fil_ph)
      -Polish (pl_pl)
      -Romanian (ro_ro)
      -Ukrainian (uk_ua)
      -Sinhala (si_lk)
      -Slovak (sk_sk)
      -Slovenian (sl_sl)
      -Albanian (sq_al)
      -Bosnian (bs_ba)
      -Serbian (sr_rs)
      -Swedish (sv_se)
      -Arabic (ar_001)

      +English (en-us)
      +Spanish (es-es)
      +French (fr-fr)
      +Indonesian (id-id)
      +Italian (it-it)
      +Japanese (ja-jp)
      +Korean (ko-kr)
      +Russian (ru-ru)
      +Thai (th-th)
      +Turkish (tr-tr)
      +Vietnamese (vi-vn)
      +Portuguese (pt-br)
      +German (de-de)
      +ChineseSimplified (zh-cn)
      +ChineseTraditional (zh-tw)
      +Bulgarian (bg-bg)
      +Bengali (bn-bd)
      +Czech (cs-cz)
      +Danish (da-dk)
      +Greek (el-gr)
      +Estonian (et-ee)
      +Finnish (fi-fi)
      +Hindi (hi-in)
      +Croatian (hr-hr)
      +Hungarian (hu-hu)
      +Georgian (ka-ge)
      +Kazakh (kk-kz)
      +Khmer (km-kh)
      +Lithuanian (lt-lt)
      +Latvian (lv-lv)
      +Malay (ms-my)
      +Burmese (my-mm)
      +Bokmal (nb-no)
      +Dutch (nl-nl)
      +Filipino (fil-ph)
      +Polish (pl-pl)
      +Romanian (ro-ro)
      +Ukrainian (uk-ua)
      +Sinhala (si-lk)
      +Slovak (sk-sk)
      +Slovenian (sl-sl)
      +Albanian (sq-al)
      +Bosnian (bs-ba)
      +Serbian (sr-rs)
      +Swedish (sv-se)
      +Arabic (ar-001)

      diff --git a/md/kr/changelogs.md b/md/kr/changelogs.md index 6bcafcc..7a3fbca 100644 --- a/md/kr/changelogs.md +++ b/md/kr/changelogs.md @@ -1,6 +1,9 @@ # 버전 번경사항 +## 2.25 +실험적 API 로써 GetChildren() 과 ChildAdded::Bindable 이 추가되었습니다. + ## 2.24 모든 문서가 정리되었습니다. diff --git a/md/kr/include/extend.md b/md/kr/include/extend.md index e4fc479..da289c7 100644 --- a/md/kr/include/extend.md +++ b/md/kr/include/extend.md @@ -263,7 +263,7 @@ local Class = Quad.Class local Mount = Quad.Mount local Evnet = Quad.Event -local TextBox = Class "TextButton" +local TextButton = Class "TextButton" local myClass = Class.Extend() function myClass:Render(props) @@ -291,3 +291,80 @@ end) Mount(ScreenGUI, myButton) ```
    + +--- + +==Event== `#!ts .ChildAdded:Connect((child)->())->Connection` +
    + +자식 오브젝트가 추가될 때 발생하는 이벤트입니다. `#!ts :Init` 에서 사용하면 옵션으로 넣은 자식 오브젝트가 이 이벤트를 통해 얻어질 수 있으며, `#!ts :AfterRender` 에서는 추후 `Mount` 를 통해 추가되는 자식 오브젝트만 이 이벤트로 얻어질 수 있습니다. +```lua +local Quad = require(path.to.module).Init() +local Class = Quad.Class +local Mount = Quad.Mount +local Evnet = Quad.Event + +local TextButton = Class "TextButton" + +local myClass = Class.Extend() +function myClass:Render(props) + return TextButton { + self "_holder"; + } +end +function myClass:AfterRender() + self.ChildAdded:Connect(function(child) + print(child.Name) + end) +end + +local myImported = Class(myClass) +local myButton = myImported{ + -- Init 에 ChildAdded 를 넣은것이 아니기 때문에 출력되지 않습니다. + -- 그러나 AfterRender 에 :GetChildren 을 넣어 이 오브젝트를 + -- 얻어올 수 있습니다. + TextButton { Name = "Hello "}; +} + +Mount(myButton, TextButton{ Name = "Hello" }) +Mount(myButton, TextButton{ Name = "World" }) +``` +
    + +--- + +`#!ts :GetChildren()` +
    + +자식 오브젝트들을 가져오는 함수입니다. `:Init()` 에서는 빈 테이블을 반환하고, `AfterRender` 에서는 옵션에 들어간 자식 오브젝트들이 담긴 테이블을 반환합니다. 자식의 순서는 일정하지 않습니다. +```lua +local Quad = require(path.to.module).Init() +local Class = Quad.Class +local Mount = Quad.Mount +local Evnet = Quad.Event + +local TextButton = Class "TextButton" + +local myClass = Class.Extend() +function myClass:Render(props) + return TextButton { + self "_holder"; + } +end +function myClass:AfterRender() + for i,v in ipairs(self:GetChildren()) do + print(v.Name) + end +end + +local myImported = Class(myClass) +local myButton = myImported{ + TextButton { Name = "Hello World"}; +} + +-- 나중에 추가하는 오브젝트는 출력되지 않습니다. +Mount(myButton, TextButton{ Name = "Hello" }) +Mount(myButton, TextButton{ Name = "World" }) +``` +
    + diff --git a/src/class.lua b/src/class.lua index 45d6499..861d3b6 100644 --- a/src/class.lua +++ b/src/class.lua @@ -356,6 +356,7 @@ function module.init(shared) __prop = prop; __parent = parent; __propertyChangedSignals = {}; + ChildAdded = signal.Bindable.New(); } local init = this.Init if init then @@ -407,6 +408,18 @@ function module.init(shared) thisSignal:Fire(value) end + function this:GetChildren() + local children = rawget(self,"__child") + if not children then + return {} + end + local newChildren = {} + for _,v in pairs(children) do + insert(newChildren,v) + end + return newChildren + end + --- re-render object (if some props chaged, call this to render again) function this:Update() -- swap object local object = rawget(self,"__object") -- get last instance @@ -541,8 +554,43 @@ function module.init(shared) return this end - local function ApplyNewProps(Item,Props) - + local function ApplyNewProps(Item,NewProps) + local quadType = PcallGetProperty(Item, "__type") + if quadType == "quad_extend" then + local prop = Item.__prop + local propKeep = prop.__keep + local propTweens = prop.__tweens + local propValues = prop.__self + for index,value in pairs(NewProps) do + -- if new value is register + if PcallGetProperty(value,"__type") == "quad_register" then + -- remove old register + for keepIndex,keepValue in pairs(propKeep) do + if type(keepValue) == "table" and PcallGetProperty(keepValue,"key") == index then + keepValue.register:Unregister(keepValue.func) + propKeep[keepIndex] = nil + end + end + + -- calc value + do + local setValue,tween = value:CalcWithDefault(Item) + propValues[index] = setValue + propTweens[index] = tween + end + + -- make event connection + local function regFn(_,newValue,eventKey) + -- !HOLD IT SELF TO PREVENT THIS REGISTER BEGIN REMOVED FROM MEMORY + local setValue = value:CalcWithNewValue(Item,newValue,eventKey) + prop[index] = setValue + end + value:Register(regFn) + insert(propKeep,{func=regFn,register=value,key=index}) + end + + end + end end local function Apply(Item) return function (Props) diff --git a/src/exports.lua b/src/exports.lua index a2ca97a..f74e65c 100644 --- a/src/exports.lua +++ b/src/exports.lua @@ -21,7 +21,7 @@ local round = require "libs.round" local customWarn = require "libs.customWarn" local IS_TEST = false -local VER = "2.24" .. (IS_TEST and "B" or "") +local VER = "2.25" .. (IS_TEST and "B" or "") if IS_TEST then warn("You are using BETA version of quad now. Many features may change in the future and unstable. AS USING BETA VERSION OF QUAD, YOU SHOULD KNOW IT WILL BUGGY SOMETIME. still on development - you can ignore this message if have no issue. if you have issue on using quad, please report issue on github. VERSION: "..VER) end diff --git a/src/mount.lua b/src/mount.lua index d2c24b7..1b7eb95 100644 --- a/src/mount.lua +++ b/src/mount.lua @@ -5,7 +5,7 @@ local pack = table.pack ---@param shared quad_export ---@return quad_module_mount function module.init(shared) - local warn = shared.warn + local PcallGetProperty = shared.Store.PcallGetProperty ---@class quad_module_mount local new = {__type = "quad_module_mount"} @@ -75,6 +75,12 @@ function module.init(shared) rawset(to,"__child",child) end insert(child,this) + + -- ChildAdded call + local childAdded = rawget(to,"ChildAdded") + if childAdded and PcallGetProperty(childAdded,"__type") == "quad_bindable" then + childAdded:Fire(this) + end end if noReturn then return end return setmetatable({to = to,this = this},mountClass) diff --git a/src/signal.lua b/src/signal.lua index f120be6..bda479c 100644 --- a/src/signal.lua +++ b/src/signal.lua @@ -52,7 +52,7 @@ function module.init(shared) end new.Disconnecter = disconnecterClass - local connection = {} + local connection = {__type = "quad_connection"} connection.__index = connection function connection.New(signal,func) return setmetatable({signal = signal,func = func},connection) @@ -85,7 +85,7 @@ function module.init(shared) new.Connection = connection local signals = {} - local signal = {} + local signal = {__type = "quad_bindable"} signal.__index = signal function signal:Fire(...) local waitting = self.waitting diff --git a/src/store.lua b/src/store.lua index e6a8567..994a33c 100644 --- a/src/store.lua +++ b/src/store.lua @@ -191,6 +191,21 @@ function module.init(shared) local registerClass = { __type = "quad_register"; + Unregister = function(s,efunc) + local self = s.store + local events = self.__evt + for key in gmatch(s.key,"[^,]+") do + key = gsub(gsub(key,"^ +","")," +$","") + local event = events[key] + if event then + for i,v in pairs(event) do + if efunc == v then + event[i] = nil + end + end + end + end + end; Register = function (s,efunc) local self = s.store local events = self.__evt @@ -348,14 +363,14 @@ function module.init(shared) for key,item in pairs(selfValues) do if type(item) == "table" and item.__type == "quad_register" then -- fetch data from origin - do - local tstore = item.store - for tkey in item.key:gmatch("^[,]") do - if not selfValues[tkey] then - selfValues[tkey] = tstore[tkey] - end - end - end + -- do + -- local tstore = item.store + -- for tkey in item.key:gmatch("^[,]") do + -- if not selfValues[tkey] then + -- selfValues[tkey] = tstore[tkey] + -- end + -- end + -- end -- calc value do @@ -391,7 +406,7 @@ function module.init(shared) end if func then - register.Register(func) + register:Register(func) end return register end diff --git a/src/types.lua b/src/types.lua index 5105816..9340557 100644 --- a/src/types.lua +++ b/src/types.lua @@ -100,7 +100,7 @@ export type ObjectIdList = string export type module_store = { GetObjects: (ids:ObjectIdList)->objectList; GetObject: (id:string)->DOM?; - AddObject: (ids:ObjectIdList)->(); + AddObject: (ids:ObjectIdList,item:Dom|any)->(); GetStore: (id:string?)->valueStore; } & (id:string?)->valueStore