浏览代码

[Raycast] Add UIWidgetsRaycastablePanel

/main
iizzaya 5 年前
当前提交
25f6d10a
共有 11 个文件被更改,包括 139 次插入204 次删除
  1. 33
      Runtime/Plugins/Raycast/RaycastManager.cs
  2. 145
      Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity
  3. 3
      Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs
  4. 2
      Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs
  5. 2
      Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta
  6. 12
      Runtime/engine/UIWidgetsPanel.cs
  7. 49
      Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs
  8. 11
      Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs.meta
  9. 40
      Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs
  10. 46
      Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs
  11. 0
      /Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta

33
Runtime/Plugins/Raycast/RaycastManager.cs


public readonly Dictionary<int, Dictionary<int, RaycastableRect>> raycastHandlerMap =
new Dictionary<int, Dictionary<int, RaycastableRect>>();
public static void VerifyWindow(int windowHashCode) {
public static void NewWindow(int windowHashCode) {
Debug.Log($"New Window: @[{windowHashCode}] ({instance.raycastHandlerMap.Count})");
// Debug.Log($"New Window: @[{windowHashCode}] ({instance.raycastHandlerMap.Count})");
public static void DisposeWindow(int windowHashCode) {
if (instance.raycastHandlerMap.ContainsKey(windowHashCode)) {
// Debug.Log($"Dispose Window: @[{windowHashCode}]");
instance.raycastHandlerMap.Remove(windowHashCode);
}
}
VerifyWindow(windowHashCode);
Debug.Log($"Add To List: [{widgetHashCode}]@[{windowHashCode}]");
if (!instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode)) {
instance.raycastHandlerMap[windowHashCode][widgetHashCode] = new RaycastableRect();
}
// Debug.Log($"Add To List: [{widgetHashCode}]@[{windowHashCode}]");
D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
$"Raycast Handler Map doesn't contain Window {windowHashCode}, " +
$"Make sure using UIWidgetsRaycastablePanel instead of UIWidgetsPanel " +
$"while using RaycastableContainer.");
D.assert(!instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>
$"Raycast Handler Map already contains Widget {widgetHashCode} at Window {windowHashCode}");
instance.raycastHandlerMap[windowHashCode][widgetHashCode] = new RaycastableRect();
Debug.Log($"Mark Dirty: [{widgetHashCode}]@[{windowHashCode}]");
// Debug.Log($"Mark Dirty: [{widgetHashCode}]@[{windowHashCode}]");
D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
$"Raycast Handler Map doesn't contain Window {windowHashCode}");
D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>

}
public static void UpdateSizeOffset(int widgetHashCode, int windowHashCode, Size size, Offset offset) {
D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
$"Raycast Handler Map doesn't contain Window {windowHashCode}");
D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>

Debug.Log($"Update Size Offset: [{widgetHashCode}]@[{windowHashCode}]");
// Debug.Log($"Update Size Offset: [{widgetHashCode}]@[{windowHashCode}]");
instance.raycastHandlerMap[windowHashCode][widgetHashCode]
.UpdateRect(offset.dx, offset.dy, size.width, size.height);
instance.raycastHandlerMap[windowHashCode][widgetHashCode].UnmarkDirty();

public static void RemoveFromList(int widgetHashCode, int windowHashCode) {
Debug.Log($"Remove From List: [{widgetHashCode}]@[{windowHashCode}]");
// Debug.Log($"Remove From List: [{widgetHashCode}]@[{windowHashCode}]");
D.assert(instance.raycastHandlerMap.ContainsKey(windowHashCode), () =>
$"Raycast Handler Map doesn't contain Window {windowHashCode}");
D.assert(instance.raycastHandlerMap[windowHashCode].ContainsKey(widgetHashCode), () =>

145
Runtime/Plugins/Raycast/Sample/Raycast Simple Testbed.unity


m_Component:
- component: {fileID: 238084977}
- component: {fileID: 238084980}
- component: {fileID: 238084979}
- component: {fileID: 238084978}
m_Layer: 5
m_Name: Panel Button With Filter

m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -200, y: 0.0000076294}
m_AnchoredPosition: {x: 0, y: 0.0000076294}
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 238084976}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
m_Name:
m_EditorClassIdentifier:
reversed: 0
--- !u!114 &238084979
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}

- {fileID: 789225035}
- {fileID: 1371170890}
- {fileID: 238084977}
- {fileID: 1262432453}
- {fileID: 409216488}
- {fileID: 2108199658}
m_Father: {fileID: 0}

