diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 2359711..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.rbxmx -*.rbxm diff --git a/CNAME b/CNAME deleted file mode 100644 index 44171e0..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -quad.qwreey.kr diff --git a/DEV_CHANGELOG.txt b/DEV_CHANGELOG.txt deleted file mode 100644 index e231f77..0000000 --- a/DEV_CHANGELOG.txt +++ /dev/null @@ -1,13 +0,0 @@ -types 모듈이 삭제되며 init.lua 에 통합됨 - -:Tween() 필드에 register 값을, 또 Tween 자체에 register 값을 등록할 수 있음 - -이제 extend 에 대해서 Init(self) self 안에 props 기능이 내장되어있음 - -TODO: slot 기능 구현 - -TODO: spring 구현 - -TODO: !ChildRemoved 구현 - -TODO: AdvancedTween 을 submodule 로 변경 diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 0c62b80..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,42 +0,0 @@ - QwreeyKawaii license v1.3 - -Copyright 2023. Qwreey [qwreey75@gmail.com] - -This license is based on DBAD license. -Everyone is permitted to copy and distribute -verbatim or modified copies of this license -document. - -TERMS, AND CONDITIONS FOR COPYING, -DISTRIBUTION, AND MODIFICATION - -1. You can do anything with this original work, -but don't be rude - -In general, being rude includes below - -First. Do not copy these cute works without - any modification. changing the name - only is outright copyright infringement -Second. Do not add some harmful or NSFW content. - It's very rude and may harm others - -Being rude is not limited to these instances. -Above all, don't hurt cute people - -2. If you get any benefit or profit from these cute -works, Share the love. A polite person may share -the love with cute people. -3. These cute works are provided with no warranty. -If something goes wrong due to the creator's cute -mistake, Fix it yourself. A polite person may -submit the fix or bug report. -4. If you create something with these works, Leave -the original creator's name in your work. -the cute creator will be happy if their works are -used for good. -* This is a recommendation. Not required. -5. Russian nationality can not use this creation for -commercial purposes. — We do not support the war. -Same reason, This creation cannot be used where -it can support the war. diff --git a/Makefile b/Makefile deleted file mode 100644 index 0d2cfd4..0000000 --- a/Makefile +++ /dev/null @@ -1,20 +0,0 @@ - -kr: - mkdocs build -f mkdocs_kr.yml -krserve: - mkdocs serve -f mkdocs_kr.yml - -en: - mkdocs build -f mkdocs_en.yml -enserve: - mkdocs serve -f mkdocs_en.yml - -docs: kr en - -build: - rojo build default.project.json -o output.rbxmx - -test: - rojo serve test.project.json - -all: build docs diff --git a/README.md b/README.md deleted file mode 100644 index 22fbbff..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ - -문서화된 사용법 -https://quad.qwreey.kr/kr/ diff --git a/default.project.json b/default.project.json deleted file mode 100644 index 6ba2b6b..0000000 --- a/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Quad", - "tree": { - "$path": "src" - } -} diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index b89e47d..0000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -quad.qwreey.kr \ No newline at end of file diff --git a/docs/en/404.html b/docs/en/404.html deleted file mode 100644 index 2057021..0000000 --- a/docs/en/404.html +++ /dev/null @@ -1,381 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - -English docment is still writing.
-You can see docment in korean too!
English docment is still writing. You can see docment in korean too!
"}]} \ No newline at end of file diff --git a/docs/en/sitemap.xml b/docs/en/sitemap.xml deleted file mode 100644 index b0e58f0..0000000 --- a/docs/en/sitemap.xml +++ /dev/null @@ -1,8 +0,0 @@ - -실험적 API 로써 GetChildren() 과 ChildAdded::Bindable 이 추가되었습니다.
-모든 문서가 정리되었습니다.
-객체 생성시 일어나는 오류를 해결했습니다.
-이제 Extend 객체 내부 자식이 Unmount 되는 경우 __child 에서 제거됩니다.
-types 의 오타를 고쳤습니다.
더이상 Event.Prop 가 처음 생성시 실행되는 일이 일어나지 않습니다.
-Linker 가 이제 클래스 안 클래스에서 사용될 수 있도록 변경되었습니다.
-Docments 가 업데이트되었습니다. 많은양의 새로운 튜토리얼이 제공됩니다.
-Mkdocs 테마와 여러가지 설정이 변경되었습니다.
-이제 Makefile 을 통해서 rojo build 와 mkdocs build 를 사용할 수 있습니다.
Linker 객체가 추가되었습니다. 이제 GetPropertyChangedSignal 와, self 에 특정 오브젝트 혹은 이벤트를 연결할 수 있습니다
-이제 더이상 GC 에 의해 Store 의 Instance 값이 손실되지 않습니다
-Tween 의 CallBack 등록 시 주언지는 파라메터가 변경되었습니다.
-이제 더이상 ~ 문이 사용되지 않습니다.
이제 Lang 에서 CurrentLocale, FailedMessage 을 변경하면 자동으로 변경사항이 업데이트됩니다. 또한 일부 필드의 네이밍이 변경되었습니다
-Lang 모듈이 추가되었습니다. register 를 사용해 사용자 지정 다중언어 지원을 추가할 수 있습니다
-Signal 모듈이 추가되었습니다. 이제 Class.Extend 에서 GetPropertyChangedSignal 과 EmitPropertyChangedSignal 를 사용할 수 있습니다
-Mount 반환 객체에 Add 를 사용할 수 있도록 Mount 객체가 변경되었습니다
-Store.GetObjects 에 이제 & 문법을 사용할 수 있습니다.
-PreloadAsync 를 통해 이제 round.lua 에서 라운드 이미지를 미리 로드합니다.
-반환 관련 코드가 exports 로 이주되었으며. init.lua 에서는 자동적으로 types 를 반환합니다.
-이제 types 를 완전히 지원합니다. 직접 불러와 사용할 수 있습니다
-모든 모듈의 필드의 이름이 변경되었으며, 모든 클래스들이 기본적으로 대문자 시작 네이밍을 사용하도록 명명규칙을 변경했습니다.
-버전 판올림, BREAKING CHANGES 를 위해 버전을 판올림 하였습니다.
- - - - - - -여기는 여러분들의 작품을 올려볼 수 있는 곳입니다!
-Quad 를 사용한 여러가지 훌륭한 작품들을 보여주세요!
:Fire(...any)
--등록된 연결들을 실행하고,
-Wait을 풀어줍니다.
:Wait()->(...any)
---
Fire가 호출될 때 까지 기다립니다.Fire에 사용된 값이 반환됩니다.
:Connect((...any)->())->Connection
---
Fire가 호출 될 때 함수가 실행되도록 만듭니다.Fire에 사용된 값이 호출 인자로 사용됩니다. 연결을 끊을 수 있도록Connection이 제공됩니다.
:Once((...any)->())->Connection
---
Connect와 유사하지만,Fire가 한번 호출된 뒤 연결이 끊어집니다/
:CheckConnected(func)->boolean
--함수가 이미 등록되어 있는지 여부를 반환합니다.
-
:DisconnectAll()
--모든 연결을 끊습니다.
-Wait으로 기다리고 있는 곳에는nil을 반환합니다.
:Destroy()
-- - - - - - --
:DisconnectAll()를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id가 등록되어 있는경우 저장소에서 파기하게 됩니다.
:Disconnect()
--연결을 끊습니다.
-Fire가 호출되더라도Connect혹은Once에 사용된 함수가 실행되지 않습니다.
:Destroy()
-- - - - - - --
:Disconnect()의 별칭입니다.
Out
-초반에 가속이 이루워지며, 후반에 느려집니다.
In
-초반에는 느리며, 점점 가속이 늘어납니다.
InOut
-중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.
:Add(connection:Connection|RBXScriptConnection)
---
connection을 리스트에 추가합니다. 나중에:Disconnect를 호출하면 추가된 연결이 파기됩니다.
:Disconnect()
--추가된 모든 연결에
-Disconnect()를 수행합니다. 이 호출 후에 추가된 연결은 모두 사라지며. 이 요청 후에도 다시:Add를 사용할 수 있습니다
-Disconnecter 를 완전히 사용하지 못하도록 하려면:Destroy를 호출하세요
:Destroy()
-- - - - - - --
:Disconnect()를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id가 등록되어 있는경우 저장소에서 파기하게 됩니다.

