chore(unity): 固定Unity CLI Loop本地包并移除UnitySkills依赖
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace io.github.hatayama.uLoopMCP
|
||||
{
|
||||
public static class KeySymbolMap
|
||||
{
|
||||
private static readonly Dictionary<string, string> Symbols = new()
|
||||
{
|
||||
{ "Space", "\u2423" }, // ␣
|
||||
{ "Enter", "\u23CE" }, // ⏎
|
||||
{ "UpArrow", "\u2191" }, // ↑
|
||||
{ "DownArrow", "\u2193" }, // ↓
|
||||
{ "LeftArrow", "\u2190" }, // ←
|
||||
{ "RightArrow", "\u2192" }, // →
|
||||
{ "Tab", "\u21E5" }, // ⇥
|
||||
{ "Escape", "Esc" },
|
||||
{ "ContextMenu", "Menu" },
|
||||
{ "PrintScreen", "PrtSc" },
|
||||
{ "ScrollLock", "ScrLk" },
|
||||
};
|
||||
|
||||
// Meta key maps to ⌘ on macOS, ⊞ on Windows/Linux
|
||||
private static bool IsMac =>
|
||||
Application.platform == RuntimePlatform.OSXEditor ||
|
||||
Application.platform == RuntimePlatform.OSXPlayer;
|
||||
|
||||
public static string GetSymbol(string keyName)
|
||||
{
|
||||
// Key.LeftMeta.ToString() returns "LeftWindows" in Input System
|
||||
if (keyName == "LeftMeta" || keyName == "RightMeta" ||
|
||||
keyName == "LeftWindows" || keyName == "RightWindows")
|
||||
{
|
||||
return IsMac ? "\u2318" : "\u229E"; // ⌘ or ⊞
|
||||
}
|
||||
|
||||
if (keyName == "LeftCtrl" || keyName == "RightCtrl")
|
||||
{
|
||||
return IsMac ? "\u2303" : "Ctrl"; // ⌃ or Ctrl
|
||||
}
|
||||
|
||||
if (keyName == "LeftAlt" || keyName == "RightAlt")
|
||||
{
|
||||
return IsMac ? "\u2325" : "Alt"; // ⌥ or Alt
|
||||
}
|
||||
|
||||
if (keyName == "LeftShift" || keyName == "RightShift")
|
||||
{
|
||||
return IsMac ? "\u21E7" : "Shift"; // ⇧ or Shift
|
||||
}
|
||||
|
||||
if (keyName == "Backspace")
|
||||
{
|
||||
return IsMac ? "\u232B" : "BS"; // ⌫ or BS
|
||||
}
|
||||
|
||||
if (keyName == "Delete")
|
||||
{
|
||||
return IsMac ? "\u2326" : "Del"; // ⌦ or Del
|
||||
}
|
||||
|
||||
if (Symbols.TryGetValue(keyName, out string symbol))
|
||||
{
|
||||
return symbol;
|
||||
}
|
||||
|
||||
return keyName;
|
||||
}
|
||||
|
||||
// Single non-ASCII characters render smaller than text in most fonts
|
||||
public static bool IsGlyphSymbol(string symbol)
|
||||
{
|
||||
return symbol.Length == 1 && symbol[0] > 127;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3f8551e9ac39140f2a1eb0e3ce81ec15
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace io.github.hatayama.uLoopMCP
|
||||
{
|
||||
public enum KeyboardAction
|
||||
{
|
||||
Press = 0,
|
||||
KeyDown = 1,
|
||||
KeyUp = 2
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 95c39d99bda824fd2b7aedf25ddcd2b1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,140 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8de76314d55f142d687ee8b477288bae
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 16, y: 16, z: 16, w: 16}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 0
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,204 @@
|
||||
#if UNITY_EDITOR
|
||||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace io.github.hatayama.uLoopMCP
|
||||
{
|
||||
public class SimulateKeyboardOverlay : MonoBehaviour
|
||||
{
|
||||
public const float CONTAINER_BACKGROUND_ALPHA = 0.8f;
|
||||
|
||||
private const float PRESS_DISPLAY_DURATION = 0.5f;
|
||||
private const float FADE_DURATION = 0.2f;
|
||||
private const int FONT_SIZE = 48;
|
||||
private const int GLYPH_FONT_SIZE = 64;
|
||||
private static readonly Color ContainerBackgroundColor = new Color(0.15f, 0.15f, 0.15f, CONTAINER_BACKGROUND_ALPHA);
|
||||
|
||||
[SerializeField] private GameObject _container = null!;
|
||||
[SerializeField] private Image _containerImage = null!;
|
||||
|
||||
private readonly List<BadgeEntry> _badgePool = new();
|
||||
private readonly List<string> _cachedKeyNames = new();
|
||||
private readonly List<string> _displayKeys = new();
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
Debug.Assert(_container != null, "_container must be assigned in prefab");
|
||||
Debug.Assert(_containerImage != null, "_containerImage must be assigned in prefab");
|
||||
|
||||
// Prefab keeps preview badges for editor inspection, but runtime badges must start empty.
|
||||
for (int i = _container!.transform.childCount - 1; i >= 0; i--)
|
||||
{
|
||||
DestroyImmediate(_container.transform.GetChild(i).gameObject);
|
||||
}
|
||||
|
||||
_container.SetActive(false);
|
||||
}
|
||||
|
||||
private void LateUpdate()
|
||||
{
|
||||
bool hasHeldKeys = SimulateKeyboardOverlayState.HeldKeys.Count > 0;
|
||||
string? pressKey = SimulateKeyboardOverlayState.PressKey;
|
||||
bool isPressHeld = SimulateKeyboardOverlayState.IsPressHeld;
|
||||
float pressElapsedSinceRelease = 0f;
|
||||
|
||||
if (pressKey != null && !isPressHeld)
|
||||
{
|
||||
pressElapsedSinceRelease = Time.realtimeSinceStartup - SimulateKeyboardOverlayState.PressReleasedTime;
|
||||
if (pressElapsedSinceRelease > PRESS_DISPLAY_DURATION + FADE_DURATION)
|
||||
{
|
||||
SimulateKeyboardOverlayState.ClearPress();
|
||||
pressKey = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasHeldKeys && pressKey == null)
|
||||
{
|
||||
SetBadgeCount(0);
|
||||
_container.SetActive(false);
|
||||
return;
|
||||
}
|
||||
|
||||
_displayKeys.Clear();
|
||||
IReadOnlyList<string> heldKeys = SimulateKeyboardOverlayState.HeldKeys;
|
||||
for (int i = 0; i < heldKeys.Count; i++)
|
||||
{
|
||||
_displayKeys.Add(heldKeys[i]);
|
||||
}
|
||||
|
||||
if (pressKey != null && !_displayKeys.Contains(pressKey))
|
||||
{
|
||||
_displayKeys.Add(pressKey);
|
||||
}
|
||||
|
||||
SetBadgeCount(_displayKeys.Count);
|
||||
_container.SetActive(true);
|
||||
|
||||
float maxAlpha = 0f;
|
||||
for (int i = 0; i < _displayKeys.Count; i++)
|
||||
{
|
||||
float alpha = GetBadgeAlpha(_displayKeys[i], pressKey, isPressHeld, pressElapsedSinceRelease);
|
||||
UpdateBadge(_badgePool[i], i, _displayKeys[i], alpha);
|
||||
if (alpha > maxAlpha)
|
||||
{
|
||||
maxAlpha = alpha;
|
||||
}
|
||||
}
|
||||
|
||||
_containerImage.color = new Color(
|
||||
ContainerBackgroundColor.r,
|
||||
ContainerBackgroundColor.g,
|
||||
ContainerBackgroundColor.b,
|
||||
ContainerBackgroundColor.a * maxAlpha);
|
||||
}
|
||||
|
||||
private void SetBadgeCount(int count)
|
||||
{
|
||||
while (_badgePool.Count < count)
|
||||
{
|
||||
_badgePool.Add(CreateBadge());
|
||||
_cachedKeyNames.Add("");
|
||||
}
|
||||
|
||||
for (int i = 0; i < _badgePool.Count; i++)
|
||||
{
|
||||
_badgePool[i].Root.SetActive(i < count);
|
||||
}
|
||||
}
|
||||
|
||||
private BadgeEntry CreateBadge()
|
||||
{
|
||||
GameObject badge = new GameObject("KeyBadge");
|
||||
badge.transform.SetParent(_container.transform, false);
|
||||
|
||||
badge.AddComponent<RectTransform>();
|
||||
|
||||
Image bg = badge.AddComponent<Image>();
|
||||
bg.color = new Color(0f, 0f, 0f, 0f);
|
||||
bg.raycastTarget = false;
|
||||
|
||||
LayoutElement layoutElement = badge.AddComponent<LayoutElement>();
|
||||
|
||||
GameObject textGo = new GameObject("KeyText");
|
||||
textGo.transform.SetParent(badge.transform, false);
|
||||
|
||||
RectTransform textRect = textGo.AddComponent<RectTransform>();
|
||||
textRect.anchorMin = Vector2.zero;
|
||||
textRect.anchorMax = Vector2.one;
|
||||
textRect.offsetMin = Vector2.zero;
|
||||
textRect.offsetMax = Vector2.zero;
|
||||
|
||||
Text text = textGo.AddComponent<Text>();
|
||||
text.font = Resources.GetBuiltinResource<Font>("LegacyRuntime.ttf");
|
||||
text.fontSize = FONT_SIZE;
|
||||
text.fontStyle = FontStyle.Bold;
|
||||
text.color = Color.white;
|
||||
text.alignment = TextAnchor.MiddleCenter;
|
||||
text.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||||
text.raycastTarget = false;
|
||||
|
||||
// Thicken glyph strokes so Unicode symbols don't look too thin
|
||||
Outline outline = textGo.AddComponent<Outline>();
|
||||
outline.effectColor = Color.white;
|
||||
outline.effectDistance = new Vector2(1f, -1f);
|
||||
|
||||
return new BadgeEntry(badge, bg, text, layoutElement);
|
||||
}
|
||||
|
||||
private void UpdateBadge(BadgeEntry badge, int index, string keyName, float alpha)
|
||||
{
|
||||
badge.Text.color = new Color(1f, 1f, 1f, alpha);
|
||||
|
||||
if (_cachedKeyNames[index] == keyName)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_cachedKeyNames[index] = keyName;
|
||||
string symbol = KeySymbolMap.GetSymbol(keyName);
|
||||
badge.Text.text = symbol;
|
||||
badge.Text.fontSize = KeySymbolMap.IsGlyphSymbol(symbol) ? GLYPH_FONT_SIZE : FONT_SIZE;
|
||||
|
||||
TextGenerationSettings settings = badge.Text.GetGenerationSettings(new Vector2(float.MaxValue, float.MaxValue));
|
||||
float preferredWidth = badge.Text.cachedTextGeneratorForLayout.GetPreferredWidth(symbol, settings);
|
||||
float preferredHeight = badge.Text.cachedTextGeneratorForLayout.GetPreferredHeight(symbol, settings);
|
||||
|
||||
badge.Layout.preferredWidth = Mathf.Max(preferredWidth / badge.Text.pixelsPerUnit, preferredHeight / badge.Text.pixelsPerUnit);
|
||||
badge.Layout.preferredHeight = preferredHeight / badge.Text.pixelsPerUnit;
|
||||
}
|
||||
|
||||
private static float GetBadgeAlpha(
|
||||
string keyName,
|
||||
string? pressKey,
|
||||
bool isPressHeld,
|
||||
float pressElapsedSinceRelease)
|
||||
{
|
||||
if (pressKey == null || keyName != pressKey || isPressHeld || pressElapsedSinceRelease <= PRESS_DISPLAY_DURATION)
|
||||
{
|
||||
return 1f;
|
||||
}
|
||||
|
||||
float fadeT = Mathf.Clamp01((pressElapsedSinceRelease - PRESS_DISPLAY_DURATION) / FADE_DURATION);
|
||||
return 1f - fadeT;
|
||||
}
|
||||
|
||||
private readonly struct BadgeEntry
|
||||
{
|
||||
public readonly GameObject Root;
|
||||
public readonly Image Background;
|
||||
public readonly Text Text;
|
||||
public readonly LayoutElement Layout;
|
||||
|
||||
public BadgeEntry(GameObject root, Image background, Text text, LayoutElement layout)
|
||||
{
|
||||
Root = root;
|
||||
Background = background;
|
||||
Text = text;
|
||||
Layout = layout;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 22d59970393a54b4cb41f956e0eb3f41
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,376 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &1163102534174049270
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 5371017374443542522}
|
||||
- component: {fileID: 8025827109147581330}
|
||||
- component: {fileID: 3026865949128803190}
|
||||
- component: {fileID: 6066404719234391660}
|
||||
m_Layer: 0
|
||||
m_Name: PreviewBadge
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &5371017374443542522
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1163102534174049270}
|
||||
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_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 5808527078553167771}
|
||||
m_Father: {fileID: 8394911915651975566}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 100, y: 100}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &8025827109147581330
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1163102534174049270}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &3026865949128803190
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1163102534174049270}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0, g: 0, b: 0, a: 0}
|
||||
m_RaycastTarget: 0
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Sprite: {fileID: 0}
|
||||
m_Type: 0
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 1
|
||||
--- !u!114 &6066404719234391660
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1163102534174049270}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_IgnoreLayout: 0
|
||||
m_MinWidth: -1
|
||||
m_MinHeight: -1
|
||||
m_PreferredWidth: 60
|
||||
m_PreferredHeight: 80
|
||||
m_FlexibleWidth: -1
|
||||
m_FlexibleHeight: -1
|
||||
m_LayoutPriority: 1
|
||||
--- !u!1 &3492586335444099666
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 8394911915651975566}
|
||||
- component: {fileID: 5543483528529774299}
|
||||
- component: {fileID: 8787032785713595466}
|
||||
- component: {fileID: 8195843448948172035}
|
||||
- component: {fileID: 8555974250771983990}
|
||||
m_Layer: 0
|
||||
m_Name: Container
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &8394911915651975566
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3492586335444099666}
|
||||
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_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 5371017374443542522}
|
||||
m_Father: {fileID: 1447186769560363053}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0.5, y: 0}
|
||||
m_AnchorMax: {x: 0.5, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 100}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0}
|
||||
--- !u!222 &5543483528529774299
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3492586335444099666}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &8787032785713595466
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3492586335444099666}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0.15, g: 0.15, b: 0.15, a: 0.8}
|
||||
m_RaycastTarget: 0
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Sprite: {fileID: 21300000, guid: 8de76314d55f142d687ee8b477288bae, type: 3}
|
||||
m_Type: 1
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 1
|
||||
--- !u!114 &8195843448948172035
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3492586335444099666}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Padding:
|
||||
m_Left: 24
|
||||
m_Right: 24
|
||||
m_Top: 16
|
||||
m_Bottom: 16
|
||||
m_ChildAlignment: 4
|
||||
m_Spacing: 8
|
||||
m_ChildForceExpandWidth: 0
|
||||
m_ChildForceExpandHeight: 0
|
||||
m_ChildControlWidth: 0
|
||||
m_ChildControlHeight: 0
|
||||
m_ChildScaleWidth: 0
|
||||
m_ChildScaleHeight: 0
|
||||
m_ReverseArrangement: 0
|
||||
--- !u!114 &8555974250771983990
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3492586335444099666}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_HorizontalFit: 2
|
||||
m_VerticalFit: 2
|
||||
--- !u!1 &6281231881990964606
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 5808527078553167771}
|
||||
- component: {fileID: 7861529244481486362}
|
||||
- component: {fileID: 2900878144175824161}
|
||||
- component: {fileID: 6622544667456466176}
|
||||
m_Layer: 0
|
||||
m_Name: KeyText
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &5808527078553167771
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6281231881990964606}
|
||||
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_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 5371017374443542522}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &7861529244481486362
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6281231881990964606}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &2900878144175824161
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6281231881990964606}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 0
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_FontData:
|
||||
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_FontSize: 48
|
||||
m_FontStyle: 1
|
||||
m_BestFit: 0
|
||||
m_MinSize: 10
|
||||
m_MaxSize: 48
|
||||
m_Alignment: 4
|
||||
m_AlignByGeometry: 0
|
||||
m_RichText: 1
|
||||
m_HorizontalOverflow: 1
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text: "\u2318"
|
||||
--- !u!114 &6622544667456466176
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6281231881990964606}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_EffectColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_EffectDistance: {x: 1, y: -1}
|
||||
m_UseGraphicAlpha: 1
|
||||
--- !u!1 &9003946234088771061
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1447186769560363053}
|
||||
- component: {fileID: 6082752830946661477}
|
||||
- component: {fileID: 7943424075059165438}
|
||||
m_Layer: 0
|
||||
m_Name: SimulateKeyboardOverlay
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &1447186769560363053
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9003946234088771061}
|
||||
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_ConstrainProportionsScale: 1
|
||||
m_Children:
|
||||
- {fileID: 8394911915651975566}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &6082752830946661477
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9003946234088771061}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 22d59970393a54b4cb41f956e0eb3f41, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_container: {fileID: 3492586335444099666}
|
||||
_containerImage: {fileID: 8787032785713595466}
|
||||
--- !u!225 &7943424075059165438
|
||||
CanvasGroup:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9003946234088771061}
|
||||
m_Enabled: 1
|
||||
m_Alpha: 1
|
||||
m_Interactable: 0
|
||||
m_BlocksRaycasts: 0
|
||||
m_IgnoreParentGroups: 0
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 13a5dea128bba49df91807161c323487
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,61 @@
|
||||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace io.github.hatayama.uLoopMCP
|
||||
{
|
||||
public static class SimulateKeyboardOverlayState
|
||||
{
|
||||
private static readonly List<string> _heldKeys = new();
|
||||
private static string? _pressKey;
|
||||
private static float _pressReleasedTime = -1f;
|
||||
|
||||
public static bool IsActive => _heldKeys.Count > 0 || _pressKey != null;
|
||||
public static IReadOnlyList<string> HeldKeys => _heldKeys;
|
||||
public static string? PressKey => _pressKey;
|
||||
public static bool IsPressHeld => _pressKey != null && _pressReleasedTime < 0f;
|
||||
public static float PressReleasedTime => _pressReleasedTime;
|
||||
|
||||
public static void AddHeldKey(string keyName)
|
||||
{
|
||||
if (!_heldKeys.Contains(keyName))
|
||||
{
|
||||
_heldKeys.Add(keyName);
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveHeldKey(string keyName)
|
||||
{
|
||||
_heldKeys.Remove(keyName);
|
||||
}
|
||||
|
||||
public static void ShowPress(string keyName)
|
||||
{
|
||||
_pressKey = keyName;
|
||||
_pressReleasedTime = -1f;
|
||||
}
|
||||
|
||||
public static void ReleasePress()
|
||||
{
|
||||
UnityEngine.Debug.Assert(_pressKey != null, "Press key must exist before it can be released.");
|
||||
if (_pressKey == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_pressReleasedTime = UnityEngine.Time.realtimeSinceStartup;
|
||||
}
|
||||
|
||||
public static void ClearPress()
|
||||
{
|
||||
_pressKey = null;
|
||||
_pressReleasedTime = -1f;
|
||||
}
|
||||
|
||||
public static void Clear()
|
||||
{
|
||||
_heldKeys.Clear();
|
||||
_pressKey = null;
|
||||
_pressReleasedTime = -1f;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2d9f7c86425414af7aa5e2d0b0fd1a1b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user