WebViewComponent

UI와 월드에 웹뷰(WebView)를 배치합니다. 웹 페이지의 조작 가능 여부, 탐색 방법 등을 설정할 수 있습니다.

# Properties

[{"index":"boolean ClickingEnabled (Sync)","0":"웹뷰에서 클릭을 가능하게 할지 여부입니다."}]

[{"index":"DragMode DragMode","0":"웹뷰 내에서 드래그했을 때 어떻게 동작할지 설정합니다."}]

[{"index":"float DragThreshold","0":"드래그 시 클릭으로 인식하지 않게 만들기 위한 임곗값입니다. 수치가 매우 높으면 드래그가 클릭으로 인식될 수 있습니다."}]

[{"index":"boolean HoveringEnabled (Sync)","0":"마우스를 웹뷰 위에 올려놓았을 때 웹 요소와 상호작용 가능 여부를 설정합니다."}]

[{"index":"boolean IgnoreMapLayerCheck (Sync)","0":"SortingLayer에 Map Layer 이름을 지정했을 때 자동 치환을 수행하지 않습니다."}]

[{"index":"int32 OrderInLayer (Sync)","0":"같은 Layer 내의 우선순위를 결정합니다. 수가 클수록 앞에 보입니다."}]

[{"index":"int32 PixelPerUnit (Sync)","0":"1 Unit 당 표시될 픽셀의 수 입니다. 100부터 500까지의 값을 사용합니다."}]

[{"index":"boolean ScrollingEnabled (Sync)","0":"웹뷰에서 스크롤 가능 여부를 설정합니다."}]

[{"index":"float ScrollSensitivity","0":"마우스 휠로 페이지를 스크롤 할 때 얼마나 많이 스크롤 될지 결정합니다."}]

[{"index":"string SortingLayer (Sync)","0":"2개 이상의 엔티티가 겹쳤을 때 Sorting Layer에 따라 보이는 우선순위가 결정됩니다."}]

[{"index":"string Url (Sync)","0":"웹 페이지의 주소입니다. Url을 변경하면 해당 웹 페이지를 불러옵니다. 변경 횟수는 1분 당 10회로 제한됩니다. 프로토콜은 http, https만 사용할 수 있습니다."}]

##### inherited from Component:

[{"index":"boolean Enable (Sync)","0":"컴포넌트 활성화 여부를 확인합니다."}]

[{"index":"boolean EnableInHierarchy (ReadOnly) (HideFromInspector)","0":"계층 구조상에서 이 컴포넌트가 Enable 상태인지를 반환합니다. Enable이 true일지라도 엔티티의 Enable이 false라면 false를 반환합니다."}]

[{"index":"Entity Entity (ReadOnly)","0":"이 컴포넌트를 소유한 엔티티입니다."}]

# Methods

[{"index":"void Click(Vector2 normalizedPosition)","0":"주어진 위치를 클릭합니다."}]

[{"index":"void GoBack()","0":"방문 기록의 이전 페이지로 이동합니다."}]

[{"index":"void GoForward()","0":"방문 기록의 다음 페이지로 이동합니다."}]

[{"index":"void Reload(string targetUserId = nil) (Client)","0":"현재 페이지를 다시 로드합니다."}]

[{"index":"void Scroll(Vector2 scrollDelta)","0":"주어진 scrollDelta만큼 스크롤 합니다. scrollDelta는 정규화된 값입니다."}]

[{"index":"void ScrollAt(Vector2 scrollDelta, Vector2 normalizedPosition)","0":"주어진 위치에서 scrollDelta만큼 스크롤 합니다. scrollDelta와 point는 정규화된 값입니다."}]

[{"index":"void ZoomIn()","0":"페이지를 조금씩 확대합니다. 줌 상태는 페이지별로 각각 유지됩니다."}]

[{"index":"void ZoomOut()","0":"페이지를 조금씩 축소합니다. 줌 상태는 페이지별로 각각 유지됩니다."}]

##### inherited from Component:

[{"index":"boolean IsClient()","0":"현재 실행 환경이 클라이언트인지 아닌지의 여부를 반환합니다."}]

[{"index":"boolean IsServer()","0":"현재 실행 환경이 서버인지 아닌지의 여부를 반환합니다."}]

# Events

[{"index":"OrderInLayerChangedEvent","0":"Component의 OrderInLayer가 변경되었을 때 발생하는 이벤트입니다."}]

[{"index":"SortingLayerChangedEvent","0":"컴포넌트의 SortingLayer가 변경되었을 때 발생하는 이벤트입니다."}]

[{"index":"WebLoadCompleteEvent","0":"웹 페이지 로드 완료 시 발생하는 이벤트입니다."}]

[{"index":"WebLoadFailEvent","0":"웹 페이지 로드 실패 시 발생하는 이벤트입니다."}]

[{"index":"WebViewClickedEvent","0":"웹뷰에 클릭을 입력했을 때 발생하는 이벤트입니다."}]

[{"index":"WebViewPopupClosedEvent","0":"열린 웹 페이지가 닫힐 때 발생하는 이벤트입니다."}]

[{"index":"WebViewPopupEvent","0":"새로운 웹 페이지가 새로운 창으로 열렸을 때 발생하는 이벤트입니다."}]