모든 Easing 은 여기에서 직접적으로 확인할 수 있습니다.
-Linear
--아무런 가감속이 없는 1차형 함수입니다
-
-i=x, x=0 to 1
Quint
--5 제곱을 이용한 가감속 함수입니다. Quart 보다 가파른 개형을 가졌습니다
-
-(^5) i=1-(1-x)^5, x=0 to 1
Quart
--네제곱을 이용한 가감속 함수입니다. Cubic 보다 가파른 개형을 가졌습니다
-
-(^4) i=1-(1-x)^4, x=0 to 1
Cubic
--세제곱을 이용한 가감속 함수입니다. Quad 보다 가파른 개형을 가졌습니다
-
-(^3) i=1-(1-x)^3, x=0 to 1
Quad
--제곱을 이용한 가감속 함수입니다.
-
-(^2) i=1-(1-x)^2, x=0 to 1
Expo
--지수형 가감속 함수입니다. 매우 가파른 개형을 가졌습니다.
-
-i=1-2^(-10*x), x=0 to 1
Sin
--사인 파형 가감속 함수입니다.
-
-i=sin(x*pi/2), x=0 to 1
Circle
--사분원 가감속 함수입니다.
-
-i=sqrt(1-(1-x)^2), x=0 to 1
Back
--시작시 뒤로 이동이 있는 가감속 함수입니다.
-
Elastic
--탄성을 가지는 가감속 함수입니다.
-
Bounce
--튀어오름을 가지는 가감속 함수입니다.
-
TODO: 애니메이션 미리보기 영상 추가
- - - - - - -Event(name:string)
--모든 로블록스 이벤트들을 나타냅니다,
-MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up등이 될 수 있습니다
-기본적으로 로블록스의 기본 이벤트들과 다르게, 첫번째 인자로self를 받을 수 있습니다.-------
1 -2 -3 -4 -5Frame { - [Event "MouseEnter"] = function (self) - print(self.Name .. "에 마우스가 올라왔습니다") - end; -} ----
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount -local TextButton = Class "TextButton" - -TextButton "mainButton" { - Size = UDim2.fromOffset(200,200); - [Event "MouseEnter"] = function (self) - print("버튼이 클릭되었습니다") - end; -} -Mount(ScreenGUI, Store.GetObject("mainButton")) -
Event.Created
--오브젝트가 생성되었을 때 실행됩니다. 첫번째 인자로
self를 받을 수 있습니다.
--
1 -2 -3 -4 -5 -6-- 용법 -Frame { - [Event.Created] = function (self) - print(self.Name .. "이 생성되었어요") - end; -} ---주의
--
Event.Created가 실행될 때는Parent값이 정해지지 않았을 수 있습니다.self.Parent는 접근해서는 안됩니다.Class.Extend에서는AfterRender를 이용해야 합니다.
Event.CreatedAsync
--
Event.Created와 비슷하지만, 코루틴 안에서 작동합니다.objectList:EachAsync()처럼 반환을 기다리지 않습니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16-- 용법 -Frame { - Frame { - Name = "A"; - [Event.CreatedAsync] = function (self) - -- 이 함수가 끝나지 않더라도 다음 오브젝트가 생성될 수 있어야합니다 - task.wait(5) - end; - }; - Frame { - Name = "B"; - [Event.Created] = function (self) - print(self.Name .. "가 생성되었습니다") - end; - }; -} ---주의
--
Event.CreatedAsync가 실행될 때는Parent값이 정해지지 않았을 수 있습니다.self.Parent는 접근해서는 안됩니다.
Event.Prop(propertyName:string)
-- - - - - - -프로퍼티 값이 변경됨을 연결합니다.
--
1 -2 -3 -4 -5 -6 -7 -8-- 용법 -TextBox { - Text = "아무거나 입력하세요"; - [Event.Prop "Text"] = function (self,text) - -- 편의상의 이유로 변경된 값이 제공됩니다 - print(text) - end; -} -
self(name:string)->linker
--Extend 메소드 전역에서 사용가능합니다. 링커를 만들며,
-PropertyChangedSignal를 이어주거나, self 에 원하는 오브젝트를 넣는 용도로 사용됩니다. 자세한 정보는 Render 를 확인해주세요.
Overwite REQUIRED :Render(props:valueStore)
--화면에 그려지는 UI 를 만들어지게 하는 함수입니다.
-Extend가 그려지려면 무조건 있어야합니다.
-이 오브젝트를 만드는데 들어간 프로퍼티 목록을 첫번째 인자로 줍니다. 레지스터 문법이 사용될 수 있습니다.-
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 -30 -31local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Event = Quad.Event -local Mount = Quad.Mount - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - [Event "MouseButton1Click"] = function (self,x,y) - print(("버튼이 %d,%d 에서 눌렸습니다"):format(x,y)) - end; - Size = props "Size"; - Text = props "Text"; -- 레지스터를 이용합니다 - } -end - -local myImported = Class(myClass) -myImported.Size = UDim2.fromOffset(200,200) - -local test = myImported { - Text = "wow" -} -Mount(ScreenGUI, test) - --- 텍스트를 업데이트합니다 -while task.wait(1) do - test.Text = "w"..("o"):rep(#test.Text-1).."w" -end -
Overwite Option :Init(props:valueStore)
--선택적인 메소드로, Render 가 수행 되기 전에 미리 props 값을 설정할 수 있습니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Init(props) - -- Size 값이 없다면 기본값을 사용하도록 합니다. - props:Default("Size", UDim2.fromOffset(100,100)) - - -- 앞에 _ 를 붇여 내부 변수를 만듭니다. - -- 어디에서나 쓰일 수 있으며 register 에 영향주지 않습니다. - self._asdf = true -end -function myClass:Render(props) - return TextButton { - props "Size" - } -end - -local myImported = Class(myClass) -local myButton = myImported() -- 옵션 없음 -print(myButton.Size) -
Overwite Option :AfterRender(object:any)
--선택적인 메소드로, Render 가 수행 된 후 할 작업을 만들 수 있습니다. 첫번째 인자로 Render 가 반환한 값이 주어집니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; -- 자기 자신에 이 버튼을 넣습니다 - } -end -function myClass:AfterRender(object) - print(self._button == object) -- true -end - -local myImported = Class(myClass) -myImported() -- 옵션 없음 -
Overwite Option :Update()
--
:Render와:AfterRender를 다시 실행하고, 이전에 있던 자식들을 다시 끌어옵니다.
-이전의 Render 결과는 제거됩니다 --
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:Update() -- update -myButton:Update() -- update -myButton:Update() -- update -
Overwite Option .Getter.<PropertyName>(self)
--값을 얻는데 사용됩니다. -
-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton {} -end --- 값을 읽는데 사용할 함수를 등록합니다 -function myClass.Getter.Test(self) - return "Hello World" -end - -local myImported = Class(myClass) -print(myImported().Test) -
Overwite Option .Setter.<PropertyName>(self,newValue:any)
--값을 설정하는데 사용됩니다. -
-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; - Text = "wow"; - } -end --- 값을 지정하는데 사용할 함수를 등록합니다 -function myClass.Setter.Test(self,newValue) - self._button.Text = newValue -end -function myClass.Getter.Test(self) - return self._button.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -print(myButton.Test) -myButton.Test = "Hello World" -print(myButton.Test) -
Overwite Option .UpdateTriggers.<PropertyName> = boolean?
--해당 값을 변경하면 Update 가 수행될지 여부를 지정합니다. -
-
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 -26local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end --- 값 변경시 업데이트 여부를 지정합니다 -myClass.UpdateTriggers.Test = true - -local myImported = Class(myClass) -local myButton = myImported() -myButton.Test = 1 -- update -myButton.Test = 1 -- update -myButton.Test = 1 -- update -
Overwite Option :Unload(object)
--:Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다. object 는 :Render 가 반환한 값입니다
-
:GetPropertyChangedSignal(propertyName:string)->Bindable
--값 변경을 연결할 수 있는
-Bindable을 반환합니다.:EmitPropertyChangedSignal으로 이 시그널을 작동시킬 수 있습니다. 편의상 이 시그널이 작동할 때, 새로운 값이 첫번째 인자로 주어집니다.
:EmitPropertyChangedSignal(propertyName:string,changedValue:any?)
--프로퍼티 변경시
:GetPropertyChangedSignal에 등록된 함수가 실행되도록 이 함수를 호출해 주어야 합니다. 일반적으로self.a = 1과 같은 방식으로 바로 값을 설정하는 경우 자동적으로 이 함수가 실행되지만, 텍스트 박스의 텍스트 처럼 객체의 변경사항을 연동해야 하는 경우 이 함수를 사용할 수 있습니다.changedValue는 선택사항이며, 주어지지 않으면self[propertyName]을 반환합니다. --
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 -30 -31 -32local ScreenGUI = script.Parent -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 "_box"; - Text = "test"; - Size = UDim2.fromOffset(200,200); - [Evnet.Prop "Text"] = function (this,newValue) - self:EmitPropertyChangedSignal("Text",newValue) - end; - -- [Evnet.Prop "Text"] = self "Text" 와 동일합니다. - -- self(name:string) 문법으로 변경 이벤트 역시 링크 - -- 할 수 있습니다. - } -end -function myClass.Getter.Text(self) - return self._box.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:GetPropertyChangedSignal("Text"):Connect(function() - print(myButton.Text) -end) -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 -29local 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 -27local 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" }) -
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)
:Unmount()
--이렇게 하면 마운트된 Instance 를 지워버립니다. Quad 는 안전한 메모리 관리를 위해 gc 의 기능에 의존하므로, gc 시간차로 인해
-Store.GetObject에서 오브젝트가 사라지는데 시간이 걸릴 수 있습니다.-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15-- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui,mainFrame) - -local childFrame = Frame {} -local childFrameMount = Mount(mainFrame,childFrame) -childFrameMount:Unmount() --- childFrame 은 단순히 .Parent = nil 되는 것을 넘어 메모리에서 사라집니다 --- 즉, Destroy() 가 호출됩니다 -
:Add(item:any)
-- - - - - - -Mount 에 오브젝트를 추가합니다. 처음 설정한
-to값을 따라 부모가 결정됩니다.이 동작은 리스트를 만들 때 유용할 수 있습니다. 다시로드 동작시 직접 제거가 필요하지 않습니다
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui, mainFrame) - -local lastListMount = Mount(mainFrame) -local function refreshList() - lastListMount:Unmount() -- 이전 children 을 알아서 제거합니다 - for i = 1,10 do - lastListMount:Add(Frame { Name = tostring(i) }) - end -end - -task.spawn(function() - while true do - refreshList() - task.wait(2) - end -end) -다음과 같이 이전 children 을 간접적으로 제거하고 새로운 오브젝트를 추가합니다. 단
-ScrollFrame의 경우CanvasPosition이 초기화 되어버리므로 자식들을:Unmount()하기 전에 위치를 저장하고 다시 불러와야 합니다
:Each((item:any, index:number)->())
--일반적인 반복입니다. for 를 사용하는것과 효과가 같으나 함수를 이용합니다
-
:EachAsync((item:any, index:number)->())
--반환을 기다리지 않고 바로바로 다음 아이템으로 넘어갑니다.
-
-코루틴이 이용됩니다.wrap()코루틴을 모르거나, 필요성이 없는경우 일반적으로:Each를 사용해도 됩니다
:IsEmpty()
--이 ObjectList 가 비어있는지 여부를 반환합니다.
-
:Remove(indexOrItem:number|any)
-- - - - - - -objectList 에서 해당하는 오브젝트를 제거합니다.
-
-, & 를 사용한 고급 검색에서는 작동하지 않습니다
RoundSize:number?
---
ImageLabel,ImageButton에만 사용할 수 있는 속성입니다. 원형 이미지에 Slice를 이용해 둥근 프레임을 구현합니다. 일반적으로UICorner보다 부드러운 코너효과를 제공합니다.
Corner:number?
--모든 로블록스 UI오브젝트에 적용됩니다.
-UICorner를 이용해 모서리 부분을 둥글게 만듭니다. 자식 오브젝트에는 적용되지 않습니다.
PaddingAll:UDim?
---
UIPadding을 적용합니다. 상하좌우 모두 같은 값으로 적용됩니다.PaddingAllOffset과 함깨 사용할 수 없습니다.
PaddingAllOffset:number?
---
UIPadding을 적용합니다.PaddingAll과 같은 방법으로 작동하나,Offset값만 설정할 수 있습니다.PaddingAll과 함깨 사용할 수 없습니다.
Scale:number?
-- - - - - - --
UIScale을 적용합니다.UIScale.Scale과 같은 효과를 나타냅니다
register 특수 메소드가 적용되는 순서는 다음과 같습니다.
:Add(value:any)->register
--값에 더하기를 취합니다. 음수형태가 제공되는 경우 빼기 처럼 작동합니다.
-number,Udim,UDim2,Color3,Vector2등 더할 수 있는 모든것을 사용할 수 있습니다
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21-- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -myStore.pos = UDim2.fromOffset(100,0) - -Frame "mainFrame" { - Position = myStore "pos":Add(UDim2.fromOffset(0,100)); -} -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -while true do - myStore.pos = myStore.pos + UDim2.fromOffset(10,0) - task.wait(2) -end ---주의
-구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다
-
:With((store:valueStore, newValue:any, key:string)->())->register
--함수 또는 테이블에서 값을 가져옵니다. Add 보다 나중에 수행됩니다.
-
-첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다-------
1 -2 -3myStore "size":With(function (_,value) - return value * 2 -end) ----
width값에 맞춰 자동으로 UI 가 업데이트되도록 만듭니다.-
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 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -myStore.topbarSize = 60 -myStore.width = 200 - --- 레지스터를 변수로 두고 사용합니다 -local listItemSize = myStore "width":With(function() - return UDim2.fromOffset(myStore.width,60) -end) - -Frame "mainFrame" { - Class "UIListLayout" { SortOrder = Enum.SortOrder.LayoutOrder }; - - -- 사이즈가 width 에 맞게 업데이트됩니다 - Size = myStore "width":With(function () - return UDim.fromOffset(store.width,400) - end); - - Frame "Topbar" { - LayoutOrder = 1; - BackgroundColor3 = Color3.fromRGB(255,0,0); - -- 이렇게 여러 값을 묶어서 두 값이 변경됨, 혹은 그이상을 - -- 만들 수 있습니다. - Size = myStore "topbarSize,width":With(function() - return UDim2.fromOffset(myStore.width,myStore.topbarSize) - end); - } - Frame "ListItem" { - LayoutOrder = 2; - BackgroundColor3 = Color3.fromRGB(0,255,0); - Size = listItemSize; - }; - Frame "ListItem" { - LayoutOrder = 3; - BackgroundColor3 = Color3.fromRGB(0,0,255); - Size = listItemSize; - }; -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) - --- width 값을 변경해보세요 -while true do - myStore.width = myStore.width + 10 - task.wait(1) -end ----
colors테이블 안에 있는 색깔들을 돌아가며 보여줍니다.-
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 -30 -31local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -local colors = { - Color3.fromRGB(255,255,255); - Color3.fromRGB(255,255,0); - Color3.fromRGB(0,255,255); - Color3.fromRGB(255,0,255); - Color3.fromRGB(255,0,0); - Color3.fromRGB(0,255,0); - Color3.fromRGB(0,0,255); -} -myStore.color = 1 - -Frame "mainFrame" { - Size = UDim2.fromOffset(200,200); - -- colors 에서 인덱싱해 값을 가져옵니다 - BackgroundColor3 = myStore "color":With(colors); -} -Mount(ScreenGUI, Store.GetObject("mainFrame")) - --- 인덱스를 순회합니다 -while task.wait(1) do - myStore.color = (i-1)%(#colors)+2 -end ---주의
-구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다
-
:Tween(options:TweenOptions)->register
--트윈을 이용해 변경사항을 적용합니다(처음 오브젝트 생성시에는 적용되지 않음) 옵션은 Tween 문서에 나와있는 옵션과 같습니다.
--------
1 -2-- Tween 옵션을 넣을 수 있습니다 -myStore "size":Tween{ Time = 2 } ---프레임을 한꺼번에 움직입니다.
--
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 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount -local Style = Quad.Style - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") -myStore.pos = UDim2.fromOffset(50,0) -Style "TweenFrame" { - Size = UDim2.fromOffset(50,50); - BackgroundColor3 = Color3.fromRGB(255,100,255); -} - -Frame "mainFrame" { - BackgroundColor3 = Color3.fromRGB(255,255,255); - Size = UDim2.fromOffset(500,500); - Frame "TweenFrame" { - Position = myStore "pos":Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,100)) - :Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,200)) - :Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,300)) - :Tween{Time = 2}; - } -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -local on = false -while true do - on = not on - myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0) - task.wait(1.5) -- 트윈은 덮어 쓸 수 있습니다 - -- 따라서 2 초인 길이보다 더 빨리 바꿔도 오류가 일어나지 않습니다 -end ---주의
-구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다
-
:Default(value:any)->register
--기본값을 정합니다. 만약 값이
nil인 경우 이 값을 사용하게 됩니다. Add 나 With 등 다른것에 영향받지 않습니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21-- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -Frame "mainFrame" { - Size = UDim2.fromOffset(200,200); - -- color 값이 없으므로 Default 안의 값이 사용됩니다. - BackgroundColor3 = myStore "color" - :Default(Color3.fromRGB(255,0,0)); -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -task.wait(5) -myStore.color = Color3.fromRGB(0,255,0) ---주의
--
-- 처음 오브젝트가 생성될 때에만 이 값이 사용됩니다.
-- 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다.
-
:Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT
--레지스터에 함수를 등록합니다. 값이 변경되면 함수가 실행됩니다. 첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다
--
newValue에는:Add,:With,:Tween,:Default가 따로 계산되지 않으며, 설정된 값을 아무 가공 없이 제공합니다-------
1 -2 -3 -4 -5 -6 -7 -8 -9myStore.test = 1 --- 반환 값은 입력으로 넣은 함수입니다. !꼭 저장해야합니다 --- :Register 는 함수가 사라지지 않도록 값을 유지하지 않습니다 --- 만약 버릴 경우 일정 시간 뒤 연결이 끊어질 수 있습니다 -local func = myStore "test":Register(function(_,newValue) - -- 값 변경시 출력됩니다 - print(newValue) -end) -myStore.test = 2 ----
myStore.test1,myStore.test2가 변화하면 print 함수를 실행합니다.-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13local Quad = require(path.to.module).Init() -local Store = Quad.Store - -local myStore = Store.GetStore("myStore") - -myStore.test1 = 1 -myStore.test2 = "Hello" - -local func = myStore "test1,test2":Register(function() - print(myStore.test1,myStore.test2) -end) - -myStore.test1 = 2 ---주의
-Register 안에 들어간 함수는 GC 안정성을 위해서 약한 참조로 저장됩니다. 따라서 함수를 저장해야합니다.
-
:Observe((newValue:any)->())
-- - - - - - --
:Register의 간소화 버전입니다.:Register와 다르게 자동적으로 들어간 함수를 GC 로 부터 보호하기 때문에 들어간 함수를 따로 저장 할 필요가 없으며, 인자는newValue하나만 주어집니다.-
newValue는:Add,:With,:Tween,:Default가 계산된 상태로 제공됩니다.-------
1 -2 -3 -4 -5 -6myStore.test = 1 -myStore "test":Add(1):Observe(function(_,newValue) - -- 값 변경시 출력됩니다 - print(newValue) -end) -myStore.test = 2 -
Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler
--트윈을 실행합니다. 트윈 옵션에 대한 정보는 TweenOptions 문서에서 찾을 수 있습니다. -
Ended,OnStepped,Setter,Getter값이 설정되면Option안의 값보다 우선적으로 사용됩니다. 기능은 TweenOptions의 내용과 같습니다. -나중에 트윈을 중단시킬 수 있도록TweenHandler가 제공됩니다. -다른 트윈이 변경중인 속성이 다시 트윈하도록 호출되면, 이전 트윈에서 해당 속성은 트윈이 중단되며 새로운 트윈으로 덮어쓰기 됩니다. --
1 -2 -3 -4 -5Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -
Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)
--
Tween.RunTween와 같으나 여러 오브젝트를 한꺼번에 트윈합니다. 아무것도 반환하지 않습니다
--
1 -2 -3 -4 -5Tween.RunTween({myFrame1, myFrame2, myFrame3},{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -
Tween.StopTween(ItemOrHandler:TweenHandler|any)
--트윈을 멈춥니다.
-TweenHandler또는 오브젝트를 넣어 멈출 수 있습니다. 오브젝트를 넣으면 그 오브젝트에 실행중인 모든 트윈을 멈춥니다.-------
1 -2 -3 -4 -5 -6 -7local Handler = Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) - -Tween.StopTween(Handler) ----
1 -2 -3 -4 -5 -6 -7local Handler = Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) - -Tween.StopTween(myFrame) -
Tween.StopPropertyTween(Item:any, PropertyName:string)
--오브젝트에 특정 프로퍼티의 트윈을 중단시킵니다.
-TweenHandler는 사용할 수 없습니다.
Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean
--해당 오브젝트 또는
-TweenHandler로 트윈이 진행중인지 여부를 판단합니다.
Tween.IsPropertyTweening(Item:any, PropertyName:string)
--해당 오브젝트의 프로퍼티가 트윈중이지 여부를 판단합니다.
-TweenHandler는 사용할 수 없습니다.
Tween.Easings: { [string]: EasingFunction }
--이징 함수들이 담겨있습니다.
--그래프와 미리보기는 Easings 에서 확인할 수 있습니다 -
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15type Easing = - "Linear" // 아무런 가감속이 없는 1차형 - |"Quint" // 5 제곱 - |"Quart" // 네제곱 - |"Cubic" // 세제곱 - |"Quad" // 제곱 - |"Sin" // 사인 파형 - |"Circle" // 사분원 - |"Expo" // 지수형 - |"Elastic" // 탄성 - |"Bounce" // 튀어오름 - |"Back" // 뒤로 가감속 - |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2 - |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4 - |EasingFunction?; -
Tween.Easings: { [string]: EasingFunction }
-- - - - - - -이징 함수들이 담겨있습니다.
--자세한 정보는 Easings 에서 확인할 수 있습니다 -
1 -2 -3 -4 -5 -6 -7type Direction = - // 초반에 가속이 이루워지며, 후반에 느려집니다. - "Out" - // 초반에는 느리며, 점점 가속이 늘어납니다. - |"In" - //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다. - |"InOut" -
Option Time:number?
--트윈의 총 길이를 정합니다. 아무 값도 지정하지 않으면
-1이 사용됩니다.
Option Easing:string|(index:number)->number?
--트윈의 가감속 정도를 결정합니다. 문자열 그대로 사용하거나,
Tween.Easings.Linear와 같이 열거형 방식으로 사용할 수 있습니다.
-혹은 필요에 따라 함수를 지정할 수도 있습니다. 함수를 Easing 으로 사용하는 경우 첫번째 인자로 1차 진행도 (Linear, 0 에서 1 사이의 값) 값이 주어지며, 계산 결과로 실제 적용될 위치를 반환해야합니다. 반환값은 음수이거나 1 보다 클 수 있습니다.
-아무 값도 지정하지 않으면Exp2가 사용됩니다.
--함수에 관한 자세한 설명과 미리보기는 여기에서 확인하세요 -
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15type Easing = - "Linear" // 아무런 가감속이 없는 1차형 - |"Quint" // 5 제곱 - |"Quart" // 네제곱 - |"Cubic" // 세제곱 - |"Quad" // 제곱 - |"Sin" // 사인 파형 - |"Circle" // 사분원 - |"Expo" // 지수형 - |"Elastic" // 탄성 - |"Bounce" // 튀어오름 - |"Back" // 뒤로 가감속 - |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2 - |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4 - |EasingFunction?; -
Option Direction:string?
--트윈이 진행되는 방향입니다. 문자열 그대로 사용하거나,
Tween.Directions.Out과 같이 열거형 방식으로 사용할 수 있습니다.
-아무 값도 지정하지 않으면Out이 사용됩니다. --방향에 관한 자세한 설명과 미리보기는 여기에서 확인하세요 -
1 -2 -3 -4 -5 -6 -7type Direction = - // 초반에 가속이 이루워지며, 후반에 느려집니다. - "Out" - // 초반에는 느리며, 점점 가속이 늘어납니다. - |"In" - //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다. - |"InOut" -
Option CallBack:{[number|"*"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?
--선택적인 필드이며, 트윈이 실행중인 도중에 함수를 실행시킬 수 있습니다. 트윈의 진행 정도에 따라서 한번 함수가 실행되거나 트윈 진행중 계속해서 실행되도록 만들 수 있습니다.
-
-인덱스가 숫자인 경우 해당 지점을 넘을 때 함수가 실행되도록 만들 수 있으며,"*"를 인덱스로 사용하면 모든 부분에서 함수가 실행됩니다.
-함수에는 편의상 트윈을 하고있는 오브젝트, 위치값, 시간만을 고려한 1차 위치값이 제공됩니다.
Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?
--CallBack 에
-"*"를 넣은것과 동일한 효과를 가지는 별칭입니다
Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?
--CallBack 에
-1을 넣은것과 동일한 효과를 가지는 별칭입니다
Option Getter:(Item:any, Property:string)->any?
--선택적인 필드이며, 트윈이 값을 얻으려 할 때 사용할 함수입니다.
-
-함수에 트윈하고 있는 오브젝트, 프로퍼티 이름이 제공됩니다.--Warning
--
register:Tween()와 호환되지 않습니다.
Option Getter:(Item:any, Property:string, Value:Lerpable)->any?
-- - - - - - -선택적인 필드이며, 트윈이 값을 설정하려 할 때 사용할 함수입니다. -함수에 트윈하고 있는 오브젝트, 프로퍼티 이름, 설정할 값이 제공됩니다.
---Warning
--
register:Tween()와 호환되지 않습니다.
1 -2 -3 -4 -5 -6 -7 | |
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 | |
QwreeyKawaii License v1.3
-| Permissions | -Limitations | -Conditions | -
|---|---|---|
| ✅ 상업적 사용 | -❎ 보증 | -❓ 라이선스와 저작권 고지 (권고사항) | -
| ✅ 배포 | -❎ 무례하게 굴기 | -- |
| ✅ 변경/수정/2차저작 | -❎ 러시아를 비롯한 전쟁을 돕는 | -- |
| ✅ 개인적 사용 | -❎ 아무런 변경사항 없이 복제 | -- |
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 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 | |
| Permissions | -Limitations | -Conditions | -
|---|---|---|
| ✅ Commercial use | -❎ Warranty | -❓ License and copyright notice (Recommendation) | -
| ✅ Distribution | -❎ Being Rude | -- |
| ✅ Modification | -❎ Russian, And supporting war | -- |
| ✅ Private use | -❎ Copy without any modification | -- |
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 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 | |
self(name:string)->linker
--Extend 메소드 전역에서 사용가능합니다. 링커를 만들며,
-PropertyChangedSignal를 이어주거나, self 에 원하는 오브젝트를 넣는 용도로 사용됩니다. 자세한 정보는 Render 를 확인해주세요.
Overwite REQUIRED :Render(props:valueStore)
--화면에 그려지는 UI 를 만들어지게 하는 함수입니다.
-Extend가 그려지려면 무조건 있어야합니다.
-이 오브젝트를 만드는데 들어간 프로퍼티 목록을 첫번째 인자로 줍니다. 레지스터 문법이 사용될 수 있습니다.-
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 -30 -31local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Event = Quad.Event -local Mount = Quad.Mount - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - [Event "MouseButton1Click"] = function (self,x,y) - print(("버튼이 %d,%d 에서 눌렸습니다"):format(x,y)) - end; - Size = props "Size"; - Text = props "Text"; -- 레지스터를 이용합니다 - } -end - -local myImported = Class(myClass) -myImported.Size = UDim2.fromOffset(200,200) - -local test = myImported { - Text = "wow" -} -Mount(ScreenGUI, test) - --- 텍스트를 업데이트합니다 -while task.wait(1) do - test.Text = "w"..("o"):rep(#test.Text-1).."w" -end -
Overwite Option :Init(props:valueStore)
--선택적인 메소드로, Render 가 수행 되기 전에 미리 props 값을 설정할 수 있습니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Init(props) - -- Size 값이 없다면 기본값을 사용하도록 합니다. - props:Default("Size", UDim2.fromOffset(100,100)) - - -- 앞에 _ 를 붇여 내부 변수를 만듭니다. - -- 어디에서나 쓰일 수 있으며 register 에 영향주지 않습니다. - self._asdf = true -end -function myClass:Render(props) - return TextButton { - props "Size" - } -end - -local myImported = Class(myClass) -local myButton = myImported() -- 옵션 없음 -print(myButton.Size) -
Overwite Option :AfterRender(object:any)
--선택적인 메소드로, Render 가 수행 된 후 할 작업을 만들 수 있습니다. 첫번째 인자로 Render 가 반환한 값이 주어집니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; -- 자기 자신에 이 버튼을 넣습니다 - } -end -function myClass:AfterRender(object) - print(self._button == object) -- true -end - -local myImported = Class(myClass) -myImported() -- 옵션 없음 -
Overwite Option :Update()
--
:Render와:AfterRender를 다시 실행하고, 이전에 있던 자식들을 다시 끌어옵니다.
-이전의 Render 결과는 제거됩니다 --
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:Update() -- update -myButton:Update() -- update -myButton:Update() -- update -
Overwite Option .Getter.<PropertyName>(self)
--값을 얻는데 사용됩니다. -
-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton {} -end --- 값을 읽는데 사용할 함수를 등록합니다 -function myClass.Getter.Test(self) - return "Hello World" -end - -local myImported = Class(myClass) -print(myImported().Test) -
Overwite Option .Setter.<PropertyName>(self,newValue:any)
--값을 설정하는데 사용됩니다. -
-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; - Text = "wow"; - } -end --- 값을 지정하는데 사용할 함수를 등록합니다 -function myClass.Setter.Test(self,newValue) - self._button.Text = newValue -end -function myClass.Getter.Test(self) - return self._button.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -print(myButton.Test) -myButton.Test = "Hello World" -print(myButton.Test) -
Overwite Option .UpdateTriggers.<PropertyName> = boolean?
--해당 값을 변경하면 Update 가 수행될지 여부를 지정합니다. -
-
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 -26local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end --- 값 변경시 업데이트 여부를 지정합니다 -myClass.UpdateTriggers.Test = true - -local myImported = Class(myClass) -local myButton = myImported() -myButton.Test = 1 -- update -myButton.Test = 1 -- update -myButton.Test = 1 -- update -
Overwite Option :Unload(object)
--:Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다. object 는 :Render 가 반환한 값입니다
-
:GetPropertyChangedSignal(propertyName:string)->Bindable
--값 변경을 연결할 수 있는
-Bindable을 반환합니다.:EmitPropertyChangedSignal으로 이 시그널을 작동시킬 수 있습니다. 편의상 이 시그널이 작동할 때, 새로운 값이 첫번째 인자로 주어집니다.
:EmitPropertyChangedSignal(propertyName:string,changedValue:any?)
--프로퍼티 변경시
:GetPropertyChangedSignal에 등록된 함수가 실행되도록 이 함수를 호출해 주어야 합니다. 일반적으로self.a = 1과 같은 방식으로 바로 값을 설정하는 경우 자동적으로 이 함수가 실행되지만, 텍스트 박스의 텍스트 처럼 객체의 변경사항을 연동해야 하는 경우 이 함수를 사용할 수 있습니다.changedValue는 선택사항이며, 주어지지 않으면self[propertyName]을 반환합니다. --
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 -30 -31 -32local ScreenGUI = script.Parent -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 "_box"; - Text = "test"; - Size = UDim2.fromOffset(200,200); - [Evnet.Prop "Text"] = function (this,newValue) - self:EmitPropertyChangedSignal("Text",newValue) - end; - -- [Evnet.Prop "Text"] = self "Text" 와 동일합니다. - -- self(name:string) 문법으로 변경 이벤트 역시 링크 - -- 할 수 있습니다. - } -end -function myClass.Getter.Text(self) - return self._box.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:GetPropertyChangedSignal("Text"):Connect(function() - print(myButton.Text) -end) -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 -29local 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 -27local 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" }) -
Lang.FailedMessage:string
--아무런 번역 값도 얻어오지 못하였을때 보여줄 문자열입니다.
-
-변경시 자동으로 업데이트가 이루워집니다.
Lang.CurrentLocale:Locale<item of 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)
:Unmount()
--이렇게 하면 마운트된 Instance 를 지워버립니다. Quad 는 안전한 메모리 관리를 위해 gc 의 기능에 의존하므로, gc 시간차로 인해
-Store.GetObject에서 오브젝트가 사라지는데 시간이 걸릴 수 있습니다.-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15-- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui,mainFrame) - -local childFrame = Frame {} -local childFrameMount = Mount(mainFrame,childFrame) -childFrameMount:Unmount() --- childFrame 은 단순히 .Parent = nil 되는 것을 넘어 메모리에서 사라집니다 --- 즉, Destroy() 가 호출됩니다 -
:Add(item:any)
-- - - - - - -Mount 에 오브젝트를 추가합니다. 처음 설정한
-to값을 따라 부모가 결정됩니다.이 동작은 리스트를 만들 때 유용할 수 있습니다. 다시로드 동작시 직접 제거가 필요하지 않습니다
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui, mainFrame) - -local lastListMount = Mount(mainFrame) -local function refreshList() - lastListMount:Unmount() -- 이전 children 을 알아서 제거합니다 - for i = 1,10 do - lastListMount:Add(Frame { Name = tostring(i) }) - end -end - -task.spawn(function() - while true do - refreshList() - task.wait(2) - end -end) -다음과 같이 이전 children 을 간접적으로 제거하고 새로운 오브젝트를 추가합니다. 단
-ScrollFrame의 경우CanvasPosition이 초기화 되어버리므로 자식들을:Unmount()하기 전에 위치를 저장하고 다시 불러와야 합니다
RoundSize:number?
---
ImageLabel,ImageButton에만 사용할 수 있는 속성입니다. 원형 이미지에 Slice를 이용해 둥근 프레임을 구현합니다. 일반적으로UICorner보다 부드러운 코너효과를 제공합니다.
Corner:number?
--모든 로블록스 UI오브젝트에 적용됩니다.
-UICorner를 이용해 모서리 부분을 둥글게 만듭니다. 자식 오브젝트에는 적용되지 않습니다.
PaddingAll:UDim?
---
UIPadding을 적용합니다. 상하좌우 모두 같은 값으로 적용됩니다.PaddingAllOffset과 함깨 사용할 수 없습니다.
PaddingAllOffset:number?
---
UIPadding을 적용합니다.PaddingAll과 같은 방법으로 작동하나,Offset값만 설정할 수 있습니다.PaddingAll과 함깨 사용할 수 없습니다.
Scale:number?
-- - - - - - --
UIScale을 적용합니다.UIScale.Scale과 같은 효과를 나타냅니다
:Fire(...any)
--등록된 연결들을 실행하고,
-Wait을 풀어줍니다.
:Wait()->(...any)
---
Fire가 호출될 때 까지 기다립니다.Fire에 사용된 값이 반환됩니다.
:Connect((...any)->())->Connection
---
Fire가 호출 될 때 함수가 실행되도록 만듭니다.Fire에 사용된 값이 호출 인자로 사용됩니다. 연결을 끊을 수 있도록Connection이 제공됩니다.
:Once((...any)->())->Connection
---
Connect와 유사하지만,Fire가 한번 호출된 뒤 연결이 끊어집니다/
:CheckConnected(func)->boolean
--함수가 이미 등록되어 있는지 여부를 반환합니다.
-
:DisconnectAll()
--모든 연결을 끊습니다.
-Wait으로 기다리고 있는 곳에는nil을 반환합니다.
:Destroy()
-- - - - - - --
:DisconnectAll()를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id가 등록되어 있는경우 저장소에서 파기하게 됩니다.
:Add(connection:Connection|RBXScriptConnection)
---
connection을 리스트에 추가합니다. 나중에:Disconnect를 호출하면 추가된 연결이 파기됩니다.
:Disconnect()
--추가된 모든 연결에
-Disconnect()를 수행합니다. 이 호출 후에 추가된 연결은 모두 사라지며. 이 요청 후에도 다시:Add를 사용할 수 있습니다
-Disconnecter 를 완전히 사용하지 못하도록 하려면:Destroy를 호출하세요
:Destroy()
-- - - - - - --
:Disconnect()를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id가 등록되어 있는경우 저장소에서 파기하게 됩니다.
Signal.Bindable.New(id:string)->Bindable
- --
Signal.Disconnecter.New(id:string)->Disconnecter
-- - - - - - -새로운 Disconnecter 을 생성하거나 이전의 Disconnecter 을 반환합니다.
-
Store.GetStore(id:string?)->store
--값들을 저장하고 레지스터를 생성할 수 있는 값 저장소를 반환합니다.
-
Store.GetObject(id:string)->Object?
--해당 id 를 가진 생성된 오브젝트를 반환합니다.
-
Store.GetObjects(id:string)->objectList?
-- - - - - - -해당 id 를 가진 생성된 오브젝트들을 반환합니다. 반환은 objectList 타입을 가지고 있습니다.
-
-고급 ID 를 사용할 수 있습니다. 자세한 사항은 튜토리얼 문서를 확인하세요.
:Each((item:any, index:number)->())
--일반적인 반복입니다. for 를 사용하는것과 효과가 같으나 함수를 이용합니다
-
:EachAsync((item:any, index:number)->())
--반환을 기다리지 않고 바로바로 다음 아이템으로 넘어갑니다.
-
-코루틴이 이용됩니다.wrap()코루틴을 모르거나, 필요성이 없는경우 일반적으로:Each를 사용해도 됩니다
:IsEmpty()
--이 ObjectList 가 비어있는지 여부를 반환합니다.
-
:Remove(indexOrItem:number|any)
-- - - - - - -objectList 에서 해당하는 오브젝트를 제거합니다.
-
-, & 를 사용한 고급 검색에서는 작동하지 않습니다
Out
-초반에 가속이 이루워지며, 후반에 느려집니다.
In
-초반에는 느리며, 점점 가속이 늘어납니다.
InOut
-중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다.

