meta: adding dependencies

This commit is contained in:
Sc0rch-thinks 2024-12-02 21:30:42 +08:00
parent 81e1bfa974
commit 1e2a68bd52
130 changed files with 26165 additions and 0 deletions

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 581b28b7a018d6446a9e55939415171b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,4 @@
{
"displayName": "Spatial Keyboard",
"description": "Virtual spatial keyboard to allow for text entry in a world space UI. This interactable keyboard can be used in your app instead of the platform's system keyboard."
}

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c0a5d95a237741a4fbac6440bc7a75e1
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,66 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b53eb82258e249bb97cf3789c6a97dda, type: 3}
m_Name: BlendShapeAffordance
m_EditorClassIdentifier:
m_Comments:
m_ReadOnly: 1
m_Value:
m_StateAnimationCurve:
m_UseConstant: 1
m_ConstantValue:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_Variable: {fileID: 0}
m_List:
- stateName: disabled
animationStateStartValue: 0
animationStateEndValue: 0
- stateName: idle
animationStateStartValue: 5
animationStateEndValue: 5
- stateName: hovered
animationStateStartValue: 15
animationStateEndValue: 15
- stateName: hoveredPriority
animationStateStartValue: 0
animationStateEndValue: 0
- stateName: selected
animationStateStartValue: 15
animationStateEndValue: 15
- stateName: activated
animationStateStartValue: 0
animationStateEndValue: 0
- stateName: focused
animationStateStartValue: 0
animationStateEndValue: 0

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 37a719930348de649a3f10a8836c6a50
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,68 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b5d80f45fb5f4418a5e84a476e517628, type: 3}
m_Name: GrabHandleColorAffordanceTheme
m_EditorClassIdentifier:
m_Comments:
m_ReadOnly: 1
m_Value:
m_StateAnimationCurve:
m_UseConstant: 1
m_ConstantValue:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_Variable: {fileID: 0}
m_List:
- stateName: disabled
animationStateStartValue: {r: 0, g: 0, b: 0, a: 0}
animationStateEndValue: {r: 0, g: 0, b: 0, a: 0}
- stateName: idle
animationStateStartValue: {r: 1, g: 1, b: 1, a: 1}
animationStateEndValue: {r: 1, g: 1, b: 1, a: 1}
- stateName: hovered
animationStateStartValue: {r: 0.09411766, g: 0.43921572, b: 0.7137255, a: 1}
animationStateEndValue: {r: 0.09411766, g: 0.43921572, b: 0.7137255, a: 1}
- stateName: hoveredPriority
animationStateStartValue: {r: 0, g: 0, b: 0, a: 0}
animationStateEndValue: {r: 0, g: 0, b: 0, a: 0}
- stateName: selected
animationStateStartValue: {r: 0.1254902, g: 0.5882353, b: 0.95294124, a: 1}
animationStateEndValue: {r: 0.1254902, g: 0.5882353, b: 0.95294124, a: 1}
- stateName: activated
animationStateStartValue: {r: 0.56078434, g: 0.7960785, b: 0.97647065, a: 0}
animationStateEndValue: {r: 0.56078434, g: 0.7960785, b: 0.97647065, a: 0}
- stateName: focused
animationStateStartValue: {r: 0.56078434, g: 0.7960785, b: 0.97647065, a: 0}
animationStateEndValue: {r: 0.56078434, g: 0.7960785, b: 0.97647065, a: 0}
m_ColorBlendMode: 0
m_BlendAmount: 1

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ad4e83cc4eb3a974993a5a183887e287
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,68 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b5d80f45fb5f4418a5e84a476e517628, type: 3}
m_Name: ScaleHandleColorAffordanceTheme
m_EditorClassIdentifier:
m_Comments:
m_ReadOnly: 1
m_Value:
m_StateAnimationCurve:
m_UseConstant: 1
m_ConstantValue:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_Variable: {fileID: 0}
m_List:
- stateName: disabled
animationStateStartValue: {r: 0, g: 0, b: 0, a: 0}
animationStateEndValue: {r: 0, g: 0, b: 0, a: 0}
- stateName: idle
animationStateStartValue: {r: 1, g: 1, b: 1, a: 0.050980393}
animationStateEndValue: {r: 1, g: 1, b: 1, a: 0.050980393}
- stateName: hovered
animationStateStartValue: {r: 1, g: 1, b: 1, a: 1}
animationStateEndValue: {r: 1, g: 1, b: 1, a: 1}
- stateName: hoveredPriority
animationStateStartValue: {r: 1, g: 1, b: 1, a: 1}
animationStateEndValue: {r: 1, g: 1, b: 1, a: 1}
- stateName: selected
animationStateStartValue: {r: 1, g: 1, b: 1, a: 1}
animationStateEndValue: {r: 1, g: 1, b: 1, a: 1}
- stateName: activated
animationStateStartValue: {r: 1, g: 1, b: 1, a: 1}
animationStateEndValue: {r: 1, g: 1, b: 1, a: 1}
- stateName: focused
animationStateStartValue: {r: 1, g: 1, b: 1, a: 1}
animationStateEndValue: {r: 1, g: 1, b: 1, a: 1}
m_ColorBlendMode: 0
m_BlendAmount: 1

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0874a22edbf877c4183cb5ccde285f5a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9ac15806e0a32c34a834dbb1bfa349c0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,22 @@
fileFormatVersion: 2
guid: f81fcd9edaa84754869e9e9acb3aece4
AudioImporter:
externalObjects: {}
serializedVersion: 6
defaultSettings:
loadType: 0
sampleRateSetting: 0
sampleRateOverride: 44100
compressionFormat: 1
quality: 1
conversionMode: 0
platformSettingOverrides: {}
forceToMono: 0
normalize: 1
preloadAudioData: 1
loadInBackground: 0
ambisonic: 0
3D: 1
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: be59de3c98b87434f98d65b6c407ad31
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ebddc14e41f0117489ec33fb0c24a865
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,167 @@
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard;
namespace UnityEditor.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
[CustomPropertyDrawer(typeof(XRKeyboardConfig.KeyMapping))]
public class KeyMappingPropertyDrawer : PropertyDrawer
{
class SerializedPropertyFields
{
public SerializedProperty character;
public SerializedProperty shiftCharacter;
public SerializedProperty displayCharacter;
public SerializedProperty shiftDisplayCharacter;
public SerializedProperty displayIcon;
public SerializedProperty shiftDisplayIcon;
public SerializedProperty overrideDefaultKeyFunction;
public SerializedProperty keyFunction;
public SerializedProperty keyCode;
public SerializedProperty disabled;
public void FindProperties(SerializedProperty property)
{
character = property.FindPropertyRelative("m_Character");
shiftCharacter = property.FindPropertyRelative("m_ShiftCharacter");
displayCharacter = property.FindPropertyRelative("m_DisplayCharacter");
shiftDisplayCharacter = property.FindPropertyRelative("m_ShiftDisplayCharacter");
displayIcon = property.FindPropertyRelative("m_DisplayIcon");
shiftDisplayIcon = property.FindPropertyRelative("m_ShiftDisplayIcon");
overrideDefaultKeyFunction = property.FindPropertyRelative("m_OverrideDefaultKeyFunction");
keyFunction = property.FindPropertyRelative("m_KeyFunction");
keyCode = property.FindPropertyRelative("m_KeyCode");
disabled = property.FindPropertyRelative("m_Disabled");
}
}
/// <summary>
/// Contents of GUI elements used by this editor.
/// </summary>
protected static class Contents
{
public static readonly GUIContent character = EditorGUIUtility.TrTextContent("Character", "Character for this key in non-shifted state. This string will be passed to the keyboard and appended to the keyboard text string or processed as a keyboard command.");
public static readonly GUIContent shiftCharacter = EditorGUIUtility.TrTextContent("Shift Character", "Character for this key in a shifted state. This string will be passed to the keyboard and appended to the keyboard text string or processed as a keyboard command.");
public static readonly GUIContent displayCharacter = EditorGUIUtility.TrTextContent("Display Character", "Display character for this key in a non-shifted state. This string will be displayed on the key text field. If empty, character will be used as a fallback.");
public static readonly GUIContent shiftDisplayCharacter = EditorGUIUtility.TrTextContent("Shift Display Character", "Display character for this key in a shifted state. This string will be displayed on the key text field. If empty, shift character will be used as a fallback.");
public static readonly GUIContent displayIcon = EditorGUIUtility.TrTextContent("Display Icon", "Display icon for this key in a non-shifted state. This icon will be displayed on the key image field. If empty, the display character or character will be used as a fallback.");
public static readonly GUIContent shiftDisplayIcon = EditorGUIUtility.TrTextContent("Shift Display Icon", "Display icon for this key in a shifted state. This icon will be displayed on the key image field. If empty, the shift display character or shift character will be used as a fallback.");
public static readonly GUIContent overrideDefaultKeyFunction = EditorGUIUtility.TrTextContent("Override Default Key Function", "If true, this will expose a key function property to override the default key function of this config.");
public static readonly GUIContent keyFunction = EditorGUIUtility.TrTextContent("Key Function", "KeyFunction used for this key. The function callback will be called on key press and used to communicate with the keyboard API.");
public static readonly GUIContent keyCode = EditorGUIUtility.TrTextContent("Key Code", "(Optional) KeyCode used for this key. Used with Key Function to support already defined KeyCode values.");
public static readonly GUIContent disabled = EditorGUIUtility.TrTextContent("Disabled", "If true, the key button interactable property will be set to false.");
}
readonly SerializedPropertyFields m_Fields = new SerializedPropertyFields();
/// <summary>
/// See <see cref="PropertyDrawer"/>.
/// </summary>
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
if (property.isExpanded)
{
// 1 Foldout header + 3 boldLabel headers + 10 or 9 PropertyField
m_Fields.FindProperties(property);
var numLines = m_Fields.overrideDefaultKeyFunction.boolValue ? 14 : 13;
return EditorGUIUtility.singleLineHeight * numLines + EditorGUIUtility.standardVerticalSpacing * (numLines - 1);
}
return EditorGUIUtility.singleLineHeight;
}
/// <summary>
/// See <see cref="PropertyDrawer"/>.
/// </summary>
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginProperty(position, label, property);
// Don't make child fields be indented
var indent = EditorGUI.indentLevel;
EditorGUI.indentLevel = 0;
var propertyRect = position;
propertyRect.height = EditorGUIUtility.singleLineHeight;
m_Fields.FindProperties(property);
property.isExpanded = EditorGUI.Foldout(propertyRect, property.isExpanded, GetPreviewString(m_Fields), true);
// Draw expanded properties
if (property.isExpanded)
{
var yDelta = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
propertyRect.y += yDelta;
// Character settings
EditorGUI.LabelField(propertyRect, "Character Settings", EditorStyles.boldLabel);
propertyRect.y += yDelta;
using (new EditorGUI.IndentLevelScope())
{
EditorGUI.PropertyField(propertyRect, m_Fields.character, Contents.character);
propertyRect.y += yDelta;
EditorGUI.PropertyField(propertyRect, m_Fields.shiftCharacter, Contents.shiftCharacter);
propertyRect.y += yDelta;
}
// Display settings
EditorGUI.LabelField(propertyRect, "Display Settings", EditorStyles.boldLabel);
propertyRect.y += yDelta;
using (new EditorGUI.IndentLevelScope())
{
EditorGUI.PropertyField(propertyRect, m_Fields.displayCharacter, Contents.displayCharacter);
propertyRect.y += yDelta;
EditorGUI.PropertyField(propertyRect, m_Fields.shiftDisplayCharacter, Contents.shiftDisplayCharacter);
propertyRect.y += yDelta;
EditorGUI.PropertyField(propertyRect, m_Fields.displayIcon, Contents.displayIcon);
propertyRect.y += yDelta;
EditorGUI.PropertyField(propertyRect, m_Fields.shiftDisplayIcon, Contents.shiftDisplayIcon);
propertyRect.y += yDelta;
}
// Function settings
EditorGUI.LabelField(propertyRect, "Function Settings", EditorStyles.boldLabel);
propertyRect.y += yDelta;
using (new EditorGUI.IndentLevelScope())
{
EditorGUI.PropertyField(propertyRect, m_Fields.overrideDefaultKeyFunction, Contents.overrideDefaultKeyFunction);
propertyRect.y += yDelta;
if (m_Fields.overrideDefaultKeyFunction.boolValue)
{
using (new EditorGUI.IndentLevelScope())
{
EditorGUI.PropertyField(propertyRect, m_Fields.keyFunction, Contents.keyFunction);
propertyRect.y += yDelta;
}
}
EditorGUI.PropertyField(propertyRect, m_Fields.keyCode, Contents.keyCode);
propertyRect.y += yDelta;
EditorGUI.PropertyField(propertyRect, m_Fields.disabled, Contents.disabled);
propertyRect.y += yDelta;
}
}
// Set indent back to what it was
EditorGUI.indentLevel = indent;
EditorGUI.EndProperty();
}
static string GetPreviewString(SerializedPropertyFields fields)
{
if (fields.overrideDefaultKeyFunction.boolValue)
{
var keyFunctionName = fields.keyFunction.objectReferenceValue != null
? fields.keyFunction.objectReferenceValue.name
: "None";
return $"{fields.character.stringValue} [{keyFunctionName}]";
}
return fields.character.stringValue;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bf84391e5296de6468c2c36a85c6ee65
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Unity.XR.CoreUtils.Editor;
using UnityEditor.PackageManager.UI;
using UnityEngine;
namespace UnityEditor.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Unity Editor class which registers Project Validation rules for the Spatial Keyboard sample,
/// checking that other required samples are installed.
/// </summary>
static class SpatialKeyboardSampleProjectValidation
{
const string k_SampleDisplayName = "Spatial Keyboard";
const string k_Category = "XR Interaction Toolkit";
const string k_StarterAssetsSampleName = "Starter Assets";
const string k_ProjectValidationSettingsPath = "Project/XR Plug-in Management/Project Validation";
const string k_XRIPackageName = "com.unity.xr.interaction.toolkit";
static readonly BuildTargetGroup[] s_BuildTargetGroups =
((BuildTargetGroup[])Enum.GetValues(typeof(BuildTargetGroup))).Distinct().ToArray();
static readonly List<BuildValidationRule> s_BuildValidationRules = new List<BuildValidationRule>
{
new BuildValidationRule
{
Message = $"[{k_SampleDisplayName}] {k_StarterAssetsSampleName} sample from XR Interaction Toolkit ({k_XRIPackageName}) package must be imported or updated to use this sample.",
Category = k_Category,
CheckPredicate = () => TryFindSample(k_XRIPackageName, string.Empty, k_StarterAssetsSampleName, out var sample) && sample.isImported,
FixIt = () =>
{
if (TryFindSample(k_XRIPackageName, string.Empty, k_StarterAssetsSampleName, out var sample))
{
sample.Import(Sample.ImportOptions.OverridePreviousImports);
}
},
FixItAutomatic = true,
Error = true,
},
};
[InitializeOnLoadMethod]
static void RegisterProjectValidationRules()
{
foreach (var buildTargetGroup in s_BuildTargetGroups)
{
BuildValidator.AddRules(buildTargetGroup, s_BuildValidationRules);
}
// Delay evaluating conditions for issues to give time for Package Manager and UPM cache to fully initialize.
EditorApplication.delayCall += ShowWindowIfIssuesExist;
}
static void ShowWindowIfIssuesExist()
{
foreach (var validation in s_BuildValidationRules)
{
if (validation.CheckPredicate == null || !validation.CheckPredicate.Invoke())
{
ShowWindow();
return;
}
}
}
internal static void ShowWindow()
{
// Delay opening the window since sometimes other settings in the player settings provider redirect to the
// project validation window causing serialized objects to be nullified.
EditorApplication.delayCall += () =>
{
SettingsService.OpenProjectSettings(k_ProjectValidationSettingsPath);
};
}
static bool TryFindSample(string packageName, string packageVersion, string sampleDisplayName, out Sample sample)
{
sample = default;
if (!PackageVersionUtility.IsPackageInstalled(packageName))
return false;
IEnumerable<Sample> packageSamples;
try
{
packageSamples = Sample.FindByPackage(packageName, packageVersion);
}
catch (Exception e)
{
Debug.LogError($"Couldn't find samples of the {ToString(packageName, packageVersion)} package; aborting project validation rule. Exception: {e}");
return false;
}
if (packageSamples == null)
{
Debug.LogWarning($"Couldn't find samples of the {ToString(packageName, packageVersion)} package; aborting project validation rule.");
return false;
}
foreach (var packageSample in packageSamples)
{
if (packageSample.displayName == sampleDisplayName)
{
sample = packageSample;
return true;
}
}
Debug.LogWarning($"Couldn't find {sampleDisplayName} sample in the {ToString(packageName, packageVersion)} package; aborting project validation rule.");
return false;
}
static string ToString(string packageName, string packageVersion)
{
return string.IsNullOrEmpty(packageVersion) ? packageName : $"{packageName}@{packageVersion}";
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 50fef6c461e4ab04ebeadac7b7e61185
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,34 @@
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard;
namespace UnityEditor.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Custom editor for an <see cref="XRKeyboardConfig"/>.
/// </summary>
[CustomEditor(typeof(XRKeyboardConfig), true), CanEditMultipleObjects]
public class XRKeyboardConfigEditor : BaseInteractionEditor
{
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardConfig.defaultKeyFunction"/>.</summary>
protected SerializedProperty m_DefaultKeyFunction;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardConfig.keyMappings"/>.</summary>
protected SerializedProperty m_KeyMappings;
/// <summary>
/// See <see cref="Editor"/>.
/// </summary>
protected virtual void OnEnable()
{
m_DefaultKeyFunction = serializedObject.FindProperty("m_DefaultKeyFunction");
m_KeyMappings = serializedObject.FindProperty("m_KeyMappings");
}
/// <inheritdoc />
protected override void DrawInspector()
{
DrawScript();
EditorGUILayout.PropertyField(m_DefaultKeyFunction);
EditorGUILayout.PropertyField(m_KeyMappings);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 336152d70bca65d49a424cea3b6cd4b8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,119 @@
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard;
namespace UnityEditor.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Custom editor for an <see cref="XRKeyboardDisplay"/>.
/// </summary>
[CustomEditor(typeof(XRKeyboardDisplay), true), CanEditMultipleObjects]
public class XRKeyboardDisplayEditor : BaseInteractionEditor
{
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.inputField"/>.</summary>
protected SerializedProperty m_InputField;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.keyboard"/>.</summary>
protected SerializedProperty m_Keyboard;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.useSceneKeyboard"/>.</summary>
protected SerializedProperty m_UseSceneKeyboard;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.updateOnKeyPress"/>.</summary>
protected SerializedProperty m_UpdateOnKeyPress;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.alwaysObserveKeyboard"/>.</summary>
protected SerializedProperty m_AlwaysObserveKeyboard;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.monitorInputFieldCharacterLimit"/>.</summary>
protected SerializedProperty m_MonitorInputFieldCharacterLimit;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.clearTextOnSubmit"/>.</summary>
protected SerializedProperty m_ClearTextOnSubmit;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.clearTextOnOpen"/>.</summary>
protected SerializedProperty m_ClearTextOnOpen;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.onKeyboardOpened"/>.</summary>
protected SerializedProperty m_OnKeyboardOpened;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.onKeyboardClosed"/>.</summary>
protected SerializedProperty m_OnKeyboardClosed;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.onKeyboardFocusChanged"/>.</summary>
protected SerializedProperty m_OnKeyboardFocusChanged;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardDisplay.onTextSubmitted"/>.</summary>
protected SerializedProperty m_OnTextSubmitted;
/// <summary>
/// Contents of GUI elements used by this editor.
/// </summary>
protected static class Contents
{
public static readonly GUIContent inputField = EditorGUIUtility.TrTextContent("Input Field", "Input field linked to this display");
public static readonly GUIContent keyboard = EditorGUIUtility.TrTextContent("Keyboard", "Keyboard for this display to monitor and interact with. If empty this will default to the GlobalNonNativeKeyboard keyboard.");
public static readonly GUIContent useSceneKeyboard = EditorGUIUtility.TrTextContent("Use Scene Keyboard", "If true, this display will use the keyboard reference. If false or if the keyboard field is empty, this display will use global keyboard.");
public static readonly GUIContent updateOnKeyPress = EditorGUIUtility.TrTextContent("Update on Key Press", "If true, this display will update with each key press. If false, this display will update on OnTextSubmit.");
public static readonly GUIContent alwaysObserveKeyboard = EditorGUIUtility.TrTextContent("Always Observe Keyboard", "If true, this display will always subscribe to the keyboard updates. If false, this display will subscribe to keyboard when the input field gains focus.");
public static readonly GUIContent monitorInputFieldCharacterLimit = EditorGUIUtility.TrTextContent("Monitor Input Field Character Limit", "If true, this display will use the input field's character limit to limit the update text from the keyboard and will pass this into the keyboard when opening.");
public static readonly GUIContent clearTextOnSubmit = EditorGUIUtility.TrTextContent("Clear Text on Submit", "If true, this display will clear the input field text on text submit from the keyboard.");
public static readonly GUIContent clearTextOnOpen = EditorGUIUtility.TrTextContent("Clear Text on Open", "If true, this display will clear the input field text when the keyboard opens.");
public static readonly GUIContent keyboardEvents = EditorGUIUtility.TrTextContent("Keyboard Display Events", "Events associated with the keyboard display");
public static readonly GUIContent onKeyboardOpened = EditorGUIUtility.TrTextContent("On Keyboard Opened", "The event that is called when this display opens a keyboard.");
public static readonly GUIContent onKeyboardClosed = EditorGUIUtility.TrTextContent("On Keyboard Closed", "The event that is called when the keyboard this display is observing is closed.");
public static readonly GUIContent onKeyboardFocusChanged = EditorGUIUtility.TrTextContent("On Keyboard Focus Changed", "The event that is called when the keyboard changes focus and this display is not focused.");
public static readonly GUIContent onTextSubmitted = EditorGUIUtility.TrTextContent("On Text Submitted", "The event that is called when this display receives a text submitted event from the keyboard. Invoked with the keyboard text as a parameter.");
}
/// <summary>
/// See <see cref="Editor"/>.
/// </summary>
protected virtual void OnEnable()
{
m_InputField = serializedObject.FindProperty("m_InputField");
m_Keyboard = serializedObject.FindProperty("m_Keyboard");
m_UseSceneKeyboard = serializedObject.FindProperty("m_UseSceneKeyboard");
m_UpdateOnKeyPress = serializedObject.FindProperty("m_UpdateOnKeyPress");
m_AlwaysObserveKeyboard = serializedObject.FindProperty("m_AlwaysObserveKeyboard");
m_MonitorInputFieldCharacterLimit = serializedObject.FindProperty("m_MonitorInputFieldCharacterLimit");
m_ClearTextOnSubmit = serializedObject.FindProperty("m_ClearTextOnSubmit");
m_ClearTextOnOpen = serializedObject.FindProperty("m_ClearTextOnOpen");
m_OnKeyboardOpened = serializedObject.FindProperty("m_OnKeyboardOpened");
m_OnKeyboardClosed = serializedObject.FindProperty("m_OnKeyboardClosed");
m_OnKeyboardFocusChanged = serializedObject.FindProperty("m_OnKeyboardFocusChanged");
m_OnTextSubmitted = serializedObject.FindProperty("m_OnTextSubmitted");
}
/// <inheritdoc />
protected override void DrawInspector()
{
DrawScript();
EditorGUILayout.PropertyField(m_InputField, Contents.inputField);
EditorGUILayout.PropertyField(m_UseSceneKeyboard, Contents.useSceneKeyboard);
using (new EditorGUI.IndentLevelScope())
{
using (new EditorGUI.DisabledScope(!m_UseSceneKeyboard.boolValue || Application.isPlaying))
{
EditorGUILayout.PropertyField(m_Keyboard, Contents.keyboard);
}
}
EditorGUILayout.PropertyField(m_UpdateOnKeyPress, Contents.updateOnKeyPress);
EditorGUILayout.PropertyField(m_AlwaysObserveKeyboard, Contents.alwaysObserveKeyboard);
EditorGUILayout.PropertyField(m_MonitorInputFieldCharacterLimit, Contents.monitorInputFieldCharacterLimit);
EditorGUILayout.PropertyField(m_ClearTextOnSubmit, Contents.clearTextOnSubmit);
EditorGUILayout.PropertyField(m_ClearTextOnOpen, Contents.clearTextOnOpen);
DrawKeyboardEvents();
}
void DrawKeyboardEvents()
{
m_OnTextSubmitted.isExpanded = EditorGUILayout.Foldout(m_OnTextSubmitted.isExpanded, Contents.keyboardEvents, toggleOnLabelClick: true);
if (m_OnTextSubmitted.isExpanded)
{
EditorGUILayout.PropertyField(m_OnTextSubmitted, Contents.onTextSubmitted);
EditorGUILayout.PropertyField(m_OnKeyboardOpened, Contents.onKeyboardOpened);
EditorGUILayout.PropertyField(m_OnKeyboardClosed, Contents.onKeyboardClosed);
EditorGUILayout.PropertyField(m_OnKeyboardFocusChanged, Contents.onKeyboardFocusChanged);
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 933dba84a98d0a94facc4dd555755984
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,112 @@
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard;
namespace UnityEditor.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Custom editor for an <see cref="XRKeyboard"/>.
/// </summary>
[CustomEditor(typeof(XRKeyboard), true), CanEditMultipleObjects]
public class XRKeyboardEditor : BaseInteractionEditor
{
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.submitOnEnter"/>.</summary>
protected SerializedProperty m_SubmitOnEnter;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.closeOnSubmit"/>.</summary>
protected SerializedProperty m_CloseOnSubmit;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.doubleClickInterval"/>.</summary>
protected SerializedProperty m_DoubleClickInterval;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.subsetLayout"/>.</summary>
protected SerializedProperty m_SubsetLayout;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.onTextSubmitted"/>.</summary>
protected SerializedProperty m_OnTextSubmit;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.onTextUpdated"/>.</summary>
protected SerializedProperty m_OnTextUpdate;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.onKeyPressed"/>.</summary>
protected SerializedProperty m_OnKeyPressed;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.onShifted"/>.</summary>
protected SerializedProperty m_OnShift;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.onLayoutChanged"/>.</summary>
protected SerializedProperty m_OnLayoutChange;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.onOpened"/>.</summary>
protected SerializedProperty m_OnOpen;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.onClosed"/>.</summary>
protected SerializedProperty m_OnClose;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.onFocusChanged"/>.</summary>
protected SerializedProperty m_OnFocusChanged;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboard.onCharacterLimitReached"/>.</summary>
protected SerializedProperty m_OnCharacterLimitReached;
/// <summary>
/// Contents of GUI elements used by this editor.
/// </summary>
protected static class Contents
{
public static readonly GUIContent submitOnEnter = EditorGUIUtility.TrTextContent("Submit On Enter", "If true, On Text Submit will be invoked when the keyboard receives a return or enter command. Otherwise it will treat return or enter as a newline.");
public static readonly GUIContent closeOnSubmit = EditorGUIUtility.TrTextContent("Close On Submit", "If true, keyboard will close on enter or return command.");
public static readonly GUIContent doubleClickInterval = EditorGUIUtility.TrTextContent("Double Click Interval", "Interval in which a key pressed twice would be considered a double click.");
public static readonly GUIContent subsetLayout = EditorGUIUtility.TrTextContent("Subset Layout", "List of layouts this keyboard is able to switch between given the corresponding layout command.");
public static readonly GUIContent keyboardEvents = EditorGUIUtility.TrTextContent("Keyboard Events", "Events associated with the keyboard.");
public static readonly GUIContent onTextSubmit = EditorGUIUtility.TrTextContent("On Text Submitted", "Event invoked when keyboard submits text.");
public static readonly GUIContent onTextUpdate = EditorGUIUtility.TrTextContent("On Text Updated", "Event invoked when keyboard text is updated.");
public static readonly GUIContent onKeyPressed = EditorGUIUtility.TrTextContent("On Key Pressed", "Event invoked after a key is pressed.");
public static readonly GUIContent onShift = EditorGUIUtility.TrTextContent("On Shifted", "Event invoked after keyboard shift is changed.");
public static readonly GUIContent onLayoutChange = EditorGUIUtility.TrTextContent("On Layout Changed", "Event invoked when the keyboard is opened. Called with the keyboard and the new layout string key.");
public static readonly GUIContent onOpen = EditorGUIUtility.TrTextContent("On Opened", "Event invoked when the keyboard is opened.");
public static readonly GUIContent onClose = EditorGUIUtility.TrTextContent("On Closed", "Event invoked after the keyboard is closed.");
public static readonly GUIContent onFocusChanged = EditorGUIUtility.TrTextContent("On Focus Changed", "Event invoked when the keyboard changes or gains input field focus.");
public static readonly GUIContent onCharacterLimitReached = EditorGUIUtility.TrTextContent("On Character Limit Reached", "Event invoked when the keyboard tries to update text, but the character of the input field is reached.");
}
/// <summary>
/// See <see cref="Editor"/>.
/// </summary>
protected virtual void OnEnable()
{
m_SubmitOnEnter = serializedObject.FindProperty("m_SubmitOnEnter");
m_CloseOnSubmit = serializedObject.FindProperty("m_CloseOnSubmit");
m_DoubleClickInterval = serializedObject.FindProperty("m_DoubleClickInterval");
m_SubsetLayout = serializedObject.FindProperty("m_SubsetLayout");
m_OnTextSubmit = serializedObject.FindProperty("m_OnTextSubmitted");
m_OnTextUpdate = serializedObject.FindProperty("m_OnTextUpdated");
m_OnKeyPressed = serializedObject.FindProperty("m_OnKeyPressed");
m_OnShift = serializedObject.FindProperty("m_OnShifted");
m_OnLayoutChange = serializedObject.FindProperty("m_OnLayoutChanged");
m_OnOpen = serializedObject.FindProperty("m_OnOpened");
m_OnClose = serializedObject.FindProperty("m_OnClosed");
m_OnFocusChanged = serializedObject.FindProperty("m_OnFocusChanged");
m_OnCharacterLimitReached = serializedObject.FindProperty("m_OnCharacterLimitReached");
}
/// <inheritdoc />
protected override void DrawInspector()
{
DrawScript();
EditorGUILayout.PropertyField(m_SubmitOnEnter, Contents.submitOnEnter);
EditorGUILayout.PropertyField(m_CloseOnSubmit, Contents.closeOnSubmit);
EditorGUILayout.PropertyField(m_DoubleClickInterval, Contents.doubleClickInterval);
EditorGUILayout.PropertyField(m_SubsetLayout, Contents.subsetLayout);
DrawKeyboardEvents();
}
void DrawKeyboardEvents()
{
m_OnOpen.isExpanded = EditorGUILayout.Foldout(m_OnOpen.isExpanded, Contents.keyboardEvents, toggleOnLabelClick: true);
if (m_OnOpen.isExpanded)
{
EditorGUILayout.PropertyField(m_OnOpen, Contents.onOpen);
EditorGUILayout.PropertyField(m_OnClose, Contents.onClose);
EditorGUILayout.PropertyField(m_OnFocusChanged, Contents.onFocusChanged);
EditorGUILayout.PropertyField(m_OnTextSubmit, Contents.onTextSubmit);
EditorGUILayout.PropertyField(m_OnTextUpdate, Contents.onTextUpdate);
EditorGUILayout.PropertyField(m_OnKeyPressed, Contents.onKeyPressed);
EditorGUILayout.PropertyField(m_OnShift, Contents.onShift);
EditorGUILayout.PropertyField(m_OnLayoutChange, Contents.onLayoutChange);
EditorGUILayout.PropertyField(m_OnCharacterLimitReached, Contents.onCharacterLimitReached);
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a09373fc8a4b6ae4e9868ff02f9e336a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,150 @@
using UnityEditor.UI;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard;
namespace UnityEditor.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Custom editor for an <see cref="XRKeyboardKey"/>.
/// </summary>
[CustomEditor(typeof(XRKeyboardKey), true), CanEditMultipleObjects]
public class XRKeyboardKeyEditor : ButtonEditor
{
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.keyFunction"/>.</summary>
protected SerializedProperty m_KeyFunction;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.keyCode"/>.</summary>
protected SerializedProperty m_KeyCode;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.character"/>.</summary>
protected SerializedProperty m_Character;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.displayCharacter"/>.</summary>
protected SerializedProperty m_DisplayCharacter;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.displayIcon"/>.</summary>
protected SerializedProperty m_DisplayIcon;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.shiftCharacter"/>.</summary>
protected SerializedProperty m_ShiftCharacter;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.shiftDisplayCharacter"/>.</summary>
protected SerializedProperty m_ShiftDisplayCharacter;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.shiftDisplayIcon"/>.</summary>
protected SerializedProperty m_ShiftDisplayIcon;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.updateOnKeyDown"/>.</summary>
protected SerializedProperty m_UpdateOnKeyDown;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.textComponent"/>.</summary>
protected SerializedProperty m_TextComponent;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.audioSource"/>.</summary>
protected SerializedProperty m_AudioSource;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.highlightComponent"/>.</summary>
protected SerializedProperty m_HighlightComponent;
/// <summary><see cref="SerializedProperty"/> of the <see cref="SerializeField"/> backing <see cref="XRKeyboardKey.iconComponent"/>.</summary>
protected SerializedProperty m_IconComponent;
/// <summary>
/// Contents of GUI elements used by this editor.
/// </summary>
protected static class Contents
{
public static readonly GUIContent keyFunction = EditorGUIUtility.TrTextContent("Key Function", "KeyFunction used for this key. The FunctionCallBack will be called on key press and used to communicate with the keyboard.");
public static readonly GUIContent keyCode = EditorGUIUtility.TrTextContent("Key Code", "(Optional) KeyCode used for this key. Used in conjunction with KeyCodeFunction or as a fallback for standard commands.");
public static readonly GUIContent character = EditorGUIUtility.TrTextContent("Character", "Character for this key in non-shifted state. This string will be passed to the keyboard and appended to the keyboard text string or processed as a keyboard command.");
public static readonly GUIContent displayCharacter = EditorGUIUtility.TrTextContent("Display Character", "Display character for this key in a non-shifted state. This string will be displayed on the key text field. If empty, character will be used as a fall back.");
public static readonly GUIContent displayIcon = EditorGUIUtility.TrTextContent("Display Icon", "Display icon for this key in a non-shifted state. This icon will be displayed on the key image field. If empty, the display character or character will be used as a fall back.");
public static readonly GUIContent shiftCharacter = EditorGUIUtility.TrTextContent("Shift Character", "Character for this key in a shifted state. This string will be passed to the keyboard and appended to the keyboard text string or processed as a keyboard command.");
public static readonly GUIContent shiftDisplayCharacter = EditorGUIUtility.TrTextContent("Shift Display Character", "Display character for this key in a shifted state. This string will be displayed on the key text field. If empty, shift character will be used as a fall back.");
public static readonly GUIContent shiftDisplayIcon = EditorGUIUtility.TrTextContent("Shift Display Icon", "Display icon for this key in a shifted state. This icon will be displayed on the key image field. If empty, the shift display character or shift character will be used as a fall back.");
public static readonly GUIContent updateOnDown = EditorGUIUtility.TrTextContent("Update on key down", "If true, the key pressed event will fire on button down. If false, the key pressed event will fire on OnClick.");
public static readonly GUIContent textComponent = EditorGUIUtility.TrTextContent("Text Component", "Text field used to display key character.");
public static readonly GUIContent audioSource = EditorGUIUtility.TrTextContent("Audio Source", "(Optional) Audio source played when key is pressed.");
public static readonly GUIContent highlightComponent = EditorGUIUtility.TrTextContent("Highlight Component", "(Optional) Image used to highlight key indicating and active state.");
public static readonly GUIContent iconComponent = EditorGUIUtility.TrTextContent("Icon Component", "(Optional) Image used for key icon, used as an alternative to a character.");
public static readonly GUIContent buttonSettings = EditorGUIUtility.TrTextContent("Button Settings", "Settings for the keyboard key button.");
}
/// <inheritdoc />
protected override void OnEnable()
{
base.OnEnable();
m_KeyFunction = serializedObject.FindProperty("m_KeyFunction");
m_KeyCode = serializedObject.FindProperty("m_KeyCode");
m_Character = serializedObject.FindProperty("m_Character");
m_DisplayCharacter = serializedObject.FindProperty("m_DisplayCharacter");
m_DisplayIcon = serializedObject.FindProperty("m_DisplayIcon");
m_ShiftCharacter = serializedObject.FindProperty("m_ShiftCharacter");
m_ShiftDisplayCharacter = serializedObject.FindProperty("m_ShiftDisplayCharacter");
m_ShiftDisplayIcon = serializedObject.FindProperty("m_ShiftDisplayIcon");
m_UpdateOnKeyDown = serializedObject.FindProperty("m_UpdateOnKeyDown");
m_TextComponent = serializedObject.FindProperty("m_TextComponent");
m_AudioSource = serializedObject.FindProperty("m_AudioSource");
m_HighlightComponent = serializedObject.FindProperty("m_HighlightComponent");
m_IconComponent = serializedObject.FindProperty("m_IconComponent");
}
/// <inheritdoc />
public override void OnInspectorGUI()
{
serializedObject.Update();
DrawCharacterSettings();
DrawDisplaySettings();
DrawFunctionSettings();
DrawComponentReferences();
// Draw basic key settings
EditorGUILayout.PropertyField(m_UpdateOnKeyDown, Contents.updateOnDown);
// Draw button settings if that section is expanded
m_UpdateOnKeyDown.isExpanded = EditorGUILayout.Foldout(m_UpdateOnKeyDown.isExpanded, Contents.buttonSettings, toggleOnLabelClick: true);
if (m_UpdateOnKeyDown.isExpanded)
{
using (new EditorGUI.IndentLevelScope())
{
base.OnInspectorGUI();
}
}
serializedObject.ApplyModifiedProperties();
}
void DrawCharacterSettings()
{
EditorGUILayout.LabelField("Character Settings", EditorStyles.boldLabel);
using (new EditorGUI.IndentLevelScope())
{
EditorGUILayout.PropertyField(m_Character, Contents.character);
EditorGUILayout.PropertyField(m_ShiftCharacter, Contents.shiftCharacter);
}
}
void DrawDisplaySettings()
{
EditorGUILayout.LabelField("Display Settings", EditorStyles.boldLabel);
using (new EditorGUI.IndentLevelScope())
{
EditorGUILayout.PropertyField(m_DisplayCharacter, Contents.displayCharacter);
EditorGUILayout.PropertyField(m_ShiftDisplayCharacter, Contents.shiftDisplayCharacter);
EditorGUILayout.PropertyField(m_DisplayIcon, Contents.displayIcon);
EditorGUILayout.PropertyField(m_ShiftDisplayIcon, Contents.shiftDisplayIcon);
}
}
void DrawFunctionSettings()
{
EditorGUILayout.LabelField("Function Settings", EditorStyles.boldLabel);
using (new EditorGUI.IndentLevelScope())
{
EditorGUILayout.PropertyField(m_KeyFunction, Contents.keyFunction);
EditorGUILayout.PropertyField(m_KeyCode, Contents.keyCode);
}
}
void DrawComponentReferences()
{
EditorGUILayout.LabelField("Component References", EditorStyles.boldLabel);
using (new EditorGUI.IndentLevelScope())
{
EditorGUILayout.PropertyField(m_TextComponent, Contents.textComponent);
EditorGUILayout.PropertyField(m_IconComponent, Contents.iconComponent);
EditorGUILayout.PropertyField(m_HighlightComponent, Contents.highlightComponent);
EditorGUILayout.PropertyField(m_AudioSource, Contents.audioSource);
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2af9f13e3aa49624c9ed2bafb94c7146
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,22 @@
{
"name": "Unity.XR.Interaction.Toolkit.Samples.SpatialKeyboard.Editor",
"rootNamespace": "",
"references": [
"Unity.XR.Interaction.Toolkit",
"Unity.XR.Interaction.Toolkit.Editor",
"Unity.XR.Interaction.Toolkit.Samples.SpatialKeyboard",
"Unity.XR.CoreUtils",
"Unity.XR.CoreUtils.Editor"
],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: caec957259cc5814287297ecb624a01b
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4d9dadfef58ccfc42be08b6ede878073
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,14 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 58528143acafcd44e93258c8e6a59dc5, type: 3}
m_Name: Hide Function
m_EditorClassIdentifier:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fafb46c355cbf0c4ab314558d216a90f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,14 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 92861f72e977a244cb0be6d8410a8d99, type: 3}
m_Name: Key Code Function
m_EditorClassIdentifier:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2ff02eb02547eaf41855aabb5c603f8b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,14 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0f25471b9f361d64ba3aebe064d73092, type: 3}
m_Name: Layout Function
m_EditorClassIdentifier:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: abe6f1e7debe4b842a92014211d944fb
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,15 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: cad704687d7908f42b71e1e4516c590a, type: 3}
m_Name: Shift Key Function
m_EditorClassIdentifier:
m_CapsLockDisplayIcon: {fileID: 21300000, guid: e9767100377274c4891dcd86110e54c5, type: 3}

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fd75c3033834cc447bf5886f0424c0b9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,14 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4857d519405a3874cb91aea6424e314d, type: 3}
m_Name: Value Key Function
m_EditorClassIdentifier:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5e3d82ae0a9ac0d43ada00a218daeefd
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ad3bc6be3dfc6fe4c93410327d58b369
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3f07009ab4050c7409967e768aa6a2fc
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,436 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 944d8cf1c59c0e8468bcd7e2fd86fe4d, type: 3}
m_Name: LayoutAlphaNumeric
m_EditorClassIdentifier:
m_DefaultKeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyMappings:
- m_Character: 1
m_DisplayCharacter: 1
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 1
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: 2
m_DisplayCharacter: 2
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 2
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: 3
m_DisplayCharacter: 3
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 3
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: 4
m_DisplayCharacter: 4
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 4
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: 5
m_DisplayCharacter: 5
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 5
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: 6
m_DisplayCharacter: 6
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 6
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: 7
m_DisplayCharacter: 7
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 7
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: 8
m_DisplayCharacter: 8
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 8
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: 9
m_DisplayCharacter: 9
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 9
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: 0
m_DisplayCharacter: 0
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: 0
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: q
m_DisplayCharacter: q
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: Q
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: w
m_DisplayCharacter: w
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: W
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: e
m_DisplayCharacter: e
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: E
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: r
m_DisplayCharacter: r
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: R
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: t
m_DisplayCharacter: t
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: T
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: y
m_DisplayCharacter: y
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: Y
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: u
m_DisplayCharacter: u
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: U
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: i
m_DisplayCharacter: i
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: I
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: o
m_DisplayCharacter: o
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: O
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: p
m_DisplayCharacter: p
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: P
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: a
m_DisplayCharacter: a
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: A
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: s
m_DisplayCharacter: s
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: S
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: d
m_DisplayCharacter: d
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: D
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: f
m_DisplayCharacter: f
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: F
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: g
m_DisplayCharacter: g
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: G
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: h
m_DisplayCharacter: h
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: H
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: j
m_DisplayCharacter: j
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: J
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: k
m_DisplayCharacter: k
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: K
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: l
m_DisplayCharacter: l
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: L
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: \s
m_DisplayCharacter: shift
m_DisplayIcon: {fileID: 21300000, guid: acf80862a3f4c634394d450c760a8785, type: 3}
m_ShiftCharacter: \s
m_ShiftDisplayCharacter: shift
m_ShiftDisplayIcon: {fileID: 21300000, guid: acf80862a3f4c634394d450c760a8785, type: 3}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: fd75c3033834cc447bf5886f0424c0b9, type: 2}
m_KeyCode: 304
m_Disabled: 0
- m_Character: z
m_DisplayCharacter: z
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: Z
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: x
m_DisplayCharacter: x
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: X
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: c
m_DisplayCharacter: c
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: C
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: v
m_DisplayCharacter: v
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: V
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: b
m_DisplayCharacter: b
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: B
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: n
m_DisplayCharacter: n
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: N
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: m
m_DisplayCharacter: m
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: M
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: \h
m_DisplayCharacter: Hide
m_DisplayIcon: {fileID: 21300000, guid: c79d61212a86f46498cf3acc9f5a3df9, type: 3}
m_ShiftCharacter: \h
m_ShiftDisplayCharacter: Hide
m_ShiftDisplayIcon: {fileID: 21300000, guid: c79d61212a86f46498cf3acc9f5a3df9, type: 3}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: fafb46c355cbf0c4ab314558d216a90f, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: \e
m_DisplayCharacter:
m_DisplayIcon: {fileID: 21300000, guid: 1ba3355ce4a17124f9f3b0da441ac021, type: 3}
m_ShiftCharacter: \e
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 21300000, guid: 1ba3355ce4a17124f9f3b0da441ac021, type: 3}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: abe6f1e7debe4b842a92014211d944fb, type: 2}
m_KeyCode: 0
m_Disabled: 1
- m_Character: \sym
m_DisplayCharacter: '#+='
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: \sym
m_ShiftDisplayCharacter: '#+='
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: abe6f1e7debe4b842a92014211d944fb, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: ' '
m_DisplayCharacter: Space
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: ' '
m_ShiftDisplayCharacter: Space
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyCode: 32
m_Disabled: 0
- m_Character: \r
m_DisplayCharacter: Enter
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: \r
m_ShiftDisplayCharacter: Enter
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: 2ff02eb02547eaf41855aabb5c603f8b, type: 2}
m_KeyCode: 13
m_Disabled: 0

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2580319e56ac659458811dcad1c26d69
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,436 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 944d8cf1c59c0e8468bcd7e2fd86fe4d, type: 3}
m_Name: LayoutSymbols
m_EditorClassIdentifier:
m_DefaultKeyFunction: {fileID: 11400000, guid: 5e3d82ae0a9ac0d43ada00a218daeefd, type: 2}
m_KeyMappings:
- m_Character: '-'
m_DisplayCharacter: '-'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: /
m_DisplayCharacter: /
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: ':'
m_DisplayCharacter: ':'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: ;
m_DisplayCharacter: ;
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: (
m_DisplayCharacter: (
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: )
m_DisplayCharacter: )
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: $
m_DisplayCharacter: $
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '&'
m_DisplayCharacter: '&'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '@'
m_DisplayCharacter: '@'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '"'
m_DisplayCharacter: '"'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '['
m_DisplayCharacter: '['
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: ']'
m_DisplayCharacter: ']'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '{'
m_DisplayCharacter: '{'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '}'
m_DisplayCharacter: '}'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '#'
m_DisplayCharacter: '#'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '%'
m_DisplayCharacter: '%'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: ^
m_DisplayCharacter: ^
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '*'
m_DisplayCharacter: '*'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: +
m_DisplayCharacter: +
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: =
m_DisplayCharacter: =
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: _
m_DisplayCharacter: _
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: \
m_DisplayCharacter: \
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '|'
m_DisplayCharacter: '|'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: ~
m_DisplayCharacter: ~
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: <
m_DisplayCharacter: <
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '>'
m_DisplayCharacter: '>'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: "\u20AC"
m_DisplayCharacter: "\u20AC"
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: "\xA3"
m_DisplayCharacter: "\xA3"
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: "\xA5"
m_DisplayCharacter: "\xA5"
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: \s
m_DisplayCharacter: shift
m_DisplayIcon: {fileID: 21300000, guid: acf80862a3f4c634394d450c760a8785, type: 3}
m_ShiftCharacter: \s
m_ShiftDisplayCharacter: shift
m_ShiftDisplayIcon: {fileID: 21300000, guid: acf80862a3f4c634394d450c760a8785, type: 3}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: fd75c3033834cc447bf5886f0424c0b9, type: 2}
m_KeyCode: 304
m_Disabled: 1
- m_Character: .
m_DisplayCharacter: .
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: ','
m_DisplayCharacter: ','
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '?'
m_DisplayCharacter: '?'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '!'
m_DisplayCharacter: '!'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: ''''
m_DisplayCharacter: ''''
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: "\u2022"
m_DisplayCharacter: "\u2022"
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: '`'
m_DisplayCharacter: '`'
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Disabled: 0
- m_Character: \h
m_DisplayCharacter: Hide
m_DisplayIcon: {fileID: 21300000, guid: c79d61212a86f46498cf3acc9f5a3df9, type: 3}
m_ShiftCharacter: \h
m_ShiftDisplayCharacter: Hide
m_ShiftDisplayIcon: {fileID: 21300000, guid: c79d61212a86f46498cf3acc9f5a3df9, type: 3}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: fafb46c355cbf0c4ab314558d216a90f, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: \e
m_DisplayCharacter:
m_DisplayIcon: {fileID: 21300000, guid: 1ba3355ce4a17124f9f3b0da441ac021, type: 3}
m_ShiftCharacter: \e
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 21300000, guid: 1ba3355ce4a17124f9f3b0da441ac021, type: 3}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: abe6f1e7debe4b842a92014211d944fb, type: 2}
m_KeyCode: 0
m_Disabled: 1
- m_Character: \sym
m_DisplayCharacter: ABC
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: \sym
m_ShiftDisplayCharacter: ABC
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: abe6f1e7debe4b842a92014211d944fb, type: 2}
m_KeyCode: 0
m_Disabled: 0
- m_Character: ' '
m_DisplayCharacter: Space
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: ' '
m_ShiftDisplayCharacter: Space
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 0
m_KeyFunction: {fileID: 0}
m_KeyCode: 32
m_Disabled: 0
- m_Character: \r
m_DisplayCharacter: Enter
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter: \r
m_ShiftDisplayCharacter: Enter
m_ShiftDisplayIcon: {fileID: 0}
m_OverrideDefaultKeyFunction: 1
m_KeyFunction: {fileID: 11400000, guid: 2ff02eb02547eaf41855aabb5c603f8b, type: 2}
m_KeyCode: 13
m_Disabled: 0

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 846fe994ca156db429b72643cdf7c042
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7e29b6f228e3ffe4ab218055470fceff
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,80 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: GrabHandle
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e6214d327b0cf3f4fbb4085685e38d0a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,16 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e7883133e628dff4a86f50c082f77055, type: 3}
m_Name: MaterialPipelineHandler
m_EditorClassIdentifier:
m_ShaderContainers: []
m_AutoRefreshShaders: 1

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: eb7e5e68631561a4a8ccf587221af3a3
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,102 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: ScaleHandle
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ValidKeywords:
- _ALPHABLEND_ON
- _GLOSSYREFLECTIONS_OFF
- _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
- _SPECULARHIGHLIGHTS_OFF
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: 3000
stringTagMap:
RenderType: Transparent
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BumpScale: 1
- _ColorMask: 15
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 10
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _Mode: 2
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 1
- _SpecularHighlights: 0
- _SrcBlend: 5
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _Strength: 0.2
- _UVSec: 0
- _UseUIAlphaClip: 0
- _ZWrite: 0
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 0.050980393}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 14907cbcede41d94f99fc623c76cce72
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: dd1cc06898271ab49802c8ff94559648
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,106 @@
fileFormatVersion: 2
guid: ae54ba12b7f49c840a53ce0b50b389b6
ModelImporter:
serializedVersion: 21300
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 1
motionNodeName:
rigImportErrors:
rigImportWarnings:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,106 @@
fileFormatVersion: 2
guid: e1baba050113e0f44bd4f6b52e77696d
ModelImporter:
serializedVersion: 21300
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 0
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 1
motionNodeName:
rigImportErrors:
rigImportWarnings:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 0
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 0
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,106 @@
fileFormatVersion: 2
guid: e6666376763e6204a9760e199b9c04f5
ModelImporter:
serializedVersion: 21300
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 1
motionNodeName:
rigImportErrors:
rigImportWarnings:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 0
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
remapMaterialsIfMaterialImportModeIsNone: 1
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 60e4fc3810bec6144ba8b5da8afc6935
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,755 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &5185231984917197337
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5185231984917197345}
- component: {fileID: 5185231984917197344}
- component: {fileID: 5185231984917197343}
- component: {fileID: 5185231984917197342}
- component: {fileID: 5185231984917197340}
- component: {fileID: 5185231984917197339}
- component: {fileID: 5185231984917197338}
- component: {fileID: 1715446783570025663}
- component: {fileID: 3293349416794078848}
m_Layer: 5
m_Name: Input Field Global Keyboard
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5185231984917197345
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5185231984917197337}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.003, y: 0.003, z: 0.003}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 8437028974135710645}
m_Father: {fileID: 0}
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: 300, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!223 &5185231984917197344
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5185231984917197337}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 2
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 0
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 25
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
--- !u!114 &5185231984917197343
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5185231984917197337}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 0
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 800, y: 600}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 1
--- !u!114 &5185231984917197342
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5185231984917197337}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 1
m_BlockingObjects: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!222 &5185231984917197340
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5185231984917197337}
m_CullTransparentMesh: 0
--- !u!114 &5185231984917197339
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5185231984917197337}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
m_Color: {r: 0, g: 0, b: 0, a: 0.7490196}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
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: 8
--- !u!114 &5185231984917197338
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5185231984917197337}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 16
m_Right: 16
m_Top: 12
m_Bottom: 16
m_ChildAlignment: 4
m_Spacing: 10
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 0
m_ChildControlHeight: 0
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &1715446783570025663
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5185231984917197337}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalFit: 0
m_VerticalFit: 1
--- !u!114 &3293349416794078848
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5185231984917197337}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7951c64acb0fa62458bf30a60089fe2d, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 0
m_CheckFor2DOcclusion: 0
m_CheckFor3DOcclusion: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RaycastTriggerInteraction: 1
--- !u!1 &8437028974135710644
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8437028974135710645}
- component: {fileID: 8437028974135710649}
- component: {fileID: 8437028974135710648}
- component: {fileID: 8437028974135710651}
- component: {fileID: 8437028974135710650}
m_Layer: 5
m_Name: InputField (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8437028974135710645
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974135710644}
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: 8437028975400972187}
m_Father: {fileID: 5185231984917197345}
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: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8437028974135710649
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974135710644}
m_CullTransparentMesh: 1
--- !u!114 &8437028974135710648
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974135710644}
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: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
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 &8437028974135710651
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974135710644}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 8437028974135710648}
m_TextViewport: {fileID: 8437028975400972187}
m_TextComponent: {fileID: 8437028974540207066}
m_Placeholder: {fileID: 8437028974606165540}
m_VerticalScrollbar: {fileID: 0}
m_VerticalScrollbarEventHandler: {fileID: 0}
m_LayoutGroup: {fileID: 0}
m_ScrollSensitivity: 1
m_ContentType: 0
m_InputType: 0
m_AsteriskChar: 42
m_KeyboardType: 0
m_LineType: 0
m_HideMobileInput: 0
m_HideSoftKeyboard: 1
m_CharacterValidation: 0
m_RegexValue:
m_GlobalPointSize: 14
m_CharacterLimit: 0
m_OnEndEdit:
m_PersistentCalls:
m_Calls: []
m_OnSubmit:
m_PersistentCalls:
m_Calls: []
m_OnSelect:
m_PersistentCalls:
m_Calls: []
m_OnDeselect:
m_PersistentCalls:
m_Calls: []
m_OnTextSelection:
m_PersistentCalls:
m_Calls: []
m_OnEndTextSelection:
m_PersistentCalls:
m_Calls: []
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
m_OnTouchScreenKeyboardStatusChanged:
m_PersistentCalls:
m_Calls: []
m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_CustomCaretColor: 0
m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
m_Text:
m_CaretBlinkRate: 0.85
m_CaretWidth: 1
m_ReadOnly: 0
m_RichText: 1
m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_OnFocusSelectAll: 1
m_ResetOnDeActivation: 1
m_RestoreOriginalTextOnEscape: 1
m_isRichTextEditingAllowed: 0
m_LineLimit: 0
m_InputValidator: {fileID: 0}
--- !u!114 &8437028974135710650
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974135710644}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a2317ceab4d3d38419fe16eebc1c0cd3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_InputField: {fileID: 8437028974135710651}
m_Keyboard: {fileID: 0}
m_UseSceneKeyboard: 0
m_UpdateOnKeyPress: 1
m_AlwaysObserveKeyboard: 0
m_MonitorInputFieldCharacterLimit: 0
m_ClearTextOnSubmit: 0
m_ClearTextOnOpen: 0
m_OnTextSubmitted:
m_PersistentCalls:
m_Calls: []
m_OnKeyboardOpened:
m_PersistentCalls:
m_Calls: []
m_OnKeyboardClosed:
m_PersistentCalls:
m_Calls: []
m_OnKeyboardFocusChanged:
m_PersistentCalls:
m_Calls: []
--- !u!1 &8437028974540207060
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8437028974540207061}
- component: {fileID: 8437028974540207067}
- component: {fileID: 8437028974540207066}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8437028974540207061
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974540207060}
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: 8437028975400972187}
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 &8437028974540207067
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974540207060}
m_CullTransparentMesh: 1
--- !u!114 &8437028974540207066
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974540207060}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u200B"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 14
m_fontSizeBase: 14
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 1
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &8437028974606165537
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8437028974606165542}
- component: {fileID: 8437028974606165541}
- component: {fileID: 8437028974606165540}
- component: {fileID: 8437028974606165543}
m_Layer: 5
m_Name: Placeholder
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8437028974606165542
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974606165537}
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: 8437028975400972187}
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 &8437028974606165541
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974606165537}
m_CullTransparentMesh: 1
--- !u!114 &8437028974606165540
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974606165537}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Enter text...
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 2150773298
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 14
m_fontSizeBase: 14
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 2
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 1
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &8437028974606165543
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028974606165537}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 1
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &8437028975400972186
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8437028975400972187}
- component: {fileID: 8437028975400972184}
m_Layer: 5
m_Name: Text Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8437028975400972187
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028975400972186}
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: 8437028974606165542}
- {fileID: 8437028974540207061}
m_Father: {fileID: 8437028974135710645}
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.5}
m_SizeDelta: {x: -20, y: -13}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &8437028975400972184
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8437028975400972186}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding: {x: -8, y: -5, z: -8, w: -5}
m_Softness: {x: 0, y: 0}

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1ff0f8852dba09f44a33463b31d011bc
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,755 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2106131159180314403
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2106131159180314395}
- component: {fileID: 2106131159180314394}
- component: {fileID: 2106131159180314405}
- component: {fileID: 2106131159180314404}
- component: {fileID: 2106131159180314406}
- component: {fileID: 2106131159180314401}
- component: {fileID: 2106131159180314400}
- component: {fileID: 5548896429074786693}
- component: {fileID: 8609631233081117626}
m_Layer: 5
m_Name: Input Field World Keyboard
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2106131159180314395
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2106131159180314403}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.003, y: 0.003, z: 0.003}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 3447935437714240047}
m_Father: {fileID: 0}
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: 300, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!223 &2106131159180314394
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2106131159180314403}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 2
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 0
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 25
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
--- !u!114 &2106131159180314405
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2106131159180314403}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 0
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 800, y: 600}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 1
--- !u!114 &2106131159180314404
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2106131159180314403}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 1
m_BlockingObjects: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!222 &2106131159180314406
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2106131159180314403}
m_CullTransparentMesh: 0
--- !u!114 &2106131159180314401
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2106131159180314403}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
m_Color: {r: 0, g: 0, b: 0, a: 0.7490196}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
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: 8
--- !u!114 &2106131159180314400
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2106131159180314403}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 16
m_Right: 16
m_Top: 12
m_Bottom: 16
m_ChildAlignment: 4
m_Spacing: 10
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 0
m_ChildControlHeight: 0
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &5548896429074786693
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2106131159180314403}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalFit: 0
m_VerticalFit: 1
--- !u!114 &8609631233081117626
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2106131159180314403}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7951c64acb0fa62458bf30a60089fe2d, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 0
m_CheckFor2DOcclusion: 0
m_CheckFor3DOcclusion: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RaycastTriggerInteraction: 1
--- !u!1 &3447935436786261979
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3447935436786261978}
- component: {fileID: 3447935436786261983}
- component: {fileID: 3447935436786261980}
- component: {fileID: 3447935436786261981}
m_Layer: 5
m_Name: Placeholder
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3447935436786261978
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935436786261979}
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: 3447935436979216421}
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 &3447935436786261983
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935436786261979}
m_CullTransparentMesh: 1
--- !u!114 &3447935436786261980
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935436786261979}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Enter text...
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 2150773298
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 14
m_fontSizeBase: 14
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 2
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 1
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &3447935436786261981
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935436786261979}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 1
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &3447935436979216418
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3447935436979216421}
- component: {fileID: 3447935436979216420}
m_Layer: 5
m_Name: Text Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3447935436979216421
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935436979216418}
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: 3447935436786261978}
- {fileID: 3447935437304462856}
m_Father: {fileID: 3447935437714240047}
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.5}
m_SizeDelta: {x: -20, y: -13}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &3447935436979216420
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935436979216418}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding: {x: -8, y: -5, z: -8, w: -5}
m_Softness: {x: 0, y: 0}
--- !u!1 &3447935437304462857
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3447935437304462856}
- component: {fileID: 3447935437304462858}
- component: {fileID: 3447935437304462859}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3447935437304462856
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935437304462857}
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: 3447935436979216421}
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 &3447935437304462858
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935437304462857}
m_CullTransparentMesh: 1
--- !u!114 &3447935437304462859
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935437304462857}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\u200B"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 14
m_fontSizeBase: 14
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 1
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &3447935437714240044
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3447935437714240047}
- component: {fileID: 3447935437714240051}
- component: {fileID: 3447935437714240048}
- component: {fileID: 3447935437714240049}
- component: {fileID: 3447935437714240046}
m_Layer: 5
m_Name: InputField (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3447935437714240047
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935437714240044}
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: 3447935436979216421}
m_Father: {fileID: 2106131159180314395}
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: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3447935437714240051
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935437714240044}
m_CullTransparentMesh: 1
--- !u!114 &3447935437714240048
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935437714240044}
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: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
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 &3447935437714240049
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935437714240044}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 3447935437714240048}
m_TextViewport: {fileID: 3447935436979216421}
m_TextComponent: {fileID: 3447935437304462859}
m_Placeholder: {fileID: 3447935436786261980}
m_VerticalScrollbar: {fileID: 0}
m_VerticalScrollbarEventHandler: {fileID: 0}
m_LayoutGroup: {fileID: 0}
m_ScrollSensitivity: 1
m_ContentType: 0
m_InputType: 0
m_AsteriskChar: 42
m_KeyboardType: 0
m_LineType: 0
m_HideMobileInput: 0
m_HideSoftKeyboard: 1
m_CharacterValidation: 0
m_RegexValue:
m_GlobalPointSize: 14
m_CharacterLimit: 8
m_OnEndEdit:
m_PersistentCalls:
m_Calls: []
m_OnSubmit:
m_PersistentCalls:
m_Calls: []
m_OnSelect:
m_PersistentCalls:
m_Calls: []
m_OnDeselect:
m_PersistentCalls:
m_Calls: []
m_OnTextSelection:
m_PersistentCalls:
m_Calls: []
m_OnEndTextSelection:
m_PersistentCalls:
m_Calls: []
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
m_OnTouchScreenKeyboardStatusChanged:
m_PersistentCalls:
m_Calls: []
m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_CustomCaretColor: 0
m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
m_Text:
m_CaretBlinkRate: 0.85
m_CaretWidth: 1
m_ReadOnly: 0
m_RichText: 1
m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_OnFocusSelectAll: 1
m_ResetOnDeActivation: 0
m_RestoreOriginalTextOnEscape: 1
m_isRichTextEditingAllowed: 0
m_LineLimit: 0
m_InputValidator: {fileID: 0}
--- !u!114 &3447935437714240046
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3447935437714240044}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a2317ceab4d3d38419fe16eebc1c0cd3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_InputField: {fileID: 3447935437714240049}
m_Keyboard: {fileID: 0}
m_UseSceneKeyboard: 1
m_UpdateOnKeyPress: 1
m_AlwaysObserveKeyboard: 0
m_MonitorInputFieldCharacterLimit: 0
m_ClearTextOnSubmit: 0
m_ClearTextOnOpen: 0
m_OnTextSubmitted:
m_PersistentCalls:
m_Calls: []
m_OnKeyboardOpened:
m_PersistentCalls:
m_Calls: []
m_OnKeyboardClosed:
m_PersistentCalls:
m_Calls: []
m_OnKeyboardFocusChanged:
m_PersistentCalls:
m_Calls: []

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 978a908aeff4f144dadda280e00e34ee
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,132 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &3702302986624515272
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3923090998476762128}
- component: {fileID: 3579071922695784126}
m_Layer: 0
m_Name: Scale Handle Collider
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3923090998476762128
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3702302986624515272}
m_LocalRotation: {x: 0.000000044703487, y: 0.7071068, z: -0.7071068, w: 0.000000044703487}
m_LocalPosition: {x: -0.686, y: 0, z: 0.632}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 2196794532296188522}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 90, y: -30, z: -210}
--- !u!64 &3579071922695784126
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3702302986624515272}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 4
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: 6788383922943872000, guid: e1baba050113e0f44bd4f6b52e77696d, type: 3}
--- !u!1 &6633183498948813012
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2196794532296188522}
- component: {fileID: 7807628761442964775}
- component: {fileID: 3361920201703168660}
m_Layer: 0
m_Name: Scale Handle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2196794532296188522
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6633183498948813012}
m_LocalRotation: {x: -0, y: -0.7071068, z: 0.7071068, w: 0}
m_LocalPosition: {x: 3.7499998, y: 0.75, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 3923090998476762128}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 180}
--- !u!33 &7807628761442964775
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6633183498948813012}
m_Mesh: {fileID: 8128991250398310201, guid: ae54ba12b7f49c840a53ce0b50b389b6, type: 3}
--- !u!23 &3361920201703168660
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6633183498948813012}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 14907cbcede41d94f99fc623c76cce72, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ed6de342cc483934a84e46eb1cfdbe6a
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,53 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2314523925997562666
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2314523925997562660}
- component: {fileID: 2314523925997562667}
m_Layer: 0
m_Name: XRI Global Keyboard Manager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2314523925997562660
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2314523925997562666}
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: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2314523925997562667
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2314523925997562666}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 015b50343a7cf174ebb7703245f6ba72, type: 3}
m_Name:
m_EditorClassIdentifier:
m_KeyboardPrefab: {fileID: 7339749990365776448, guid: 1aaf2dceef22d1147bfc70d706ddd188, type: 3}
m_PlayerRoot: {fileID: 0}
m_Keyboard: {fileID: 0}
m_KeyboardOffset: {x: 0, y: -0.35, z: 0.25}
m_CameraTransform: {fileID: 0}
m_RepositionOutOfViewKeyboardOnOpen: 1
m_FacingKeyboardThreshold: 0.15

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 763522a439f36ac4d881f5652181a2ee
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,633 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1253337762353444269
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2197442164563211728}
- component: {fileID: 2743443539172796335}
- component: {fileID: 5599558209658972096}
- component: {fileID: 5185769617649039493}
- component: {fileID: 3017688714510272995}
- component: {fileID: 8919338462331172391}
m_Layer: 5
m_Name: XRI Keyboard Key
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2197442164563211728
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1253337762353444269}
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: 5792483888663696090}
m_Father: {fileID: 0}
m_RootOrder: 0
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: 64, y: 64}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2743443539172796335
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1253337762353444269}
m_CullTransparentMesh: 0
--- !u!114 &5599558209658972096
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1253337762353444269}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 84bf39f7245577d4491b0aa8ea6016ee, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 0
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 0.18039216, g: 0.18039216, b: 0.18039216, a: 1}
m_HighlightedColor: {r: 0.1254902, g: 0.5882353, b: 0.9529412, a: 0.6313726}
m_PressedColor: {r: 0.1254902, g: 0.5882353, b: 0.9529412, a: 1}
m_SelectedColor: {r: 0.18039216, g: 0.18039216, b: 0.18039216, a: 1}
m_DisabledColor: {r: 0.047058824, g: 0.047058824, b: 0.047058824, a: 1}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 5764233770622607508}
m_OnClick:
m_PersistentCalls:
m_Calls: []
m_KeyFunction: {fileID: 0}
m_KeyCode: 0
m_Character:
m_DisplayCharacter:
m_DisplayIcon: {fileID: 0}
m_ShiftCharacter:
m_ShiftDisplayCharacter:
m_ShiftDisplayIcon: {fileID: 0}
m_UpdateOnKeyDown: 1
m_TextComponent: {fileID: 1230688967838103642}
m_IconComponent: {fileID: 434614208518678406}
m_HighlightComponent: {fileID: 1500099412274214952}
m_AudioSource: {fileID: 8919338462331172391}
--- !u!114 &5185769617649039493
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1253337762353444269}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 07b3638c2f5db5b479ff24c2859713d4, type: 3}
m_Name:
m_EditorClassIdentifier:
m_PokeFollowTransform: {fileID: 5792483888663696090}
m_SmoothingSpeed: 16
m_ReturnToInitialPosition: 1
m_ApplyIfChildIsTarget: 1
m_ClampToMaxDistance: 1
m_MaxDistance: 10
--- !u!114 &3017688714510272995
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1253337762353444269}
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: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
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!82 &8919338462331172391
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1253337762353444269}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 0}
m_audioClip: {fileID: 8300000, guid: f81fcd9edaa84754869e9e9acb3aece4, type: 3}
m_PlayOnAwake: 0
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 1
MaxDistance: 500
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!1 &4620195480082662092
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7744964415469400118}
- component: {fileID: 9011756104155648123}
- component: {fileID: 1500099412274214952}
m_Layer: 5
m_Name: Highlight
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7744964415469400118
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4620195480082662092}
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: 5792483888663696090}
m_RootOrder: 2
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: 0, y: 0}
m_SizeDelta: {x: 64, y: 64}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9011756104155648123
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4620195480082662092}
m_CullTransparentMesh: 1
--- !u!114 &1500099412274214952
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4620195480082662092}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.1254902, g: 0.5882353, b: 0.9529412, 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_Sprite: {fileID: 21300000, guid: b5ef5a94299045b4988c14406eb10d19, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 1
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &6587516960349639740
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4749110839071018368}
- component: {fileID: 6235336889950583525}
- component: {fileID: 1230688967838103642}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4749110839071018368
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6587516960349639740}
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: 5792483888663696090}
m_RootOrder: 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: 0, y: 0}
m_SizeDelta: {x: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6235336889950583525
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6587516960349639740}
m_CullTransparentMesh: 1
--- !u!114 &1230688967838103642
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6587516960349639740}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text:
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &6788957415840782927
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5017493697046792933}
- component: {fileID: 5842188131676396847}
- component: {fileID: 434614208518678406}
m_Layer: 5
m_Name: Icon
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5017493697046792933
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6788957415840782927}
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: 5792483888663696090}
m_RootOrder: 1
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: 0, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5842188131676396847
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6788957415840782927}
m_CullTransparentMesh: 1
--- !u!114 &434614208518678406
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6788957415840782927}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_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!1 &9128965994530478997
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5792483888663696090}
- component: {fileID: 8949111014583776716}
- component: {fileID: 5764233770622607508}
- component: {fileID: 3718196666601218021}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5792483888663696090
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9128965994530478997}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 4749110839071018368}
- {fileID: 5017493697046792933}
- {fileID: 7744964415469400118}
m_Father: {fileID: 2197442164563211728}
m_RootOrder: 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: 0, y: 0}
m_SizeDelta: {x: 64, y: 64}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8949111014583776716
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9128965994530478997}
m_CullTransparentMesh: 1
--- !u!114 &5764233770622607508
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9128965994530478997}
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: 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_Sprite: {fileID: 21300000, guid: 30a9256eb7d98ad4188fe103a8e7143b, 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 &3718196666601218021
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9128965994530478997}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
m_Name:
m_EditorClassIdentifier:
m_ShowMaskGraphic: 1

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8a27b1b39d17cdc4c8f3da30ea294c6f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4dfac36245beb8e4d884a833a5a0517f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1aaf2dceef22d1147bfc70d706ddd188
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 65c75791c4df60f4aa83f4a60b748ca6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,241 @@
using TMPro;
using UnityEngine.XR.Interaction.Toolkit.Utilities;
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Manages spawning and positioning of the global keyboard.
/// </summary>
public class GlobalNonNativeKeyboard : MonoBehaviour
{
public static GlobalNonNativeKeyboard instance { get; private set; }
[SerializeField, Tooltip("The prefab with the XR Keyboard component to automatically instantiate.")]
GameObject m_KeyboardPrefab;
/// <summary>
/// The prefab with the XR Keyboard component to automatically instantiate.
/// </summary>
public GameObject keyboardPrefab
{
get => m_KeyboardPrefab;
set => m_KeyboardPrefab = value;
}
[SerializeField, Tooltip("The parent Transform to instantiate the Keyboard Prefab under.")]
Transform m_PlayerRoot;
/// <summary>
/// The parent Transform to instantiate the Keyboard Prefab under.
/// </summary>
public Transform playerRoot
{
get => m_PlayerRoot;
set => m_PlayerRoot = value;
}
[HideInInspector]
[SerializeField]
XRKeyboard m_Keyboard;
/// <summary>
/// Global keyboard instance.
/// </summary>
public XRKeyboard keyboard
{
get => m_Keyboard;
set => m_Keyboard = value;
}
[SerializeField, Tooltip("Position offset from the camera to place the keyboard.")]
Vector3 m_KeyboardOffset;
/// <summary>
/// Position offset from the camera to place the keyboard.
/// </summary>
public Vector3 keyboardOffset
{
get => m_KeyboardOffset;
set => m_KeyboardOffset = value;
}
[SerializeField, Tooltip("Transform of the camera. If left empty, this will default to Camera.main.")]
Transform m_CameraTransform;
/// <summary>
/// Transform of the camera. If left empty, this will default to Camera.main.
/// </summary>
public Transform cameraTransform
{
get => m_CameraTransform;
set => m_CameraTransform = value;
}
[SerializeField, Tooltip("If true, the keyboard will be repositioned to the starting position if it is out of view when Show Keyboard is called.")]
bool m_RepositionOutOfViewKeyboardOnOpen = true;
/// <summary>
/// If true, the keyboard will be repositioned to the starting position if it is out of view when Show Keyboard is called.
/// </summary>
public bool repositionOutOfViewKeyboardOnOpen
{
get => m_RepositionOutOfViewKeyboardOnOpen;
set => m_RepositionOutOfViewKeyboardOnOpen = value;
}
[SerializeField, Tooltip("Threshold for the dot product when determining if the keyboard is out of view and should be repositioned. The lower the threshold, the wider the field of view."), Range(0f, 1f)]
float m_FacingKeyboardThreshold = 0.15f;
/// <summary>
/// Threshold for the dot product when determining if the keyboard is out of view and should be repositioned. The lower the threshold, the wider the field of view.
/// </summary>
public float facingKeyboardThreshold
{
get => m_FacingKeyboardThreshold;
set => m_FacingKeyboardThreshold = value;
}
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
void Awake()
{
if (instance != null && instance != this)
{
Destroy(this);
return;
}
instance = this;
if (m_CameraTransform == null)
{
var mainCamera = Camera.main;
if (mainCamera != null)
m_CameraTransform = mainCamera.transform;
else
Debug.LogWarning("Could not find main camera to assign the missing Camera Transform property.", this);
}
if (m_KeyboardPrefab != null)
{
keyboard = Instantiate(m_KeyboardPrefab, m_PlayerRoot).GetComponent<XRKeyboard>();
keyboard.gameObject.SetActive(false);
}
}
/// <summary>
/// Opens the global keyboard with a <see cref="TMP_InputField"/> to monitor.
/// </summary>
/// <remarks>This will update the keyboard with <see cref="TMP_InputField.text"/> as the existing string for the keyboard.</remarks>
/// <param name="inputField">The input field for the global keyboard to monitor</param>
/// <param name="observeCharacterLimit">If true, the global keyboard will respect the character limit of the
/// <see cref="inputField"/>. This is false by default.</param>
public virtual void ShowKeyboard(TMP_InputField inputField, bool observeCharacterLimit = false)
{
if (keyboard == null)
return;
// Check if keyboard is already open or should be repositioned
var shouldPositionKeyboard = !keyboard.isOpen || (m_RepositionOutOfViewKeyboardOnOpen && IsKeyboardOutOfView());
// Open keyboard
keyboard.Open(inputField, observeCharacterLimit);
// Position keyboard in front of user if the keyboard is closed
if (shouldPositionKeyboard)
PositionKeyboard(m_CameraTransform);
}
/// <summary>
/// Opens the global keyboard with the option to populate it with existing text.
/// </summary>
/// <remarks>This will update the keyboard with <see cref="text"/> as the existing string for the keyboard.</remarks>
/// <param name="text">The existing text string to populate the keyboard with on open.</param>
public virtual void ShowKeyboard(string text)
{
if (keyboard == null)
return;
// Check if keyboard is already open or should be repositioned
var shouldPositionKeyboard = !keyboard.isOpen || (m_RepositionOutOfViewKeyboardOnOpen && IsKeyboardOutOfView());
// Open keyboard
keyboard.Open(text);
// Position keyboard in front of user if the keyboard is closed
if (shouldPositionKeyboard)
PositionKeyboard(m_CameraTransform);
}
/// <summary>
/// Opens the global keyboard with the option to clear any existing keyboard text.
/// </summary>
/// <param name="clearKeyboardText">If true, the keyboard will open with no string populated in the keyboard. If false,
/// the existing text will be maintained. This is false by default.</param>
public void ShowKeyboard(bool clearKeyboardText = false)
{
if (keyboard == null)
return;
ShowKeyboard(clearKeyboardText ? string.Empty : keyboard.text);
}
/// <summary>
/// Closes the global keyboard.
/// </summary>
public virtual void HideKeyboard()
{
if (keyboard == null)
return;
keyboard.Close();
}
/// <summary>
/// Reposition <see cref="keyboard"/> to starting position if it is out of view. Keyboard will only reposition if is active and enabled.
/// </summary>
/// <remarks>
/// Field if view is defined by the <see cref="facingKeyboardThreshold"/>, and the starting position
/// is defined by the <see cref="keyboardOffset"/> in relation to the camera.
/// </remarks>
public void RepositionKeyboardIfOutOfView()
{
if (IsKeyboardOutOfView())
{
if (keyboard.isOpen)
PositionKeyboard(m_CameraTransform);
}
}
void PositionKeyboard(Transform target)
{
var position = target.position +
target.right * m_KeyboardOffset.x +
target.forward * m_KeyboardOffset.z +
Vector3.up * m_KeyboardOffset.y;
keyboard.transform.position = position;
FaceKeyboardAtTarget(m_CameraTransform);
}
void FaceKeyboardAtTarget(Transform target)
{
var forward = (keyboard.transform.position - target.position).normalized;
BurstMathUtility.OrthogonalLookRotation(forward, Vector3.up, out var newTarget);
keyboard.transform.rotation = newTarget;
}
bool IsKeyboardOutOfView()
{
if (m_CameraTransform == null || keyboard == null)
{
Debug.LogWarning("Camera or keyboard reference is null. Unable to determine if keyboard is out of view.", this);
return false;
}
var dotProduct = Vector3.Dot(m_CameraTransform.forward, (keyboard.transform.position - m_CameraTransform.position).normalized);
return dotProduct < m_FacingKeyboardThreshold;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 015b50343a7cf174ebb7703245f6ba72
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,70 @@
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Abstract class defining callbacks for key functionality. Allows users to extend
/// custom functionality of keys and keyboard.
/// </summary>
public abstract class KeyFunction : ScriptableObject
{
/// <summary>
/// Pre-process function when a key is pressed.
/// </summary>
/// <param name="keyboardContext">The current keyboard associated with <see cref="key"/>.</param>
/// <param name="key">The key that is being pressed.</param>
public virtual void PreprocessKey(XRKeyboard keyboardContext, XRKeyboardKey key)
{
if (keyboardContext != null)
keyboardContext.PreprocessKeyPress(key);
}
/// <summary>
/// Primary function callback when a key is pressed. Use this function to interface directly with a keyboard
/// and process logic based on the current keyboard and key context.
/// </summary>
/// <param name="keyboardContext">The current keyboard associated with <see cref="key"/>.</param>
/// <param name="key">The key that is being pressed.</param>
public abstract void ProcessKey(XRKeyboard keyboardContext, XRKeyboardKey key);
/// <summary>
/// Post-process function when a key is pressed. This function calls <see cref="XRKeyboard.PostprocessKeyPress"/> on the keyboard.
/// </summary>
/// <param name="keyboardContext">The current keyboard associated with <see cref="key"/>.</param>
/// <param name="key">The key that is being pressed.</param>
public virtual void PostprocessKey(XRKeyboard keyboardContext, XRKeyboardKey key)
{
if (keyboardContext != null)
keyboardContext.PostprocessKeyPress(key);
}
/// <summary>
/// Uses keyboard and key context to determine if this key function should override the key's display icon.
/// </summary>
/// <param name="keyboardContext">Current keyboard context.</param>
/// <param name="key">Current keyboard key.</param>
/// <returns>Returns true if this key function should override the display icon.</returns>
public virtual bool OverrideDisplayIcon(XRKeyboard keyboardContext, XRKeyboardKey key)
{
return false;
}
/// <summary>
/// Returns display icon for this key function based on the context of the key and keyboard.
/// </summary>
/// <param name="keyboardContext">Current keyboard context.</param>
/// <param name="key">Current keyboard key.</param>
/// <returns>Returns display icon for this key.</returns>
public virtual Sprite GetDisplayIcon(XRKeyboard keyboardContext, XRKeyboardKey key)
{
return null;
}
/// <summary>
/// Allows this key function to process when a key is refreshing its display.
/// </summary>
/// <param name="keyboardContext">The current keyboard associated with <see cref="key"/>.</param>
/// <param name="key">The key that is refreshing the display.</param>
public virtual void ProcessRefreshDisplay(XRKeyboard keyboardContext, XRKeyboardKey key)
{
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 18e905492db2a3e4e9fd486d79848865
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 89613eddc1ae20046a22fe8d45de2d0d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,16 @@
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard.KeyFunctions
{
/// <summary>
/// Key function used to hide the keyboard.
/// </summary>
[CreateAssetMenu(fileName = "Hide Function", menuName = "XR/Spatial Keyboard/Hide Key Function", order = 1)]
public class HideFunction : KeyFunction
{
/// <inheritdoc />
public override void ProcessKey(XRKeyboard keyboardContext, XRKeyboardKey key)
{
if (keyboardContext != null)
keyboardContext.Close(false);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 58528143acafcd44e93258c8e6a59dc5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,16 @@
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard.KeyFunctions
{
/// <summary>
/// Key function used to send a key code for the keyboard to process.
/// </summary>
[CreateAssetMenu(fileName = "Key Code Function", menuName = "XR/Spatial Keyboard/Key Code Key Function", order = 1)]
public class KeyCodeFunction : KeyFunction
{
/// <inheritdoc />
public override void ProcessKey(XRKeyboard keyboardContext, XRKeyboardKey key)
{
if (keyboardContext != null)
keyboardContext.ProcessKeyCode(key.keyCode);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 92861f72e977a244cb0be6d8410a8d99
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,16 @@
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard.KeyFunctions
{
/// <summary>
/// Key function used to update the keyboard layout.
/// </summary>
[CreateAssetMenu(fileName = "Layout Function", menuName = "XR/Spatial Keyboard/Layout Key Function", order = 1)]
public class LayoutFunction : KeyFunction
{
/// <inheritdoc />
public override void ProcessKey(XRKeyboard keyboardContext, XRKeyboardKey key)
{
if (keyboardContext != null)
keyboardContext.UpdateLayout(key.GetEffectiveCharacter());
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0f25471b9f361d64ba3aebe064d73092
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,71 @@
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard.KeyFunctions
{
/// <summary>
/// Key function used to process shift and caps lock functionality.
/// </summary>
[CreateAssetMenu(fileName = "Shift Function", menuName = "XR/Spatial Keyboard/Shift Key Function", order = 1)]
public class ShiftFunction : KeyFunction
{
[SerializeField]
Sprite m_CapsLockDisplayIcon;
public Sprite capsLockDisplayIcon
{
get => m_CapsLockDisplayIcon;
set => m_CapsLockDisplayIcon = value;
}
/// <inheritdoc />
public override Sprite GetDisplayIcon(XRKeyboard keyboardContext, XRKeyboardKey key)
{
// This method won't be called unless OverrideDisplayIcon below returns true,
// so no need for logic to return a shift display icon, which is already set up
// as the default in the UI.
return m_CapsLockDisplayIcon;
}
/// <inheritdoc />
public override bool OverrideDisplayIcon(XRKeyboard keyboardContext, XRKeyboardKey key)
{
return keyboardContext != null && keyboardContext.capsLocked;
}
/// <inheritdoc />
public override void ProcessKey(XRKeyboard keyboardContext, XRKeyboardKey key)
{
if (keyboardContext == null)
return;
var keyCode = KeyCode.LeftShift;
// Check the caps lock state of the keyboard. If they key is shifted, check if there is a double click.
if (keyboardContext.capsLocked ||(keyboardContext.shifted && key.timeSinceLastClick < keyboardContext.doubleClickInterval))
keyCode = KeyCode.CapsLock;
keyboardContext.ProcessKeyCode(keyCode);
}
/// <inheritdoc />
public override void PostprocessKey(XRKeyboard keyboardContext, XRKeyboardKey key)
{
base.PostprocessKey(keyboardContext, key);
RefreshKeyHighlight(keyboardContext, key);
}
/// <inheritdoc />
public override void ProcessRefreshDisplay(XRKeyboard keyboardContext, XRKeyboardKey key)
{
base.ProcessRefreshDisplay(keyboardContext, key);
RefreshKeyHighlight(keyboardContext, key);
}
protected void RefreshKeyHighlight(XRKeyboard keyboardContext, XRKeyboardKey key)
{
if (keyboardContext == null)
return;
var highlight = keyboardContext.capsLocked || keyboardContext.shifted;
key.EnableHighlight(highlight);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cad704687d7908f42b71e1e4516c590a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,16 @@
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard.KeyFunctions
{
/// <summary>
/// Key function used to update the keyboard text with a string value.
/// </summary>
[CreateAssetMenu(fileName = "Value Key Function", menuName = "XR/Spatial Keyboard/Value Key Function", order = 1)]
public class ValueKeyFunction : KeyFunction
{
/// <inheritdoc />
public override void ProcessKey(XRKeyboard keyboardContext, XRKeyboardKey key)
{
if (keyboardContext != null)
keyboardContext.UpdateText(key.GetEffectiveCharacter());
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4857d519405a3874cb91aea6424e314d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,796 @@
using System;
using System.Collections.Generic;
using TMPro;
using UnityEngine.Pool;
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Virtual spatial keyboard.
/// </summary>
public class XRKeyboard : MonoBehaviour
{
/// <summary>
/// Layout this keyboard is able to switch to with the corresponding layout command.
/// </summary>
/// <seealso cref="subsetLayout"/>
[Serializable]
public struct SubsetMapping
{
[SerializeField, Tooltip("This drives what GameObject layout is displayed.")]
string m_LayoutString;
/// <summary>
/// This drives what GameObject layout is displayed.
/// </summary>
public string layoutString
{
get => m_LayoutString;
set => m_LayoutString = value;
}
[SerializeField, Tooltip("GameObject root of the layout which contains the set of keys.")]
XRKeyboardLayout m_LayoutRoot;
/// <summary>
/// GameObject root of the layout which contains the set of keys.
/// </summary>
public XRKeyboardLayout layoutRoot
{
get => m_LayoutRoot;
set => m_LayoutRoot = value;
}
[SerializeField, Tooltip("Config asset which contains the key definitions for the layout when this is turned on.")]
XRKeyboardConfig m_ToggleOnConfig;
/// <summary>
/// Config asset which contains the key definitions for the layout when this is turned on.
/// </summary>
public XRKeyboardConfig toggleOnConfig
{
get => m_ToggleOnConfig;
set => m_ToggleOnConfig = value;
}
[SerializeField, Tooltip("Config asset which is the default config when this is turned off.")]
XRKeyboardConfig m_ToggleOffConfig;
/// <summary>
/// Config asset which is the default config when this is turned off.
/// </summary>
public XRKeyboardConfig toggleOffConfig
{
get => m_ToggleOffConfig;
set => m_ToggleOffConfig = value;
}
}
[SerializeField, HideInInspector]
string m_Text = string.Empty;
/// <summary>
/// String of text currently in the keyboard. Setter invokes <see cref="onTextUpdated"/> when updated.
/// </summary>
public string text
{
get => m_Text;
protected set
{
if (m_Text != value)
{
m_Text = value;
caretPosition = Math.Clamp(caretPosition, 0, m_Text.Length);
using (m_KeyboardTextEventArgs.Get(out var args))
{
args.keyboard = this;
args.keyboardText = text;
onTextUpdated?.Invoke(args);
}
}
}
}
[SerializeField, HideInInspector]
TMP_InputField m_CurrentInputField;
/// <summary>
/// Current input field this keyboard is observing.
/// </summary>
protected TMP_InputField currentInputField
{
get => m_CurrentInputField;
set
{
if (m_CurrentInputField == value)
return;
StopObservingInputField(m_CurrentInputField);
m_CurrentInputField = value;
StartObservingInputField(m_CurrentInputField);
using (m_KeyboardTextEventArgs.Get(out var args))
{
args.keyboard = this;
args.keyboardText = text;
onFocusChanged?.Invoke(args);
}
}
}
[SerializeField]
KeyboardTextEvent m_OnTextSubmitted = new KeyboardTextEvent();
/// <summary>
/// Event invoked when keyboard submits text.
/// </summary>
public KeyboardTextEvent onTextSubmitted
{
get => m_OnTextSubmitted;
set => m_OnTextSubmitted = value;
}
[SerializeField]
KeyboardTextEvent m_OnTextUpdated = new KeyboardTextEvent();
/// <summary>
/// Event invoked when keyboard text is updated.
/// </summary>
public KeyboardTextEvent onTextUpdated
{
get => m_OnTextUpdated;
set => m_OnTextUpdated = value;
}
[SerializeField]
KeyboardKeyEvent m_OnKeyPressed = new KeyboardKeyEvent();
/// <summary>
/// Event invoked after a key is pressed.
/// </summary>
public KeyboardKeyEvent onKeyPressed
{
get => m_OnKeyPressed;
set => m_OnKeyPressed = value;
}
[SerializeField]
KeyboardModifiersEvent m_OnShifted = new KeyboardModifiersEvent();
/// <summary>
/// Event invoked after keyboard shift is changed. These event args also contain the value for the caps lock state.
/// </summary>
public KeyboardModifiersEvent onShifted
{
get => m_OnShifted;
set => m_OnShifted = value;
}
[SerializeField]
KeyboardLayoutEvent m_OnLayoutChanged = new KeyboardLayoutEvent();
/// <summary>
/// Event invoked when keyboard layout is changed.
/// </summary>
public KeyboardLayoutEvent onLayoutChanged
{
get => m_OnLayoutChanged;
set => m_OnLayoutChanged = value;
}
[SerializeField]
KeyboardTextEvent m_OnOpened = new KeyboardTextEvent();
/// <summary>
/// Event invoked when the keyboard is opened.
/// </summary>
public KeyboardTextEvent onOpened
{
get => m_OnOpened;
set => m_OnOpened = value;
}
[SerializeField]
KeyboardTextEvent m_OnClosed;
/// <summary>
/// Event invoked after the keyboard is closed.
/// </summary>
public KeyboardTextEvent onClosed
{
get => m_OnClosed;
set => m_OnClosed = value;
}
[SerializeField]
KeyboardTextEvent m_OnFocusChanged = new KeyboardTextEvent();
/// <summary>
/// Event invoked when the keyboard changes or gains input field focus.
/// </summary>
public KeyboardTextEvent onFocusChanged
{
get => m_OnFocusChanged;
set => m_OnFocusChanged = value;
}
[SerializeField]
KeyboardEvent m_OnCharacterLimitReached = new KeyboardEvent();
/// <summary>
/// Event invoked when the keyboard tries to update text, but the character of the input field is reached.
/// </summary>
public KeyboardEvent onCharacterLimitReached
{
get => m_OnCharacterLimitReached;
set => m_OnCharacterLimitReached = value;
}
[SerializeField]
bool m_SubmitOnEnter = true;
/// <summary>
/// If true, <see cref="onTextSubmitted"/> will be invoked when the keyboard receives a return or enter command. Otherwise,
/// it will treat return or enter as a newline.
/// </summary>
public bool submitOnEnter
{
get => m_SubmitOnEnter;
set => m_SubmitOnEnter = value;
}
[SerializeField]
bool m_CloseOnSubmit;
/// <summary>
/// If true, keyboard will close on enter or return command.
/// </summary>
public bool closeOnSubmit
{
get => m_CloseOnSubmit;
set => m_CloseOnSubmit = value;
}
[SerializeField]
float m_DoubleClickInterval = 2f;
/// <summary>
/// Interval in which a key pressed twice would be considered a double click.
/// </summary>
public float doubleClickInterval
{
get => m_DoubleClickInterval;
set => m_DoubleClickInterval = value;
}
[SerializeField]
List<SubsetMapping> m_SubsetLayout;
/// <summary>
/// List of layouts this keyboard is able to switch between given the corresponding layout command.
/// </summary>
/// <remarks>This supports multiple layout roots updating with the same <see cref="SubsetMapping.layoutString"/>.</remarks>
public List<SubsetMapping> subsetLayout
{
get => m_SubsetLayout;
set => m_SubsetLayout = value;
}
/// <summary>
/// List of keys associated with this keyboard.
/// </summary>
public List<XRKeyboardKey> keys { get; set; }
int m_CaretPosition;
/// <summary>
/// Caret index of this keyboard.
/// </summary>
public int caretPosition
{
get => m_CaretPosition;
protected set => m_CaretPosition = value;
}
bool m_Shifted;
/// <summary>
/// (Read Only) Gets the shift state of the keyboard.
/// </summary>
public bool shifted => m_Shifted;
bool m_CapsLocked;
/// <summary>
/// (Read Only) Gets the caps lock state of the keyboard.
/// </summary>
public bool capsLocked => m_CapsLocked;
bool m_IsOpen;
/// <summary>
/// Returns true if the keyboard has been opened with the open function and the keyboard is active and enabled, otherwise returns false.
/// </summary>
public bool isOpen => (m_IsOpen && isActiveAndEnabled);
Dictionary<string, List<SubsetMapping>> m_SubsetLayoutMap;
HashSet<XRKeyboardLayout> m_KeyboardLayouts;
// Reusable event args
readonly LinkedPool<KeyboardTextEventArgs> m_KeyboardTextEventArgs = new LinkedPool<KeyboardTextEventArgs>(() => new KeyboardTextEventArgs(), collectionCheck: false);
readonly LinkedPool<KeyboardLayoutEventArgs> m_KeyboardLayoutEventArgs = new LinkedPool<KeyboardLayoutEventArgs>(() => new KeyboardLayoutEventArgs(), collectionCheck: false);
readonly LinkedPool<KeyboardModifiersEventArgs> m_KeyboardModifiersEventArgs = new LinkedPool<KeyboardModifiersEventArgs>(() => new KeyboardModifiersEventArgs(), collectionCheck: false);
readonly LinkedPool<KeyboardKeyEventArgs> m_KeyboardKeyEventArgs = new LinkedPool<KeyboardKeyEventArgs>(() => new KeyboardKeyEventArgs(), collectionCheck: false);
readonly LinkedPool<KeyboardBaseEventArgs> m_KeyboardBaseEventArgs = new LinkedPool<KeyboardBaseEventArgs>(() => new KeyboardBaseEventArgs(), collectionCheck: false);
int m_CharacterLimit = -1;
bool m_MonitorCharacterLimit;
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
void Awake()
{
m_SubsetLayoutMap = new Dictionary<string, List<SubsetMapping>>();
m_KeyboardLayouts = new HashSet<XRKeyboardLayout>();
foreach (var subsetMapping in m_SubsetLayout)
{
if (m_SubsetLayoutMap.TryGetValue(subsetMapping.layoutString, out var subsetMappings))
subsetMappings.Add(subsetMapping);
else
m_SubsetLayoutMap[subsetMapping.layoutString] = new List<SubsetMapping> { subsetMapping };
m_KeyboardLayouts.Add(subsetMapping.layoutRoot);
}
keys = new List<XRKeyboardKey>();
GetComponentsInChildren(true, keys);
keys.ForEach(key => key.keyboard = this);
}
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
void OnDisable()
{
// Reset if this component is turned off without first calling close function
m_IsOpen = false;
}
/// <summary>
/// Processes a <see cref="KeyCode"/>.
/// </summary>
/// <param name="keyCode">Key code to process.</param>
/// <returns>True on supported KeyCode.</returns>
/// <remarks>
/// Override this method to add support for additional <see cref="KeyCode"/>.
/// </remarks>
public virtual bool ProcessKeyCode(KeyCode keyCode)
{
var success = true;
switch (keyCode)
{
case KeyCode.LeftShift:
case KeyCode.RightShift:
Shift(!m_Shifted);
break;
case KeyCode.CapsLock:
CapsLock(!m_CapsLocked);
break;
case KeyCode.Backspace:
Backspace();
break;
case KeyCode.Delete:
Delete();
break;
case KeyCode.Clear:
Clear();
break;
case KeyCode.Space:
UpdateText(" ");
break;
case KeyCode.Return:
case KeyCode.KeypadEnter:
if (submitOnEnter)
{
Submit();
}
else
{
UpdateText("\n");
}
break;
default:
success = false;
break;
}
return success;
}
/// <summary>
/// Attempts to process the key based on the key's character. Used as a fallback when KeyFunction is
/// empty on the key.
/// </summary>
/// <param name="key">Key to attempt to process</param>
public virtual void TryProcessKeyPress(XRKeyboardKey key)
{
if (key == null || !ReferenceEquals(key.keyboard, this))
return;
// Process key stroke
if (onKeyPressed != null)
{
// Try to process key code
if (ProcessKeyCode(key.keyCode))
return;
var keyPress = key.GetEffectiveCharacter();
// Monitor for subset change
if (UpdateLayout(keyPress))
return;
switch (keyPress)
{
case "\\s":
// Shift
Shift(!m_Shifted);
break;
case "\\caps":
CapsLock(!m_CapsLocked);
break;
case "\\b":
// Backspace
Backspace();
break;
case "\\c":
// cancel
break;
case "\\r" when submitOnEnter:
{
Submit();
break;
}
case "\\cl":
// Clear
Clear();
break;
case "\\h":
// Hide
Close();
break;
default:
{
UpdateText(keyPress);
break;
}
}
}
}
/// <summary>
/// Pre-process function when a key is pressed.
/// </summary>
/// <param name="key">Key that is about to process.</param>
public virtual void PreprocessKeyPress(XRKeyboardKey key)
{
}
/// <summary>
/// Post-process function when a key is pressed.
/// </summary>
/// <param name="key">Key that has just been processed.</param>
public virtual void PostprocessKeyPress(XRKeyboardKey key)
{
using (m_KeyboardKeyEventArgs.Get(out var args))
{
args.keyboard = this;
args.key = key;
onKeyPressed.Invoke(args);
}
}
#region Process Key Functions
/// <summary>
/// Updates the keyboard text by inserting the <see cref="newText"/> string into the existing <see cref="text"/>.
/// </summary>
/// <param name="newText">The new text to insert into the current keyboard text.</param>
/// <remarks>If the keyboard is set to monitor the input field's character limit, the keyboard will ensure
/// the text does not exceed the <see cref="TMP_InputField.characterLimit"/>.</remarks>
public virtual void UpdateText(string newText)
{
// Attempt to add key press to current text
var updatedText = text;
updatedText = updatedText.Insert(caretPosition, newText);
var isUpdatedTextWithinLimits = !m_MonitorCharacterLimit || updatedText.Length <= m_CharacterLimit;
if (isUpdatedTextWithinLimits)
{
caretPosition += newText.Length;
text = updatedText;
}
else
{
using (m_KeyboardBaseEventArgs.Get(out var args))
{
args.keyboard = this;
onCharacterLimitReached?.Invoke(args);
}
}
// Turn off shift after typing a letter
if (m_Shifted && !m_CapsLocked)
Shift(!m_Shifted);
}
/// <summary>
/// Process shift command for keyboard.
/// </summary>
public virtual void Shift(bool shiftValue)
{
m_Shifted = shiftValue;
using (m_KeyboardModifiersEventArgs.Get(out var args))
{
args.keyboard = this;
args.shiftValue = m_Shifted;
args.capsLockValue = m_CapsLocked;
onShifted.Invoke(args);
}
}
/// <summary>
/// Process caps lock command for keyboard.
/// </summary>
public virtual void CapsLock(bool capsLockValue)
{
m_CapsLocked = capsLockValue;
Shift(capsLockValue);
}
/// <summary>
/// Process backspace command for keyboard.
/// </summary>
public virtual void Backspace()
{
if (caretPosition > 0)
{
--caretPosition;
text = text.Remove(caretPosition, 1);
}
}
/// <summary>
/// Process delete command for keyboard and deletes one character.
/// </summary>
public virtual void Delete()
{
if (caretPosition < text.Length)
{
text = text.Remove(caretPosition, 1);
}
}
/// <summary>
/// Invokes <see cref="onTextSubmitted"/> event and closes keyboard if <see cref="closeOnSubmit"/> is true.
/// </summary>
public virtual void Submit()
{
using (m_KeyboardTextEventArgs.Get(out var args))
{
args.keyboard = this;
args.keyboardText = text;
onTextSubmitted?.Invoke(args);
}
if (closeOnSubmit)
Close(false);
}
/// <summary>
/// Clears text to an empty string.
/// </summary>
public virtual void Clear()
{
text = string.Empty;
caretPosition = text.Length;
}
/// <summary>
/// Looks up the <see cref="SubsetMapping"/> associated with the <see cref="layoutKey"/> and updates the
/// <see cref="XRKeyboardLayout"/> on the <see cref="SubsetMapping.layoutRoot"/>. If the
/// <see cref="XRKeyboardLayout.activeKeyMapping"/> is already <see cref="SubsetMapping.toggleOnConfig"/>,
/// <see cref="SubsetMapping.toggleOffConfig"/> will be set as the active key mapping.
/// </summary>
/// <param name="layoutKey">The string of the new layout as it is registered in the <see cref="subsetLayout"/>.</param>
/// <returns>Returns true if the layout was successfully found and changed.</returns>
/// <remarks>By default, shift or caps lock will be turned off on layout change.</remarks>
public virtual bool UpdateLayout(string layoutKey)
{
if (m_SubsetLayoutMap.TryGetValue(layoutKey, out var subsetMappings))
{
foreach (var subsetMapping in subsetMappings)
{
var layout = subsetMapping.layoutRoot;
layout.activeKeyMapping = layout.activeKeyMapping != subsetMapping.toggleOnConfig ? subsetMapping.toggleOnConfig : subsetMapping.toggleOffConfig;
}
if (m_Shifted || m_CapsLocked)
CapsLock(false);
using (m_KeyboardLayoutEventArgs.Get(out var args))
{
args.keyboard = this;
args.layout = layoutKey;
onLayoutChanged.Invoke(args);
}
return true;
}
return false;
}
#endregion
#region Open Functions
/// <summary>
/// Opens the keyboard with a <see cref="TMP_InputField"/> parameter as the active input field.
/// </summary>
/// <param name="inputField">The input field opening this keyboard.</param>
/// <param name="observeCharacterLimit">If true, keyboard will observe the character limit from the <see cref="inputField"/>.</param>
public virtual void Open(TMP_InputField inputField, bool observeCharacterLimit = false)
{
currentInputField = inputField;
m_MonitorCharacterLimit = observeCharacterLimit;
m_CharacterLimit = observeCharacterLimit ? currentInputField.characterLimit : -1;
Open(currentInputField.text);
}
/// <summary>
/// Opens the keyboard with any existing text.
/// </summary>
/// <remarks>
/// Shortcut for <c>Open(text)</c>.
/// </remarks>
public void Open() => Open(text);
/// <summary>
/// Opens the keyboard with an empty string and clear any existing text in the input field or keyboard.
/// </summary>
/// <remarks>
/// Shortcut for <c>Open(string.Empty)</c>.
/// </remarks>
public void OpenCleared() => Open(string.Empty);
/// <summary>
/// Opens the keyboard with a given string to populate the keyboard text.
/// </summary>
/// <param name="newText">Text string to set the keyboard <see cref="text"/> to.</param>
/// <remarks>The <see cref="onOpened"/> event is fired before the text is updating with <see cref="newText"/>
/// to give any observers that would be listening the opportunity to close and stop observing before the text is updated.
/// This is a common use case for any <see cref="XRKeyboardDisplay"/> utilizing the global keyboard. </remarks>
public virtual void Open(string newText)
{
if (!isActiveAndEnabled)
{
// Fire event before updating text because any displays observing keyboards will be listening to that text change
// This gives them the opportunity to close and stop observing before the text is updated.
using (m_KeyboardTextEventArgs.Get(out var args))
{
args.keyboard = this;
args.keyboardText = text;
onOpened?.Invoke(args);
}
}
caretPosition = newText.Length;
text = newText;
gameObject.SetActive(true);
m_IsOpen = true;
}
#endregion
#region Close Functions
/// <summary>
/// Process close command for keyboard.
/// </summary>
/// <remarks>Stops observing active input field, resets variables, and hides this GameObject.</remarks>
public virtual void Close()
{
// Clear any input field the keyboard is observing
currentInputField = null;
m_MonitorCharacterLimit = false;
m_CharacterLimit = -1;
if (m_Shifted || m_CapsLocked)
CapsLock(false);
using (m_KeyboardTextEventArgs.Get(out var args))
{
args.keyboard = this;
args.keyboardText = text;
onClosed?.Invoke(args);
}
gameObject.SetActive(false);
m_IsOpen = false;
}
/// <summary>
/// Process close command for keyboard. Optional overload for clearing text and resetting layout on close.
/// </summary>
/// <param name="clearText">If true, text will be cleared upon keyboard closing. This will happen after the
/// <see cref="onClosed"/> event is fired so the observers have time to stop listening.</param>
/// <param name="resetLayout">If true, each <see cref="XRKeyboardLayout"/> will reset to the <see cref="XRKeyboardLayout.defaultKeyMapping"/>.</param>
/// <remarks>Please note, if <see cref="clearText"/> is true, the text will be cleared and the <see cref="onTextUpdated"/>
/// event will be fired. This means any observers will be notified of an empty string. To avoid unwanted behavior of
/// the text clearing, use the <see cref="onClosed"/> event to unsubscribe to the keyboard events before the text is cleared.</remarks>
public virtual void Close(bool clearText, bool resetLayout = true)
{
Close();
if (clearText)
text = string.Empty;
// Reset keyboard layout on close
if (resetLayout)
{
// Loop through each layout root and reset to default layouts
foreach (var layoutRoot in m_KeyboardLayouts)
{
layoutRoot.SetDefaultLayout();
}
// Fire event of layout change to ensure highlighted buttons are reset
using (m_KeyboardLayoutEventArgs.Get(out var args))
{
args.keyboard = this;
args.layout = "default";
onLayoutChanged.Invoke(args);
}
}
}
#endregion
#region Input Field Handling
protected virtual void StopObservingInputField(TMP_InputField inputField)
{
if (inputField == null)
return;
currentInputField.onValueChanged.RemoveListener(OnInputFieldValueChange);
}
protected virtual void StartObservingInputField(TMP_InputField inputField)
{
if (inputField == null)
return;
currentInputField.onValueChanged.AddListener(OnInputFieldValueChange);
}
/// <summary>
/// Callback method invoked when the input field's text value changes.
/// </summary>
/// <param name="updatedText">The text of the input field.</param>
protected virtual void OnInputFieldValueChange(string updatedText)
{
caretPosition = updatedText.Length;
text = updatedText;
}
#endregion
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4f17a1b36fcb274449d030ef08f66941
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,175 @@
using System;
using System.Collections.Generic;
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Scriptable object that defines key mappings to support swapping <see cref="XRKeyboardLayout"/>. There should be one
/// instance of the <see cref="XRKeyboardConfig"/> for each layout (i.e. alphanumeric, symbols, etc.).
/// </summary>
public class XRKeyboardConfig : ScriptableObject
{
/// <summary>
/// Class representing the data needed to populate keys.
/// </summary>
[Serializable]
public class KeyMapping
{
[SerializeField]
string m_Character;
/// <summary>
/// Character for this key in non-shifted state. This string will be passed to the keyboard and appended to the keyboard text string or processed as a keyboard command.
/// </summary>
public string character
{
get => m_Character;
set => m_Character = value;
}
[SerializeField]
string m_DisplayCharacter;
/// <summary>
/// Display character for this key in a non-shifted state. This string will be displayed on the key text field.
/// If empty, character will be used as a fallback.
/// </summary>
public string displayCharacter
{
get => m_DisplayCharacter;
set => m_DisplayCharacter = value;
}
[SerializeField]
Sprite m_DisplayIcon;
/// <summary>
/// Display icon for this key in a non-shifted state. This icon will be displayed on the key image field.
/// If empty, the display character or character will be used as a fallback.
/// </summary>
public Sprite displayIcon
{
get => m_DisplayIcon;
set => m_DisplayIcon = value;
}
[SerializeField]
string m_ShiftCharacter;
/// <summary>
/// Character for this key in a shifted state. This string will be passed to the keyboard and appended to
/// the keyboard text string or processed as a keyboard command.
/// </summary>
public string shiftCharacter
{
get => m_ShiftCharacter;
set => m_ShiftCharacter = value;
}
[SerializeField]
string m_ShiftDisplayCharacter;
/// <summary>
/// Display character for this key in a shifted state. This string will be displayed on the key
/// text field. If empty, shift character will be used as a fallback.
/// </summary>
public string shiftDisplayCharacter
{
get => m_ShiftDisplayCharacter;
set => m_ShiftDisplayCharacter = value;
}
[SerializeField]
Sprite m_ShiftDisplayIcon;
/// <summary>
/// Display icon for this key in a shifted state. This icon will be displayed on the key image field.
/// If empty, the shift display character or shift character will be used as a fallback.
/// </summary>
public Sprite shiftDisplayIcon
{
get => m_ShiftDisplayIcon;
set => m_ShiftDisplayIcon = value;
}
[SerializeField]
bool m_OverrideDefaultKeyFunction;
/// <summary>
/// If true, this will expose a key function property to override the default key function of this config.
/// </summary>
public bool overrideDefaultKeyFunction
{
get => m_OverrideDefaultKeyFunction;
set => m_OverrideDefaultKeyFunction = value;
}
[SerializeField]
KeyFunction m_KeyFunction;
/// <summary>
/// <see cref="KeyFunction"/> used for this key. The function callback will be called on key press
/// and used to communicate with the keyboard API.
/// </summary>
public KeyFunction keyFunction
{
get => m_KeyFunction;
set => m_KeyFunction = value;
}
[SerializeField]
KeyCode m_KeyCode;
/// <summary>
/// (Optional) <see cref="KeyCode"/> used for this key. Used with <see cref="keyFunction"/> to
/// support already defined KeyCode values.
/// </summary>
public KeyCode keyCode
{
get => m_KeyCode;
set => m_KeyCode = value;
}
[SerializeField]
bool m_Disabled;
/// <summary>
/// If true, the key button interactable property will be set to false.
/// </summary>
public bool disabled
{
get => m_Disabled;
set => m_Disabled = value;
}
}
[SerializeField, Tooltip("Default key function for each key in this mapping.")]
KeyFunction m_DefaultKeyFunction;
/// <summary>
/// Default key function for each key in this mapping.
/// </summary>
/// <remarks>This is a utility feature that reduces the authoring needed when most key mappings share the same
/// functionality (i.e. value keys that append characters).</remarks>
public KeyFunction defaultKeyFunction
{
get => m_DefaultKeyFunction;
set => m_DefaultKeyFunction = value;
}
/// <summary>
/// List of each key mapping in this layout.
/// </summary>
[SerializeField, Tooltip("List of each key mapping in this layout.")]
List<KeyMapping> m_KeyMappings;
/// <summary>
/// List of each key mapping in this layout.
/// </summary>
public List<KeyMapping> keyMappings
{
get => m_KeyMappings;
set => m_KeyMappings = value;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 944d8cf1c59c0e8468bcd7e2fd86fe4d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,390 @@
using TMPro;
using UnityEngine.Events;
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Utility class to help facilitate input field relationship with <see cref="XRKeyboard"/>
/// </summary>
public class XRKeyboardDisplay : MonoBehaviour
{
[SerializeField, Tooltip("Input field linked to this display.")]
TMP_InputField m_InputField;
/// <summary>
/// Input field linked to this display.
/// </summary>
public TMP_InputField inputField
{
get => m_InputField;
set
{
if (inputField != null)
m_InputField.onSelect.RemoveListener(OnInputFieldGainedFocus);
m_InputField = value;
if (inputField != null)
{
m_InputField.resetOnDeActivation = false;
m_InputField.onSelect.AddListener(OnInputFieldGainedFocus);
}
}
}
// The script requires setter property logic to be run, so disable when playing
[SerializeField, Tooltip("Keyboard for this display to monitor and interact with. If empty this will default to the GlobalNonNativeKeyboard keyboard.")]
XRKeyboard m_Keyboard;
/// <summary>
/// Keyboard for this display to monitor and interact with. If empty this will default to the <see cref="GlobalNonNativeKeyboard"/> keyboard.
/// </summary>
public XRKeyboard keyboard
{
get => m_Keyboard;
set => SetKeyboard(value);
}
[SerializeField, Tooltip("If true, this display will use the keyboard reference. If false or if the keyboard field is empty, this display will use global keyboard.")]
bool m_UseSceneKeyboard;
/// <summary>
/// If true, this display will use the keyboard reference. If false or if the keyboard field is empty,
/// this display will use global keyboard.
/// </summary>
public bool useSceneKeyboard
{
get => m_UseSceneKeyboard;
set => m_UseSceneKeyboard = value;
}
[SerializeField, Tooltip("If true, this display will update with each key press. If false, this display will update on OnTextSubmit.")]
bool m_UpdateOnKeyPress = true;
/// <summary>
/// If true, this display will update with each key press. If false, this display will update on OnTextSubmit.
/// </summary>
public bool updateOnKeyPress
{
get => m_UpdateOnKeyPress;
set => m_UpdateOnKeyPress = value;
}
[SerializeField, Tooltip("If true, this display will always subscribe to the keyboard updates. If false, this display will subscribe to keyboard when the input field gains focus.")]
bool m_AlwaysObserveKeyboard;
/// <summary>
/// If true, this display will always subscribe to the keyboard updates. If false, this display will subscribe
/// to keyboard when the input field gains focus.
/// </summary>
public bool alwaysObserveKeyboard
{
get => m_AlwaysObserveKeyboard;
set => m_AlwaysObserveKeyboard = value;
}
[SerializeField, Tooltip("If true, this display will use the input field's character limit to limit the update text from the keyboard and will pass this into the keyboard when opening.")]
public bool m_MonitorInputFieldCharacterLimit;
/// <summary>
/// If true, this display will use the input field's character limit to limit the update text from the keyboard
/// and will pass this into the keyboard when opening if.
/// </summary>
public bool monitorInputFieldCharacterLimit
{
get => m_MonitorInputFieldCharacterLimit;
set => m_MonitorInputFieldCharacterLimit = value;
}
[SerializeField, Tooltip("If true, this display will clear the input field text on text submit from the keyboard.")]
public bool m_ClearTextOnSubmit;
/// <summary>
/// If true, this display will clear the input field text on text submit from the keyboard.
/// </summary>
public bool clearTextOnSubmit
{
get => m_ClearTextOnSubmit;
set => m_ClearTextOnSubmit = value;
}
[SerializeField, Tooltip("If true, this display will clear the input field text when the keyboard opens.")]
public bool m_ClearTextOnOpen;
/// <summary>
/// If true, this display will clear the input field text on text submit from the keyboard.
/// </summary>
public bool clearTextOnOpen
{
get => m_ClearTextOnOpen;
set => m_ClearTextOnOpen = value;
}
[SerializeField, Tooltip("The event that is called when this display receives a text submitted event from the keyboard. Invoked with the keyboard text as a parameter.")]
UnityEvent<string> m_OnTextSubmitted = new UnityEvent<string>();
/// <summary>
/// The event that is called when this display receives a text submitted event from the keyboard.
/// </summary>
public UnityEvent<string> onTextSubmitted
{
get => m_OnTextSubmitted;
set => m_OnTextSubmitted = value;
}
[SerializeField, Tooltip("The event that is called when this display opens a keyboard.")]
UnityEvent m_OnKeyboardOpened = new UnityEvent();
/// <summary>
/// The event that is called when this display opens a keyboard.
/// </summary>
public UnityEvent onKeyboardOpened
{
get => m_OnKeyboardOpened;
set => m_OnKeyboardOpened = value;
}
[SerializeField, Tooltip("The event that is called when the keyboard this display is observing is closed.")]
UnityEvent m_OnKeyboardClosed = new UnityEvent();
/// <summary>
/// The event that is called when the keyboard this display is observing is closed.
/// </summary>
public UnityEvent onKeyboardClosed
{
get => m_OnKeyboardClosed;
set => m_OnKeyboardClosed = value;
}
[SerializeField, Tooltip("The event that is called when the keyboard changes focus and this display is not focused.")]
UnityEvent m_OnKeyboardFocusChanged = new UnityEvent();
/// <summary>
/// The event that is called when the keyboard changes focus and this display is not focused.
/// </summary>
public UnityEvent onKeyboardFocusChanged
{
get => m_OnKeyboardFocusChanged;
set => m_OnKeyboardFocusChanged = value;
}
// Active keyboard for this display
XRKeyboard m_ActiveKeyboard;
bool m_IsActivelyObservingKeyboard;
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
void Awake()
{
// Set active keyboard to any serialized keyboard
m_ActiveKeyboard = m_Keyboard;
if (m_InputField != null)
{
// resetOnDeActivation should be false so the caret position does not break with the keyboard interaction
m_InputField.resetOnDeActivation = false;
// shouldHideSoftKeyboard should be true so there is no conflict with the spatial keyboard and the system keyboard
m_InputField.shouldHideSoftKeyboard = true;
}
if (m_AlwaysObserveKeyboard && m_ActiveKeyboard != null)
StartObservingKeyboard(m_ActiveKeyboard);
}
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
void OnEnable()
{
if (m_InputField != null)
m_InputField.onSelect.AddListener(OnInputFieldGainedFocus);
}
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
void OnDisable()
{
if (m_InputField != null)
m_InputField.onSelect.RemoveListener(OnInputFieldGainedFocus);
}
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
void OnDestroy()
{
StopObservingKeyboard(m_ActiveKeyboard);
}
/// <summary>
/// See <see cref="MonoBehaviour"/>.
/// </summary>
void Start()
{
// Set active keyboard to global keyboard if needed
if (m_ActiveKeyboard == null || !m_UseSceneKeyboard)
m_ActiveKeyboard = GlobalNonNativeKeyboard.instance.keyboard;
// Observe keyboard if always observe is true
var observeOnStart = m_AlwaysObserveKeyboard && m_ActiveKeyboard != null &! m_IsActivelyObservingKeyboard;
if (observeOnStart)
StartObservingKeyboard(m_ActiveKeyboard);
}
void SetKeyboard(XRKeyboard updateKeyboard, bool observeKeyboard = true)
{
if (ReferenceEquals(updateKeyboard, m_Keyboard))
return;
StopObservingKeyboard(m_ActiveKeyboard);
// Update serialized referenced
m_Keyboard = updateKeyboard;
// Update private keyboard
m_ActiveKeyboard = m_Keyboard;
if (m_ActiveKeyboard != null && (observeKeyboard || m_AlwaysObserveKeyboard))
StartObservingKeyboard(m_ActiveKeyboard);
}
void StartObservingKeyboard(XRKeyboard activeKeyboard)
{
if (activeKeyboard == null || m_IsActivelyObservingKeyboard)
return;
activeKeyboard.onTextUpdated.AddListener(OnTextUpdate);
activeKeyboard.onTextSubmitted.AddListener(OnTextSubmit);
activeKeyboard.onClosed.AddListener(KeyboardClosing);
activeKeyboard.onOpened.AddListener(KeyboardOpening);
activeKeyboard.onFocusChanged.AddListener(KeyboardFocusChanged);
m_IsActivelyObservingKeyboard = true;
}
void StopObservingKeyboard(XRKeyboard activeKeyboard)
{
if (activeKeyboard == null)
return;
activeKeyboard.onTextUpdated.RemoveListener(OnTextUpdate);
activeKeyboard.onTextSubmitted.RemoveListener(OnTextSubmit);
activeKeyboard.onClosed.RemoveListener(KeyboardClosing);
activeKeyboard.onOpened.RemoveListener(KeyboardOpening);
activeKeyboard.onFocusChanged.RemoveListener(KeyboardFocusChanged);
m_IsActivelyObservingKeyboard = false;
}
void OnInputFieldGainedFocus(string text)
{
// If this display is already observing keyboard, sync, attempt to reposition, and early out
// Displays that are always observing keyboards call open to ensure they sync with the keyboard
if (m_IsActivelyObservingKeyboard && !alwaysObserveKeyboard)
{
if (!m_UseSceneKeyboard || m_Keyboard == null)
GlobalNonNativeKeyboard.instance.RepositionKeyboardIfOutOfView();
// Sync input field caret position with keyboard caret position
m_InputField.caretPosition = m_ActiveKeyboard.caretPosition;
return;
}
if (m_ClearTextOnOpen)
m_InputField.text = string.Empty;
// If not using a scene keyboard, use global keyboard.
if (!m_UseSceneKeyboard || m_Keyboard == null)
{
GlobalNonNativeKeyboard.instance.ShowKeyboard(m_InputField, m_MonitorInputFieldCharacterLimit);
}
else
{
m_ActiveKeyboard.Open(m_InputField, m_MonitorInputFieldCharacterLimit);
}
// Sync input field caret position with keyboard caret position
m_InputField.caretPosition = m_ActiveKeyboard.caretPosition;
// This display is opening the keyboard
m_OnKeyboardOpened.Invoke();
StartObservingKeyboard(m_ActiveKeyboard);
}
void OnTextSubmit(KeyboardTextEventArgs args)
{
UpdateText(args.keyboardText);
m_OnTextSubmitted?.Invoke(args.keyboardText);
if (m_ClearTextOnSubmit)
{
inputField.text = string.Empty;
}
}
void OnTextUpdate(KeyboardTextEventArgs args)
{
if (!m_UpdateOnKeyPress)
return;
UpdateText(args.keyboardText);
}
void UpdateText(string text)
{
var updatedText = text;
// Clip updated text to substring
if (m_MonitorInputFieldCharacterLimit && updatedText.Length >= m_InputField.characterLimit)
updatedText = updatedText.Substring(0, m_InputField.characterLimit);
m_InputField.text = updatedText;
// Update input field caret position with keyboard caret position
m_InputField.caretPosition = m_ActiveKeyboard.caretPosition;
}
void KeyboardOpening(KeyboardTextEventArgs args)
{
Debug.Assert(args.keyboard == m_ActiveKeyboard);
if (args.keyboard != m_ActiveKeyboard)
return;
if (!m_InputField.isFocused && !m_AlwaysObserveKeyboard)
StopObservingKeyboard(m_ActiveKeyboard);
}
void KeyboardClosing(KeyboardTextEventArgs args)
{
Debug.Assert(args.keyboard == m_ActiveKeyboard);
if (args.keyboard != m_ActiveKeyboard)
return;
if (!m_AlwaysObserveKeyboard)
StopObservingKeyboard(m_ActiveKeyboard);
m_OnKeyboardClosed.Invoke();
}
void KeyboardFocusChanged(KeyboardTextEventArgs args)
{
Debug.Assert(args.keyboard == m_ActiveKeyboard);
if (args.keyboard != m_ActiveKeyboard)
return;
if (!m_InputField.isFocused && !m_AlwaysObserveKeyboard)
StopObservingKeyboard(m_ActiveKeyboard);
// The keyboard changed focus and this input field is no longer in focus
if (!m_InputField.isFocused)
m_OnKeyboardFocusChanged.Invoke();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a2317ceab4d3d38419fe16eebc1c0cd3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,133 @@
using System;
using UnityEngine.Events;
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
#region EventArgs
/// <summary>
/// Event data associated with a keyboard event.
/// </summary>
public class KeyboardBaseEventArgs
{
/// <summary>
/// The XR Keyboard associated with this keyboard event.
/// </summary>
public XRKeyboard keyboard { get; set; }
}
/// <summary>
/// Event data associated with a keyboard event that includes text.
/// </summary>
public class KeyboardTextEventArgs : KeyboardBaseEventArgs
{
/// <summary>
/// The current keyboard text when this event is fired.
/// </summary>
public string keyboardText { get; set; }
}
/// <summary>
/// Event data associated with a keyboard event that includes a keyboard key.
/// </summary>
public class KeyboardKeyEventArgs : KeyboardBaseEventArgs
{
/// <summary>
/// The key associated with this event.
/// </summary>
public XRKeyboardKey key { get; set; }
}
/// <summary>
/// Event data associated with a keyboard event that includes a bool value.
/// </summary>
public class KeyboardBoolEventArgs : KeyboardBaseEventArgs
{
/// <summary>
/// The bool value associated with this event.
/// </summary>
public bool value { get; set; }
}
/// <summary>
/// Event data associated with a keyboard event that includes a layout string.
/// </summary>
public class KeyboardLayoutEventArgs : KeyboardBaseEventArgs
{
/// <summary>
/// The layout string associated with this event.
/// </summary>
public string layout { get; set; }
}
/// <summary>
/// Event data associated with modifiers of the keyboard.
/// </summary>
public class KeyboardModifiersEventArgs : KeyboardBaseEventArgs
{
/// <summary>
/// The shift value associated with this event.
/// </summary>
public bool shiftValue { get; set; }
/// <summary>
/// The caps lock value associated with this event.
/// </summary>
public bool capsLockValue { get; set; }
}
#endregion
#region Events
/// <summary>
/// <see cref="UnityEvent"/> that Unity invokes on a keyboard.
/// </summary>
[Serializable]
public sealed class KeyboardEvent : UnityEvent<KeyboardBaseEventArgs>
{
}
/// <summary>
/// <see cref="UnityEvent"/> that includes text that Unity invokes on a keyboard.
/// </summary>
[Serializable]
public sealed class KeyboardTextEvent : UnityEvent<KeyboardTextEventArgs>
{
}
/// <summary>
/// <see cref="UnityEvent"/> that includes a key that Unity invokes on a keyboard.
/// </summary>
[Serializable]
public sealed class KeyboardKeyEvent : UnityEvent<KeyboardKeyEventArgs>
{
}
/// <summary>
/// <see cref="UnityEvent"/> that includes a bool value that Unity invokes on a keyboard.
/// </summary>
[Serializable]
public sealed class KeyboardBoolEvent : UnityEvent<KeyboardBoolEventArgs>
{
}
/// <summary>
/// <see cref="UnityEvent"/> that includes a layout string that Unity invokes on a keyboard.
/// </summary>
[Serializable]
public sealed class KeyboardLayoutEvent : UnityEvent<KeyboardLayoutEventArgs>
{
}
/// <summary>
/// <see cref="UnityEvent"/> that includes supported keyboard modifiers.
/// </summary>
/// <remarks>Currently supported keyboard modifiers include shift and caps lock.</remarks>
[Serializable]
public sealed class KeyboardModifiersEvent : UnityEvent<KeyboardModifiersEventArgs>
{
}
#endregion
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f1f37871f6d8da54babd815aa4184559
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,451 @@
using TMPro;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace UnityEngine.XR.Interaction.Toolkit.Samples.SpatialKeyboard
{
/// <summary>
/// Keyboard key used to interface with <see cref="XRKeyboard"/>.
/// </summary>
public class XRKeyboardKey : Button
{
[SerializeField, Tooltip("KeyFunction used for this key which is called when key is pressed. Used to communicate with the Keyboard.")]
KeyFunction m_KeyFunction;
/// <summary>
/// <see cref="KeyFunction"/> used for this key which is called when key is pressed. Used to communicate with
/// the Keyboard.
/// </summary>
public KeyFunction keyFunction
{
get => m_KeyFunction;
set => m_KeyFunction = value;
}
[SerializeField, Tooltip("(Optional) KeyCode used for this key. Used in conjunction with Key Function or as a fallback for standard commands.")]
KeyCode m_KeyCode;
/// <summary>
/// (Optional) <see cref="KeyCode"/> used for this key. Used in conjunction with Key Function or as a fallback for standard commands.
/// </summary>
public KeyCode keyCode
{
get => m_KeyCode;
set => m_KeyCode = value;
}
[SerializeField, Tooltip("Character for this key in non-shifted state. This string will be passed to the keyboard and appended to the keyboard text string or processed as a keyboard command.")]
string m_Character;
/// <summary>
/// Character for this key in non-shifted state. This string will be passed to the keyboard and appended
/// to the keyboard text string or processed as a keyboard command (i.e. '\s' for shift)
/// </summary>
public string character
{
get => m_Character;
set => m_Character = value;
}
[SerializeField, Tooltip("(Optional) Display character for this key in a non-shifted state. This string will be displayed on the key text field. If empty, character will be used as a fall back.")]
string m_DisplayCharacter;
/// <summary>
/// (Optional) Display character for this key in a non-shifted state. This string will be displayed on the
/// key text field. If left empty, <see cref="character"/> will be used instead.
/// </summary>
public string displayCharacter
{
get => m_DisplayCharacter;
set
{
m_DisplayCharacter = value;
RefreshDisplayCharacter();
}
}
[SerializeField, Tooltip("(Optional) Display icon for this key in a non-shifted state. This icon will be displayed on the key icon image. If empty, the display character or character will be used as a fall back.")]
Sprite m_DisplayIcon;
/// <summary>
/// (Optional) Display icon for this key in a non-shifted state. This icon will be displayed on the key icon image.
/// If empty, the display character or character will be used instead.
/// </summary>
public Sprite displayIcon
{
get => m_DisplayIcon;
set
{
m_DisplayIcon = value;
if (m_IconComponent != null)
{
m_IconComponent.sprite = m_DisplayIcon;
m_IconComponent.enabled = m_DisplayIcon != null;
}
RefreshDisplayCharacter();
}
}
[SerializeField, Tooltip("Character for this key in a shifted state. This string will be passed to the keyboard and appended to the keyboard text string or processed as a keyboard command.")]
string m_ShiftCharacter;
/// <summary>
/// Character for this key in a shifted state. This string will be passed to the keyboard and appended
/// to the keyboard text string or processed as a keyboard command (i.e. '\s' for shift).
/// </summary>
public string shiftCharacter
{
get => m_ShiftCharacter;
set => m_ShiftCharacter = value;
}
[SerializeField, Tooltip("(Optional) Display character for this key in a shifted state. This string will be displayed on the key text field. If empty, shift character will be used as a fall back.")]
string m_ShiftDisplayCharacter;
/// <summary>
/// (Optional) Display character for this key in a shifted state. This string will be displayed on the key text field.
/// If empty, <see cref="shiftCharacter"/> will be used instead, and finally <see cref="character"/> will
/// be capitalized and used if <see cref="shiftCharacter"/> is empty.
/// </summary>
public string shiftDisplayCharacter
{
get => m_ShiftDisplayCharacter;
set
{
m_ShiftDisplayCharacter = value;
RefreshDisplayCharacter();
}
}
[SerializeField, Tooltip("(Optional) Display icon for this key in a shifted state. This icon will be displayed on the key icon image. If empty, the shift display character or shift character will be used as a fall back.")]
Sprite m_ShiftDisplayIcon;
/// <summary>
/// (Optional) Display icon for this key in a shifted state. This icon will be displayed on the key icon image.
/// If empty, the shift display character or shift character will be used instead.
/// </summary>
public Sprite shiftDisplayIcon
{
get => m_ShiftDisplayIcon;
set
{
m_ShiftDisplayIcon = value;
if (m_IconComponent != null)
{
m_IconComponent.sprite = shiftDisplayIcon;
m_IconComponent.enabled = shiftDisplayIcon != null;
}
RefreshDisplayCharacter();
}
}
[SerializeField, Tooltip("If true, the key pressed event will fire on button down. If false, the key pressed event will fire on On Click.")]
bool m_UpdateOnKeyDown;
/// <summary>
/// If true, key pressed will fire on button down instead of on button up.
/// </summary>
public bool updateOnKeyDown
{
get => m_UpdateOnKeyDown;
set => m_UpdateOnKeyDown = value;
}
[SerializeField, Tooltip("Text field used to display key character.")]
TMP_Text m_TextComponent;
/// <summary>
/// Text field used to display key character.
/// </summary>
public TMP_Text textComponent
{
get => m_TextComponent;
set => m_TextComponent = value;
}
[SerializeField, Tooltip("Image component used to display icons for key.")]
Image m_IconComponent;
/// <summary>
/// Image component used to display icons for key.
/// </summary>
public Image iconComponent
{
get => m_IconComponent;
set => m_IconComponent = value;
}
[SerializeField, Tooltip("Image component used to highlight key indicating an active state.")]
Image m_HighlightComponent;
/// <summary>
/// Image component used to highlight key indicating an active state.
/// </summary>
public Image highlightComponent
{
get => m_HighlightComponent;
set => m_HighlightComponent = value;
}
[SerializeField, Tooltip("(Optional) Audio source played when key is pressed.")]
AudioSource m_AudioSource;
/// <summary>
/// (Optional) Audio source played when key is pressed.
/// </summary>
public AudioSource audioSource
{
get => m_AudioSource;
set => m_AudioSource = value;
}
XRKeyboard m_Keyboard;
float m_LastClickTime;
bool m_Shifted;
/// <summary>
/// True if this key is in a shifted state, otherwise returns false.
/// </summary>
public bool shifted
{
get => m_Shifted;
set
{
m_Shifted = value;
RefreshDisplayCharacter();
}
}
/// <summary>
/// Time the key was last pressed.
/// </summary>
public float lastClickTime => m_LastClickTime;
/// <summary>
/// Time since the key was last pressed.
/// </summary>
public float timeSinceLastClick => Time.time - m_LastClickTime;
/// <summary>
/// The keyboard associated with this key.
/// </summary>
public XRKeyboard keyboard
{
get => m_Keyboard;
set
{
if (m_Keyboard != null)
{
m_Keyboard.onShifted.RemoveListener(OnKeyboardShift);
m_Keyboard.onLayoutChanged.RemoveListener(OnKeyboardLayoutChange);
}
m_Keyboard = value;
if (m_Keyboard != null)
{
m_Keyboard.onShifted.AddListener(OnKeyboardShift);
m_Keyboard.onLayoutChanged.AddListener(OnKeyboardLayoutChange);
}
}
}
/// <inheritdoc />
protected override void Start()
{
base.Start();
RefreshDisplayCharacter();
}
/// <inheritdoc />
protected override void OnDestroy()
{
base.OnDestroy();
if (m_Keyboard != null)
{
m_Keyboard.onShifted.RemoveListener(OnKeyboardShift);
m_Keyboard.onLayoutChanged.RemoveListener(OnKeyboardLayoutChange);
}
}
/// <inheritdoc />
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
if (m_UpdateOnKeyDown && interactable)
KeyClick();
}
/// <inheritdoc />
public override void OnPointerClick(PointerEventData eventData)
{
base.OnPointerClick(eventData);
if (!m_UpdateOnKeyDown)
KeyClick();
}
protected virtual void KeyClick()
{
// Local function of things to do to the key when pressed (Audio, etc.)
KeyPressed();
if (m_KeyFunction != null)
{
m_KeyFunction.PreprocessKey(m_Keyboard, this);
m_KeyFunction.ProcessKey(m_Keyboard, this);
m_KeyFunction.PostprocessKey(m_Keyboard, this);
}
else
{
// Fallback if key function is null
m_Keyboard.PreprocessKeyPress(this);
m_Keyboard.TryProcessKeyPress(this);
m_Keyboard.PostprocessKeyPress(this);
}
m_LastClickTime = Time.time;
}
/// <summary>
/// Local handling of this key being pressed.
/// </summary>
protected virtual void KeyPressed()
{
if (m_AudioSource != null)
{
if (m_AudioSource.isPlaying)
m_AudioSource.Stop();
float pitchVariance = Random.Range(0.95f, 1.05f);
m_AudioSource.pitch = pitchVariance;
m_AudioSource.Play();
}
}
protected virtual void OnKeyboardShift(KeyboardModifiersEventArgs args)
{
shifted = args.shiftValue;
}
protected virtual void OnKeyboardLayoutChange(KeyboardLayoutEventArgs args)
{
var enableHighlight = args.layout == m_Character && !m_HighlightComponent.enabled;
EnableHighlight(enableHighlight);
}
/// <summary>
/// Enables or disables the key highlight image.
/// </summary>
/// <param name="enable">If true, the highlight image is enabled. If false, the highlight image is disabled.</param>
public void EnableHighlight(bool enable)
{
if (m_HighlightComponent != null)
{
m_HighlightComponent.enabled = enable;
}
}
// Helper functions
protected void RefreshDisplayCharacter()
{
if (m_KeyFunction != null && m_Keyboard != null)
m_KeyFunction.ProcessRefreshDisplay(m_Keyboard, this);
if (m_IconComponent != null)
{
m_IconComponent.sprite = GetEffectiveDisplayIcon();
if (m_IconComponent.sprite != null)
{
m_TextComponent.enabled = false;
m_IconComponent.enabled = true;
return;
}
}
if (m_TextComponent != null)
{
m_TextComponent.text = GetEffectiveDisplayCharacter();
m_TextComponent.enabled = true;
m_IconComponent.enabled = false;
}
}
protected virtual string GetEffectiveDisplayCharacter()
{
// If we've got a display character, prioritize that.
string value;
if (!string.IsNullOrEmpty(m_DisplayCharacter))
value = m_DisplayCharacter;
else if (!string.IsNullOrEmpty(m_Character))
value = m_Character;
else
value = string.Empty;
// If we're in shift mode, check our shift overrides.
if (m_Shifted)
{
if (!string.IsNullOrEmpty(m_ShiftDisplayCharacter))
value = m_ShiftDisplayCharacter;
else if (!string.IsNullOrEmpty(m_ShiftCharacter))
value = m_ShiftCharacter;
else
value = value.ToUpper();
}
return value;
}
protected virtual Sprite GetEffectiveDisplayIcon()
{
if (m_KeyFunction != null && m_Keyboard != null && m_KeyFunction.OverrideDisplayIcon(m_Keyboard, this))
return m_KeyFunction.GetDisplayIcon(m_Keyboard, this);
return m_Shifted ? m_ShiftDisplayIcon : m_DisplayIcon;
}
/// <summary>
/// Helper function that returns the current effective character for this key based on shifted state.
/// </summary>
/// <returns>Returns the <see cref="shiftCharacter"/> when this key is in the shifted state or <see cref="character"/>
/// when this key is not shifted.</returns>
public virtual string GetEffectiveCharacter()
{
if (m_Shifted)
{
if (!string.IsNullOrEmpty(m_ShiftCharacter))
return m_ShiftCharacter;
return m_Character.ToUpper();
}
return m_Character;
}
/// <summary>
/// Enables or disables the key button being interactable. The icon and text alpha will be adjusted to reflect
/// the state of the button.
/// </summary>
/// <param name="enable">The desired interactable state of the key.</param>
public virtual void SetButtonInteractable(bool enable)
{
const float enabledAlpha = 1f;
const float disabledAlpha = 0.25f;
interactable = enable;
if (m_TextComponent != null)
{
m_TextComponent.alpha = enable ? enabledAlpha : disabledAlpha;
}
if (m_IconComponent != null)
{
var c = m_IconComponent.color;
c.a = enable ? enabledAlpha : disabledAlpha;
m_IconComponent.color = c;
}
}
}
}

Some files were not shown because too many files have changed in this diff Show more