# Examples

`+`, `-`키로 웹뷰 화면을 확대/축소하는 예제입니다. 화면 우측에 주소 입력 UI와 앞으로 가기, 뒤로 가기 버튼이 생성됩니다. WebViewComponent가 있는 엔티티에 새로운 컴포넌트를 만들어 추가하고, 아래 코드를 작성합니다.
    
    
    @Component
    script WebViewUIController extends Component
        @ExecSpace("ClientOnly")
        method void OnBeginPlay()
        	local webview = self.Entity.WebViewComponent
        	if webview == nil then
        	    log_error("Entity doesn't have WebViewComponent")
        	    return
        	end
    
        	local webviewGroup = _EntityService:GetEntityByPath("/ui/WebViewGroup")
        	if webviewGroup == nil then
        	    webviewGroup = _SpawnService:SpawnByModelId("model://uigroup", "WebViewGroup", Vector3.zero, _EntityService:GetEntityByPath("/ui"))
        	end
    
        	webviewGroup.Enable = true
    
        	local forwardButton = _SpawnService:SpawnByModelId("model://uibutton", "Button_Forward", Vector3.zero, webviewGroup)
        	local backwardButton = _SpawnService:SpawnByModelId("model://uibutton", "Button_Backward", Vector3.zero, webviewGroup)
        	local urlInputField = _SpawnService:SpawnByModelId("model://uitext", "UIUrlInputField", Vector3.zero, webviewGroup)
        	urlInputField:AddComponent(TextInputComponent)
    
        	forwardButton.UITransformComponent.AlignmentOption = AlignmentType.TopRight
        	backwardButton.UITransformComponent.AlignmentOption = AlignmentType.TopRight
        	urlInputField.UITransformComponent.AlignmentOption = AlignmentType.TopRight
    
        	forwardButton.UITransformComponent.anchoredPosition = Vector2(-40, -155)
        	forwardButton.UITransformComponent.RectSize = Vector2(75, 75)
        	forwardButton.UITransformComponent.ZRotation = 90
        	forwardButton.SpriteGUIRendererComponent.ImageRUID = "000000"
    
        	backwardButton.UITransformComponent.anchoredPosition = Vector2(-115, -155)
        	backwardButton.UITransformComponent.RectSize = Vector2(75, 75)
        	backwardButton.UITransformComponent.ZRotation = 90
        	backwardButton.SpriteGUIRendererComponent.ImageRUID = "000000"
        	backwardButton.SpriteGUIRendererComponent.FlipY = true
    
        	urlInputField.UITransformComponent.Pivot = Vector2(1, 0.5)
        	urlInputField.UITransformComponent.anchoredPosition = Vector2(-155, -155)
        	urlInputField.UITransformComponent.RectSize = Vector2(500, 75)
    
        	urlInputField.SpriteGUIRendererComponent.ImageRUID = "000000"
        	urlInputField.SpriteGUIRendererComponent.Color = Color.white
        	urlInputField.TextComponent.Overflow = OverflowType.Truncate
        	urlInputField.TextComponent.Padding = RectOffset(15, 15, 15, 15)
        	urlInputField.TextComponent.FontColor = Color.white
        	urlInputField.TextComponent.Text = webview.Url
        	urlInputField.TextInputComponent.Text = webview.Url
    
        	-- 각 UI엔티티들에 이벤트 연결
        -- 	urlInputField:ConnectEvent(TextInputEndEditEvent, function (event)
        -- 	        webview.Url = event.text
        -- 	    end)
        -- [Commented: MLUA requires @EventSender + handler pattern]
    
        -- 	backwardButton:ConnectEvent(ButtonClickEvent, function ()
        -- 	        webview:GoBack()
        -- 	    end)
        -- [Commented: MLUA requires @EventSender + handler pattern]
    
        -- 	forwardButton:ConnectEvent(ButtonClickEvent, function ()
        -- 	        webview:GoForward()
        -- 	    end)
        -- [Commented: MLUA requires @EventSender + handler pattern]
    
        	-- 웹 로드 완료 시 InputField를 현재 주소로 갱신
        -- 	self.Entity:ConnectEvent(WebLoadCompleteEvent, function ()
        -- 	        urlInputField.TextComponent.Text = webview.Url
        -- 	    end)
        -- [Commented: MLUA requires @EventSender + handler pattern]
        end
    
        @EventSender("Service", "InputService")
        handler HandleKeyDownEvent(KeyDownEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: InputService
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
        local key = event.key
        ---------------------------------------------------------
        if self.Entity.WebViewComponent == nil then
            return
        end
    
        -- 플러스, 마이너스 키 입력 시 확대, 축소
        if key == KeyboardKey.Equals or key == KeyboardKey.KeypadPlus then
            self.Entity.WebViewComponent:ZoomIn()
        end
    
        if key == KeyboardKey.Minus or key == KeyboardKey.KeypadMinus then
            self.Entity.WebViewComponent:ZoomOut()
        end
        end
    end
    

# SeeAlso

  * SpriteGUIRendererComponent
  * TextComponent
  * UITransformComponent
  * KeyboardKey
  * ButtonClickEvent
  * KeyDownEvent
  * Vector2
  * Vector3
  * EntityService
  * InputService
  * SpawnService