모든 Easing 은 여기에서 직접적으로 확인할 수 있습니다.
-Linear
--아무런 가감속이 없는 1차형 함수입니다
-
-i=x, x=0 to 1
Quint
--5 제곱을 이용한 가감속 함수입니다. Quart 보다 가파른 개형을 가졌습니다
-
-(^5) i=1-(1-x)^5, x=0 to 1
Quart
--네제곱을 이용한 가감속 함수입니다. Cubic 보다 가파른 개형을 가졌습니다
-
-(^4) i=1-(1-x)^4, x=0 to 1
Cubic
--세제곱을 이용한 가감속 함수입니다. Quad 보다 가파른 개형을 가졌습니다
-
-(^3) i=1-(1-x)^3, x=0 to 1
Quad
--제곱을 이용한 가감속 함수입니다.
-
-(^2) i=1-(1-x)^2, x=0 to 1
Expo
--지수형 가감속 함수입니다. 매우 가파른 개형을 가졌습니다.
-
-i=1-2^(-10*x), x=0 to 1
Sin
--사인 파형 가감속 함수입니다.
-
-i=sin(x*pi/2), x=0 to 1
Circle
--사분원 가감속 함수입니다.
-
-i=sqrt(1-(1-x)^2), x=0 to 1
Back
--시작시 뒤로 이동이 있는 가감속 함수입니다.
-
Elastic
--탄성을 가지는 가감속 함수입니다.
-
Bounce
--튀어오름을 가지는 가감속 함수입니다.
-
TODO: 애니메이션 미리보기 영상 추가
- - - - - - -Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler
--트윈을 실행합니다. 트윈 옵션에 대한 정보는 TweenOptions 문서에서 찾을 수 있습니다. -
Ended,OnStepped,Setter,Getter값이 설정되면Option안의 값보다 우선적으로 사용됩니다. 기능은 TweenOptions의 내용과 같습니다. -나중에 트윈을 중단시킬 수 있도록TweenHandler가 제공됩니다. -다른 트윈이 변경중인 속성이 다시 트윈하도록 호출되면, 이전 트윈에서 해당 속성은 트윈이 중단되며 새로운 트윈으로 덮어쓰기 됩니다. --
1 -2 -3 -4 -5Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -
Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)
--
Tween.RunTween와 같으나 여러 오브젝트를 한꺼번에 트윈합니다. 아무것도 반환하지 않습니다
--
1 -2 -3 -4 -5Tween.RunTween({myFrame1, myFrame2, myFrame3},{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -
Tween.StopTween(ItemOrHandler:TweenHandler|any)
--트윈을 멈춥니다.
-TweenHandler또는 오브젝트를 넣어 멈출 수 있습니다. 오브젝트를 넣으면 그 오브젝트에 실행중인 모든 트윈을 멈춥니다.-------
1 -2 -3 -4 -5 -6 -7local Handler = Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) - -Tween.StopTween(Handler) ----
1 -2 -3 -4 -5 -6 -7local Handler = Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) - -Tween.StopTween(myFrame) -
Tween.StopPropertyTween(Item:any, PropertyName:string)
--오브젝트에 특정 프로퍼티의 트윈을 중단시킵니다.
-TweenHandler는 사용할 수 없습니다.
Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean
--해당 오브젝트 또는
-TweenHandler로 트윈이 진행중인지 여부를 판단합니다.
Tween.IsPropertyTweening(Item:any, PropertyName:string)
--해당 오브젝트의 프로퍼티가 트윈중이지 여부를 판단합니다.
-TweenHandler는 사용할 수 없습니다.
Tween.Easings: { [string]: EasingFunction }
--이징 함수들이 담겨있습니다.
--그래프와 미리보기는 Easings 에서 확인할 수 있습니다 -
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15type Easing = - "Linear" // 아무런 가감속이 없는 1차형 - |"Quint" // 5 제곱 - |"Quart" // 네제곱 - |"Cubic" // 세제곱 - |"Quad" // 제곱 - |"Sin" // 사인 파형 - |"Circle" // 사분원 - |"Expo" // 지수형 - |"Elastic" // 탄성 - |"Bounce" // 튀어오름 - |"Back" // 뒤로 가감속 - |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2 - |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4 - |EasingFunction?; -
Tween.Easings: { [string]: EasingFunction }
-- - - - - - -이징 함수들이 담겨있습니다.
--자세한 정보는 Easings 에서 확인할 수 있습니다 -
1 -2 -3 -4 -5 -6 -7type Direction = - // 초반에 가속이 이루워지며, 후반에 느려집니다. - "Out" - // 초반에는 느리며, 점점 가속이 늘어납니다. - |"In" - //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다. - |"InOut" -
Option Time:number?
--트윈의 총 길이를 정합니다. 아무 값도 지정하지 않으면
-1이 사용됩니다.
Option Easing:string|(index:number)->number?
--트윈의 가감속 정도를 결정합니다. 문자열 그대로 사용하거나,
Tween.Easings.Linear와 같이 열거형 방식으로 사용할 수 있습니다.
-혹은 필요에 따라 함수를 지정할 수도 있습니다. 함수를 Easing 으로 사용하는 경우 첫번째 인자로 1차 진행도 (Linear, 0 에서 1 사이의 값) 값이 주어지며, 계산 결과로 실제 적용될 위치를 반환해야합니다. 반환값은 음수이거나 1 보다 클 수 있습니다.
-아무 값도 지정하지 않으면Exp2가 사용됩니다.
--함수에 관한 자세한 설명과 미리보기는 여기에서 확인하세요 -
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15type Easing = - "Linear" // 아무런 가감속이 없는 1차형 - |"Quint" // 5 제곱 - |"Quart" // 네제곱 - |"Cubic" // 세제곱 - |"Quad" // 제곱 - |"Sin" // 사인 파형 - |"Circle" // 사분원 - |"Expo" // 지수형 - |"Elastic" // 탄성 - |"Bounce" // 튀어오름 - |"Back" // 뒤로 가감속 - |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2 - |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4 - |EasingFunction?; -
Option Direction:string?
--트윈이 진행되는 방향입니다. 문자열 그대로 사용하거나,
Tween.Directions.Out과 같이 열거형 방식으로 사용할 수 있습니다.
-아무 값도 지정하지 않으면Out이 사용됩니다. --방향에 관한 자세한 설명과 미리보기는 여기에서 확인하세요 -
1 -2 -3 -4 -5 -6 -7type Direction = - // 초반에 가속이 이루워지며, 후반에 느려집니다. - "Out" - // 초반에는 느리며, 점점 가속이 늘어납니다. - |"In" - //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다. - |"InOut" -
Option CallBack:{[number|"*"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?
--선택적인 필드이며, 트윈이 실행중인 도중에 함수를 실행시킬 수 있습니다. 트윈의 진행 정도에 따라서 한번 함수가 실행되거나 트윈 진행중 계속해서 실행되도록 만들 수 있습니다.
-
-인덱스가 숫자인 경우 해당 지점을 넘을 때 함수가 실행되도록 만들 수 있으며,"*"를 인덱스로 사용하면 모든 부분에서 함수가 실행됩니다.
-함수에는 편의상 트윈을 하고있는 오브젝트, 위치값, 시간만을 고려한 1차 위치값이 제공됩니다.
Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?
--CallBack 에
-"*"를 넣은것과 동일한 효과를 가지는 별칭입니다
Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?
--CallBack 에
-1을 넣은것과 동일한 효과를 가지는 별칭입니다
Option Getter:(Item:any, Property:string)->any?
--선택적인 필드이며, 트윈이 값을 얻으려 할 때 사용할 함수입니다.
-
-함수에 트윈하고 있는 오브젝트, 프로퍼티 이름이 제공됩니다.--Warning
--
register:Tween()와 호환되지 않습니다.
Option Getter:(Item:any, Property:string, Value:Lerpable)->any?
-- - - - - - -선택적인 필드이며, 트윈이 값을 설정하려 할 때 사용할 함수입니다. -함수에 트윈하고 있는 오브젝트, 프로퍼티 이름, 설정할 값이 제공됩니다.
---Warning
--
register:Tween()와 호환되지 않습니다.
\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.
: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.
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.
: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.
\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.
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 \ub610\ub294 :AfterRender \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, \ucd94\ud6c4 Mount \ub97c \ud1b5\ud574 \ucd94\uac00\ub418\ub294 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8 \ub610\ud55c \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() \uc640 :AfterRender() \uc5d0\uc11c\ub294 \ube48 \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
: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
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\ube14myStore \"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 :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
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.
:Observe((newValue:any)->())
:Register\uc758 \uac04\uc18c\ud654 \ubc84\uc804\uc785\ub2c8\ub2e4. :Register\uc640 \ub2e4\ub974\uac8c \uc790\ub3d9\uc801\uc73c\ub85c \ub4e4\uc5b4\uac04 \ud568\uc218\ub97c GC \ub85c \ubd80\ud130 \ubcf4\ud638\ud558\uae30 \ub54c\ubb38\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub97c \ub530\ub85c \uc800\uc7a5 \ud560 \ud544\uc694\uac00 \uc5c6\uc73c\uba70, \uc778\uc790\ub294 newValue \ud558\ub098\ub9cc \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.
newValue \ub294 :Add, :With, :Tween, :Default \uac00 \uacc4\uc0b0\ub41c \uc0c1\ud0dc\ub85c \uc81c\uacf5\ub429\ub2c8\ub2e4.
myStore.test = 1\nmyStore \"test\":Add(1):Observe(function(_,newValue)\n -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n print(newValue)\nend)\nmyStore.test = 2\n"},{"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.
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.
Warningregister: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.
Warningregister:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\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"},{"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 \ub610\ub294 :AfterRender \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, \ucd94\ud6c4 Mount \ub97c \ud1b5\ud574 \ucd94\uac00\ub418\ub294 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8 \ub610\ud55c \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() \uc640 :AfterRender() \uc5d0\uc11c\ub294 \ube48 \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
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
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.
: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.
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.
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.
\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.
Warningregister: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.
Warningregister:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
\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.
\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\uc758rojo \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 \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.
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.
\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.
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.
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.
\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.
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.
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\ub2e4local 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 \ub610\ub294 :AfterRender \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, \ucd94\ud6c4 Mount \ub97c \ud1b5\ud574 \ucd94\uac00\ub418\ub294 \uc790\uc2dd \uc624\ube0c\uc81d\ud2b8 \ub610\ud55c \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() \uc640 :AfterRender() \uc5d0\uc11c\ub294 \ube48 \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
\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
\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
\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\uc758Store.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 , & 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
GetObject \uc5d0\ub294 \uc774 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. objectList:Remove \uba54\uc18c\ub4dc\ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \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
\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
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
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.
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.
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\ud2bcTween.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.
Warningregister: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.
Warningregister:Tween() \uc640 \ud638\ud658\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
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.
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.
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
\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
\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.
\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 \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\ube14myStore \"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 :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
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.
:Observe((newValue:any)->())
:Register\uc758 \uac04\uc18c\ud654 \ubc84\uc804\uc785\ub2c8\ub2e4. :Register\uc640 \ub2e4\ub974\uac8c \uc790\ub3d9\uc801\uc73c\ub85c \ub4e4\uc5b4\uac04 \ud568\uc218\ub97c GC \ub85c \ubd80\ud130 \ubcf4\ud638\ud558\uae30 \ub54c\ubb38\uc5d0 \ub4e4\uc5b4\uac04 \ud568\uc218\ub97c \ub530\ub85c \uc800\uc7a5 \ud560 \ud544\uc694\uac00 \uc5c6\uc73c\uba70, \uc778\uc790\ub294 newValue \ud558\ub098\ub9cc \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4.
newValue \ub294 :Add, :With, :Tween, :Default \uac00 \uacc4\uc0b0\ub41c \uc0c1\ud0dc\ub85c \uc81c\uacf5\ub429\ub2c8\ub2e4.
myStore.test = 1\nmyStore \"test\":Add(1):Observe(function(_,newValue)\n -- \uac12 \ubcc0\uacbd\uc2dc \ucd9c\ub825\ub429\ub2c8\ub2e4\n print(newValue)\nend)\nmyStore.test = 2\n"},{"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
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.
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 deleted file mode 100644 index 4c904df..0000000 --- a/docs/kr/sitemap.xml +++ /dev/null @@ -1,248 +0,0 @@ - -Easing 문서에 Out In Inout 비교 영상 만들기
-Spring 물리 계산을 UI 애니메이션에 적용합니다
-WIP. 아직 진행중인 프로젝트.
Register 의 상태와 Store 의 값, Class 의 동작 여부 등 Quad 의 여러 자원을 긴밀하게 디버그합니다.
-WIP. 아직 진행중인 프로젝트.
Tab 키등으로 버튼 선택하기 (... 가능함?) -WIP. 검토중인 프로젝트.
-혹은 이루워지지 않는
-눈에 보이는 워지워그식 편집기를 이용해 Quad Class 를 생성합니다.
-HTML, CSS, JS 로써 스크립트를 변형해 스튜디오 없이 개발하는 가벼운 개발법입니다.
-미리 렌더링된 rbxm 객체를 반환합니다. lua 스크립트들이 매핑되어 일반적이게 돌아갑니다.
- - - - - - -모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Bindable, Disconnecter 기능이 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Bindable, Disconnecter 는 공유됩니다
Quad 에는 편의상의 이유로 로블록스의 RBXScriptSignal 의 유사품과, 한번에 시그널을 끊어주는 Disconnecter 를 제공합니다.
-이는 내부적으로 Extend 의 GetPropertyChangedSignal 같은 곳에서 사용되기도 합니다.
Bindable 은 RBXScriptSignal 과 유사한 객체입니다. Signal.Bindable.New(id:string?) 으로 생성할 수 있습니다.
-로블록스의 기본 BindableEvent 와는 다르게 :Fire 가 한곳에 합쳐져 있습니다.
만약 id 를 지정한 경우, 같은 id 를 가진 Bindable 이 있으면 이전것을 반환합니다.
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 | |
Bindable 에는 다음과 같은 메소드들이 제공됩니다.
:Fire(...any)
--등록된 연결들을 실행하고,
-Wait을 풀어줍니다.
:Wait()->(...any)
---
Fire가 호출될 때 까지 기다립니다.Fire에 사용된 값이 반환됩니다.
:Connect((...any)->())->Connection
---
Fire가 호출 될 때 함수가 실행되도록 만듭니다.Fire에 사용된 값이 호출 인자로 사용됩니다. 연결을 끊을 수 있도록Connection이 제공됩니다.
:Once((...any)->())->Connection
---
Connect와 유사하지만,Fire가 한번 호출된 뒤 연결이 끊어집니다/
:CheckConnected(func)->boolean
--함수가 이미 등록되어 있는지 여부를 반환합니다.
-
:DisconnectAll()
--모든 연결을 끊습니다.
-Wait으로 기다리고 있는 곳에는nil을 반환합니다.
:Destroy()
---
:DisconnectAll()를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id가 등록되어 있는경우 저장소에서 파기하게 됩니다.
Bindable:Connect 와 Bindable:Once 는 Connection 을 반환합니다. Connection 에는 다음과 같은 메소드들이 제공됩니다.
:Disconnect()
--연결을 끊습니다.
-Fire가 호출되더라도Connect혹은Once에 사용된 함수가 실행되지 않습니다.
:Destroy()
---
:Disconnect()의 별칭입니다.
Disconnecter 는 일종의 Maid 모듈과 비슷한 객체입니다. 이 객체에는 Connection (로블록스, Quad 모두 호환) 을 추가할 수 있으며, 나중에 추가된 Connection 을 한꺼번에 Disconnect 할 수 있습니다. Signal.Disconnecter.New(id:string?) 으로 생성할 수 있습니다.
만약 id 를 지정한 경우, 같은 id 를 가진 Bindable 이 있으면 이전것을 반환합니다.
:Add(connection:Connection|RBXScriptConnection)
---
connection을 리스트에 추가합니다. 나중에:Disconnect를 호출하면 추가된 연결이 파기됩니다.
:Disconnect()
--추가된 모든 연결에
-Disconnect()를 수행합니다. 이 호출 후에 추가된 연결은 모두 사라지며. 이 요청 후에도 다시:Add를 사용할 수 있습니다
-Disconnecter 를 완전히 사용하지 못하도록 하려면:Destroy를 호출하세요
:Destroy()
-- - - - - - --
:Disconnect()를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
-id가 등록되어 있는경우 저장소에서 파기하게 됩니다.
Quad 에서는 로블록스의 Frame 이나 TextButton 같은 기본 오브젝트만 만들 수 있는것이 아닙니다. Quad 는 자신만의 버튼, 혹은 여러 컴포넌트들을 추상적으로 만들고. 다시 활용할 수 있도록 Extend 를 지원합니다.
Extend 는 Register 와 더불어 Quad 의 가장 중요한 기능으로써, 다음과 같은 장점을 지닙니다.
---
-- 재사용 가능합니다. 나만의 버튼을 만들고, 고치고 싶은 마음이 생겨 고치면 자동으로 사용된 곳들이 업데이트됩니다.
-- 긴 코드를 나누어 코드마다 확실한 목적을 부여해 더 명확한 코드 작성이 가능해집니다.
-- 자신만의 프로퍼티를 만들거나 완전히 원하는대로 오브젝트를 커스터마이징 할 수 있습니다.
-- 함수나 생성기를 직접 만드는 것 보다 일관된 방법을 제공합니다.
-- 매우 유연합니다. 다양한 방법의 구현법을 원하는대로 사용할 수 있습니다.
-
Extend 객체는 다음과 같이 생성합니다.
-
1 -2 -3 -4 -5 | |
다음과 같은 코드 구조를 만들어보세요. 아래의 코드는 모든 Extend 문법을 설명합니다.
-
1 -2 -3 | |
| Extend 클래스를 불러오고 사용합니다 | |
|---|---|
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 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 | |
| Extend 클래스를 만듭니다. 다른곳에서 불러서 사용할 수 있습니다. | |
|---|---|
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 - 30 - 31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40 - 41 - 42 - 43 - 44 - 45 - 46 - 47 - 48 - 49 - 50 - 51 - 52 - 53 - 54 - 55 - 56 - 57 - 58 - 59 - 60 - 61 - 62 - 63 - 64 - 65 - 66 - 67 - 68 - 69 - 70 - 71 - 72 - 73 - 74 - 75 - 76 - 77 - 78 - 79 - 80 - 81 - 82 - 83 - 84 - 85 - 86 - 87 - 88 - 89 - 90 - 91 - 92 - 93 - 94 - 95 - 96 - 97 - 98 - 99 -100 -101 -102 -103 -104 -105 | |
Extend 에서 사용할 수 있는 값들과 메소드입니다.
-self(name:string)->linker
--Extend 메소드 전역에서 사용가능합니다. 링커를 만들며,
-PropertyChangedSignal를 이어주거나, self 에 원하는 오브젝트를 넣는 용도로 사용됩니다. 자세한 정보는 Render 를 확인해주세요.
Overwite REQUIRED :Render(props:valueStore)
--화면에 그려지는 UI 를 만들어지게 하는 함수입니다.
-Extend가 그려지려면 무조건 있어야합니다.
-이 오브젝트를 만드는데 들어간 프로퍼티 목록을 첫번째 인자로 줍니다. 레지스터 문법이 사용될 수 있습니다.-
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 -30 -31local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Event = Quad.Event -local Mount = Quad.Mount - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - [Event "MouseButton1Click"] = function (self,x,y) - print(("버튼이 %d,%d 에서 눌렸습니다"):format(x,y)) - end; - Size = props "Size"; - Text = props "Text"; -- 레지스터를 이용합니다 - } -end - -local myImported = Class(myClass) -myImported.Size = UDim2.fromOffset(200,200) - -local test = myImported { - Text = "wow" -} -Mount(ScreenGUI, test) - --- 텍스트를 업데이트합니다 -while task.wait(1) do - test.Text = "w"..("o"):rep(#test.Text-1).."w" -end -
Overwite Option :Init(props:valueStore)
--선택적인 메소드로, Render 가 수행 되기 전에 미리 props 값을 설정할 수 있습니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Init(props) - -- Size 값이 없다면 기본값을 사용하도록 합니다. - props:Default("Size", UDim2.fromOffset(100,100)) - - -- 앞에 _ 를 붇여 내부 변수를 만듭니다. - -- 어디에서나 쓰일 수 있으며 register 에 영향주지 않습니다. - self._asdf = true -end -function myClass:Render(props) - return TextButton { - props "Size" - } -end - -local myImported = Class(myClass) -local myButton = myImported() -- 옵션 없음 -print(myButton.Size) -
Overwite Option :AfterRender(object:any)
--선택적인 메소드로, Render 가 수행 된 후 할 작업을 만들 수 있습니다. 첫번째 인자로 Render 가 반환한 값이 주어집니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; -- 자기 자신에 이 버튼을 넣습니다 - } -end -function myClass:AfterRender(object) - print(self._button == object) -- true -end - -local myImported = Class(myClass) -myImported() -- 옵션 없음 -
Overwite Option :Update()
--
:Render와:AfterRender를 다시 실행하고, 이전에 있던 자식들을 다시 끌어옵니다.
-이전의 Render 결과는 제거됩니다 --
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:Update() -- update -myButton:Update() -- update -myButton:Update() -- update -
Overwite Option .Getter.<PropertyName>(self)
--값을 얻는데 사용됩니다. -
-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton {} -end --- 값을 읽는데 사용할 함수를 등록합니다 -function myClass.Getter.Test(self) - return "Hello World" -end - -local myImported = Class(myClass) -print(myImported().Test) -
Overwite Option .Setter.<PropertyName>(self,newValue:any)
--값을 설정하는데 사용됩니다. -
-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; - Text = "wow"; - } -end --- 값을 지정하는데 사용할 함수를 등록합니다 -function myClass.Setter.Test(self,newValue) - self._button.Text = newValue -end -function myClass.Getter.Test(self) - return self._button.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -print(myButton.Test) -myButton.Test = "Hello World" -print(myButton.Test) -
Overwite Option .UpdateTriggers.<PropertyName> = boolean?
--해당 값을 변경하면 Update 가 수행될지 여부를 지정합니다. -
-
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 -26local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end --- 값 변경시 업데이트 여부를 지정합니다 -myClass.UpdateTriggers.Test = true - -local myImported = Class(myClass) -local myButton = myImported() -myButton.Test = 1 -- update -myButton.Test = 1 -- update -myButton.Test = 1 -- update -
Overwite Option :Unload(object)
--:Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다. object 는 :Render 가 반환한 값입니다
-
:GetPropertyChangedSignal(propertyName:string)->Bindable
--값 변경을 연결할 수 있는
-Bindable을 반환합니다.:EmitPropertyChangedSignal으로 이 시그널을 작동시킬 수 있습니다. 편의상 이 시그널이 작동할 때, 새로운 값이 첫번째 인자로 주어집니다.
:EmitPropertyChangedSignal(propertyName:string,changedValue:any?)
--프로퍼티 변경시
:GetPropertyChangedSignal에 등록된 함수가 실행되도록 이 함수를 호출해 주어야 합니다. 일반적으로self.a = 1과 같은 방식으로 바로 값을 설정하는 경우 자동적으로 이 함수가 실행되지만, 텍스트 박스의 텍스트 처럼 객체의 변경사항을 연동해야 하는 경우 이 함수를 사용할 수 있습니다.changedValue는 선택사항이며, 주어지지 않으면self[propertyName]을 반환합니다. --
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 -30 -31 -32local ScreenGUI = script.Parent -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 "_box"; - Text = "test"; - Size = UDim2.fromOffset(200,200); - [Evnet.Prop "Text"] = function (this,newValue) - self:EmitPropertyChangedSignal("Text",newValue) - end; - -- [Evnet.Prop "Text"] = self "Text" 와 동일합니다. - -- self(name:string) 문법으로 변경 이벤트 역시 링크 - -- 할 수 있습니다. - } -end -function myClass.Getter.Text(self) - return self._box.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:GetPropertyChangedSignal("Text"):Connect(function() - print(myButton.Text) -end) -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 -29local 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 -27local 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" }) -
Frame 과 같은 UI 오브젝트를 만들고 싶은 경우 먼저 import 를 이용해주어야 합니다. -다음과 같이 입력해보세요!
-1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 | |
나중에 자신만의 UI 오브젝트를 생성할 수 있지만, 일반적인 로블록스가 지원하는 오브젝트의 경우 Class(ClassName:string) 으로 불러올 수 있습니다
불러온 Class 에 기본값을 설정할 수도 있습니다.
-이렇게 하면 BorderSizePixel 와 같이 자주 사용될 수 있는 프로퍼티를 미리 지정해 둘 수 있습니다.
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 | |
이제 그려낸 프레임을 화면에 그려보고 싶나요? 다음 튜토리얼 Mount 를 확인해보세요!
- - - - - - -Quad 모듈에서 모든 Parent 처리는 Mount 를 이용합니다. Mount(to:any,...item:any?)->mounts 함수를 이용하면 다루는 오브젝트가 로블록스 Instance 인지, 향후 소개될 Quad 확장 클래스인지 상관없이 알아서 Parent 가 처리됩니다.
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 | |
편의를 위해서 Mount 함수는 mounts 라는 객체를 반환합니다. 이것을 이용하면 필요에 따라서 Mount 상태를 해제하거나 추가 할 수 있습니다. mounts 객체는 다음과 같은 메소드를 가집니다.
:Unmount()
--이렇게 하면 마운트된 Instance 를 지워버립니다. Quad 는 안전한 메모리 관리를 위해 gc 의 기능에 의존하므로, gc 시간차로 인해
-Store.GetObject에서 오브젝트가 사라지는데 시간이 걸릴 수 있습니다.-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15-- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui,mainFrame) - -local childFrame = Frame {} -local childFrameMount = Mount(mainFrame,childFrame) -childFrameMount:Unmount() --- childFrame 은 단순히 .Parent = nil 되는 것을 넘어 메모리에서 사라집니다 --- 즉, Destroy() 가 호출됩니다 -
:Add(item:any)
-- - - - - - -Mount 에 오브젝트를 추가합니다. 처음 설정한
-to값을 따라 부모가 결정됩니다.이 동작은 리스트를 만들 때 유용할 수 있습니다. 다시로드 동작시 직접 제거가 필요하지 않습니다
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui, mainFrame) - -local lastListMount = Mount(mainFrame) -local function refreshList() - lastListMount:Unmount() -- 이전 children 을 알아서 제거합니다 - for i = 1,10 do - lastListMount:Add(Frame { Name = tostring(i) }) - end -end - -task.spawn(function() - while true do - refreshList() - task.wait(2) - end -end) -다음과 같이 이전 children 을 간접적으로 제거하고 새로운 오브젝트를 추가합니다. 단
-ScrollFrame의 경우CanvasPosition이 초기화 되어버리므로 자식들을:Unmount()하기 전에 위치를 저장하고 다시 불러와야 합니다
모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Store.GetObject 가 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Store.GetObject 는 공유됩니다
변수에 만들어진 오브젝트를 하나하나 저장해야하나요? 아니요, Quad 에는 오브젝트에 아이디를 부여할 수 있습니다.
-1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 | |
아이디에 허용되는 글자는 변수명과 같습니다. 대소문자, 숫자, 언더바(_) 를 허용합니다.
-오브젝트 생성시 Frame "mainFrame" {} 와 같이 id 값을 지정해 준다면 생성된 오브젝트는 그 아이디를 가지게 됩니다.
-Store.GetObject(id:string)->Object? 는 생성된 객체중 가장 첫번째의 id 가 일치하는 오브젝트를 반환해 줍니다.
1 -2 -3 | |
위처럼 생성이나 가져오기에서 식을 만들어 넣을 수도 있습니다.
-Store.GetObjects의 반환값인 objectList는 캐시해서는 안됩니다. objectList를 local 에 넣고 계속해서 유지시키지 마십시오, 반환값은 자동으로 업데이트 되지 않습니다.
Quad 는 다량의 오브젝트를 다루기 편하도록 Store.GetObjects(id:string)->objectList 라는 함수를 가지고 있습니다.
실험으로, 색깔이 랜덤하게 바뀌는 프레임들을 만들어 봅시다
-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 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 | |
Store.GetObjects() 의 반환 objectList 의 메소드들은 다음과 같습니다.
:Each((item:any, index:number)->())
--일반적인 반복입니다. for 를 사용하는것과 효과가 같으나 함수를 이용합니다
-
:EachAsync((item:any, index:number)->())
--반환을 기다리지 않고 바로바로 다음 아이템으로 넘어갑니다.
-
-코루틴이 이용됩니다.wrap()코루틴을 모르거나, 필요성이 없는경우 일반적으로:Each를 사용해도 됩니다
:IsEmpty()
--이 ObjectList 가 비어있는지 여부를 반환합니다.
-
:Remove(indexOrItem:number|any)
--objectList 에서 해당하는 오브젝트를 제거합니다.
-
-, & 를 사용한 고급 검색에서는 작동하지 않습니다
id 기능을 조금더 고급적인 방법으로 사용할 수도 있습니다.
-1 -2 -3 -4 -5 -6 | |
| 좀더 직관적인 확인을 위해서 작동시켜보세요. | |
|---|---|
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 -30 -31 -32 -33 -34 -35 -36 | |
, & GetObjects 에는 이 두 연산을 사용할 수 있고, 생성시에는 , 으로 여러 아이디를 부여해줄 수 있습니다. 띄어쓰기는 무시됩니다
GetObject 에는 이 방식을 사용할 수 없습니다. objectList:Remove 메소드는 사용할 수 없습니다. 경우에 따라 이미 생성한 오브젝트에 id 를 추가 혹은 제거해줄 수 있습니다
-1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 | |
Store.AddObject(ids:string, item:any) 를 이용해 item 에 아이디를 추가하고
-:Remove(item:any) 를 이용해 item 에 아이디를 제거합니다
모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Style 기능이 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Style 는 공유됩니다
Quad 에서는 반복적인 속성들을 줄여 쓸 수 있도록 Style 을 제공합니다.
-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 -30 -31 -32 -33 -34 -35 -36 -37 | |
Style을 사용하면 많은 양의 속성을 하나에 변수로 집어넣을 수 있습니다. Style을 사용해서 많은 양의 코드를 줄여보세요
Style에는 타겟 id를 지정해줄 수 있습니다
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 | |
Style(id:string){ any }를 이용해 스타일을 선언해주면 나중에 해당 id를 가진 오브젝트 생성시 해당 스타일이 적용됩니다.
MouseButton1Click 혹은 GetPropertyChangedSignal 같은 로블 기본 이벤트를 간단하게 등록하고 싶으신가요? Event 를 이용해보세요.
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 | |
적용가능한 Event 들은 다음과 같습니다
-Event(name:string)
--모든 로블록스 이벤트들을 나타냅니다,
-MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up등이 될 수 있습니다
-기본적으로 로블록스의 기본 이벤트들과 다르게, 첫번째 인자로self를 받을 수 있습니다.-------
1 -2 -3 -4 -5Frame { - [Event "MouseEnter"] = function (self) - print(self.Name .. "에 마우스가 올라왔습니다") - end; -} ----
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Mount = Quad.Mount -local TextButton = Class "TextButton" - -TextButton "mainButton" { - Size = UDim2.fromOffset(200,200); - [Event "MouseEnter"] = function (self) - print("버튼이 클릭되었습니다") - end; -} -Mount(ScreenGUI, Store.GetObject("mainButton")) -
Event.Created
--오브젝트가 생성되었을 때 실행됩니다. 첫번째 인자로
self를 받을 수 있습니다.
--
1 -2 -3 -4 -5 -6-- 용법 -Frame { - [Event.Created] = function (self) - print(self.Name .. "이 생성되었어요") - end; -} ---주의
--
Event.Created가 실행될 때는Parent값이 정해지지 않았을 수 있습니다.self.Parent는 접근해서는 안됩니다.Class.Extend에서는AfterRender를 이용해야 합니다.
Event.CreatedAsync
--
Event.Created와 비슷하지만, 코루틴 안에서 작동합니다.objectList:EachAsync()처럼 반환을 기다리지 않습니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16-- 용법 -Frame { - Frame { - Name = "A"; - [Event.CreatedAsync] = function (self) - -- 이 함수가 끝나지 않더라도 다음 오브젝트가 생성될 수 있어야합니다 - task.wait(5) - end; - }; - Frame { - Name = "B"; - [Event.Created] = function (self) - print(self.Name .. "가 생성되었습니다") - end; - }; -} ---주의
--
Event.CreatedAsync가 실행될 때는Parent값이 정해지지 않았을 수 있습니다.self.Parent는 접근해서는 안됩니다.
Event.Prop(propertyName:string)
-- - - - - - -프로퍼티 값이 변경됨을 연결합니다.
--
1 -2 -3 -4 -5 -6 -7 -8-- 용법 -TextBox { - Text = "아무거나 입력하세요"; - [Event.Prop "Text"] = function (self,text) - -- 편의상의 이유로 변경된 값이 제공됩니다 - print(text) - end; -} -
Quad에는 트윈을 도와주는 모듈이 내장되어 있습니다. 이 트윈 모듈은 단순한 Instance들을 넘어서 table 형식도 트윈을 수행할 수 있습니다. 이는 나중에 커스텀 오브젝트를 트윈할 때 유용합니다.
-Quad 에서는 실제로 직접적으로 Tween 을 사용할 일은 적으며 추후 설명되는 register:Tween()로 사용하는것이 권장됩니다.
트윈은 일반적으로 다음과 같이 수행합니다.
-1 -2 -3 -4 -5 -6 -7 -8 -9 | |
| 클릭시 움직이는 버튼을 구현합니다. | |
|---|---|
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 -30 -31 -32 -33 -34 -35 -36 | |
트윈에는 트윈 옵션이 들어가며, 여기에는 트윈의 방향, 가감속, 시간 등을 설정해줄 수 있습니다.
-넣을 수 있는 트윈 옵션은 다음과 같습니다.
Option Time:number?
--트윈의 총 길이를 정합니다. 아무 값도 지정하지 않으면
-1이 사용됩니다.
Option Easing:string|(index:number)->number?
--트윈의 가감속 정도를 결정합니다. 문자열 그대로 사용하거나,
Tween.Easings.Linear와 같이 열거형 방식으로 사용할 수 있습니다.
-혹은 필요에 따라 함수를 지정할 수도 있습니다. 함수를 Easing 으로 사용하는 경우 첫번째 인자로 1차 진행도 (Linear, 0 에서 1 사이의 값) 값이 주어지며, 계산 결과로 실제 적용될 위치를 반환해야합니다. 반환값은 음수이거나 1 보다 클 수 있습니다.
-아무 값도 지정하지 않으면Exp2가 사용됩니다.
--함수에 관한 자세한 설명과 미리보기는 여기에서 확인하세요 -
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15type Easing = - "Linear" // 아무런 가감속이 없는 1차형 - |"Quint" // 5 제곱 - |"Quart" // 네제곱 - |"Cubic" // 세제곱 - |"Quad" // 제곱 - |"Sin" // 사인 파형 - |"Circle" // 사분원 - |"Expo" // 지수형 - |"Elastic" // 탄성 - |"Bounce" // 튀어오름 - |"Back" // 뒤로 가감속 - |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2 - |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4 - |EasingFunction?; -
Option Direction:string?
--트윈이 진행되는 방향입니다. 문자열 그대로 사용하거나,
Tween.Directions.Out과 같이 열거형 방식으로 사용할 수 있습니다.
-아무 값도 지정하지 않으면Out이 사용됩니다. --방향에 관한 자세한 설명과 미리보기는 여기에서 확인하세요 -
1 -2 -3 -4 -5 -6 -7type Direction = - // 초반에 가속이 이루워지며, 후반에 느려집니다. - "Out" - // 초반에는 느리며, 점점 가속이 늘어납니다. - |"In" - //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다. - |"InOut" -
Option CallBack:{[number|"*"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?
--선택적인 필드이며, 트윈이 실행중인 도중에 함수를 실행시킬 수 있습니다. 트윈의 진행 정도에 따라서 한번 함수가 실행되거나 트윈 진행중 계속해서 실행되도록 만들 수 있습니다.
-
-인덱스가 숫자인 경우 해당 지점을 넘을 때 함수가 실행되도록 만들 수 있으며,"*"를 인덱스로 사용하면 모든 부분에서 함수가 실행됩니다.
-함수에는 편의상 트윈을 하고있는 오브젝트, 위치값, 시간만을 고려한 1차 위치값이 제공됩니다.
Option OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?
--CallBack 에
-"*"를 넣은것과 동일한 효과를 가지는 별칭입니다
Option Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?
--CallBack 에
-1을 넣은것과 동일한 효과를 가지는 별칭입니다
Option Getter:(Item:any, Property:string)->any?
--선택적인 필드이며, 트윈이 값을 얻으려 할 때 사용할 함수입니다.
-
-함수에 트윈하고 있는 오브젝트, 프로퍼티 이름이 제공됩니다.--Warning
--
register:Tween()와 호환되지 않습니다.
Option Getter:(Item:any, Property:string, Value:Lerpable)->any?
--선택적인 필드이며, 트윈이 값을 설정하려 할 때 사용할 함수입니다. -함수에 트윈하고 있는 오브젝트, 프로퍼티 이름, 설정할 값이 제공됩니다.
---Warning
--
register:Tween()와 호환되지 않습니다.
Quad 의 트윈에는 트윈을 멈추거나 트윈중인지 확인하는 등의 작업을 할 수 있는 여러 함수들이 제공됩니다.
-Tween 안의 모든 함수와 값들은 다음과 같습니다.
Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler
--트윈을 실행합니다. 트윈 옵션에 대한 정보는 TweenOptions 문서에서 찾을 수 있습니다. -
Ended,OnStepped,Setter,Getter값이 설정되면Option안의 값보다 우선적으로 사용됩니다. 기능은 TweenOptions의 내용과 같습니다. -나중에 트윈을 중단시킬 수 있도록TweenHandler가 제공됩니다. -다른 트윈이 변경중인 속성이 다시 트윈하도록 호출되면, 이전 트윈에서 해당 속성은 트윈이 중단되며 새로운 트윈으로 덮어쓰기 됩니다. --
1 -2 -3 -4 -5Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -
Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)
--
Tween.RunTween와 같으나 여러 오브젝트를 한꺼번에 트윈합니다. 아무것도 반환하지 않습니다
--
1 -2 -3 -4 -5Tween.RunTween({myFrame1, myFrame2, myFrame3},{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -
Tween.StopTween(ItemOrHandler:TweenHandler|any)
--트윈을 멈춥니다.
-TweenHandler또는 오브젝트를 넣어 멈출 수 있습니다. 오브젝트를 넣으면 그 오브젝트에 실행중인 모든 트윈을 멈춥니다.-------
1 -2 -3 -4 -5 -6 -7local Handler = Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) - -Tween.StopTween(Handler) ----
1 -2 -3 -4 -5 -6 -7local Handler = Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) - -Tween.StopTween(myFrame) -
Tween.StopPropertyTween(Item:any, PropertyName:string)
--오브젝트에 특정 프로퍼티의 트윈을 중단시킵니다.
-TweenHandler는 사용할 수 없습니다.
Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean
--해당 오브젝트 또는
-TweenHandler로 트윈이 진행중인지 여부를 판단합니다.
Tween.IsPropertyTweening(Item:any, PropertyName:string)
--해당 오브젝트의 프로퍼티가 트윈중이지 여부를 판단합니다.
-TweenHandler는 사용할 수 없습니다.
Tween.Easings: { [string]: EasingFunction }
--이징 함수들이 담겨있습니다.
--그래프와 미리보기는 Easings 에서 확인할 수 있습니다 -
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15type Easing = - "Linear" // 아무런 가감속이 없는 1차형 - |"Quint" // 5 제곱 - |"Quart" // 네제곱 - |"Cubic" // 세제곱 - |"Quad" // 제곱 - |"Sin" // 사인 파형 - |"Circle" // 사분원 - |"Expo" // 지수형 - |"Elastic" // 탄성 - |"Bounce" // 튀어오름 - |"Back" // 뒤로 가감속 - |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2 - |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4 - |EasingFunction?; -
Tween.Easings: { [string]: EasingFunction }
-- - - - - - -이징 함수들이 담겨있습니다.
--자세한 정보는 Easings 에서 확인할 수 있습니다 -
1 -2 -3 -4 -5 -6 -7type Direction = - // 초반에 가속이 이루워지며, 후반에 느려집니다. - "Out" - // 초반에는 느리며, 점점 가속이 늘어납니다. - |"In" - //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다. - |"InOut" -
특수 프로퍼티는 Tween 이 지원되지 않습니다. 그러나 register의 :Tween()의 경우 호환되므로, 특수 프로퍼티 값을 트윈하려면 향후 설명되는 register 와 함깨 사용해야합니다.
---
Tween.RunTween,Tween.RunTweens와는 같이 사용할 수 없습니다.
Quad 에서는 편리성을 위해 일부 특수 프로퍼티를 사용할 수 있습니다.
-이 모든 특수 프로퍼티는 향후 소개되는 register와 함깨 사용할 수 있습니다
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 | |
사용할 수 있는 프로퍼티는 다음과 같습니다.
-RoundSize:number?
---
ImageLabel,ImageButton에만 사용할 수 있는 속성입니다. 원형 이미지에 Slice를 이용해 둥근 프레임을 구현합니다. 일반적으로UICorner보다 부드러운 코너효과를 제공합니다.
Corner:number?
--모든 로블록스 UI오브젝트에 적용됩니다.
-UICorner를 이용해 모서리 부분을 둥글게 만듭니다. 자식 오브젝트에는 적용되지 않습니다.
PaddingAll:UDim?
---
UIPadding을 적용합니다. 상하좌우 모두 같은 값으로 적용됩니다.PaddingAllOffset과 함깨 사용할 수 없습니다.
PaddingAllOffset:number?
---
UIPadding을 적용합니다.PaddingAll과 같은 방법으로 작동하나,Offset값만 설정할 수 있습니다.PaddingAll과 함깨 사용할 수 없습니다.
Scale:number?
-- - - - - - --
UIScale을 적용합니다.UIScale.Scale과 같은 효과를 나타냅니다
모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Store.GetStore 가 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Store.GetStore 는 공유됩니다
레지스터는 한 값이 변경될 때, 그 값을 사용한 곳이 업데이트 될 수 있도록 만들어주는 Quad 의 주요 기술입니다. 추후 설명될 Class.Extend 와도 같이 사용됩니다.
레지스터는 이러한 시나리오에서 사용될 수 있습니다.
----
-- UI 의 여러 오브젝트를 한번에 페이드 아웃 혹은 페이드 인 시키는 경우.
-- 가변 크기의 UI 를 업데이트 시키는 경우.
-- 여러 오브젝트들을 한꺼번에 트윈시키는 경우.
-- 다크테마/화이트테마 변경할 수 있게 만드는 경우.
-
이외에도 레지스터의 활용 방법은 무궁무진합니다. 레지스터의 사용법은 다음과 같습니다.
-1 -2 -3 -4 -5 | |
구현의 복잡성의 이유로 레지스터는 오브젝트 생성시에만 등록할 수 있습니다.
-1 -2 | |
1 -2 -3 -4 | |
---
-- 스토어를 생성함.
-- 기본 값을 설정함.
-- 스토어를 호출해 레지스터를 얻어 등록함.
-
예시 코드로 정확하게 확인해 볼 수 있습니다
-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 -30 -31 -32 -33 -34 -35 -36 -37 -38 | |
레지스터에는 여러가지 메소드가 담겨있습니다. 이 메소드를 사용하면 레지스터를 보다 더 다양하게 활용할 수 있습니다.
-register 특수 메소드가 적용되는 순서는 다음과 같습니다.
:Add(value:any)->register
--값에 더하기를 취합니다. 음수형태가 제공되는 경우 빼기 처럼 작동합니다.
-number,Udim,UDim2,Color3,Vector2등 더할 수 있는 모든것을 사용할 수 있습니다
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21-- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -myStore.pos = UDim2.fromOffset(100,0) - -Frame "mainFrame" { - Position = myStore "pos":Add(UDim2.fromOffset(0,100)); -} -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -while true do - myStore.pos = myStore.pos + UDim2.fromOffset(10,0) - task.wait(2) -end ---주의
-구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다
-
:With((store:valueStore, newValue:any, key:string)->())->register
--함수 또는 테이블에서 값을 가져옵니다. Add 보다 나중에 수행됩니다.
-
-첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다-------
1 -2 -3myStore "size":With(function (_,value) - return value * 2 -end) ----
width값에 맞춰 자동으로 UI 가 업데이트되도록 만듭니다.-
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 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -myStore.topbarSize = 60 -myStore.width = 200 - --- 레지스터를 변수로 두고 사용합니다 -local listItemSize = myStore "width":With(function() - return UDim2.fromOffset(myStore.width,60) -end) - -Frame "mainFrame" { - Class "UIListLayout" { SortOrder = Enum.SortOrder.LayoutOrder }; - - -- 사이즈가 width 에 맞게 업데이트됩니다 - Size = myStore "width":With(function () - return UDim.fromOffset(store.width,400) - end); - - Frame "Topbar" { - LayoutOrder = 1; - BackgroundColor3 = Color3.fromRGB(255,0,0); - -- 이렇게 여러 값을 묶어서 두 값이 변경됨, 혹은 그이상을 - -- 만들 수 있습니다. - Size = myStore "topbarSize,width":With(function() - return UDim2.fromOffset(myStore.width,myStore.topbarSize) - end); - } - Frame "ListItem" { - LayoutOrder = 2; - BackgroundColor3 = Color3.fromRGB(0,255,0); - Size = listItemSize; - }; - Frame "ListItem" { - LayoutOrder = 3; - BackgroundColor3 = Color3.fromRGB(0,0,255); - Size = listItemSize; - }; -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) - --- width 값을 변경해보세요 -while true do - myStore.width = myStore.width + 10 - task.wait(1) -end ----
colors테이블 안에 있는 색깔들을 돌아가며 보여줍니다.-
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 -30 -31local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -local colors = { - Color3.fromRGB(255,255,255); - Color3.fromRGB(255,255,0); - Color3.fromRGB(0,255,255); - Color3.fromRGB(255,0,255); - Color3.fromRGB(255,0,0); - Color3.fromRGB(0,255,0); - Color3.fromRGB(0,0,255); -} -myStore.color = 1 - -Frame "mainFrame" { - Size = UDim2.fromOffset(200,200); - -- colors 에서 인덱싱해 값을 가져옵니다 - BackgroundColor3 = myStore "color":With(colors); -} -Mount(ScreenGUI, Store.GetObject("mainFrame")) - --- 인덱스를 순회합니다 -while task.wait(1) do - myStore.color = (i-1)%(#colors)+2 -end ---주의
-구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다
-
:Tween(options:TweenOptions)->register
--트윈을 이용해 변경사항을 적용합니다(처음 오브젝트 생성시에는 적용되지 않음) 옵션은 Tween 문서에 나와있는 옵션과 같습니다.
--------
1 -2-- Tween 옵션을 넣을 수 있습니다 -myStore "size":Tween{ Time = 2 } ---프레임을 한꺼번에 움직입니다.
--
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 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount -local Style = Quad.Style - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") -myStore.pos = UDim2.fromOffset(50,0) -Style "TweenFrame" { - Size = UDim2.fromOffset(50,50); - BackgroundColor3 = Color3.fromRGB(255,100,255); -} - -Frame "mainFrame" { - BackgroundColor3 = Color3.fromRGB(255,255,255); - Size = UDim2.fromOffset(500,500); - Frame "TweenFrame" { - Position = myStore "pos":Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,100)) - :Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,200)) - :Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,300)) - :Tween{Time = 2}; - } -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -local on = false -while true do - on = not on - myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0) - task.wait(1.5) -- 트윈은 덮어 쓸 수 있습니다 - -- 따라서 2 초인 길이보다 더 빨리 바꿔도 오류가 일어나지 않습니다 -end ---주의
-구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다
-
:Default(value:any)->register
--기본값을 정합니다. 만약 값이
nil인 경우 이 값을 사용하게 됩니다. Add 나 With 등 다른것에 영향받지 않습니다.
--
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21-- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -Frame "mainFrame" { - Size = UDim2.fromOffset(200,200); - -- color 값이 없으므로 Default 안의 값이 사용됩니다. - BackgroundColor3 = myStore "color" - :Default(Color3.fromRGB(255,0,0)); -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -task.wait(5) -myStore.color = Color3.fromRGB(0,255,0) ---주의
--
-- 처음 오브젝트가 생성될 때에만 이 값이 사용됩니다.
-- 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다.
-
:Register(<INPUT>(store:valueStore, newValue:any, key:string)->())->INPUT
--레지스터에 함수를 등록합니다. 값이 변경되면 함수가 실행됩니다. 첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다
--
newValue에는:Add,:With,:Tween,:Default가 따로 계산되지 않으며, 설정된 값을 아무 가공 없이 제공합니다-------
1 -2 -3 -4 -5 -6 -7 -8 -9myStore.test = 1 --- 반환 값은 입력으로 넣은 함수입니다. !꼭 저장해야합니다 --- :Register 는 함수가 사라지지 않도록 값을 유지하지 않습니다 --- 만약 버릴 경우 일정 시간 뒤 연결이 끊어질 수 있습니다 -local func = myStore "test":Register(function(_,newValue) - -- 값 변경시 출력됩니다 - print(newValue) -end) -myStore.test = 2 ----
myStore.test1,myStore.test2가 변화하면 print 함수를 실행합니다.-
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13local Quad = require(path.to.module).Init() -local Store = Quad.Store - -local myStore = Store.GetStore("myStore") - -myStore.test1 = 1 -myStore.test2 = "Hello" - -local func = myStore "test1,test2":Register(function() - print(myStore.test1,myStore.test2) -end) - -myStore.test1 = 2 ---주의
-Register 안에 들어간 함수는 GC 안정성을 위해서 약한 참조로 저장됩니다. 따라서 함수를 저장해야합니다.
-
:Observe((newValue:any)->())
-- - - - - - --
:Register의 간소화 버전입니다.:Register와 다르게 자동적으로 들어간 함수를 GC 로 부터 보호하기 때문에 들어간 함수를 따로 저장 할 필요가 없으며, 인자는newValue하나만 주어집니다.-
newValue는:Add,:With,:Tween,:Default가 계산된 상태로 제공됩니다.-------
1 -2 -3 -4 -5 -6myStore.test = 1 -myStore "test":Add(1):Observe(function(_,newValue) - -- 값 변경시 출력됩니다 - print(newValue) -end) -myStore.test = 2 -
모듈 설정시 .Init() 처럼 QuadId 란을 비워두는 경우 Lang 기능이 코드를 넘어 공유되지 않습니다
-하지만 .Init("Project1") 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 Lang 은 공유됩니다
Quad 에는 귀찮은 언어관리를 자동으로 해주는 기능이 내장되어 있습니다. 이 기능은 register 와 연동해 적은 줄의 코드로 변하는 텍스트도 언어에 맞게 출력되도록 만들 수 있습니다.
-번역 테이블은 Lang.New(LangName:string,{ [Locale]: string|(options)->string }) 다음을 이용해 만들 수 있으며.
-Lang(LangName:string)(options)->register 로 UI 에 적용시킬 수 있습니다.
Lang.Locales.Default 는 일치하는 언어가 없을때 보여줄 언어입니다. 일반적으로 영어를 추천합니다.
| 자세한 설명은 예제를 참고하세요 | |
|---|---|
1 -2 -3 -4 -5 -6 -7 -8 -9 | |
| 1초가 지날 때 마다 카운트를 증가합니다. 영어 사용자에겐 영어를, 한국어 사용자에겐 한국어를 보여줍니다. | |
|---|---|
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 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 | |
구현의 복잡성의 이유로 Lang 은 레지스터와 같은 제약을 가집니다 (오브젝트 생성시에만 등록할 수 있습니다)
-1 -2 -3 | |
대신에 :Register 문법을 사용하여 등록할 수 있습니다.
1 -2 -3 -4 -5 | |
로케일 값들은 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)
실험적인 모듈
-이 모듈은 업데이트가 빈번합니다! 항상 Github 를 확인해주세요!
-이 페이지는 Quad 모듈을 쉽게 시작할 수 있도록 튜토리얼을 제공하고 있습니다. 이 페이지를 정독해 Quad 모듈의 전반적인 사용법을 파악해보세요!
-변경 사항은 여기에서 확인할 수 있습니다.
-3가지 방법중 가장 편한 방법을 선택해 모듈을 설치해주세요.
-드레그해 스튜디오에 넣을 수 있는 모듈 파일입니다.
- -다운로드해 스튜디오에 옮겨주세요.
-rojo 를 사용해 빌드하는 방법을 사용할 수 있다면 Quad 를 직접 빌드할 수 있습니다.
-1 -2 -3 | |
윈도우의 경우 make build 대신 rojo build default.project.json -o output.rbxmx 를 입력해 주어야 합니다.
프로젝트가 rojo 를 사용하고 git 을 사용하는 경우 submodule 로 추가할 수 있습니다.
-1 -2 -3 -4 | |
1 | |
모듈을 셋업하기 위해서는 .Init(QuadId:string?) 을 이용합니다. 일반적으로 QuadId 값은 필요하지 않지만, 나중에 소개할 Store 와 같은 일부 기능들이 QuadId:string 에 영향받기도 합니다.
.Init(QuadId:string) 함수는 QuadId 가 같은 불러오기가 이미 있었던 경우, 초기화 하지 않고 불러왔던것을 반환합니다.
-따라서 모듈들 끼리 QuadId 가 같은 경우 Store 같은것들이 공유됩니다.
QuadId 가 비워진 경우 한번도 생성된 적 없는 새로운 Quad 가 생성됩니다
1 -2 | |
불러오기가 끝났다면 이제 Quad 의 자원들을 이용할 수 있습니다!
-다음 페이지로 넘어가 어서 활용해 봅시다
기본적으로 Quad 는 로드시 타입 같이 반환하지만. 직접적으로 타입을 지정하고 싶은 경우 types.lua 를 불러올 수 있습니다
-1 -2 | |
테스트 환경은 rojo 와의 개발통합을 위해 Play 버튼을 누르지 않고 미리보기를 사용할 수 있도록 만들어줍니다
-이를 통해 다른 코드 방식의 UI 프레임 워크보다 빠른 개발속도를 달성할 수 있습니다
편의상을 위해 자동 리로드를 설정해 줄 수 있습니다.
-rojo 환경이 아니라면 자동 리로드는 랙을 동반할 수 있습니다
---일반적으로, 로컬 편집 환경에서 로블록스의 script editor 는 한글자 한글자 변경시 마다 .Source 를 업데이트합니다. 이는 한글자 한글자 타이핑 시 마다 UI 가 업데이트 될 수 있음을 의미합니다. Quad 의 tracker 모듈은 순간적으로 많은양의 리로드가 발생하지 않도록 적절한 쿨타임과 시간분배를 가지고 있지만, 이 경우에도 Ctrl+S 를 눌러 저장해야 적용되는 vscode 와 같은 타 편집기와는 차이가 날 수 있습니다. 코드가 커짐으로 인해 자동 리로드에서 퍼포먼스적 이슈를 겪는다면, rojo 를 활용해 코드를 외부로 옮긴 후, vscode 를 스튜디오 위에 놓고 미리보기와 코드를 동시에 보면서 편집하세요.
-
-프로젝트가 매우 거대하지 않다면 크게 걱정하지 않아도 됩니다.
다음과 같은 코드트리를 만들어주세요.
-1 -2 -3 | |
| 실제로 UI 들을 그리는 코드들이 담깁니다. | |
|---|---|
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 -13 -14 -15 | |
| 게임을 플레이 할 때 코드가 로드될 수 있도록 만드는 로더입니다. | |
|---|---|
1 | |
| 명령창에서 명령어 입력으로 테스트를 실행 할 수 있도록 만드는 코드들이 담깁니다. | |
|---|---|
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 -30 -31 -32 -33 -34 -35 -36 | |
이제 명령어 창에서 자동 리로드를 켜거나 끌 수 있습니다. rojo 나 편집기로 인해 코드가 변경되면 자동으로 업데이트됩니다!
-1 | |
- -모든 로블록스 이벤트들을 나타냅니다, `MouseEnter, MouseLeave, MouseButton1Down, MouseButton1Up` 등이 될 수 있습니다 -기본적으로 로블록스의 기본 이벤트들과 다르게, 첫번째 인자로 `self` 를 받을 수 있습니다. - -=== "용법" - - ```lua - Frame { - [Event "MouseEnter"] = function (self) - print(self.Name .. "에 마우스가 올라왔습니다") - end; - } - ``` - -=== "예제 - 버튼클릭" - - ```lua - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Class = Quad.Class - local Mount = Quad.Mount - local TextButton = Class "TextButton" - - TextButton "mainButton" { - Size = UDim2.fromOffset(200,200); - [Event "MouseEnter"] = function (self) - print("버튼이 클릭되었습니다") - end; - } - Mount(ScreenGUI, Store.GetObject("mainButton")) - ``` - -- ---- - -`#!ts Event.Created` -
- -오브젝트가 생성되었을 때 실행됩니다. 첫번째 인자로 `self` 를 받을 수 있습니다. -```lua --- 용법 -Frame { - [Event.Created] = function (self) - print(self.Name .. "이 생성되었어요") - end; -} -``` - -???+ Warning "주의" - `Event.Created` 가 실행될 때는 `Parent` 값이 정해지지 않았을 수 있습니다. `#!lua self.Parent` 는 접근해서는 안됩니다. `Class.Extend` 에서는 `AfterRender` 를 이용해야 합니다. -- ---- - -`#!ts Event.CreatedAsync` -
- -`#!ts Event.Created` 와 비슷하지만, 코루틴 안에서 작동합니다. `#!ts objectList:EachAsync()` 처럼 반환을 기다리지 않습니다. -```lua --- 용법 -Frame { - Frame { - Name = "A"; - [Event.CreatedAsync] = function (self) - -- 이 함수가 끝나지 않더라도 다음 오브젝트가 생성될 수 있어야합니다 - task.wait(5) - end; - }; - Frame { - Name = "B"; - [Event.Created] = function (self) - print(self.Name .. "가 생성되었습니다") - end; - }; -} -``` -???+ Warning "주의" - `Event.CreatedAsync` 가 실행될 때는 `Parent` 값이 정해지지 않았을 수 있습니다. `#!lua self.Parent` 는 접근해서는 안됩니다. -- ---- - -`#!ts Event.Prop(propertyName:string)` -
- -프로퍼티 값이 변경됨을 연결합니다. -```lua --- 용법 -TextBox { - Text = "아무거나 입력하세요"; - [Event.Prop "Text"] = function (self,text) - -- 편의상의 이유로 변경된 값이 제공됩니다 - print(text) - end; -} -``` -diff --git a/md/kr/include/extend.md b/md/kr/include/extend.md deleted file mode 100644 index 1df8a1b..0000000 --- a/md/kr/include/extend.md +++ /dev/null @@ -1,370 +0,0 @@ - -`self(name:string)->linker` -> Extend 메소드 전역에서 사용가능합니다. 링커를 만들며, `PropertyChangedSignal` 를 이어주거나, self 에 원하는 오브젝트를 넣는 용도로 사용됩니다. 자세한 정보는 Render 를 확인해주세요. - ---- - -==Overwite== ==**REQUIRED**== `#!ts :Render(props:valueStore)` -
- -화면에 그려지는 UI 를 만들어지게 하는 함수입니다. `Extend` 가 그려지려면 무조건 있어야합니다. -이 오브젝트를 만드는데 들어간 프로퍼티 목록을 첫번째 인자로 줍니다. 레지스터 문법이 사용될 수 있습니다. - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class = Quad.Class -local Event = Quad.Event -local Mount = Quad.Mount - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - [Event "MouseButton1Click"] = function (self,x,y) - print(("버튼이 %d,%d 에서 눌렸습니다"):format(x,y)) - end; - Size = props "Size"; - Text = props "Text"; -- 레지스터를 이용합니다 - } -end - -local myImported = Class(myClass) -myImported.Size = UDim2.fromOffset(200,200) - -local test = myImported { - Text = "wow" -} -Mount(ScreenGUI, test) - --- 텍스트를 업데이트합니다 -while task.wait(1) do - test.Text = "w"..("o"):rep(#test.Text-1).."w" -end -``` - -- ---- - -==Overwite== ==Option== `#!ts :Init(props:valueStore)` -
- -선택적인 메소드로, Render 가 수행 되기 전에 미리 props 값을 설정할 수 있습니다. - -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Init(props) - -- Size 값이 없다면 기본값을 사용하도록 합니다. - props:Default("Size", UDim2.fromOffset(100,100)) - - -- 앞에 _ 를 붇여 내부 변수를 만듭니다. - -- 어디에서나 쓰일 수 있으며 register 에 영향주지 않습니다. - self._asdf = true -end -function myClass:Render(props) - return TextButton { - props "Size" - } -end - -local myImported = Class(myClass) -local myButton = myImported() -- 옵션 없음 -print(myButton.Size) -``` -- ---- - -==Overwite== ==Option== `#!ts :AfterRender(object:any)` -
- -선택적인 메소드로, Render 가 수행 된 후 할 작업을 만들 수 있습니다. 첫번째 인자로 Render 가 반환한 값이 주어집니다. - -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; -- 자기 자신에 이 버튼을 넣습니다 - } -end -function myClass:AfterRender(object) - print(self._button == object) -- true -end - -local myImported = Class(myClass) -myImported() -- 옵션 없음 -``` -- ---- - -==Overwite== ==Option== `#!ts :Update()` -
- -`:Render` 와 `:AfterRender` 를 다시 실행하고, 이전에 있던 자식들을 다시 끌어옵니다. -이전의 Render 결과는 제거됩니다 -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:Update() -- update -myButton:Update() -- update -myButton:Update() -- update -``` -- ---- - -==Overwite== ==Option== `#!ts .Getter.
- -값을 얻는데 사용됩니다. -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton {} -end --- 값을 읽는데 사용할 함수를 등록합니다 -function myClass.Getter.Test(self) - return "Hello World" -end - -local myImported = Class(myClass) -print(myImported().Test) -``` -- ---- - -==Overwite== ==Option== `#!ts .Setter.
- -값을 설정하는데 사용됩니다. -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" - -local myClass = Class.Extend() -function myClass:Render(props) - return TextButton { - self "_button"; - Text = "wow"; - } -end --- 값을 지정하는데 사용할 함수를 등록합니다 -function myClass.Setter.Test(self,newValue) - self._button.Text = newValue -end -function myClass.Getter.Test(self) - return self._button.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -print(myButton.Test) -myButton.Test = "Hello World" -print(myButton.Test) -``` -- ---- - -==Overwite== ==Option== `#!ts .UpdateTriggers.
- -해당 값을 변경하면 Update 가 수행될지 여부를 지정합니다. -```lua -local Quad = require(path.to.module).Init() -local Class = Quad.Class - -local TextButton = Class "TextButton" -local count = 0 - -local myClass = Class.Extend() -function myClass:Render(props) - print("Rendering!") - count = count + 1 - return TextButton { - self "_button"; - Name = tostring(count); - } -end -function myClass:AfterRender(object) - print(self._button.Name) -end --- 값 변경시 업데이트 여부를 지정합니다 -myClass.UpdateTriggers.Test = true - -local myImported = Class(myClass) -local myButton = myImported() -myButton.Test = 1 -- update -myButton.Test = 1 -- update -myButton.Test = 1 -- update -``` -- ---- - -==Overwite== ==Option== `#!ts :Unload(object)` -> :Destroy 가 호출될 때 사용됩니다. 따로 선언하지 않아도 연결을 모두 끊고 없에주지만 필요한 경우 직접 없에줄 수 있습니다. object 는 :Render 가 반환한 값입니다 - ---- - -`#!ts :GetPropertyChangedSignal(propertyName:string)->Bindable` -> 값 변경을 연결할 수 있는 `Bindable`을 반환합니다. `:EmitPropertyChangedSignal` 으로 이 시그널을 작동시킬 수 있습니다. 편의상 이 시그널이 작동할 때, 새로운 값이 첫번째 인자로 주어집니다. - ---- - -`#!ts :EmitPropertyChangedSignal(propertyName:string,changedValue:any?)` -
- -프로퍼티 변경시 `:GetPropertyChangedSignal` 에 등록된 함수가 실행되도록 이 함수를 호출해 주어야 합니다. 일반적으로 `#!ts self.a = 1` 과 같은 방식으로 바로 값을 설정하는 경우 자동적으로 이 함수가 실행되지만, 텍스트 박스의 텍스트 처럼 객체의 변경사항을 연동해야 하는 경우 이 함수를 사용할 수 있습니다. `changedValue` 는 선택사항이며, 주어지지 않으면 `#!ts self[propertyName]`을 반환합니다. -```lua -local ScreenGUI = script.Parent -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 "_box"; - Text = "test"; - Size = UDim2.fromOffset(200,200); - [Evnet.Prop "Text"] = function (this,newValue) - self:EmitPropertyChangedSignal("Text",newValue) - end; - -- [Evnet.Prop "Text"] = self "Text" 와 동일합니다. - -- self(name:string) 문법으로 변경 이벤트 역시 링크 - -- 할 수 있습니다. - } -end -function myClass.Getter.Text(self) - return self._box.Text -end - -local myImported = Class(myClass) -local myButton = myImported() -myButton:GetPropertyChangedSignal("Text"):Connect(function() - print(myButton.Text) -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/md/kr/include/locales.md b/md/kr/include/locales.md deleted file mode 100644 index cd56585..0000000 --- a/md/kr/include/locales.md +++ /dev/null @@ -1,48 +0,0 @@ - -**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) diff --git a/md/kr/include/mounts.md b/md/kr/include/mounts.md deleted file mode 100644 index ce43e8c..0000000 --- a/md/kr/include/mounts.md +++ /dev/null @@ -1,61 +0,0 @@ -`#!ts :Unmount()` -
- -이렇게 하면 마운트된 Instance 를 지워버립니다. Quad 는 안전한 메모리 관리를 위해 gc 의 기능에 의존하므로, gc 시간차로 인해 `#!ts Store.GetObject` 에서 오브젝트가 사라지는데 시간이 걸릴 수 있습니다. - -```lua --- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui,mainFrame) - -local childFrame = Frame {} -local childFrameMount = Mount(mainFrame,childFrame) -childFrameMount:Unmount() --- childFrame 은 단순히 .Parent = nil 되는 것을 넘어 메모리에서 사라집니다 --- 즉, Destroy() 가 호출됩니다 -``` -- ---- - -`#!ts :Add(item:any)` -
- -Mount 에 오브젝트를 추가합니다. 처음 설정한 `to` 값을 따라 부모가 결정됩니다. - -이 동작은 리스트를 만들 때 유용할 수 있습니다. *다시로드 동작시 직접 제거가 필요하지 않습니다* - -```lua -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Class,Mount = Quad.Class,Quad.Mount - -local Frame = Class "Frame" - -local mainFrame = Frame {} -Mount(ScreenGui, mainFrame) - -local lastListMount = Mount(mainFrame) -local function refreshList() - lastListMount:Unmount() -- 이전 children 을 알아서 제거합니다 - for i = 1,10 do - lastListMount:Add(Frame { Name = tostring(i) }) - end -end - -task.spawn(function() - while true do - refreshList() - task.wait(2) - end -end) -``` - -다음과 같이 이전 children 을 간접적으로 제거하고 새로운 오브젝트를 추가합니다. 단 `ScrollFrame` 의 경우 `CanvasPosition`이 초기화 되어버리므로 자식들을 `#!ts :Unmount()` 하기 전에 위치를 저장하고 다시 불러와야 합니다 -diff --git a/md/kr/include/objectList.md b/md/kr/include/objectList.md deleted file mode 100644 index eafb7be..0000000 --- a/md/kr/include/objectList.md +++ /dev/null @@ -1,19 +0,0 @@ -`#!ts :Each((item:any, index:number)->())` -> 일반적인 반복입니다. for 를 사용하는것과 효과가 같으나 함수를 이용합니다 - ---- - -`#!ts :EachAsync((item:any, index:number)->())` -> 반환을 기다리지 않고 바로바로 다음 아이템으로 넘어갑니다. -> 코루틴이 이용됩니다. `wrap()` 코루틴을 모르거나, 필요성이 없는경우 일반적으로 `#!ts :Each` 를 사용해도 됩니다 - ---- - -`#!ts :IsEmpty()` -> 이 ObjectList 가 비어있는지 여부를 반환합니다. - ---- - -`#!ts :Remove(indexOrItem:number|any)` -> objectList 에서 해당하는 오브젝트를 제거합니다. -> , & 를 사용한 고급 검색에서는 작동하지 않습니다 diff --git a/md/kr/include/quad.md b/md/kr/include/quad.md deleted file mode 100644 index e69de29..0000000 diff --git a/md/kr/include/quadProperty.md b/md/kr/include/quadProperty.md deleted file mode 100644 index 3c6c459..0000000 --- a/md/kr/include/quadProperty.md +++ /dev/null @@ -1,22 +0,0 @@ -`#!ts RoundSize:number?` -> `ImageLabel`, `ImageButton` 에만 사용할 수 있는 속성입니다. 원형 이미지에 Slice를 이용해 둥근 프레임을 구현합니다. 일반적으로 `UICorner`보다 부드러운 코너효과를 제공합니다. - ---- - -`#!ts Corner:number?` -> 모든 로블록스 UI오브젝트에 적용됩니다. `UICorner`를 이용해 모서리 부분을 둥글게 만듭니다. 자식 오브젝트에는 적용되지 않습니다. - ---- - -`#!ts PaddingAll:UDim?` -> `UIPadding`을 적용합니다. 상하좌우 모두 같은 값으로 적용됩니다. `PaddingAllOffset` 과 함깨 사용할 수 없습니다. - ---- - -`#!ts PaddingAllOffset:number?` -> `UIPadding`을 적용합니다. `PaddingAll`과 같은 방법으로 작동하나, `Offset`값만 설정할 수 있습니다. `PaddingAll` 과 함깨 사용할 수 없습니다. - ---- - -`#!ts Scale:number?` -> `UIScale`을 적용합니다. `#!ts UIScale.Scale` 과 같은 효과를 나타냅니다 diff --git a/md/kr/include/register.md b/md/kr/include/register.md deleted file mode 100644 index 3fb4d08..0000000 --- a/md/kr/include/register.md +++ /dev/null @@ -1,328 +0,0 @@ - -`register` 특수 메소드가 적용되는 순서는 다음과 같습니다. - -`#!ts :Add(value:any)->register` -
- -값에 더하기를 취합니다. 음수형태가 제공되는 경우 빼기 처럼 작동합니다. -`number`, `Udim`, `UDim2`, `Color3`, `Vector2` 등 더할 수 있는 모든것을 사용할 수 있습니다 -```lua --- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -myStore.pos = UDim2.fromOffset(100,0) - -Frame "mainFrame" { - Position = myStore "pos":Add(UDim2.fromOffset(0,100)); -} -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -while true do - myStore.pos = myStore.pos + UDim2.fromOffset(10,0) - task.wait(2) -end -``` -???+ Warning "주의" - 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다 -- ---- - -`#!ts :With((store:valueStore, newValue:any, key:string)->())->register` -
- -함수 또는 테이블에서 값을 가져옵니다. Add 보다 나중에 수행됩니다. -첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다 - -=== "간략한 용법" - - ```lua - myStore "size":With(function (_,value) - return value * 2 - end) - ``` - -=== "예제 - 함수" - - `width` 값에 맞춰 자동으로 UI 가 업데이트되도록 만듭니다. - - ```lua - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Store = Quad.Store - local Class = Quad.Class - local Mount = Quad.Mount - - local Frame = Class "Frame" - local myStore = Store.GetStore("myStore") - - myStore.topbarSize = 60 - myStore.width = 200 - - -- 레지스터를 변수로 두고 사용합니다 - local listItemSize = myStore "width":With(function() - return UDim2.fromOffset(myStore.width,60) - end) - - Frame "mainFrame" { - Class "UIListLayout" { SortOrder = Enum.SortOrder.LayoutOrder }; - - -- 사이즈가 width 에 맞게 업데이트됩니다 - Size = myStore "width":With(function () - return UDim.fromOffset(store.width,400) - end); - - Frame "Topbar" { - LayoutOrder = 1; - BackgroundColor3 = Color3.fromRGB(255,0,0); - -- 이렇게 여러 값을 묶어서 두 값이 변경됨, 혹은 그이상을 - -- 만들 수 있습니다. - Size = myStore "topbarSize,width":With(function() - return UDim2.fromOffset(myStore.width,myStore.topbarSize) - end); - } - Frame "ListItem" { - LayoutOrder = 2; - BackgroundColor3 = Color3.fromRGB(0,255,0); - Size = listItemSize; - }; - Frame "ListItem" { - LayoutOrder = 3; - BackgroundColor3 = Color3.fromRGB(0,0,255); - Size = listItemSize; - }; - } - - Mount(ScreenGUI, Store.GetObject("mainFrame")) - - -- width 값을 변경해보세요 - while true do - myStore.width = myStore.width + 10 - task.wait(1) - end - ``` - -=== "예제 - 테이블" - - `colors` 테이블 안에 있는 색깔들을 돌아가며 보여줍니다. - - ```lua - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Store = Quad.Store - local Class = Quad.Class - local Mount = Quad.Mount - - local Frame = Class "Frame" - local myStore = Store.GetStore("myStore") - - local colors = { - Color3.fromRGB(255,255,255); - Color3.fromRGB(255,255,0); - Color3.fromRGB(0,255,255); - Color3.fromRGB(255,0,255); - Color3.fromRGB(255,0,0); - Color3.fromRGB(0,255,0); - Color3.fromRGB(0,0,255); - } - myStore.color = 1 - - Frame "mainFrame" { - Size = UDim2.fromOffset(200,200); - -- colors 에서 인덱싱해 값을 가져옵니다 - BackgroundColor3 = myStore "color":With(colors); - } - Mount(ScreenGUI, Store.GetObject("mainFrame")) - - -- 인덱스를 순회합니다 - while task.wait(1) do - myStore.color = (i-1)%(#colors)+2 - end - ``` - -???+ Warning "주의" - 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다 -- ---- - -`#!ts :Tween(options:TweenOptions)->register` -
- -트윈을 이용해 변경사항을 적용합니다(처음 오브젝트 생성시에는 적용되지 않음) 옵션은 Tween 문서에 나와있는 옵션과 같습니다. - -=== "간략한 용법" - - ```lua - -- Tween 옵션을 넣을 수 있습니다 - myStore "size":Tween{ Time = 2 } - ``` - -=== "예제 - 한꺼번에 이동" - - 프레임을 한꺼번에 움직입니다. - - ```lua - local ScreenGUI = script.Parent - local Quad = require(path.to.module).Init() - local Store = Quad.Store - local Class = Quad.Class - local Mount = Quad.Mount - local Style = Quad.Style - - local Frame = Class "Frame" - local myStore = Store.GetStore("myStore") - myStore.pos = UDim2.fromOffset(50,0) - Style "TweenFrame" { - Size = UDim2.fromOffset(50,50); - BackgroundColor3 = Color3.fromRGB(255,100,255); - } - - Frame "mainFrame" { - BackgroundColor3 = Color3.fromRGB(255,255,255); - Size = UDim2.fromOffset(500,500); - Frame "TweenFrame" { - Position = myStore "pos":Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,100)) - :Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,200)) - :Tween{Time = 2}; - }; - Frame "TweenFrame" { - Position = myStore "pos" - :Add(UDim2.fromOffset(0,300)) - :Tween{Time = 2}; - } - } - - Mount(ScreenGUI, Store.GetObject("mainFrame")) - - local on = false - while true do - on = not on - myStore.pos = on and UDim2.fromOffset(400,0) or UDim2.fromOffset(50,0) - task.wait(1.5) -- 트윈은 덮어 쓸 수 있습니다 - -- 따라서 2 초인 길이보다 더 빨리 바꿔도 오류가 일어나지 않습니다 - end - ``` -???+ Warning "주의" - 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다 -- ---- - -`#!ts :Default(value:any)->register` -
- -기본값을 정합니다. 만약 값이 `#!lua nil` 인 경우 이 값을 사용하게 됩니다. Add 나 With 등 다른것에 영향받지 않습니다. -```lua --- 용법 -local ScreenGUI = script.Parent -local Quad = require(path.to.module).Init() -local Store = Quad.Store -local Class = Quad.Class -local Mount = Quad.Mount - -local Frame = Class "Frame" -local myStore = Store.GetStore("myStore") - -Frame "mainFrame" { - Size = UDim2.fromOffset(200,200); - -- color 값이 없으므로 Default 안의 값이 사용됩니다. - BackgroundColor3 = myStore "color" - :Default(Color3.fromRGB(255,0,0)); -} - -Mount(ScreenGUI, Store.GetObject("mainFrame")) - -task.wait(5) -myStore.color = Color3.fromRGB(0,255,0) -``` -???+ Warning "주의" - + 처음 오브젝트가 생성될 때에만 이 값이 사용됩니다. - + 구조의 복잡성을 피하고자, 여러번 호출시 가장 마지막 호출된 것만 사용됩니다. -- ---- - -`#!ts :Register((store:valueStore, newValue:any, key:string)->())->INPUT` -
- -레지스터에 함수를 등록합니다. 값이 변경되면 함수가 실행됩니다. 첫번째 값에는 편의상 스토어 값이 제공되며, 새로운 값과, 바뀐 값에 대한 키가 제공됩니다 - -`newValue` 에는 `:Add`, `:With`, `:Tween`, `:Default` 가 따로 계산되지 않으며, 설정된 값을 아무 가공 없이 제공합니다 - -=== "간략한 용법" - - ```lua - myStore.test = 1 - -- 반환 값은 입력으로 넣은 함수입니다. !꼭 저장해야합니다 - -- :Register 는 함수가 사라지지 않도록 값을 유지하지 않습니다 - -- 만약 버릴 경우 일정 시간 뒤 연결이 끊어질 수 있습니다 - local func = myStore "test":Register(function(_,newValue) - -- 값 변경시 출력됩니다 - print(newValue) - end) - myStore.test = 2 - ``` - - -=== "예제 - 여러 변경사항 추적" - - `#!ts myStore.test1`, `#!ts myStore.test2` 가 변화하면 print 함수를 실행합니다. - - ```lua - local Quad = require(path.to.module).Init() - local Store = Quad.Store - - local myStore = Store.GetStore("myStore") - - myStore.test1 = 1 - myStore.test2 = "Hello" - - local func = myStore "test1,test2":Register(function() - print(myStore.test1,myStore.test2) - end) - - myStore.test1 = 2 - ``` -???+ Warning "주의" - Register 안에 들어간 함수는 GC 안정성을 위해서 약한 참조로 저장됩니다. 따라서 함수를 저장해야합니다. -- ---- - -`#!ts :Observe((newValue:any)->())` -
- -`#!ts :Register`의 간소화 버전입니다. `:Register`와 다르게 자동적으로 들어간 함수를 GC 로 부터 보호하기 때문에 들어간 함수를 따로 저장 할 필요가 없으며, 인자는 `newValue` 하나만 주어집니다. - -`newValue` 는 `:Add`, `:With`, `:Tween`, `:Default` 가 계산된 상태로 제공됩니다. - -=== "간략한 용법" - - ```lua - myStore.test = 1 - myStore "test":Add(1):Observe(function(_,newValue) - -- 값 변경시 출력됩니다 - print(newValue) - end) - myStore.test = 2 - ``` -- - - diff --git a/md/kr/include/tween.md b/md/kr/include/tween.md deleted file mode 100644 index 856b4f3..0000000 --- a/md/kr/include/tween.md +++ /dev/null @@ -1,85 +0,0 @@ -`#!ts Tween.RunTween(Item:any, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)->TweenHandler` -> 트윈을 실행합니다. 트윈 옵션에 대한 정보는 [TweenOptions](./tweenOptions.md) 문서에서 찾을 수 있습니다. -> `Ended`, `OnStepped`, `Setter`, `Getter` 값이 설정되면 `Option` 안의 값보다 우선적으로 사용됩니다. 기능은 [TweenOptions](./tweenOptions.md)의 내용과 같습니다. -> 나중에 트윈을 중단시킬 수 있도록 `TweenHandler` 가 제공됩니다. -> 다른 트윈이 변경중인 속성이 다시 트윈하도록 호출되면, 이전 트윈에서 해당 속성은 트윈이 중단되며 새로운 트윈으로 덮어쓰기 됩니다. -```lua -Tween.RunTween(myFrame,{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -``` - ---- - -`#!ts Tween.RunTweens(Items:{[number]:any}, Option:tweenOptions, Properties:{[string]:Lerpable}, Ended?, OnStepped?, Setter?, Getter?)` -> `#!ts Tween.RunTween` 와 같으나 여러 오브젝트를 한꺼번에 트윈합니다. 아무것도 반환하지 않습니다 -```lua -Tween.RunTween({myFrame1, myFrame2, myFrame3},{ - Time = 1; -},{ - Position = UDim2.new(1,0,1,0); -}) -``` - ---- - -`#!ts Tween.StopTween(ItemOrHandler:TweenHandler|any)` -
- -트윈을 멈춥니다. `TweenHandler` 또는 오브젝트를 넣어 멈출 수 있습니다. 오브젝트를 넣으면 그 오브젝트에 실행중인 모든 트윈을 멈춥니다. - -=== "TweenHandler 이용" - - ```lua - local Handler = Tween.RunTween(myFrame,{ - Time = 1; - },{ - Position = UDim2.new(1,0,1,0); - }) - - Tween.StopTween(Handler) - ``` - -=== "오브젝트 이용" - - ```lua - local Handler = Tween.RunTween(myFrame,{ - Time = 1; - },{ - Position = UDim2.new(1,0,1,0); - }) - - Tween.StopTween(myFrame) - ``` -- ---- - -`#!ts Tween.StopPropertyTween(Item:any, PropertyName:string)` -> 오브젝트에 특정 프로퍼티의 트윈을 중단시킵니다. `TweenHandler` 는 사용할 수 없습니다. - ---- - -`#!ts Tween.StopPropertyTween(ItemOrHandler:IsTweening|any)->boolean` -> 해당 오브젝트 또는 `TweenHandler` 로 트윈이 진행중인지 여부를 판단합니다. - ---- - -`#!ts Tween.IsPropertyTweening(Item:any, PropertyName:string)` -> 해당 오브젝트의 프로퍼티가 트윈중이지 여부를 판단합니다. `TweenHandler` 는 사용할 수 없습니다. - ---- - -`Tween.Easings: { [string]: EasingFunction }` -> 이징 함수들이 담겨있습니다. -{!include/typeEasings.md!} -> 그래프와 미리보기는 [Easings](./easings.md) 에서 확인할 수 있습니다 - ---- - -`Tween.Easings: { [string]: EasingFunction }` -> 이징 함수들이 담겨있습니다. -{!include/typeDirections.md!} -> 자세한 정보는 [Easings](./directions.md) 에서 확인할 수 있습니다 diff --git a/md/kr/include/tweenOptions.md b/md/kr/include/tweenOptions.md deleted file mode 100644 index 51bbc1e..0000000 --- a/md/kr/include/tweenOptions.md +++ /dev/null @@ -1,55 +0,0 @@ - -==Option== `#!ts Time:number?` -> 트윈의 총 길이를 정합니다. *아무 값도 지정하지 않으면 `#!ts 1`이 사용됩니다.* - ---- - -==Option== `#!ts Easing:string|(index:number)->number?` -> 트윈의 가감속 정도를 결정합니다. 문자열 그대로 사용하거나, `#!ts Tween.Easings.Linear`와 같이 열거형 방식으로 사용할 수 있습니다. -> 혹은 필요에 따라 함수를 지정할 수도 있습니다. 함수를 Easing 으로 사용하는 경우 첫번째 인자로 1차 진행도 (Linear, 0 에서 1 사이의 값) 값이 주어지며, 계산 결과로 실제 적용될 위치를 반환해야합니다. 반환값은 음수이거나 1 보다 클 수 있습니다. -> *아무 값도 지정하지 않으면 `Exp2`가 사용됩니다.* -{!include/typeEasings.md!} -> 함수에 관한 자세한 설명과 미리보기는 [여기에서](../reference/tween/easings) 확인하세요 - ---- - -==Option== `#!ts Direction:string?` -> 트윈이 진행되는 방향입니다. 문자열 그대로 사용하거나, `#!ts Tween.Directions.Out`과 같이 열거형 방식으로 사용할 수 있습니다. -> *아무 값도 지정하지 않으면 `Out`이 사용됩니다.* -{!include/typeDirections.md!} -> 방향에 관한 자세한 설명과 미리보기는 [여기에서](../reference/tween/directions) 확인하세요 - ---- - -==Option== `#!ts CallBack:{[number|"*"|string]:(Item:any, Alpha:number, AbsolutePercent:number)->()}?` -> 선택적인 필드이며, 트윈이 실행중인 도중에 함수를 실행시킬 수 있습니다. 트윈의 진행 정도에 따라서 한번 함수가 실행되거나 트윈 진행중 계속해서 실행되도록 만들 수 있습니다. -> 인덱스가 숫자인 경우 해당 지점을 넘을 때 함수가 실행되도록 만들 수 있으며, `#!lua "*"` 를 인덱스로 사용하면 모든 부분에서 함수가 실행됩니다. -> 함수에는 편의상 트윈을 하고있는 오브젝트, 위치값, 시간만을 고려한 1차 위치값이 제공됩니다. - ---- - -==Option== `#!ts OnStepped:(Item:any, Alpha:number, AbsolutePercent:number)->()?` -> CallBack 에 `#!lua "*"` 를 넣은것과 동일한 효과를 가지는 별칭입니다 - ---- - -==Option== `#!ts Ended:(Item:any, Alpha:number, AbsolutePercent:number)->()?` -> CallBack 에 `#!lua 1`을 넣은것과 동일한 효과를 가지는 별칭입니다 - ---- - -==Option== `#!ts Getter:(Item:any, Property:string)->any?` -> 선택적인 필드이며, 트윈이 값을 얻으려 할 때 사용할 함수입니다. -> 함수에 트윈하고 있는 오브젝트, 프로퍼티 이름이 제공됩니다. -> ???+ warning - `#!ts register:Tween()` 와 호환되지 않습니다. - ---- - -==Option== `#!ts Getter:(Item:any, Property:string, Value:Lerpable)->any?` -> 선택적인 필드이며, 트윈이 값을 설정하려 할 때 사용할 함수입니다. -> 함수에 트윈하고 있는 오브젝트, 프로퍼티 이름, 설정할 값이 제공됩니다. -> ???+ warning - `#!ts register:Tween()` 와 호환되지 않습니다. - - diff --git a/md/kr/include/typeDirections.md b/md/kr/include/typeDirections.md deleted file mode 100644 index 1810f4b..0000000 --- a/md/kr/include/typeDirections.md +++ /dev/null @@ -1,9 +0,0 @@ -```ts -type Direction = - // 초반에 가속이 이루워지며, 후반에 느려집니다. - "Out" - // 초반에는 느리며, 점점 가속이 늘어납니다. - |"In" - //중간에서 가장 빠른 속도를 가지며, 후반 초반 모두 감속이 이루워집니다. - |"InOut" -``` \ No newline at end of file diff --git a/md/kr/include/typeEasings.md b/md/kr/include/typeEasings.md deleted file mode 100644 index 2952cbf..0000000 --- a/md/kr/include/typeEasings.md +++ /dev/null @@ -1,17 +0,0 @@ -```ts -type Easing = - "Linear" // 아무런 가감속이 없는 1차형 - |"Quint" // 5 제곱 - |"Quart" // 네제곱 - |"Cubic" // 세제곱 - |"Quad" // 제곱 - |"Sin" // 사인 파형 - |"Circle" // 사분원 - |"Expo" // 지수형 - |"Elastic" // 탄성 - |"Bounce" // 튀어오름 - |"Back" // 뒤로 가감속 - |"Exp2" // 덜 가파른 지수 i=exp(x)/max, x=-4 to 2 - |"Exp4" // 더 가파른 지수 i=exp(x)/max, x=-4 ~ 4 - |EasingFunction?; -``` \ No newline at end of file diff --git a/md/kr/index.md b/md/kr/index.md deleted file mode 100644 index ab76e71..0000000 --- a/md/kr/index.md +++ /dev/null @@ -1,5 +0,0 @@ - -# Quad - -처음오셨나요? [튜토리얼 문서](tutorial)를 읽어보세요! -처음부터 차근차근 Quad 모듈을 정복할 수 있어요 diff --git a/md/kr/license.md b/md/kr/license.md deleted file mode 100644 index 6d61b12..0000000 --- a/md/kr/license.md +++ /dev/null @@ -1,119 +0,0 @@ - -# 라이선스 - -QwreeyKawaii License v1.3 - -=== "Korean" - - | Permissions | Limitations | Conditions | - |-------------|-------------|------------| - | ✅ 상업적 사용 | ❎ 보증 | ❓ 라이선스와 저작권 고지 (권고사항) | - | ✅ 배포 | ❎ 무례하게 굴기 | | - | ✅ 변경/수정/2차저작 | ❎ 러시아를 비롯한 전쟁을 돕는 | | - | ✅ 개인적 사용 | ❎ 아무런 변경사항 없이 복제 | | - - ``` - QwreeyKawaii license v1.3 - Copyright 2023. Qwreey [qwreey75@gmail.com] - - 이 라이선스는 DBAD 라이선스를 기반으로 합니다. - 누구든지 이 라이선스 문서의 원본 혹은 수정본을 - 복사, 편집, 배포 할 수 있습니다. - - QwreeyKawaii 라이선스의 복사 배포 및 수정에 - 관한 규정과 조건. - - 1. 당신은 이 귀여운 창작물을 가지고 어떠한 - 것이든 할 수 있습니다. 단, 무례하지 마세요. - 무례한 행동은 통상적으로 다음과 같습니다. - - 가. 귀여운 이 창작물을 어떠한 가공도 없이 - 복제하거나, 이름만 바꾸는 것은 무례하며 - 노골적인 저작권 침해입니다. - 나. 귀여운 이 창작물에 음란성 혹은 유해한 - 콘텐츠를 포함시키는 것은 무례합니다. - 귀여운 콘텐츠로 다른이를 해치지 마십시오. - - 그러나 이에만 국한되는것은 아닙니다. - 무엇보다도, 귀여운 타인을 상처주지 마세요. - - 2. 당신이 이 창작물을 사용해 많은 이득을 본 - 경우, 귀여운 창작자에게 사랑을 배푸세요. - 인간적인 사람은 귀여운 사람들을 외면하지 - 않습니다. 당신의 커피 한잔을 나눠주세요. - - 3. 이 창작물은 어떠한 보증 없이 제공됩니다. - 이 창작물을 사용하다, 창작자의 귀여운 - 실수로 인해 무언가 잘못되었다면, 문제를 직접 - 해결하세요. 무례하지 않은 사람은 적어도 - 귀여운 타인들을 비난하거나 모욕하지는 않으며 - 수정본을 제출하거나 버그리포트를 제출 할 - 것입니다. - - 4. 당신이 이 귀여운 창작물을 활용해 다른 창작물 - 을 만들고 싶은 경우 적어도 사용했다는 고지는 - 남겨주세요. 귀여운 창작자들은 자신의 창작물이 - 좋은곳에 사용되었음을 기뻐할 것입니다. - * 이는 권고 사항입니다. 필수가 아니며 불가피한 - 경우 무시될 수 있습니다 - - 5. 러시아 국적의 이들은 이 창작물을 영리 목적으로 - 사용할 수 없습니다. - 우리는 전쟁자금을 - 지원하지 않습니다. - 같은 이유로써, 전쟁이 지원될 수 있는 곳에서의 - 이 창작물 사용을 허용하지 않습니다. - ``` - -=== "English" - - | Permissions | Limitations | Conditions | - |-------------|-------------|------------| - | ✅ Commercial use | ❎ Warranty | ❓ License and copyright notice (Recommendation) | - | ✅ Distribution | ❎ Being Rude | | - | ✅ Modification | ❎ Russian, And supporting war | | - | ✅ Private use | ❎ Copy without any modification | | - - ``` - QwreeyKawaii license v1.3 - - Copyright 2023. Qwreey [qwreey75@gmail.com] - - This license is based on DBAD license. - Everyone is permitted to copy and distribute - verbatim or modified copies of this license - document. - - TERMS, AND CONDITIONS FOR COPYING, - DISTRIBUTION, AND MODIFICATION - - 1. You can do anything with this original work, - but don't be rude - - In general, being rude includes below - - First. Do not copy these cute works without - any modification. changing the name - only is outright copyright infringement - Second. Do not add some harmful or NSFW content. - It's very rude and may harm others - - Being rude is not limited to these instances. - Above all, don't hurt cute people - - 2. If you get any benefit or profit from these cute - works, Share the love. A polite person may share - the love with cute people. - 3. These cute works are provided with no warranty. - If something goes wrong due to the creator's cute - mistake, Fix it yourself. A polite person may - submit the fix or bug report. - 4. If you create something with these works, Leave - the original creator's name in your work. - the cute creator will be happy if their works are - used for good. - * This is a recommendation. Not required. - 5. Russian nationality can not use this creation for - commercial purposes. — We do not support the war. - Same reason, This creation cannot be used where - it can support the war. - ``` \ No newline at end of file diff --git a/md/kr/reference/event.md b/md/kr/reference/event.md deleted file mode 100644 index 87f2018..0000000 --- a/md/kr/reference/event.md +++ /dev/null @@ -1,3 +0,0 @@ -# Event - -{!include/evnets.md!} diff --git a/md/kr/reference/extend.md b/md/kr/reference/extend.md deleted file mode 100644 index 89e7514..0000000 --- a/md/kr/reference/extend.md +++ /dev/null @@ -1,3 +0,0 @@ -# Extend - -{!include/extend.md!} diff --git a/md/kr/reference/index.md b/md/kr/reference/index.md deleted file mode 100644 index e539bba..0000000 --- a/md/kr/reference/index.md +++ /dev/null @@ -1,4 +0,0 @@ - -# Reference - -이 섹션은 api 내용을 나열하지만, 깊게 설명하지 않을 수 있습니다. [튜토리얼 문서](../tutorial/index.md)를 읽어보는것을 권장합니다. diff --git a/md/kr/reference/lang.md b/md/kr/reference/lang.md deleted file mode 100644 index 9860e12..0000000 --- a/md/kr/reference/lang.md +++ /dev/null @@ -1,17 +0,0 @@ -# Lang - -`#!ts Lang.FailedMessage:string` -> 아무런 번역 값도 얻어오지 못하였을때 보여줄 문자열입니다. -> 변경시 자동으로 업데이트가 이루워집니다. - ---- - -`#!ts Lang.CurrentLocale:Locale