- component: {fileID: 409216488}
- component: {fileID: 409216491}
- component: {fileID: 409216490}
- component: {fileID: 409216489}
m_Layer: 5
m_Name: Panel Button With Filter (1)
m_TagString: Untagged

m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 354633980}
m_RootOrder: 4
m_RootOrder: 3
m_AnchoredPosition: {x: 150, y: 50}
m_AnchoredPosition: {x: 0, y: -200}
--- !u!114 &409216489
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 409216487}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
m_Name:
m_EditorClassIdentifier:
reversed: 0
--- !u!114 &409216490
MonoBehaviour:
m_ObjectHideFlags: 0

m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1097866537}
m_CullTransparentMesh: 0
--- !u!1 &1262432452
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1262432453}
- component: {fileID: 1262432456}
- component: {fileID: 1262432455}
- component: {fileID: 1262432454}
m_Layer: 5
m_Name: Panel Button With Filter (Reversed)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1262432453
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1262432452}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 354633980}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -200, y: -200}
m_SizeDelta: {x: 300, y: 150}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1262432454
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1262432452}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
m_Name:
m_EditorClassIdentifier:
reversed: 1
--- !u!114 &1262432455
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1262432452}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
m_Texture: {fileID: 0}
m_UVRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
devicePixelRatioOverride: 0
hardwareAntiAliasing: 0
--- !u!222 &1262432456
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1262432452}
m_CullTransparentMesh: 0
--- !u!1 &1371170889
GameObject:
m_ObjectHideFlags: 0

m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -200, y: 200}
m_AnchoredPosition: {x: 0, y: 200}
m_SizeDelta: {x: 300, y: 150}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1371170891

m_GameObject: {fileID: 1371170889}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4fc8b0d34b82c4c63a41e0cde280075a, type: 3}
m_Script: {fileID: 11500000, guid: 15ddf18357c864b1b822b471672fd391, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}

- component: {fileID: 2108199658}
- component: {fileID: 2108199661}
- component: {fileID: 2108199660}
- component: {fileID: 2108199659}
m_Layer: 5
m_Name: Panel Button With Filter (2)
m_TagString: Untagged

m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 354633980}
m_RootOrder: 5
m_RootOrder: 4
m_AnchoredPosition: {x: 227, y: 0}
m_AnchoredPosition: {x: 50, y: -240}
--- !u!114 &2108199659
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2108199657}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2455841904ff14258bae1b28c1363dc0, type: 3}
m_Name:
m_EditorClassIdentifier:
reversed: 0
--- !u!114 &2108199660
MonoBehaviour:
m_ObjectHideFlags: 0

3
Runtime/Plugins/Raycast/Sample/RaycastSimpleTestbedPanel.cs


using Unity.UIWidgets.engine;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.plugins.raycast;

