Add GC-less standalone input module.
This commit is contained in:
@@ -624,7 +624,7 @@ GameObject:
|
|||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 155472387}
|
- component: {fileID: 155472387}
|
||||||
- component: {fileID: 155472386}
|
- component: {fileID: 155472386}
|
||||||
- component: {fileID: 155472385}
|
- component: {fileID: 155472388}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: EventSystem
|
m_Name: EventSystem
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@@ -632,26 +632,6 @@ GameObject:
|
|||||||
m_NavMeshLayer: 0
|
m_NavMeshLayer: 0
|
||||||
m_StaticEditorFlags: 0
|
m_StaticEditorFlags: 0
|
||||||
m_IsActive: 1
|
m_IsActive: 1
|
||||||
--- !u!114 &155472385
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 155472383}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier:
|
|
||||||
m_SendPointerHoverToParent: 1
|
|
||||||
m_HorizontalAxis: Horizontal
|
|
||||||
m_VerticalAxis: Vertical
|
|
||||||
m_SubmitButton: Submit
|
|
||||||
m_CancelButton: Cancel
|
|
||||||
m_InputActionsPerSecond: 10
|
|
||||||
m_RepeatDelay: 0.5
|
|
||||||
m_ForceModuleActive: 0
|
|
||||||
--- !u!114 &155472386
|
--- !u!114 &155472386
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -682,6 +662,26 @@ Transform:
|
|||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 2
|
m_RootOrder: 2
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &155472388
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 155472383}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: d457e7b17951c6940ac8306e52498bbc, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_SendPointerHoverToParent: 1
|
||||||
|
m_HorizontalAxis: Horizontal
|
||||||
|
m_VerticalAxis: Vertical
|
||||||
|
m_SubmitButton: Submit
|
||||||
|
m_CancelButton: Cancel
|
||||||
|
m_InputActionsPerSecond: 10
|
||||||
|
m_RepeatDelay: 0.5
|
||||||
|
m_ForceModuleActive: 0
|
||||||
--- !u!1 &221975151
|
--- !u!1 &221975151
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
8
Assets/Plugins/Cryville.Unity.EventSystems.meta
Normal file
8
Assets/Plugins/Cryville.Unity.EventSystems.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 09459a4ee0cb7664ab6535ea23ac17a2
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "Cryville.Unity.EventSystems",
|
||||||
|
"rootNamespace": "",
|
||||||
|
"references": [],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f27578110a12bd048804c6492d1d9c27
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
using Cryville.Common.Buffers;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.EventSystems;
|
||||||
|
|
||||||
|
namespace Cryville.Unity.EventSystems {
|
||||||
|
[AddComponentMenu("Event/GC-less Standalone Input Module")]
|
||||||
|
public class StandaloneInputModule : UnityEngine.EventSystems.StandaloneInputModule {
|
||||||
|
private bool ShouldIgnoreEventsOnNoFocus() {
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
return !UnityEditor.EditorApplication.isRemoteConnected;
|
||||||
|
#else
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
public override void Process() {
|
||||||
|
if (!eventSystem.isFocused && ShouldIgnoreEventsOnNoFocus()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bool usedEvent = SendUpdateEventToSelectedObject();
|
||||||
|
if (!ProcessTouchEvents() && input.mousePresent) {
|
||||||
|
ProcessMouseEvent();
|
||||||
|
}
|
||||||
|
if (eventSystem.sendNavigationEvents) {
|
||||||
|
if (!usedEvent) {
|
||||||
|
usedEvent |= SendMoveEventToSelectedObject();
|
||||||
|
}
|
||||||
|
if (!usedEvent) {
|
||||||
|
SendSubmitEventToSelectedObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private bool ProcessTouchEvents() {
|
||||||
|
for (int i = 0; i < input.touchCount; i++) {
|
||||||
|
Touch touch = input.GetTouch(i);
|
||||||
|
if (touch.type != TouchType.Indirect) {
|
||||||
|
bool pressed, released;
|
||||||
|
PointerEventData pointer = GetTouchPointerEventData(touch, out pressed, out released);
|
||||||
|
ProcessTouchPress(pointer, pressed, released);
|
||||||
|
if (!released) {
|
||||||
|
ProcessMove(pointer);
|
||||||
|
ProcessDrag(pointer);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
RemovePointerData(pointer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return input.touchCount > 0;
|
||||||
|
}
|
||||||
|
protected new PointerEventData GetTouchPointerEventData(Touch input, out bool pressed, out bool released) {
|
||||||
|
PointerEventData pointerData;
|
||||||
|
bool created = GetPointerData(input.fingerId, out pointerData, create: true);
|
||||||
|
pointerData.Reset();
|
||||||
|
pressed = created || input.phase == TouchPhase.Began;
|
||||||
|
released = input.phase == TouchPhase.Canceled || input.phase == TouchPhase.Ended;
|
||||||
|
if (created) {
|
||||||
|
pointerData.position = input.position;
|
||||||
|
}
|
||||||
|
if (pressed) {
|
||||||
|
pointerData.delta = Vector2.zero;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pointerData.delta = input.position - pointerData.position;
|
||||||
|
}
|
||||||
|
pointerData.position = input.position;
|
||||||
|
pointerData.button = PointerEventData.InputButton.Left;
|
||||||
|
if (input.phase == TouchPhase.Canceled) {
|
||||||
|
pointerData.pointerCurrentRaycast = default(RaycastResult);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
eventSystem.RaycastAll(pointerData, m_RaycastResultCache);
|
||||||
|
pointerData.pointerCurrentRaycast = FindFirstRaycast(m_RaycastResultCache);
|
||||||
|
m_RaycastResultCache.Clear();
|
||||||
|
}
|
||||||
|
pointerData.pressure = input.pressure;
|
||||||
|
pointerData.altitudeAngle = input.altitudeAngle;
|
||||||
|
pointerData.azimuthAngle = input.azimuthAngle;
|
||||||
|
pointerData.radius = Vector2.one * input.radius;
|
||||||
|
pointerData.radiusVariance = Vector2.one * input.radiusVariance;
|
||||||
|
return pointerData;
|
||||||
|
}
|
||||||
|
class PointerEventDataPool : ObjectPool<PointerEventData> {
|
||||||
|
readonly EventSystem _eventSystem;
|
||||||
|
public PointerEventDataPool(EventSystem eventSystem, int capacity) : base(capacity) {
|
||||||
|
_eventSystem = eventSystem;
|
||||||
|
}
|
||||||
|
protected override PointerEventData Construct() {
|
||||||
|
return new PointerEventData(_eventSystem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PointerEventDataPool _pool;
|
||||||
|
protected override void OnEnable() {
|
||||||
|
base.OnEnable();
|
||||||
|
_pool = new PointerEventDataPool(eventSystem, 64);
|
||||||
|
}
|
||||||
|
protected new bool GetPointerData(int id, out PointerEventData data, bool create) {
|
||||||
|
if (!m_PointerData.TryGetValue(id, out data) && create) {
|
||||||
|
data = _pool.Rent();
|
||||||
|
data.pointerId = id;
|
||||||
|
m_PointerData.Add(id, data);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
protected new void RemovePointerData(PointerEventData data) {
|
||||||
|
m_PointerData.Remove(data.pointerId);
|
||||||
|
_pool.Return(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d457e7b17951c6940ac8306e52498bbc
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Reference in New Issue
Block a user