using Material = Unity.UIWidgets.material.Material;
namespace Unity.UIWidgets.Sample {
public class RaycastSimpleTestbedPanel : UIWidgetsPanel {
public class RaycastSimpleTestbedPanel : UIWidgetsRaycastablePanel {
protected override void OnEnable() {
FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
base.OnEnable();

2
Runtime/Plugins/Raycast/Sample/RaycastTestbedPanel.cs


using TextStyle = Unity.UIWidgets.painting.TextStyle;
namespace Unity.UIWidgets.Sample {
public class RaycastTestbedPanel : UIWidgetsPanel {
public class RaycastTestbedPanel : UIWidgetsRaycastablePanel {
protected override void OnEnable() {
FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
base.OnEnable();

2
Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta


fileFormatVersion: 2
guid: 2455841904ff14258bae1b28c1363dc0
guid: e5265d12f7193408b90993bdf987f058
MonoImporter:
externalObjects: {}
serializedVersion: 2

12
Runtime/engine/UIWidgetsPanel.cs


this._displayMetrics.onViewMetricsChanged();
}
protected virtual void InitWindowAdapter() {
D.assert(this._windowAdapter == null);
this._windowAdapter = new UIWidgetWindowAdapter(this);
this._windowAdapter.OnEnable();
}
protected override void OnEnable() {
base.OnEnable();

_repaintEvent = new Event {type = EventType.Repaint};
}
D.assert(this._windowAdapter == null);
this._windowAdapter = new UIWidgetWindowAdapter(this);
this._windowAdapter.OnEnable();
this.InitWindowAdapter();
Widget root;
using (this._windowAdapter.getScope()) {

49
Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs


using Unity.UIWidgets.engine;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.plugins.raycast;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using UnityEngine;
using Color = Unity.UIWidgets.ui.Color;
using Material = Unity.UIWidgets.material.Material;
namespace Unity.UIWidgets.Sample {
public class DefaultSimpleTestbedPanel : UIWidgetsPanel {
protected override void OnEnable() {
FontManager.instance.addFont(Resources.Load<Font>("fonts/MaterialIcons-Regular"), "Material Icons");
base.OnEnable();
}
protected override Widget createWidget() {
return new MaterialApp(
home: new DefaultSimpleTestbedWidget()
);
}
}
public class DefaultSimpleTestbedWidget : StatefulWidget {
public DefaultSimpleTestbedWidget(Key key = null) : base(key) { }
public override State createState() {
return new DefaultSimpleTestbedWidgetState();
}
}
public class DefaultSimpleTestbedWidgetState : State<DefaultSimpleTestbedWidget> {
public override Widget build(BuildContext context) {
return new Material(
color: new Color(0x44FFFF00),
child: new Center(
child: new Container(
child: new MaterialButton(
child: new Text("Material Button"),
onPressed: () => { },
color: Colors.lightBlue
)
)
)
);
}
}
}

11
Runtime/Plugins/Raycast/Sample/DefaultSimpleTestbedPanel.cs.meta


fileFormatVersion: 2
guid: 15ddf18357c864b1b822b471672fd391
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

40
Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs


using Unity.UIWidgets.engine;
using UnityEngine;
namespace Unity.UIWidgets.plugins.raycast {
[RequireComponent(typeof(RectTransform))]
public class UIWidgetsRaycastablePanel : UIWidgetsPanel, ICanvasRaycastFilter {
int windowHashCode;
protected override void InitWindowAdapter() {
base.InitWindowAdapter();
this.windowHashCode = this.window.GetHashCode();
RaycastManager.NewWindow(this.windowHashCode);
}
protected override void OnDisable() {
base.OnDisable();
RaycastManager.DisposeWindow(this.windowHashCode);
}
public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) {
if (!this.enabled) {
return true;
}
Vector2 local;
RectTransformUtility.ScreenPointToLocalPointInRectangle(this.rectTransform, screenPoint, eventCamera,
out local);
Rect rect = this.rectTransform.rect;
// Convert top left corner as reference origin point.
local.x += this.rectTransform.pivot.x * rect.width;
local.y -= this.rectTransform.pivot.y * rect.height;
local.x = local.x / this.devicePixelRatio;
local.y = -local.y / this.devicePixelRatio;
return !RaycastManager.CheckCastThrough(this.windowHashCode, local);
}
}
}

46
Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs


using Unity.UIWidgets.engine;
using UnityEngine;
namespace Unity.UIWidgets.plugins.raycast {
[DisallowMultipleComponent]
[RequireComponent(typeof(UIWidgetsPanel))]
[DefaultExecutionOrder(1)]
public class UIWidgetsPanelRaycastFilter : MonoBehaviour, ICanvasRaycastFilter {
public bool reversed;
UIWidgetsPanel panel;
int windowHashCode;
void OnEnable() {
this.panel = this.GetComponent<UIWidgetsPanel>();
this.windowHashCode = this.panel.window.GetHashCode();
RaycastManager.VerifyWindow(this.windowHashCode);
}
public bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) {
if (!this.enabled) {
return true;
}
Vector2 local;
RectTransformUtility.ScreenPointToLocalPointInRectangle(this.panel.rectTransform, screenPoint, eventCamera,
out local);
Rect rect = this.panel.rectTransform.rect;
// Convert top left corner as reference origin point.
local.x += this.panel.rectTransform.pivot.x * rect.width;
local.y -= this.panel.rectTransform.pivot.y * rect.height;
local.x = local.x / this.panel.devicePixelRatio;
local.y = -local.y / this.panel.devicePixelRatio;
if (this.reversed) {
return RaycastManager.CheckCastThrough(this.windowHashCode, local);
}
else {
return !RaycastManager.CheckCastThrough(this.windowHashCode, local);
}
}
}
}

/Runtime/Plugins/Raycast/UIWidgetsPanelRaycastFilter.cs.meta → /Runtime/Plugins/Raycast/UIWidgetsRaycastablePanel.cs.meta

正在加载...
取消
保存