forked from cgvr/DeltaVR
Remove useless files, add hands
This commit is contained in:
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c16c4116bcbdd184280b311f0ea43adb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -1,22 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 98e759dfda69aa7468d95f5a2c88e366
|
||||
AudioImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 6
|
||||
defaultSettings:
|
||||
loadType: 0
|
||||
sampleRateSetting: 0
|
||||
sampleRateOverride: 44100
|
||||
compressionFormat: 1
|
||||
quality: 1
|
||||
conversionMode: 0
|
||||
platformSettingOverrides: {}
|
||||
forceToMono: 1
|
||||
normalize: 0
|
||||
preloadAudioData: 1
|
||||
loadInBackground: 0
|
||||
ambisonic: 0
|
||||
3D: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -1,22 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 523f822c1c7b699489c49fea2353c2de
|
||||
AudioImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 6
|
||||
defaultSettings:
|
||||
loadType: 0
|
||||
sampleRateSetting: 0
|
||||
sampleRateOverride: 44100
|
||||
compressionFormat: 1
|
||||
quality: 1
|
||||
conversionMode: 0
|
||||
platformSettingOverrides: {}
|
||||
forceToMono: 1
|
||||
normalize: 0
|
||||
preloadAudioData: 1
|
||||
loadInBackground: 0
|
||||
ambisonic: 0
|
||||
3D: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: baf3c6535c1e8004c840b70b6e66694a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,83 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: DefaultHandMaterial
|
||||
m_Shader: {fileID: 4800000, guid: 8aba22c2208aff640a2fdc9a5e45a9dd, type: 3}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: 3001
|
||||
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_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _FresnelPower: 0.215
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _HandAlpha: 1
|
||||
- _Metallic: 0
|
||||
- _MinVisibleAlpha: 0.164
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _RimFactor: 0.922
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _ColorBottom: {r: 0.36154413, g: 0.560827, b: 0.8088235, a: 1}
|
||||
- _ColorPrimary: {r: 0.75735295, g: 0.75735295, b: 0.75735295, a: 1}
|
||||
- _ColorTop: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8f92ce6a2e9e04e458f46e6a635b1d62
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,76 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: PokeMaterial
|
||||
m_Shader: {fileID: 10755, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords:
|
||||
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_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _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: 0.20392157, g: 0.59607846, b: 0.9529412, a: 0.85882354}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4f7fe89ad7fd14a4a9a5ebc776621cef
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,80 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: RayMaterial
|
||||
m_Shader: {fileID: 10721, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords:
|
||||
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}
|
||||
- _ColorMask:
|
||||
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_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _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: 0.31132078, g: 0.31132078, b: 0.31132078, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0b157fd34da92084a8cf68f92d515504
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,87 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: SkeletonBoneMaterial
|
||||
m_Shader: {fileID: 4800000, guid: 8aba22c2208aff640a2fdc9a5e45a9dd, type: 3}
|
||||
m_ShaderKeywords: _ALPHATEST_ON
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: 3000
|
||||
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}
|
||||
- _SpecGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _FresnelPower: 0.16
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _HandAlpha: 1
|
||||
- _Metallic: 0
|
||||
- _MinVisibleAlpha: 0.1
|
||||
- _Mode: 1
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _RimFactor: 0.66
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _ColorBottom: {r: 0.69411767, g: 0.7254902, b: 0.7529412, a: 1}
|
||||
- _ColorPrimary: {r: 0.69419724, g: 0.727208, b: 0.754717, a: 1}
|
||||
- _ColorTop: {r: 0.69411767, g: 0.7254902, b: 0.7529412, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: abb80e58ce7c0a842a4758d09d9d71e0
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,83 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: SystemGestureHandMaterial
|
||||
m_Shader: {fileID: 4800000, guid: 8aba22c2208aff640a2fdc9a5e45a9dd, type: 3}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: 3001
|
||||
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_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _FresnelPower: 0.215
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _HandAlpha: 1
|
||||
- _Metallic: 0
|
||||
- _MinVisibleAlpha: 0.164
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _RimFactor: 0.922
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _ColorBottom: {r: 0.9852941, g: 0.97749966, b: 0.7027465, a: 1}
|
||||
- _ColorPrimary: {r: 0.75735295, g: 0.75735295, b: 0.75735295, a: 1}
|
||||
- _ColorTop: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6b3381fce337f7049a8972d9356bde5e
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,87 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: SystemGestureSkeletonBoneMaterial
|
||||
m_Shader: {fileID: 4800000, guid: 8aba22c2208aff640a2fdc9a5e45a9dd, type: 3}
|
||||
m_ShaderKeywords: _ALPHATEST_ON
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: 3000
|
||||
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}
|
||||
- _SpecGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _FresnelPower: 0.16
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _HandAlpha: 1
|
||||
- _Metallic: 0
|
||||
- _MinVisibleAlpha: 0.1
|
||||
- _Mode: 1
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _RimFactor: 0.66
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _ColorBottom: {r: 0.9843137, g: 0.9764706, b: 0.7019608, a: 1}
|
||||
- _ColorPrimary: {r: 0.69419724, g: 0.727208, b: 0.754717, a: 1}
|
||||
- _ColorTop: {r: 0.69411767, g: 0.7254902, b: 0.7529412, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a3aacb3bb3e11b948899db3fbefc6fe1
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,77 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: TargetMaterial
|
||||
m_Shader: {fileID: 10755, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords:
|
||||
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_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _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: 0.09433961, g: 0.09433961, b: 0.09433961, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7c4fbc253f678a74f8135c524ac84bfe
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbbc3e3307530c94eb28bc511019cac0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,169 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &100100000
|
||||
Prefab:
|
||||
m_ObjectHideFlags: 1
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications: []
|
||||
m_RemovedComponents: []
|
||||
m_ParentPrefab: {fileID: 0}
|
||||
m_RootGameObject: {fileID: 1442650750392254}
|
||||
m_IsPrefabParent: 1
|
||||
--- !u!1 &1111425375777918
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4219426481331184}
|
||||
- component: {fileID: 23972330622521208}
|
||||
- component: {fileID: 33525002520690944}
|
||||
m_Layer: 0
|
||||
m_Name: TargetTransform
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1442650750392254
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4663491353866464}
|
||||
- component: {fileID: 114989427021710928}
|
||||
m_Layer: 0
|
||||
m_Name: FingerTipPokeToolIndex
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1571306303871116
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4234436049194514}
|
||||
- component: {fileID: 114931914658985562}
|
||||
m_Layer: 0
|
||||
m_Name: FingeTipPokeToolView
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4219426481331184
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0.01, y: 0.01, z: 0.01}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 4234436049194514}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4234436049194514
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4219426481331184}
|
||||
m_Father: {fileID: 4663491353866464}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4663491353866464
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4234436049194514}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!23 &23972330622521208
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 1
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 4f7fe89ad7fd14a4a9a5ebc776621cef, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 0
|
||||
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
|
||||
--- !u!33 &33525002520690944
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!114 &114931914658985562
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f58463a8ddf862a45a7a5dbd85d11ffd, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_sphereMeshRenderer: {fileID: 23972330622521208}
|
||||
--- !u!114 &114989427021710928
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ded892ce0d9b4e043844fcfd27b63b7a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_fingerTipPokeToolView: {fileID: 114931914658985562}
|
||||
_fingerToFollow: 1
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 54e898404b081ae438d0b5d097aae07a
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,169 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &100100000
|
||||
Prefab:
|
||||
m_ObjectHideFlags: 1
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications: []
|
||||
m_RemovedComponents: []
|
||||
m_ParentPrefab: {fileID: 0}
|
||||
m_RootGameObject: {fileID: 1442650750392254}
|
||||
m_IsPrefabParent: 1
|
||||
--- !u!1 &1111425375777918
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4219426481331184}
|
||||
- component: {fileID: 23972330622521208}
|
||||
- component: {fileID: 33525002520690944}
|
||||
m_Layer: 0
|
||||
m_Name: TargetTransform
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1442650750392254
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4663491353866464}
|
||||
- component: {fileID: 114989427021710928}
|
||||
m_Layer: 0
|
||||
m_Name: FingerTipPokeToolMiddle
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1571306303871116
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4234436049194514}
|
||||
- component: {fileID: 114931914658985562}
|
||||
m_Layer: 0
|
||||
m_Name: FingeTipPokeToolView
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4219426481331184
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0.01, y: 0.01, z: 0.01}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 4234436049194514}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4234436049194514
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4219426481331184}
|
||||
m_Father: {fileID: 4663491353866464}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4663491353866464
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4234436049194514}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!23 &23972330622521208
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 1
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 4f7fe89ad7fd14a4a9a5ebc776621cef, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 0
|
||||
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
|
||||
--- !u!33 &33525002520690944
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!114 &114931914658985562
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f58463a8ddf862a45a7a5dbd85d11ffd, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_sphereMeshRenderer: {fileID: 23972330622521208}
|
||||
--- !u!114 &114989427021710928
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ded892ce0d9b4e043844fcfd27b63b7a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_fingerTipPokeToolView: {fileID: 114931914658985562}
|
||||
_fingerToFollow: 2
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa0335bbc63fc1b46b9b6d2b41d39f6d
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,169 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &100100000
|
||||
Prefab:
|
||||
m_ObjectHideFlags: 1
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications: []
|
||||
m_RemovedComponents: []
|
||||
m_ParentPrefab: {fileID: 0}
|
||||
m_RootGameObject: {fileID: 1442650750392254}
|
||||
m_IsPrefabParent: 1
|
||||
--- !u!1 &1111425375777918
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4219426481331184}
|
||||
- component: {fileID: 23972330622521208}
|
||||
- component: {fileID: 33525002520690944}
|
||||
m_Layer: 0
|
||||
m_Name: TargetTransform
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1442650750392254
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4663491353866464}
|
||||
- component: {fileID: 114989427021710928}
|
||||
m_Layer: 0
|
||||
m_Name: FingerTipPokeToolPinky
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1571306303871116
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4234436049194514}
|
||||
- component: {fileID: 114931914658985562}
|
||||
m_Layer: 0
|
||||
m_Name: FingeTipPokeToolView
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4219426481331184
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0.01, y: 0.01, z: 0.01}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 4234436049194514}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4234436049194514
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4219426481331184}
|
||||
m_Father: {fileID: 4663491353866464}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4663491353866464
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4234436049194514}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!23 &23972330622521208
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 1
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 4f7fe89ad7fd14a4a9a5ebc776621cef, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 0
|
||||
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
|
||||
--- !u!33 &33525002520690944
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!114 &114931914658985562
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f58463a8ddf862a45a7a5dbd85d11ffd, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_sphereMeshRenderer: {fileID: 23972330622521208}
|
||||
--- !u!114 &114989427021710928
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ded892ce0d9b4e043844fcfd27b63b7a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_fingerTipPokeToolView: {fileID: 114931914658985562}
|
||||
_fingerToFollow: 4
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d64b2e1f5538eca479e4bc093f451518
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,169 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &100100000
|
||||
Prefab:
|
||||
m_ObjectHideFlags: 1
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications: []
|
||||
m_RemovedComponents: []
|
||||
m_ParentPrefab: {fileID: 0}
|
||||
m_RootGameObject: {fileID: 1442650750392254}
|
||||
m_IsPrefabParent: 1
|
||||
--- !u!1 &1111425375777918
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4219426481331184}
|
||||
- component: {fileID: 23972330622521208}
|
||||
- component: {fileID: 33525002520690944}
|
||||
m_Layer: 0
|
||||
m_Name: TargetTransform
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1442650750392254
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4663491353866464}
|
||||
- component: {fileID: 114989427021710928}
|
||||
m_Layer: 0
|
||||
m_Name: FingerTipPokeToolRing
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1571306303871116
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4234436049194514}
|
||||
- component: {fileID: 114931914658985562}
|
||||
m_Layer: 0
|
||||
m_Name: FingeTipPokeToolView
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4219426481331184
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0.01, y: 0.01, z: 0.01}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 4234436049194514}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4234436049194514
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4219426481331184}
|
||||
m_Father: {fileID: 4663491353866464}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4663491353866464
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4234436049194514}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!23 &23972330622521208
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 1
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 4f7fe89ad7fd14a4a9a5ebc776621cef, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 0
|
||||
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
|
||||
--- !u!33 &33525002520690944
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!114 &114931914658985562
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f58463a8ddf862a45a7a5dbd85d11ffd, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_sphereMeshRenderer: {fileID: 23972330622521208}
|
||||
--- !u!114 &114989427021710928
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ded892ce0d9b4e043844fcfd27b63b7a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_fingerTipPokeToolView: {fileID: 114931914658985562}
|
||||
_fingerToFollow: 3
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b6168aea9d5fbf2448d74ed414bdca3b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,170 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &1111425375777918
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 4219426481331184}
|
||||
- component: {fileID: 23972330622521208}
|
||||
- component: {fileID: 33525002520690944}
|
||||
m_Layer: 0
|
||||
m_Name: TargetTransform
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4219426481331184
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0.01, y: 0.01, z: 0.01}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 4234436049194514}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!23 &23972330622521208
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 1
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_RenderingLayerMask: 1
|
||||
m_RendererPriority: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 4f7fe89ad7fd14a4a9a5ebc776621cef, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 0
|
||||
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
|
||||
--- !u!33 &33525002520690944
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1111425375777918}
|
||||
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!1 &1442650750392254
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 4663491353866464}
|
||||
- component: {fileID: 114989427021710928}
|
||||
m_Layer: 0
|
||||
m_Name: FingerTipPokeToolThumb
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4663491353866464
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4234436049194514}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &114989427021710928
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1442650750392254}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ded892ce0d9b4e043844fcfd27b63b7a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_fingerTipPokeToolView: {fileID: 114931914658985562}
|
||||
_fingerToFollow: 0
|
||||
--- !u!1 &1571306303871116
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 4234436049194514}
|
||||
- component: {fileID: 114931914658985562}
|
||||
m_Layer: 0
|
||||
m_Name: FingeTipPokeToolView
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4234436049194514
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4219426481331184}
|
||||
m_Father: {fileID: 4663491353866464}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &114931914658985562
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1571306303871116}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f58463a8ddf862a45a7a5dbd85d11ffd, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_sphereMeshRenderer: {fileID: 23972330622521208}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cf111ea2144c9504d95ffc8cd94475bc
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,56 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &100100000
|
||||
Prefab:
|
||||
m_ObjectHideFlags: 1
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications: []
|
||||
m_RemovedComponents: []
|
||||
m_ParentPrefab: {fileID: 0}
|
||||
m_RootGameObject: {fileID: 1216446904706918}
|
||||
m_IsPrefabParent: 1
|
||||
--- !u!1 &1216446904706918
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4065790629249044}
|
||||
- component: {fileID: 114346469421508108}
|
||||
m_Layer: 0
|
||||
m_Name: HandsManager
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4065790629249044
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1216446904706918}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &114346469421508108
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1216446904706918}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: c9371de340bd2354abd621fadfb9f78d, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_leftHand: {fileID: 0}
|
||||
_rightHand: {fileID: 0}
|
||||
VisualMode: 0
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbdf09e3b0f1ac246914a74904002cb6
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,71 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &100100000
|
||||
Prefab:
|
||||
m_ObjectHideFlags: 1
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications: []
|
||||
m_RemovedComponents: []
|
||||
m_ParentPrefab: {fileID: 0}
|
||||
m_RootGameObject: {fileID: 1099536711198800}
|
||||
m_IsPrefabParent: 1
|
||||
--- !u!1 &1099536711198800
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4344865891687486}
|
||||
- component: {fileID: 114894749535269414}
|
||||
- component: {fileID: 114475763992432942}
|
||||
m_Layer: 0
|
||||
m_Name: InteractableToolsSDKDriver
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4344865891687486
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1099536711198800}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0.49675}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &114475763992432942
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1099536711198800}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 85fb71180be543b44a6c8c1e4253dce4, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!114 &114894749535269414
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1099536711198800}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 83ffd5d8c717af84394416b29a9135e1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
LeftHandTools:
|
||||
- {fileID: 4663491353866464, guid: 54e898404b081ae438d0b5d097aae07a, type: 2}
|
||||
- {fileID: 4212808563549492, guid: 50f797a2ff610ca4099b5cf42214abd5, type: 2}
|
||||
RightHandTools:
|
||||
- {fileID: 4212808563549492, guid: 50f797a2ff610ca4099b5cf42214abd5, type: 2}
|
||||
- {fileID: 4663491353866464, guid: 54e898404b081ae438d0b5d097aae07a, type: 2}
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2ced187cdc1b6b94da2fd30a37e8bc41
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,259 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &100100000
|
||||
Prefab:
|
||||
m_ObjectHideFlags: 1
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications: []
|
||||
m_RemovedComponents: []
|
||||
m_ParentPrefab: {fileID: 0}
|
||||
m_RootGameObject: {fileID: 1415229620752600}
|
||||
m_IsPrefabParent: 1
|
||||
--- !u!1 &1347033447090706
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4018075546172828}
|
||||
- component: {fileID: 114332492007034412}
|
||||
- component: {fileID: 120032820719270462}
|
||||
m_Layer: 0
|
||||
m_Name: RayToolView
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1415229620752600
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4212808563549492}
|
||||
- component: {fileID: 114908037422303764}
|
||||
m_Layer: 0
|
||||
m_Name: RayTool
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!1 &1416015005936930
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 5
|
||||
m_Component:
|
||||
- component: {fileID: 4926998750941526}
|
||||
- component: {fileID: 23299412607408642}
|
||||
m_Layer: 0
|
||||
m_Name: Target
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4018075546172828
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1347033447090706}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4926998750941526}
|
||||
m_Father: {fileID: 4212808563549492}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4212808563549492
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1415229620752600}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 4018075546172828}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &4926998750941526
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1416015005936930}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 4018075546172828}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!23 &23299412607408642
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1416015005936930}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 1
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 7c4fbc253f678a74f8135c524ac84bfe, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 0
|
||||
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
|
||||
--- !u!114 &114332492007034412
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1347033447090706}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a4e71869e3ccfde47a7a16e2f483b328, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_targetTransform: {fileID: 4926998750941526}
|
||||
_lineRenderer: {fileID: 120032820719270462}
|
||||
--- !u!114 &114908037422303764
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1415229620752600}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: e5a3ef75653a3e84281bf84f8b8575c5, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
_rayToolView: {fileID: 114332492007034412}
|
||||
_coneAngleDegrees: 15
|
||||
_boneToFollow: 0
|
||||
_farFieldMaxDistance: 7
|
||||
--- !u!120 &120032820719270462
|
||||
LineRenderer:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1347033447090706}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_MotionVectors: 0
|
||||
m_LightProbeUsage: 0
|
||||
m_ReflectionProbeUsage: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 0b157fd34da92084a8cf68f92d515504, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 0
|
||||
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_Positions:
|
||||
- {x: 0, y: 0, z: 0}
|
||||
- {x: 0, y: 0, z: 1}
|
||||
m_Parameters:
|
||||
serializedVersion: 2
|
||||
widthMultiplier: 0.007
|
||||
widthCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 2
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
- serializedVersion: 2
|
||||
time: 0.18962929
|
||||
value: 0.9551013
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 0
|
||||
colorGradient:
|
||||
serializedVersion: 2
|
||||
key0: {r: 0.36078432, g: 0.56078434, b: 0.80784315, a: 1}
|
||||
key1: {r: 0.77205884, g: 0.77205884, b: 0.77205884, a: 1}
|
||||
key2: {r: 0, g: 0, b: 0, a: 0}
|
||||
key3: {r: 0, g: 0, b: 0, a: 0}
|
||||
key4: {r: 0, g: 0, b: 0, a: 0}
|
||||
key5: {r: 0, g: 0, b: 0, a: 0}
|
||||
key6: {r: 0, g: 0, b: 0, a: 0}
|
||||
key7: {r: 0, g: 0, b: 0, a: 0}
|
||||
ctime0: 0
|
||||
ctime1: 65535
|
||||
ctime2: 0
|
||||
ctime3: 0
|
||||
ctime4: 0
|
||||
ctime5: 0
|
||||
ctime6: 0
|
||||
ctime7: 0
|
||||
atime0: 0
|
||||
atime1: 65535
|
||||
atime2: 0
|
||||
atime3: 0
|
||||
atime4: 0
|
||||
atime5: 0
|
||||
atime6: 0
|
||||
atime7: 0
|
||||
m_Mode: 0
|
||||
m_NumColorKeys: 2
|
||||
m_NumAlphaKeys: 2
|
||||
numCornerVertices: 0
|
||||
numCapVertices: 0
|
||||
alignment: 0
|
||||
textureMode: 0
|
||||
generateLightingData: 0
|
||||
m_UseWorldSpace: 1
|
||||
m_Loop: 0
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 50f797a2ff610ca4099b5cf42214abd5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f72ef0e860dd5904189681cc49c68473
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,80 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Allows a bone to keep track of interactables that it has touched. This information
|
||||
/// can be used by a tool.
|
||||
/// </summary>
|
||||
public class BoneCapsuleTriggerLogic : MonoBehaviour
|
||||
{
|
||||
public InteractableToolTags ToolTags;
|
||||
|
||||
public HashSet<ColliderZone> CollidersTouchingUs = new HashSet<ColliderZone>();
|
||||
private List<ColliderZone> _elementsToCleanUp = new List<ColliderZone>();
|
||||
|
||||
/// <summary>
|
||||
/// If we get disabled, clear our colliders. Otherwise, on trigger exit may not get called.
|
||||
/// </summary>
|
||||
private void OnDisable()
|
||||
{
|
||||
CollidersTouchingUs.Clear();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
CleanUpDeadColliders();
|
||||
}
|
||||
|
||||
private void OnTriggerEnter(Collider other)
|
||||
{
|
||||
var triggerZone = other.GetComponent<ButtonTriggerZone>();
|
||||
if (triggerZone != null && (triggerZone.ParentInteractable.ValidToolTagsMask & (int)ToolTags) != 0)
|
||||
{
|
||||
CollidersTouchingUs.Add(triggerZone);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTriggerExit(Collider other)
|
||||
{
|
||||
var triggerZone = other.GetComponent<ButtonTriggerZone>();
|
||||
if (triggerZone != null && (triggerZone.ParentInteractable.ValidToolTagsMask & (int)ToolTags) != 0)
|
||||
{
|
||||
CollidersTouchingUs.Remove(triggerZone);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sometimes colliders get disabled and trigger exit doesn't get called.
|
||||
/// Take care of that edge case.
|
||||
/// </summary>
|
||||
private void CleanUpDeadColliders()
|
||||
{
|
||||
_elementsToCleanUp.Clear();
|
||||
foreach (ColliderZone colliderTouching in CollidersTouchingUs)
|
||||
{
|
||||
if (!colliderTouching.Collider.gameObject.activeInHierarchy)
|
||||
{
|
||||
_elementsToCleanUp.Add(colliderTouching);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (ColliderZone colliderZone in _elementsToCleanUp)
|
||||
{
|
||||
CollidersTouchingUs.Remove(colliderZone);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c0c1eb2fe7f491a45b278fc224f71f17
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,353 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// A button interactable used by the train scene.
|
||||
/// </summary>
|
||||
public class ButtonController : Interactable
|
||||
{
|
||||
private const float ENTRY_DOT_THRESHOLD = 0.8f;
|
||||
private const float PERP_DOT_THRESHOLD = 0.5f;
|
||||
|
||||
[SerializeField] private GameObject _proximityZone = null;
|
||||
[SerializeField] private GameObject _contactZone = null;
|
||||
[SerializeField] private GameObject _actionZone = null;
|
||||
[SerializeField] private ContactTest[] _contactTests = null;
|
||||
// for positive side tests, the contact position must be on the positive side of the plane
|
||||
// determined by this transform
|
||||
[SerializeField] private Transform _buttonPlaneCenter = null;
|
||||
|
||||
// make sure press is coming from "positive" side of button, i.e. above it
|
||||
[SerializeField] private bool _makeSureToolIsOnPositiveSide = true;
|
||||
// depending on the geometry used, the direction might not always be downwards.
|
||||
[SerializeField] private Vector3 _localButtonDirection = Vector3.down;
|
||||
[SerializeField]
|
||||
private InteractableToolTags[] _allValidToolsTags =
|
||||
new InteractableToolTags[] { InteractableToolTags.All };
|
||||
private int _toolTagsMask;
|
||||
|
||||
public override int ValidToolTagsMask
|
||||
{
|
||||
get
|
||||
{
|
||||
return _toolTagsMask;
|
||||
}
|
||||
}
|
||||
|
||||
public enum ContactTest
|
||||
{
|
||||
PerpenTest = 0, // is tool pointing along button normal?
|
||||
BackwardsPress // filter out presses coming backwards?
|
||||
}
|
||||
|
||||
public Vector3 LocalButtonDirection
|
||||
{
|
||||
get { return _localButtonDirection; }
|
||||
}
|
||||
|
||||
private InteractableState _currentButtonState = InteractableState.Default;
|
||||
|
||||
private Dictionary<InteractableTool, InteractableState> _toolToState =
|
||||
new Dictionary<InteractableTool, InteractableState>();
|
||||
|
||||
protected override void Awake()
|
||||
{
|
||||
base.Awake();
|
||||
Assert.IsNotNull(_proximityZone);
|
||||
Assert.IsNotNull(_contactZone);
|
||||
Assert.IsNotNull(_actionZone);
|
||||
Assert.IsNotNull(_buttonPlaneCenter);
|
||||
|
||||
foreach (var interactableToolTags in _allValidToolsTags)
|
||||
{
|
||||
_toolTagsMask |= (int)interactableToolTags;
|
||||
}
|
||||
|
||||
_proximityZoneCollider = _proximityZone.GetComponent<ColliderZone>();
|
||||
_contactZoneCollider = _contactZone.GetComponent<ColliderZone>();
|
||||
_actionZoneCollider = _actionZone.GetComponent<ColliderZone>();
|
||||
}
|
||||
|
||||
private void FireInteractionEventsOnDepth(InteractableCollisionDepth oldDepth,
|
||||
InteractableTool collidingTool, InteractionType interactionType)
|
||||
{
|
||||
switch (oldDepth)
|
||||
{
|
||||
case InteractableCollisionDepth.Action:
|
||||
OnActionZoneEvent(new ColliderZoneArgs(ActionCollider, Time.frameCount,
|
||||
collidingTool, interactionType));
|
||||
break;
|
||||
case InteractableCollisionDepth.Contact:
|
||||
OnContactZoneEvent(new ColliderZoneArgs(ContactCollider, Time.frameCount,
|
||||
collidingTool, interactionType));
|
||||
break;
|
||||
case InteractableCollisionDepth.Proximity:
|
||||
OnProximityZoneEvent(new ColliderZoneArgs(ProximityCollider, Time.frameCount,
|
||||
collidingTool, interactionType));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override void UpdateCollisionDepth(InteractableTool interactableTool,
|
||||
InteractableCollisionDepth oldCollisionDepth,
|
||||
InteractableCollisionDepth newCollisionDepth)
|
||||
{
|
||||
bool isFarFieldTool = interactableTool.IsFarFieldTool;
|
||||
|
||||
// if this is a near field tool and another tool already controls it, bail.
|
||||
if (!isFarFieldTool && _toolToState.Keys.Count > 0 && !_toolToState.ContainsKey(interactableTool))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var oldState = _currentButtonState;
|
||||
|
||||
// ignore contact test if you are using the far field tool
|
||||
var currButtonDirection = transform.TransformDirection(_localButtonDirection);
|
||||
bool validContact = IsValidContact(interactableTool, currButtonDirection)
|
||||
|| interactableTool.IsFarFieldTool;
|
||||
// in case tool enters contact zone first, we are in proximity as well
|
||||
bool toolIsInProximity = newCollisionDepth >= InteractableCollisionDepth.Proximity;
|
||||
bool toolInContactZone = newCollisionDepth == InteractableCollisionDepth.Contact;
|
||||
bool toolInActionZone = newCollisionDepth == InteractableCollisionDepth.Action;
|
||||
|
||||
bool switchingStates = oldCollisionDepth != newCollisionDepth;
|
||||
if (switchingStates)
|
||||
{
|
||||
FireInteractionEventsOnDepth(oldCollisionDepth, interactableTool,
|
||||
InteractionType.Exit);
|
||||
FireInteractionEventsOnDepth(newCollisionDepth, interactableTool,
|
||||
InteractionType.Enter);
|
||||
}
|
||||
else
|
||||
{
|
||||
FireInteractionEventsOnDepth(newCollisionDepth, interactableTool,
|
||||
InteractionType.Stay);
|
||||
}
|
||||
|
||||
var upcomingState = oldState;
|
||||
if (interactableTool.IsFarFieldTool)
|
||||
{
|
||||
upcomingState = toolInContactZone ? InteractableState.ContactState :
|
||||
toolInActionZone ? InteractableState.ActionState : InteractableState.Default;
|
||||
}
|
||||
else
|
||||
{
|
||||
// plane describing positive side of button
|
||||
var buttonZonePlane = new Plane(-currButtonDirection, _buttonPlaneCenter.position);
|
||||
// skip plane test if the boolean flag tells us not to test it
|
||||
bool onPositiveSideOfButton = !_makeSureToolIsOnPositiveSide ||
|
||||
buttonZonePlane.GetSide(interactableTool.InteractionPosition);
|
||||
upcomingState = GetUpcomingStateNearField(oldState, newCollisionDepth,
|
||||
toolInActionZone, toolInContactZone, toolIsInProximity,
|
||||
validContact, onPositiveSideOfButton);
|
||||
}
|
||||
|
||||
if (upcomingState != InteractableState.Default)
|
||||
{
|
||||
_toolToState[interactableTool] = upcomingState;
|
||||
}
|
||||
else
|
||||
{
|
||||
_toolToState.Remove(interactableTool);
|
||||
}
|
||||
|
||||
// if using far field tool, the upcoming state is based
|
||||
// on the far field tool that has the greatest max state so far
|
||||
// (since there can be multiple far field tools interacting
|
||||
// with button)
|
||||
if (isFarFieldTool)
|
||||
{
|
||||
foreach (var toolState in _toolToState.Values)
|
||||
{
|
||||
if (upcomingState < toolState)
|
||||
{
|
||||
upcomingState = toolState;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (oldState != upcomingState)
|
||||
{
|
||||
_currentButtonState = upcomingState;
|
||||
|
||||
var interactionType = !switchingStates ? InteractionType.Stay :
|
||||
newCollisionDepth == InteractableCollisionDepth.None ? InteractionType.Exit :
|
||||
InteractionType.Enter;
|
||||
var CurrentCollider =
|
||||
_currentButtonState == InteractableState.ProximityState ? ProximityCollider :
|
||||
_currentButtonState == InteractableState.ContactState ? ContactCollider :
|
||||
_currentButtonState == InteractableState.ActionState ? ActionCollider : null;
|
||||
if (InteractableStateChanged != null)
|
||||
{
|
||||
InteractableStateChanged.Invoke(new InteractableStateArgs(this, interactableTool,
|
||||
_currentButtonState, oldState, new ColliderZoneArgs(CurrentCollider, Time.frameCount,
|
||||
interactableTool, interactionType)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private InteractableState GetUpcomingStateNearField(InteractableState oldState,
|
||||
InteractableCollisionDepth newCollisionDepth, bool toolIsInActionZone,
|
||||
bool toolIsInContactZone, bool toolIsInProximity,
|
||||
bool validContact, bool onPositiveSideOfInteractable)
|
||||
{
|
||||
InteractableState upcomingState = oldState;
|
||||
|
||||
switch (oldState)
|
||||
{
|
||||
case InteractableState.ActionState:
|
||||
if (!toolIsInActionZone)
|
||||
{
|
||||
// if retreating from action, can go back into action state even if contact
|
||||
// is not legal (i.e. tool/finger retracts)
|
||||
if (toolIsInContactZone)
|
||||
{
|
||||
upcomingState = InteractableState.ContactState;
|
||||
}
|
||||
else if (toolIsInProximity)
|
||||
{
|
||||
upcomingState = InteractableState.ProximityState;
|
||||
}
|
||||
else
|
||||
{
|
||||
upcomingState = InteractableState.Default;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
case InteractableState.ContactState:
|
||||
if (newCollisionDepth < InteractableCollisionDepth.Contact)
|
||||
{
|
||||
upcomingState = toolIsInProximity ? InteractableState.ProximityState :
|
||||
InteractableState.Default;
|
||||
}
|
||||
// can only go to action state if contact is legal
|
||||
// if tool goes into contact state due to proper movement, but does not maintain
|
||||
// that movement throughout (i.e. a tool/finger presses downwards initially but
|
||||
// moves in random directions afterwards), then don't go into action
|
||||
else if (toolIsInActionZone && validContact && onPositiveSideOfInteractable)
|
||||
{
|
||||
upcomingState = InteractableState.ActionState;
|
||||
}
|
||||
|
||||
break;
|
||||
case InteractableState.ProximityState:
|
||||
if (newCollisionDepth < InteractableCollisionDepth.Proximity)
|
||||
{
|
||||
upcomingState = InteractableState.Default;
|
||||
}
|
||||
else if (validContact && onPositiveSideOfInteractable &&
|
||||
newCollisionDepth > InteractableCollisionDepth.Proximity)
|
||||
{
|
||||
upcomingState = newCollisionDepth == InteractableCollisionDepth.Action
|
||||
? InteractableState.ActionState
|
||||
: InteractableState.ContactState;
|
||||
}
|
||||
|
||||
break;
|
||||
case InteractableState.Default:
|
||||
// test contact, action first then proximity (more important states
|
||||
// take precedence)
|
||||
if (validContact && onPositiveSideOfInteractable &&
|
||||
newCollisionDepth > InteractableCollisionDepth.Proximity)
|
||||
{
|
||||
upcomingState = newCollisionDepth == InteractableCollisionDepth.Action
|
||||
? InteractableState.ActionState
|
||||
: InteractableState.ContactState;
|
||||
}
|
||||
else if (toolIsInProximity)
|
||||
{
|
||||
upcomingState = InteractableState.ProximityState;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return upcomingState;
|
||||
}
|
||||
|
||||
private bool IsValidContact(InteractableTool collidingTool, Vector3 buttonDirection)
|
||||
{
|
||||
if (_contactTests == null || collidingTool.IsFarFieldTool)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
foreach (var contactTest in _contactTests)
|
||||
{
|
||||
switch (contactTest)
|
||||
{
|
||||
case ContactTest.BackwardsPress:
|
||||
if (!PassEntryTest(collidingTool, buttonDirection))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
if (!PassPerpTest(collidingTool, buttonDirection))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Is tool entering button correctly? Check velocity and make sure that
|
||||
/// tool is not below action zone.
|
||||
/// </summary>
|
||||
private bool PassEntryTest(InteractableTool collidingTool, Vector3 buttonDirection)
|
||||
{
|
||||
var jointVelocityVector = collidingTool.Velocity.normalized;
|
||||
var dotProduct = Vector3.Dot(jointVelocityVector, buttonDirection);
|
||||
if (dotProduct < ENTRY_DOT_THRESHOLD)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Is our tool pointing in opposite direction compared to button?
|
||||
/// </summary>
|
||||
private bool PassPerpTest(InteractableTool collidingTool, Vector3 buttonDirection)
|
||||
{
|
||||
// the "right" vector points along tool by default
|
||||
// if it's right hand, then flip that direction
|
||||
var toolDirection = collidingTool.ToolTransform.right;
|
||||
if (collidingTool.IsRightHandedTool)
|
||||
{
|
||||
toolDirection = -toolDirection;
|
||||
}
|
||||
|
||||
var dotProduct = Vector3.Dot(toolDirection, buttonDirection);
|
||||
if (dotProduct < PERP_DOT_THRESHOLD)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 95090eefe50e77847b9b4f3eec29fea0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,48 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Trigger zone of button, can be proximity, contact or action.
|
||||
/// </summary>
|
||||
public class ButtonTriggerZone : MonoBehaviour, ColliderZone
|
||||
{
|
||||
[SerializeField] private GameObject _parentInteractableObj = null;
|
||||
|
||||
public Collider Collider { get; private set; }
|
||||
public Interactable ParentInteractable { get; private set; }
|
||||
|
||||
public InteractableCollisionDepth CollisionDepth
|
||||
{
|
||||
get
|
||||
{
|
||||
var myColliderZone = (ColliderZone)this;
|
||||
var depth = ParentInteractable.ProximityCollider == myColliderZone ? InteractableCollisionDepth.Proximity :
|
||||
ParentInteractable.ContactCollider == myColliderZone ? InteractableCollisionDepth.Contact :
|
||||
ParentInteractable.ActionCollider == myColliderZone ? InteractableCollisionDepth.Action :
|
||||
InteractableCollisionDepth.None;
|
||||
return depth;
|
||||
}
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
Assert.IsNotNull(_parentInteractableObj);
|
||||
|
||||
Collider = GetComponent<Collider>();
|
||||
ParentInteractable = _parentInteractableObj.GetComponent<Interactable>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 286a680ab908503489d2d5449f01c521
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,54 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Zone that can be collided with in example code.
|
||||
/// </summary>
|
||||
public interface ColliderZone
|
||||
{
|
||||
Collider Collider { get; }
|
||||
// Which interactable do we belong to?
|
||||
Interactable ParentInteractable { get; }
|
||||
InteractableCollisionDepth CollisionDepth { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Arguments for object interacting with collider zone.
|
||||
/// </summary>
|
||||
public class ColliderZoneArgs : EventArgs
|
||||
{
|
||||
public readonly ColliderZone Collider;
|
||||
public readonly float FrameTime;
|
||||
public readonly InteractableTool CollidingTool;
|
||||
public readonly InteractionType InteractionT;
|
||||
|
||||
public ColliderZoneArgs(ColliderZone collider, float frameTime,
|
||||
InteractableTool collidingTool, InteractionType interactionType)
|
||||
{
|
||||
Collider = collider;
|
||||
FrameTime = frameTime;
|
||||
CollidingTool = collidingTool;
|
||||
InteractionT = interactionType;
|
||||
}
|
||||
}
|
||||
|
||||
public enum InteractionType
|
||||
{
|
||||
Enter = 0,
|
||||
Stay,
|
||||
Exit
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7430c31486e4539459813e743a41d02b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,305 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
public class HandsManager : MonoBehaviour
|
||||
{
|
||||
private const string SKELETON_VISUALIZER_NAME = "SkeletonRenderer";
|
||||
|
||||
[SerializeField] GameObject _leftHand = null;
|
||||
[SerializeField] GameObject _rightHand = null;
|
||||
|
||||
public HandsVisualMode VisualMode = HandsVisualMode.Mesh;
|
||||
private OVRHand[] _hand = new OVRHand[(int)OVRHand.Hand.HandRight + 1];
|
||||
private OVRSkeleton[] _handSkeleton = new OVRSkeleton[(int)OVRHand.Hand.HandRight + 1];
|
||||
private OVRSkeletonRenderer[] _handSkeletonRenderer = new OVRSkeletonRenderer[(int)OVRHand.Hand.HandRight + 1];
|
||||
private OVRMesh[] _handMesh = new OVRMesh[(int)OVRHand.Hand.HandRight + 1];
|
||||
private OVRMeshRenderer[] _handMeshRenderer = new OVRMeshRenderer[(int)OVRHand.Hand.HandRight + 1];
|
||||
private SkinnedMeshRenderer _leftMeshRenderer = null;
|
||||
private SkinnedMeshRenderer _rightMeshRenderer = null;
|
||||
private GameObject _leftSkeletonVisual = null;
|
||||
private GameObject _rightSkeletonVisual = null;
|
||||
private float _currentHandAlpha = 1.0f;
|
||||
private int HandAlphaId = Shader.PropertyToID("_HandAlpha");
|
||||
|
||||
public enum HandsVisualMode
|
||||
{
|
||||
Mesh = 0, Skeleton = 1, Both = 2
|
||||
}
|
||||
|
||||
public OVRHand RightHand
|
||||
{
|
||||
get
|
||||
{
|
||||
return _hand[(int)OVRHand.Hand.HandRight];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_hand[(int)OVRHand.Hand.HandRight] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public OVRSkeleton RightHandSkeleton
|
||||
{
|
||||
get
|
||||
{
|
||||
return _handSkeleton[(int)OVRHand.Hand.HandRight];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_handSkeleton[(int)OVRHand.Hand.HandRight] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public OVRSkeletonRenderer RightHandSkeletonRenderer
|
||||
{
|
||||
get
|
||||
{
|
||||
return _handSkeletonRenderer[(int)OVRHand.Hand.HandRight];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_handSkeletonRenderer[(int)OVRHand.Hand.HandRight] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public OVRMesh RightHandMesh
|
||||
{
|
||||
get
|
||||
{
|
||||
return _handMesh[(int)OVRHand.Hand.HandRight];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_handMesh[(int)OVRHand.Hand.HandRight] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public OVRMeshRenderer RightHandMeshRenderer
|
||||
{
|
||||
get
|
||||
{
|
||||
return _handMeshRenderer[(int)OVRHand.Hand.HandRight];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_handMeshRenderer[(int)OVRHand.Hand.HandRight] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public OVRHand LeftHand
|
||||
{
|
||||
get
|
||||
{
|
||||
return _hand[(int)OVRHand.Hand.HandLeft];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_hand[(int)OVRHand.Hand.HandLeft] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public OVRSkeleton LeftHandSkeleton
|
||||
{
|
||||
get
|
||||
{
|
||||
return _handSkeleton[(int)OVRHand.Hand.HandLeft];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_handSkeleton[(int)OVRHand.Hand.HandLeft] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public OVRSkeletonRenderer LeftHandSkeletonRenderer
|
||||
{
|
||||
get
|
||||
{
|
||||
return _handSkeletonRenderer[(int)OVRHand.Hand.HandLeft];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_handSkeletonRenderer[(int)OVRHand.Hand.HandLeft] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public OVRMesh LeftHandMesh
|
||||
{
|
||||
get
|
||||
{
|
||||
return _handMesh[(int)OVRHand.Hand.HandLeft];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_handMesh[(int)OVRHand.Hand.HandLeft] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public OVRMeshRenderer LeftHandMeshRenderer
|
||||
{
|
||||
get
|
||||
{
|
||||
return _handMeshRenderer[(int)OVRHand.Hand.HandLeft];
|
||||
}
|
||||
private set
|
||||
{
|
||||
_handMeshRenderer[(int)OVRHand.Hand.HandLeft] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public static HandsManager Instance { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance && Instance != this)
|
||||
{
|
||||
Destroy(this);
|
||||
return;
|
||||
}
|
||||
Instance = this;
|
||||
|
||||
Assert.IsNotNull(_leftHand);
|
||||
Assert.IsNotNull(_rightHand);
|
||||
|
||||
LeftHand = _leftHand.GetComponent<OVRHand>();
|
||||
LeftHandSkeleton = _leftHand.GetComponent<OVRSkeleton>();
|
||||
LeftHandSkeletonRenderer = _leftHand.GetComponent<OVRSkeletonRenderer>();
|
||||
LeftHandMesh = _leftHand.GetComponent<OVRMesh>();
|
||||
LeftHandMeshRenderer = _leftHand.GetComponent<OVRMeshRenderer>();
|
||||
|
||||
RightHand = _rightHand.GetComponent<OVRHand>();
|
||||
RightHandSkeleton = _rightHand.GetComponent<OVRSkeleton>();
|
||||
RightHandSkeletonRenderer = _rightHand.GetComponent<OVRSkeletonRenderer>();
|
||||
RightHandMesh = _rightHand.GetComponent<OVRMesh>();
|
||||
RightHandMeshRenderer = _rightHand.GetComponent<OVRMeshRenderer>();
|
||||
_leftMeshRenderer = LeftHand.GetComponent<SkinnedMeshRenderer>();
|
||||
_rightMeshRenderer = RightHand.GetComponent<SkinnedMeshRenderer>();
|
||||
StartCoroutine(FindSkeletonVisualGameObjects());
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
switch (VisualMode)
|
||||
{
|
||||
case HandsVisualMode.Mesh:
|
||||
case HandsVisualMode.Skeleton:
|
||||
_currentHandAlpha = 1.0f;
|
||||
break;
|
||||
case HandsVisualMode.Both:
|
||||
_currentHandAlpha = 0.6f;
|
||||
break;
|
||||
default:
|
||||
_currentHandAlpha = 1.0f;
|
||||
break;
|
||||
}
|
||||
_rightMeshRenderer.sharedMaterial.SetFloat(HandAlphaId, _currentHandAlpha);
|
||||
_leftMeshRenderer.sharedMaterial.SetFloat(HandAlphaId, _currentHandAlpha);
|
||||
}
|
||||
|
||||
private IEnumerator FindSkeletonVisualGameObjects()
|
||||
{
|
||||
while (!_leftSkeletonVisual || !_rightSkeletonVisual)
|
||||
{
|
||||
if (!_leftSkeletonVisual)
|
||||
{
|
||||
Transform leftSkeletonVisualTransform = LeftHand.transform.Find(SKELETON_VISUALIZER_NAME);
|
||||
if (leftSkeletonVisualTransform)
|
||||
{
|
||||
_leftSkeletonVisual = leftSkeletonVisualTransform.gameObject;
|
||||
}
|
||||
}
|
||||
|
||||
if (!_rightSkeletonVisual)
|
||||
{
|
||||
Transform rightSkeletonVisualTransform = RightHand.transform.Find(SKELETON_VISUALIZER_NAME);
|
||||
if (rightSkeletonVisualTransform)
|
||||
{
|
||||
_rightSkeletonVisual = rightSkeletonVisualTransform.gameObject;
|
||||
}
|
||||
}
|
||||
yield return null;
|
||||
}
|
||||
SetToCurrentVisualMode();
|
||||
}
|
||||
|
||||
public void SwitchVisualization()
|
||||
{
|
||||
if (!_leftSkeletonVisual || !_rightSkeletonVisual)
|
||||
{
|
||||
return;
|
||||
}
|
||||
VisualMode = (HandsVisualMode)(((int)VisualMode + 1) % ((int)HandsVisualMode.Both + 1));
|
||||
SetToCurrentVisualMode();
|
||||
}
|
||||
|
||||
private void SetToCurrentVisualMode()
|
||||
{
|
||||
switch (VisualMode)
|
||||
{
|
||||
case HandsVisualMode.Mesh:
|
||||
RightHandMeshRenderer.enabled = true;
|
||||
_rightMeshRenderer.enabled = true;
|
||||
_rightSkeletonVisual.gameObject.SetActive(false);
|
||||
LeftHandMeshRenderer.enabled = true;
|
||||
_leftMeshRenderer.enabled = true;
|
||||
_leftSkeletonVisual.gameObject.SetActive(false);
|
||||
break;
|
||||
case HandsVisualMode.Skeleton:
|
||||
RightHandMeshRenderer.enabled = false;
|
||||
_rightMeshRenderer.enabled = false;
|
||||
_rightSkeletonVisual.gameObject.SetActive(true);
|
||||
LeftHandMeshRenderer.enabled = false;
|
||||
_leftMeshRenderer.enabled = false;
|
||||
_leftSkeletonVisual.gameObject.SetActive(true);
|
||||
break;
|
||||
case HandsVisualMode.Both:
|
||||
RightHandMeshRenderer.enabled = true;
|
||||
_rightMeshRenderer.enabled = true;
|
||||
_rightSkeletonVisual.gameObject.SetActive(true);
|
||||
LeftHandMeshRenderer.enabled = true;
|
||||
_leftMeshRenderer.enabled = true;
|
||||
_leftSkeletonVisual.gameObject.SetActive(true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<OVRBoneCapsule> GetCapsulesPerBone(OVRSkeleton skeleton, OVRSkeleton.BoneId boneId)
|
||||
{
|
||||
List<OVRBoneCapsule> boneCapsules = new List<OVRBoneCapsule>();
|
||||
var capsules = skeleton.Capsules;
|
||||
for (int i = 0; i < capsules.Count; ++i)
|
||||
{
|
||||
if (capsules[i].BoneIndex == (short)boneId)
|
||||
{
|
||||
boneCapsules.Add(capsules[i]);
|
||||
}
|
||||
}
|
||||
return boneCapsules;
|
||||
}
|
||||
|
||||
public bool IsInitialized()
|
||||
{
|
||||
return LeftHandSkeleton && LeftHandSkeleton.IsInitialized &&
|
||||
RightHandSkeleton && RightHandSkeleton.IsInitialized &&
|
||||
LeftHandMesh && LeftHandMesh.IsInitialized &&
|
||||
RightHandMesh && RightHandMesh.IsInitialized;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c9371de340bd2354abd621fadfb9f78d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,160 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Interface for all objects interacted with in example code.
|
||||
/// </summary>
|
||||
public abstract class Interactable : MonoBehaviour
|
||||
{
|
||||
protected ColliderZone _proximityZoneCollider = null;
|
||||
protected ColliderZone _contactZoneCollider = null;
|
||||
protected ColliderZone _actionZoneCollider = null;
|
||||
|
||||
// Collider that indicates "am I close?"
|
||||
public ColliderZone ProximityCollider
|
||||
{
|
||||
get
|
||||
{
|
||||
return _proximityZoneCollider;
|
||||
}
|
||||
}
|
||||
|
||||
// Collider that indicates that contact has been made.
|
||||
public ColliderZone ContactCollider
|
||||
{
|
||||
get
|
||||
{
|
||||
return _contactZoneCollider;
|
||||
}
|
||||
}
|
||||
|
||||
// Indicates interactable has been activated. Like when
|
||||
// a button goes "click" and something interesting happens.
|
||||
public ColliderZone ActionCollider
|
||||
{
|
||||
get
|
||||
{
|
||||
return _actionZoneCollider;
|
||||
}
|
||||
}
|
||||
|
||||
// What kinds of tools works with this interactable?
|
||||
public virtual int ValidToolTagsMask
|
||||
{
|
||||
get
|
||||
{
|
||||
return (int)InteractableToolTags.All;
|
||||
}
|
||||
}
|
||||
|
||||
// The following events tell you if a tool is in a zone, which
|
||||
// might *not* mean the button is in the related zone state. This can happen
|
||||
// if a tool is in the contact zone but the interactable won't go into
|
||||
// the contact state if bad interactions (i.e. incorrect button presses)
|
||||
// are filtered out.
|
||||
|
||||
public event Action<ColliderZoneArgs> ProximityZoneEvent;
|
||||
|
||||
protected virtual void OnProximityZoneEvent(ColliderZoneArgs args)
|
||||
{
|
||||
if (ProximityZoneEvent != null)
|
||||
{
|
||||
ProximityZoneEvent.Invoke(args);
|
||||
}
|
||||
}
|
||||
|
||||
public event Action<ColliderZoneArgs> ContactZoneEvent;
|
||||
|
||||
protected virtual void OnContactZoneEvent(ColliderZoneArgs args)
|
||||
{
|
||||
if (ContactZoneEvent != null)
|
||||
{
|
||||
ContactZoneEvent.Invoke(args);
|
||||
}
|
||||
}
|
||||
|
||||
public event Action<ColliderZoneArgs> ActionZoneEvent;
|
||||
|
||||
protected virtual void OnActionZoneEvent(ColliderZoneArgs args)
|
||||
{
|
||||
if (ActionZoneEvent != null)
|
||||
{
|
||||
ActionZoneEvent.Invoke(args);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void UpdateCollisionDepth(InteractableTool interactableTool,
|
||||
InteractableCollisionDepth oldCollisionDepth, InteractableCollisionDepth newCollisionDepth);
|
||||
|
||||
[Serializable]
|
||||
public class InteractableStateArgsEvent : UnityEvent<InteractableStateArgs>
|
||||
{
|
||||
}
|
||||
|
||||
public InteractableStateArgsEvent InteractableStateChanged;
|
||||
|
||||
protected virtual void Awake()
|
||||
{
|
||||
InteractableRegistry.RegisterInteractable(this);
|
||||
}
|
||||
|
||||
protected virtual void OnDestroy()
|
||||
{
|
||||
InteractableRegistry.UnregisterInteractable(this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Depth of collision, in order of "furthest" to "closest"
|
||||
/// </summary>
|
||||
public enum InteractableCollisionDepth
|
||||
{
|
||||
None = 0,
|
||||
Proximity,
|
||||
Contact,
|
||||
Action,
|
||||
}
|
||||
|
||||
public enum InteractableState
|
||||
{
|
||||
Default = 0,
|
||||
ProximityState, // in proximity -- close enough
|
||||
ContactState, // contact has been made
|
||||
ActionState, // interactable activates
|
||||
}
|
||||
|
||||
public class InteractableStateArgs : EventArgs
|
||||
{
|
||||
public readonly Interactable Interactable;
|
||||
public readonly InteractableTool Tool;
|
||||
public readonly InteractableState OldInteractableState;
|
||||
public readonly InteractableState NewInteractableState;
|
||||
public readonly ColliderZoneArgs ColliderArgs;
|
||||
|
||||
public InteractableStateArgs(Interactable interactable, InteractableTool tool,
|
||||
InteractableState newInteractableState, InteractableState oldState,
|
||||
ColliderZoneArgs colliderArgs)
|
||||
{
|
||||
Interactable = interactable;
|
||||
Tool = tool;
|
||||
NewInteractableState = newInteractableState;
|
||||
OldInteractableState = oldState;
|
||||
ColliderArgs = colliderArgs;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eed225a47adda90439d3e20862fff091
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,43 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// In case someone wants to know about all interactables in a scene,
|
||||
/// this registry is the easiest way to access that information.
|
||||
/// </summary>
|
||||
public class InteractableRegistry : MonoBehaviour
|
||||
{
|
||||
public static HashSet<Interactable> _interactables = new HashSet<Interactable>();
|
||||
|
||||
public static HashSet<Interactable> Interactables
|
||||
{
|
||||
get
|
||||
{
|
||||
return _interactables;
|
||||
}
|
||||
}
|
||||
|
||||
public static void RegisterInteractable(Interactable interactable)
|
||||
{
|
||||
Interactables.Add(interactable);
|
||||
}
|
||||
|
||||
public static void UnregisterInteractable(Interactable interactable)
|
||||
{
|
||||
Interactables.Remove(interactable);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: db53c89543f6f6b488b925fc8e25b00d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,77 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Spawns all interactable tools that are specified for a scene.
|
||||
/// </summary>
|
||||
public class InteractableToolsCreator : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private Transform[] LeftHandTools = null;
|
||||
[SerializeField] private Transform[] RightHandTools = null;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (LeftHandTools != null && LeftHandTools.Length > 0)
|
||||
{
|
||||
StartCoroutine(AttachToolsToHands(LeftHandTools, false));
|
||||
}
|
||||
|
||||
if (RightHandTools != null && RightHandTools.Length > 0)
|
||||
{
|
||||
StartCoroutine(AttachToolsToHands(RightHandTools, true));
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerator AttachToolsToHands(Transform[] toolObjects, bool isRightHand)
|
||||
{
|
||||
HandsManager handsManagerObj = null;
|
||||
while ((handsManagerObj = HandsManager.Instance) == null || !handsManagerObj.IsInitialized())
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
// create set of tools per hand to be safe
|
||||
HashSet<Transform> toolObjectSet = new HashSet<Transform>();
|
||||
foreach (Transform toolTransform in toolObjects)
|
||||
{
|
||||
toolObjectSet.Add(toolTransform.transform);
|
||||
}
|
||||
|
||||
foreach (Transform toolObject in toolObjectSet)
|
||||
{
|
||||
OVRSkeleton handSkeletonToAttachTo =
|
||||
isRightHand ? handsManagerObj.RightHandSkeleton : handsManagerObj.LeftHandSkeleton;
|
||||
while (handSkeletonToAttachTo == null || handSkeletonToAttachTo.Bones == null)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
AttachToolToHandTransform(toolObject, isRightHand);
|
||||
}
|
||||
}
|
||||
|
||||
private void AttachToolToHandTransform(Transform tool, bool isRightHanded)
|
||||
{
|
||||
var newTool = Instantiate(tool).transform;
|
||||
newTool.localPosition = Vector3.zero;
|
||||
var toolComp = newTool.GetComponent<InteractableTool>();
|
||||
toolComp.IsRightHandedTool = isRightHanded;
|
||||
// Initialize only AFTER settings have been applied!
|
||||
toolComp.Initialize();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 83ffd5d8c717af84394416b29a9135e1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,207 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Routes all collisions from interactable tools to the interactables themselves.
|
||||
/// We want to do this in a top-down fashion, because we might want to disable
|
||||
/// far-field interactions if near-field interactions take precendence (for instance).
|
||||
/// </summary>
|
||||
public class InteractableToolsInputRouter : MonoBehaviour
|
||||
{
|
||||
private static InteractableToolsInputRouter _instance;
|
||||
private bool _leftPinch, _rightPinch;
|
||||
|
||||
public static InteractableToolsInputRouter Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_instance == null)
|
||||
{
|
||||
var instances = FindObjectsOfType<InteractableToolsInputRouter>();
|
||||
if (instances.Length > 0)
|
||||
{
|
||||
_instance = instances[0];
|
||||
// remove extras, if any
|
||||
for (int i = 1; i < instances.Length; i++)
|
||||
{
|
||||
GameObject.Destroy(instances[i].gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
private HashSet<InteractableTool> _leftHandNearTools = new HashSet<InteractableTool>();
|
||||
private HashSet<InteractableTool> _leftHandFarTools = new HashSet<InteractableTool>();
|
||||
private HashSet<InteractableTool> _rightHandNearTools = new HashSet<InteractableTool>();
|
||||
private HashSet<InteractableTool> _rightHandFarTools = new HashSet<InteractableTool>();
|
||||
|
||||
public void RegisterInteractableTool(InteractableTool interactableTool)
|
||||
{
|
||||
if (interactableTool.IsRightHandedTool)
|
||||
{
|
||||
if (interactableTool.IsFarFieldTool)
|
||||
{
|
||||
_rightHandFarTools.Add(interactableTool);
|
||||
}
|
||||
else
|
||||
{
|
||||
_rightHandNearTools.Add(interactableTool);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (interactableTool.IsFarFieldTool)
|
||||
{
|
||||
_leftHandFarTools.Add(interactableTool);
|
||||
}
|
||||
else
|
||||
{
|
||||
_leftHandNearTools.Add(interactableTool);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void UnregisterInteractableTool(InteractableTool interactableTool)
|
||||
{
|
||||
if (interactableTool.IsRightHandedTool)
|
||||
{
|
||||
if (interactableTool.IsFarFieldTool)
|
||||
{
|
||||
_rightHandFarTools.Remove(interactableTool);
|
||||
}
|
||||
else
|
||||
{
|
||||
_rightHandNearTools.Remove(interactableTool);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (interactableTool.IsFarFieldTool)
|
||||
{
|
||||
_leftHandFarTools.Remove(interactableTool);
|
||||
}
|
||||
else
|
||||
{
|
||||
_leftHandNearTools.Remove(interactableTool);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (!HandsManager.Instance.IsInitialized())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool leftHandIsReliable = HandsManager.Instance.LeftHand.IsTracked &&
|
||||
HandsManager.Instance.LeftHand.HandConfidence == OVRHand.TrackingConfidence.High;
|
||||
bool rightHandIsReliable = HandsManager.Instance.RightHand.IsTracked &&
|
||||
HandsManager.Instance.RightHand.HandConfidence == OVRHand.TrackingConfidence.High;
|
||||
bool leftHandProperlyTracked = HandsManager.Instance.LeftHand.IsPointerPoseValid;
|
||||
bool rightHandProperlyTracked = HandsManager.Instance.RightHand.IsPointerPoseValid;
|
||||
|
||||
bool encounteredNearObjectsLeftHand = UpdateToolsAndEnableState(_leftHandNearTools, leftHandIsReliable);
|
||||
// don't interact with far field if near field is touching something
|
||||
UpdateToolsAndEnableState(_leftHandFarTools, !encounteredNearObjectsLeftHand && leftHandIsReliable &&
|
||||
leftHandProperlyTracked);
|
||||
|
||||
bool encounteredNearObjectsRightHand = UpdateToolsAndEnableState(_rightHandNearTools, rightHandIsReliable);
|
||||
// don't interact with far field if near field is touching something
|
||||
UpdateToolsAndEnableState(_rightHandFarTools, !encounteredNearObjectsRightHand && rightHandIsReliable &&
|
||||
rightHandProperlyTracked);
|
||||
}
|
||||
|
||||
private bool UpdateToolsAndEnableState(HashSet<InteractableTool> tools, bool toolsAreEnabledThisFrame)
|
||||
{
|
||||
bool encounteredObjects = UpdateTools(tools, resetCollisionData: !toolsAreEnabledThisFrame);
|
||||
ToggleToolsEnableState(tools, toolsAreEnabledThisFrame);
|
||||
return encounteredObjects;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update tools specified based on new collisions.
|
||||
/// </summary>
|
||||
/// <param name="tools">Tools to update.</param>
|
||||
/// <param name="resetCollisionData">True if we want the tool to be disabled. This can happen
|
||||
/// if near field tools take precedence over far-field tools, for instance.</param>
|
||||
/// <returns></returns>
|
||||
private bool UpdateTools(HashSet<InteractableTool> tools, bool resetCollisionData = false)
|
||||
{
|
||||
bool toolsEncounteredObjects = false;
|
||||
|
||||
foreach (InteractableTool currentInteractableTool in tools)
|
||||
{
|
||||
List<InteractableCollisionInfo> intersectingObjectsFound =
|
||||
currentInteractableTool.GetNextIntersectingObjects();
|
||||
|
||||
if (intersectingObjectsFound.Count > 0 && !resetCollisionData)
|
||||
{
|
||||
if (!toolsEncounteredObjects)
|
||||
{
|
||||
toolsEncounteredObjects = intersectingObjectsFound.Count > 0;
|
||||
}
|
||||
|
||||
// create map that indicates the furthest collider encountered per interactable element
|
||||
currentInteractableTool.UpdateCurrentCollisionsBasedOnDepth();
|
||||
|
||||
if (currentInteractableTool.IsFarFieldTool)
|
||||
{
|
||||
var firstInteractable = currentInteractableTool.GetFirstCurrentCollisionInfo();
|
||||
// if our tool is activated, make sure depth is set to "action"
|
||||
if (currentInteractableTool.ToolInputState == ToolInputState.PrimaryInputUp)
|
||||
{
|
||||
firstInteractable.Value.InteractableCollider = firstInteractable.Key.ActionCollider;
|
||||
firstInteractable.Value.CollisionDepth = InteractableCollisionDepth.Action;
|
||||
}
|
||||
else
|
||||
{
|
||||
firstInteractable.Value.InteractableCollider = firstInteractable.Key.ContactCollider;
|
||||
firstInteractable.Value.CollisionDepth = InteractableCollisionDepth.Contact;
|
||||
}
|
||||
|
||||
// far field tools only can focus elements -- pick first (for now)
|
||||
currentInteractableTool.FocusOnInteractable(firstInteractable.Key,
|
||||
firstInteractable.Value.InteractableCollider);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
currentInteractableTool.DeFocus();
|
||||
currentInteractableTool.ClearAllCurrentCollisionInfos();
|
||||
}
|
||||
|
||||
currentInteractableTool.UpdateLatestCollisionData();
|
||||
}
|
||||
|
||||
return toolsEncounteredObjects;
|
||||
}
|
||||
|
||||
private void ToggleToolsEnableState(HashSet<InteractableTool> tools, bool enableState)
|
||||
{
|
||||
foreach (InteractableTool tool in tools)
|
||||
{
|
||||
if (tool.EnableState != enableState)
|
||||
{
|
||||
tool.EnableState = enableState;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 85fb71180be543b44a6c8c1e4253dce4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3a1f4660319ea174e96d7ee51bb837c6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,233 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Poke tool used for near-field (touching) interactions. Assumes that it will be placed on
|
||||
/// finger tips.
|
||||
/// </summary>
|
||||
public class FingerTipPokeTool : InteractableTool
|
||||
{
|
||||
private const int NUM_VELOCITY_FRAMES = 10;
|
||||
|
||||
[SerializeField] private FingerTipPokeToolView _fingerTipPokeToolView = null;
|
||||
[SerializeField] private OVRPlugin.HandFinger _fingerToFollow = OVRPlugin.HandFinger.Index;
|
||||
|
||||
public override InteractableToolTags ToolTags
|
||||
{
|
||||
get
|
||||
{
|
||||
return InteractableToolTags.Poke;
|
||||
}
|
||||
}
|
||||
public override ToolInputState ToolInputState
|
||||
{
|
||||
get
|
||||
{
|
||||
return ToolInputState.Inactive;
|
||||
}
|
||||
}
|
||||
public override bool IsFarFieldTool
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool EnableState
|
||||
{
|
||||
get
|
||||
{
|
||||
return _fingerTipPokeToolView.gameObject.activeSelf;
|
||||
}
|
||||
set
|
||||
{
|
||||
_fingerTipPokeToolView.gameObject.SetActive(value);
|
||||
}
|
||||
}
|
||||
|
||||
private Vector3[] _velocityFrames;
|
||||
private int _currVelocityFrame = 0;
|
||||
private bool _sampledMaxFramesAlready;
|
||||
private Vector3 _position;
|
||||
|
||||
private BoneCapsuleTriggerLogic[] _boneCapsuleTriggerLogic;
|
||||
|
||||
private float _lastScale = 1.0f;
|
||||
private bool _isInitialized = false;
|
||||
private OVRBoneCapsule _capsuleToTrack;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
Assert.IsNotNull(_fingerTipPokeToolView);
|
||||
|
||||
InteractableToolsInputRouter.Instance.RegisterInteractableTool(this);
|
||||
_fingerTipPokeToolView.InteractableTool = this;
|
||||
|
||||
_velocityFrames = new Vector3[NUM_VELOCITY_FRAMES];
|
||||
Array.Clear(_velocityFrames, 0, NUM_VELOCITY_FRAMES);
|
||||
|
||||
StartCoroutine(AttachTriggerLogic());
|
||||
}
|
||||
|
||||
private IEnumerator AttachTriggerLogic()
|
||||
{
|
||||
while (!HandsManager.Instance || !HandsManager.Instance.IsInitialized())
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
OVRSkeleton handSkeleton = IsRightHandedTool ? HandsManager.Instance.RightHandSkeleton : HandsManager.Instance.LeftHandSkeleton;
|
||||
|
||||
OVRSkeleton.BoneId boneToTestCollisions = OVRSkeleton.BoneId.Hand_Pinky3;
|
||||
switch (_fingerToFollow)
|
||||
{
|
||||
case OVRPlugin.HandFinger.Thumb:
|
||||
boneToTestCollisions = OVRSkeleton.BoneId.Hand_Thumb3;
|
||||
break;
|
||||
case OVRPlugin.HandFinger.Index:
|
||||
boneToTestCollisions = OVRSkeleton.BoneId.Hand_Index3;
|
||||
break;
|
||||
case OVRPlugin.HandFinger.Middle:
|
||||
boneToTestCollisions = OVRSkeleton.BoneId.Hand_Middle3;
|
||||
break;
|
||||
case OVRPlugin.HandFinger.Ring:
|
||||
boneToTestCollisions = OVRSkeleton.BoneId.Hand_Ring3;
|
||||
break;
|
||||
default:
|
||||
boneToTestCollisions = OVRSkeleton.BoneId.Hand_Pinky3;
|
||||
break;
|
||||
}
|
||||
|
||||
List<BoneCapsuleTriggerLogic> boneCapsuleTriggerLogic = new List<BoneCapsuleTriggerLogic>();
|
||||
List<OVRBoneCapsule> boneCapsules = HandsManager.GetCapsulesPerBone(handSkeleton, boneToTestCollisions);
|
||||
foreach (var ovrCapsuleInfo in boneCapsules)
|
||||
{
|
||||
var boneCapsuleTrigger = ovrCapsuleInfo.CapsuleRigidbody.gameObject.AddComponent<BoneCapsuleTriggerLogic>();
|
||||
ovrCapsuleInfo.CapsuleCollider.isTrigger = true;
|
||||
boneCapsuleTrigger.ToolTags = ToolTags;
|
||||
boneCapsuleTriggerLogic.Add(boneCapsuleTrigger);
|
||||
}
|
||||
|
||||
_boneCapsuleTriggerLogic = boneCapsuleTriggerLogic.ToArray();
|
||||
// finger tip should have only one capsule
|
||||
if (boneCapsules.Count > 0)
|
||||
{
|
||||
_capsuleToTrack = boneCapsules[0];
|
||||
}
|
||||
|
||||
_isInitialized = true;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (!HandsManager.Instance || !HandsManager.Instance.IsInitialized() || !_isInitialized || _capsuleToTrack == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
OVRHand hand = IsRightHandedTool ? HandsManager.Instance.RightHand : HandsManager.Instance.LeftHand;
|
||||
float currentScale = hand.HandScale;
|
||||
// push tool into the tip based on how wide it is. so negate the direction
|
||||
Transform capsuleTransform = _capsuleToTrack.CapsuleCollider.transform;
|
||||
// NOTE: use time settings 0.0111111/0.02 to make collisions work correctly!
|
||||
Vector3 capsuleDirection = capsuleTransform.right;
|
||||
Vector3 capsuleTipPosition = capsuleTransform.position + _capsuleToTrack.CapsuleCollider.height * 0.5f
|
||||
* capsuleDirection;
|
||||
Vector3 toolSphereRadiusOffsetFromTip = currentScale * _fingerTipPokeToolView.SphereRadius *
|
||||
capsuleDirection;
|
||||
// push tool back so that it's centered on transform/bone
|
||||
Vector3 toolPosition = capsuleTipPosition + toolSphereRadiusOffsetFromTip;
|
||||
transform.position = toolPosition;
|
||||
transform.rotation = capsuleTransform.rotation;
|
||||
InteractionPosition = capsuleTipPosition;
|
||||
|
||||
UpdateAverageVelocity();
|
||||
|
||||
CheckAndUpdateScale();
|
||||
}
|
||||
|
||||
private void UpdateAverageVelocity()
|
||||
{
|
||||
var prevPosition = _position;
|
||||
var currPosition = transform.position;
|
||||
var currentVelocity = (currPosition - prevPosition) / Time.deltaTime;
|
||||
_position = currPosition;
|
||||
_velocityFrames[_currVelocityFrame] = currentVelocity;
|
||||
// if sampled more than allowed, loop back toward the beginning
|
||||
_currVelocityFrame = (_currVelocityFrame + 1) % NUM_VELOCITY_FRAMES;
|
||||
|
||||
Velocity = Vector3.zero;
|
||||
// edge case; when we first start up, we will have only sampled less than the
|
||||
// max frames. so only compute the average over that subset. After that, the
|
||||
// frame samples will act like an array that loops back toward to the beginning
|
||||
if (!_sampledMaxFramesAlready && _currVelocityFrame == NUM_VELOCITY_FRAMES - 1)
|
||||
{
|
||||
_sampledMaxFramesAlready = true;
|
||||
}
|
||||
|
||||
int numFramesToSamples = _sampledMaxFramesAlready ? NUM_VELOCITY_FRAMES : _currVelocityFrame + 1;
|
||||
for (int frameIndex = 0; frameIndex < numFramesToSamples; frameIndex++)
|
||||
{
|
||||
Velocity += _velocityFrames[frameIndex];
|
||||
}
|
||||
|
||||
Velocity /= numFramesToSamples;
|
||||
}
|
||||
|
||||
private void CheckAndUpdateScale()
|
||||
{
|
||||
float currentScale = IsRightHandedTool ? HandsManager.Instance.RightHand.HandScale
|
||||
: HandsManager.Instance.LeftHand.HandScale;
|
||||
if (Mathf.Abs(currentScale - _lastScale) > Mathf.Epsilon)
|
||||
{
|
||||
transform.localScale = new Vector3(currentScale, currentScale, currentScale);
|
||||
_lastScale = currentScale;
|
||||
}
|
||||
}
|
||||
|
||||
public override List<InteractableCollisionInfo> GetNextIntersectingObjects()
|
||||
{
|
||||
_currentIntersectingObjects.Clear();
|
||||
|
||||
foreach (var boneCapsuleTriggerLogic in _boneCapsuleTriggerLogic)
|
||||
{
|
||||
var collidersTouching = boneCapsuleTriggerLogic.CollidersTouchingUs;
|
||||
foreach (ColliderZone colliderTouching in collidersTouching)
|
||||
{
|
||||
_currentIntersectingObjects.Add(new InteractableCollisionInfo(colliderTouching,
|
||||
colliderTouching.CollisionDepth, this));
|
||||
}
|
||||
}
|
||||
|
||||
return _currentIntersectingObjects;
|
||||
}
|
||||
|
||||
public override void FocusOnInteractable(Interactable focusedInteractable,
|
||||
ColliderZone colliderZone)
|
||||
{
|
||||
// no need for focus
|
||||
}
|
||||
|
||||
public override void DeFocus()
|
||||
{
|
||||
// no need for focus
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ded892ce0d9b4e043844fcfd27b63b7a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,53 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
|
||||
/// <summary>
|
||||
/// Visual of finger tip poke tool.
|
||||
/// </summary>
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
public class FingerTipPokeToolView : MonoBehaviour, InteractableToolView
|
||||
{
|
||||
[SerializeField] private MeshRenderer _sphereMeshRenderer = null;
|
||||
|
||||
public InteractableTool InteractableTool { get; set; }
|
||||
|
||||
public bool EnableState
|
||||
{
|
||||
get
|
||||
{
|
||||
return _sphereMeshRenderer.enabled;
|
||||
}
|
||||
set
|
||||
{
|
||||
_sphereMeshRenderer.enabled = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool ToolActivateState { get; set; }
|
||||
|
||||
public float SphereRadius { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
Assert.IsNotNull(_sphereMeshRenderer);
|
||||
SphereRadius = _sphereMeshRenderer.transform.localScale.z * 0.5f;
|
||||
}
|
||||
|
||||
public void SetFocusedInteractable(Interactable interactable)
|
||||
{
|
||||
// nothing to see here
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f58463a8ddf862a45a7a5dbd85d11ffd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,210 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Describes how the tool will work with interactables. An interactable,
|
||||
/// in turn, can tell us which tools they support via their flag bit mask.
|
||||
/// </summary>
|
||||
[System.Flags]
|
||||
public enum InteractableToolTags
|
||||
{
|
||||
None = 0,
|
||||
Ray = 1 << 0,
|
||||
Poke = 1 << 2,
|
||||
All = ~0
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indicates if tool has been activated via some gesture, press, etc.
|
||||
/// </summary>
|
||||
public enum ToolInputState
|
||||
{
|
||||
Inactive = 0,
|
||||
PrimaryInputDown,
|
||||
PrimaryInputDownStay,
|
||||
PrimaryInputUp
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Describes tool-to-collision information.
|
||||
/// </summary>
|
||||
public class InteractableCollisionInfo
|
||||
{
|
||||
public InteractableCollisionInfo(ColliderZone collider, InteractableCollisionDepth collisionDepth,
|
||||
InteractableTool collidingTool)
|
||||
{
|
||||
InteractableCollider = collider;
|
||||
CollisionDepth = collisionDepth;
|
||||
CollidingTool = collidingTool;
|
||||
}
|
||||
|
||||
public ColliderZone InteractableCollider;
|
||||
public InteractableCollisionDepth CollisionDepth;
|
||||
public InteractableTool CollidingTool;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A tool that can engage interactables.
|
||||
/// </summary>
|
||||
public abstract class InteractableTool : MonoBehaviour
|
||||
{
|
||||
public Transform ToolTransform { get { return this.transform; } }
|
||||
public bool IsRightHandedTool { get; set; }
|
||||
|
||||
public abstract InteractableToolTags ToolTags { get; }
|
||||
|
||||
public abstract ToolInputState ToolInputState { get; }
|
||||
|
||||
public abstract bool IsFarFieldTool { get; }
|
||||
|
||||
public Vector3 Velocity { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Sometimes we want the position of a tool for stuff like pokes.
|
||||
/// </summary>
|
||||
public Vector3 InteractionPosition { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// List of objects that intersect tool.
|
||||
/// </summary>
|
||||
protected List<InteractableCollisionInfo> _currentIntersectingObjects =
|
||||
new List<InteractableCollisionInfo>();
|
||||
public List<InteractableCollisionInfo> GetCurrentIntersectingObjects()
|
||||
{
|
||||
return _currentIntersectingObjects;
|
||||
}
|
||||
public abstract List<InteractableCollisionInfo> GetNextIntersectingObjects();
|
||||
|
||||
/// <summary>
|
||||
/// Used to tell the tool to "focus" on a specific object, if
|
||||
/// focusing is indeed possible given the tool type.
|
||||
/// </summary>
|
||||
/// <param name="focusedInteractable">Interactable to focus.</param>
|
||||
/// <param name="colliderZone">Collider zone of interactable.</param>
|
||||
public abstract void FocusOnInteractable(Interactable focusedInteractable,
|
||||
ColliderZone colliderZone);
|
||||
|
||||
public abstract void DeFocus();
|
||||
|
||||
public abstract bool EnableState { get; set; }
|
||||
|
||||
// lists created once so that they don't need to be created per frame
|
||||
private List<Interactable> _addedInteractables = new List<Interactable>();
|
||||
private List<Interactable> _removedInteractables = new List<Interactable>();
|
||||
private List<Interactable> _remainingInteractables = new List<Interactable>();
|
||||
|
||||
private Dictionary<Interactable, InteractableCollisionInfo> _currInteractableToCollisionInfos
|
||||
= new Dictionary<Interactable, InteractableCollisionInfo>();
|
||||
private Dictionary<Interactable, InteractableCollisionInfo> _prevInteractableToCollisionInfos
|
||||
= new Dictionary<Interactable, InteractableCollisionInfo>();
|
||||
|
||||
public abstract void Initialize();
|
||||
|
||||
public KeyValuePair<Interactable, InteractableCollisionInfo> GetFirstCurrentCollisionInfo()
|
||||
{
|
||||
return _currInteractableToCollisionInfos.First();
|
||||
}
|
||||
|
||||
public void ClearAllCurrentCollisionInfos()
|
||||
{
|
||||
_currInteractableToCollisionInfos.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// For each intersecting interactable, update meta data to indicate deepest collision only.
|
||||
/// </summary>
|
||||
public virtual void UpdateCurrentCollisionsBasedOnDepth()
|
||||
{
|
||||
_currInteractableToCollisionInfos.Clear();
|
||||
foreach (InteractableCollisionInfo interactableCollisionInfo in _currentIntersectingObjects)
|
||||
{
|
||||
var interactable = interactableCollisionInfo.InteractableCollider.ParentInteractable;
|
||||
var depth = interactableCollisionInfo.CollisionDepth;
|
||||
InteractableCollisionInfo collisionInfoFromMap = null;
|
||||
|
||||
if (!_currInteractableToCollisionInfos.TryGetValue(interactable, out collisionInfoFromMap))
|
||||
{
|
||||
_currInteractableToCollisionInfos[interactable] = interactableCollisionInfo;
|
||||
}
|
||||
else if (collisionInfoFromMap.CollisionDepth < depth)
|
||||
{
|
||||
collisionInfoFromMap.InteractableCollider = interactableCollisionInfo.InteractableCollider;
|
||||
collisionInfoFromMap.CollisionDepth = depth;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If our collision information changed per frame, make note of it.
|
||||
/// Removed, added and remaining objects must get their proper events.
|
||||
/// </summary>
|
||||
public virtual void UpdateLatestCollisionData()
|
||||
{
|
||||
_addedInteractables.Clear();
|
||||
_removedInteractables.Clear();
|
||||
_remainingInteractables.Clear();
|
||||
|
||||
foreach (Interactable key in _currInteractableToCollisionInfos.Keys)
|
||||
{
|
||||
if (!_prevInteractableToCollisionInfos.ContainsKey(key))
|
||||
{
|
||||
_addedInteractables.Add(key);
|
||||
}
|
||||
else
|
||||
{
|
||||
_remainingInteractables.Add(key);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (Interactable key in _prevInteractableToCollisionInfos.Keys)
|
||||
{
|
||||
if (!_currInteractableToCollisionInfos.ContainsKey(key))
|
||||
{
|
||||
_removedInteractables.Add(key);
|
||||
}
|
||||
}
|
||||
|
||||
// tell removed interactables that we are gone
|
||||
foreach (Interactable removedInteractable in _removedInteractables)
|
||||
{
|
||||
removedInteractable.UpdateCollisionDepth(this,
|
||||
_prevInteractableToCollisionInfos[removedInteractable].CollisionDepth,
|
||||
InteractableCollisionDepth.None);
|
||||
}
|
||||
|
||||
// tell added interactable what state we are now in
|
||||
foreach (Interactable addedInteractableKey in _addedInteractables)
|
||||
{
|
||||
var addedInteractable = _currInteractableToCollisionInfos[addedInteractableKey];
|
||||
var collisionDepth = addedInteractable.CollisionDepth;
|
||||
addedInteractableKey.UpdateCollisionDepth(this, InteractableCollisionDepth.None,
|
||||
collisionDepth);
|
||||
}
|
||||
|
||||
// remaining interactables must be updated
|
||||
foreach (Interactable remainingInteractableKey in _remainingInteractables)
|
||||
{
|
||||
var newDepth = _currInteractableToCollisionInfos[remainingInteractableKey].CollisionDepth;
|
||||
var oldDepth = _prevInteractableToCollisionInfos[remainingInteractableKey].CollisionDepth;
|
||||
remainingInteractableKey.UpdateCollisionDepth(this, oldDepth, newDepth);
|
||||
}
|
||||
|
||||
_prevInteractableToCollisionInfos = new Dictionary<Interactable, InteractableCollisionInfo>(
|
||||
_currInteractableToCollisionInfos);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 315c35e87495799449c01ea6abb8fda6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,26 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// The visual abstraction of an interactable tool.
|
||||
/// </summary>
|
||||
public interface InteractableToolView
|
||||
{
|
||||
InteractableTool InteractableTool { get; }
|
||||
void SetFocusedInteractable(Interactable interactable);
|
||||
|
||||
bool EnableState { get; set; }
|
||||
// Useful if you want to tool to glow in case it interacts with an object.
|
||||
bool ToolActivateState { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4527e0b0689eb704d84933513d5b5dd3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,120 +0,0 @@
|
||||
// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
||||
|
||||
using UnityEngine;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Manages pinch state, including if an object is being focused via something
|
||||
/// like a ray (or not).
|
||||
/// </summary>
|
||||
public class PinchStateModule
|
||||
{
|
||||
private const float PINCH_STRENGTH_THRESHOLD = 1.0f;
|
||||
|
||||
private enum PinchState
|
||||
{
|
||||
None = 0,
|
||||
PinchDown,
|
||||
PinchStay,
|
||||
PinchUp
|
||||
}
|
||||
|
||||
private PinchState _currPinchState;
|
||||
private Interactable _firstFocusedInteractable;
|
||||
|
||||
/// <summary>
|
||||
/// We want a pinch up and down gesture to be done **while** an object is focused.
|
||||
/// We don't want someone to pinch, unfocus an object, then refocus before doing
|
||||
/// pinch up. We also want to avoid focusing a different interactable during this process.
|
||||
/// While the latter is difficult to do since a person might focus nothing before
|
||||
/// focusing on another interactable, it's theoretically possible.
|
||||
/// </summary>
|
||||
public bool PinchUpAndDownOnFocusedObject
|
||||
{
|
||||
get
|
||||
{
|
||||
return _currPinchState == PinchState.PinchUp && _firstFocusedInteractable != null;
|
||||
}
|
||||
}
|
||||
|
||||
public bool PinchSteadyOnFocusedObject
|
||||
{
|
||||
get
|
||||
{
|
||||
return _currPinchState == PinchState.PinchStay && _firstFocusedInteractable != null;
|
||||
}
|
||||
}
|
||||
|
||||
public bool PinchDownOnFocusedObject
|
||||
{
|
||||
get
|
||||
{
|
||||
return _currPinchState == PinchState.PinchDown && _firstFocusedInteractable != null;
|
||||
}
|
||||
}
|
||||
|
||||
public PinchStateModule()
|
||||
{
|
||||
_currPinchState = PinchState.None;
|
||||
_firstFocusedInteractable = null;
|
||||
}
|
||||
|
||||
public void UpdateState(OVRHand hand, Interactable currFocusedInteractable)
|
||||
{
|
||||
float pinchStrength = hand.GetFingerPinchStrength(OVRHand.HandFinger.Index);
|
||||
bool isPinching = Mathf.Abs(PINCH_STRENGTH_THRESHOLD - pinchStrength) < Mathf.Epsilon;
|
||||
var oldPinchState = _currPinchState;
|
||||
|
||||
switch (oldPinchState)
|
||||
{
|
||||
case PinchState.PinchUp:
|
||||
// can only be in pinch up for a single frame, so consider
|
||||
// next frame carefully
|
||||
if (isPinching)
|
||||
{
|
||||
_currPinchState = PinchState.PinchDown;
|
||||
if (currFocusedInteractable != _firstFocusedInteractable)
|
||||
{
|
||||
_firstFocusedInteractable = null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_currPinchState = PinchState.None;
|
||||
_firstFocusedInteractable = null;
|
||||
}
|
||||
break;
|
||||
case PinchState.PinchStay:
|
||||
if (!isPinching)
|
||||
{
|
||||
_currPinchState = PinchState.PinchUp;
|
||||
}
|
||||
// if object is not focused anymore, then forget it
|
||||
if (currFocusedInteractable != _firstFocusedInteractable)
|
||||
{
|
||||
_firstFocusedInteractable = null;
|
||||
}
|
||||
break;
|
||||
// pinch down lasts for a max of 1 frame. either go to pinch stay or up
|
||||
case PinchState.PinchDown:
|
||||
_currPinchState = isPinching ? PinchState.PinchStay : PinchState.PinchUp;
|
||||
// if the focused interactable changes, then the original one is now invalid
|
||||
if (_firstFocusedInteractable != currFocusedInteractable)
|
||||
{
|
||||
_firstFocusedInteractable = null;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (isPinching)
|
||||
{
|
||||
_currPinchState = PinchState.PinchDown;
|
||||
// this is the interactable that must be focused through out the pinch up and down
|
||||
// gesture.
|
||||
_firstFocusedInteractable = currFocusedInteractable;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4a90623ee41311f42a1193b508156429
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,348 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Ray tool used for far-field interactions.
|
||||
/// </summary>
|
||||
public class RayTool : InteractableTool
|
||||
{
|
||||
private const float MINIMUM_RAY_CAST_DISTANCE = 0.8f;
|
||||
private const float COLLIDER_RADIUS = 0.01f;
|
||||
private const int NUM_MAX_PRIMARY_HITS = 10;
|
||||
private const int NUM_MAX_SECONDARY_HITS = 25;
|
||||
private const int NUM_COLLIDERS_TO_TEST = 20;
|
||||
|
||||
[SerializeField] private RayToolView _rayToolView = null;
|
||||
[Range(0.0f, 45.0f)] [SerializeField] private float _coneAngleDegrees = 20.0f;
|
||||
[SerializeField] private float _farFieldMaxDistance = 5f;
|
||||
|
||||
public override InteractableToolTags ToolTags
|
||||
{
|
||||
get
|
||||
{
|
||||
return InteractableToolTags.Ray;
|
||||
}
|
||||
}
|
||||
|
||||
private PinchStateModule _pinchStateModule = new PinchStateModule();
|
||||
private Interactable _focusedInteractable;
|
||||
|
||||
public override ToolInputState ToolInputState
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_pinchStateModule.PinchDownOnFocusedObject)
|
||||
{
|
||||
return ToolInputState.PrimaryInputDown;
|
||||
}
|
||||
if (_pinchStateModule.PinchSteadyOnFocusedObject)
|
||||
{
|
||||
return ToolInputState.PrimaryInputDownStay;
|
||||
}
|
||||
if (_pinchStateModule.PinchUpAndDownOnFocusedObject)
|
||||
{
|
||||
return ToolInputState.PrimaryInputUp;
|
||||
}
|
||||
|
||||
return ToolInputState.Inactive;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool IsFarFieldTool
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
public override bool EnableState
|
||||
{
|
||||
get
|
||||
{
|
||||
return _rayToolView.EnableState;
|
||||
}
|
||||
set
|
||||
{
|
||||
_rayToolView.EnableState = value;
|
||||
}
|
||||
}
|
||||
|
||||
private Collider[] _collidersOverlapped = new Collider[NUM_COLLIDERS_TO_TEST];
|
||||
|
||||
private Interactable _currInteractableCastedAgainst = null;
|
||||
private float _coneAngleReleaseDegrees;
|
||||
|
||||
private RaycastHit[] _primaryHits = new RaycastHit[NUM_MAX_PRIMARY_HITS];
|
||||
private Collider[] _secondaryOverlapResults = new Collider[NUM_MAX_SECONDARY_HITS];
|
||||
private bool _initialized = false;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
Assert.IsNotNull(_rayToolView);
|
||||
InteractableToolsInputRouter.Instance.RegisterInteractableTool(this);
|
||||
_rayToolView.InteractableTool = this;
|
||||
_coneAngleReleaseDegrees = _coneAngleDegrees * 1.2f;
|
||||
_initialized = true;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (InteractableToolsInputRouter.Instance != null)
|
||||
{
|
||||
InteractableToolsInputRouter.Instance.UnregisterInteractableTool(this);
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (!HandsManager.Instance || !HandsManager.Instance.IsInitialized() || !_initialized)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var hand = IsRightHandedTool ? HandsManager.Instance.RightHand : HandsManager.Instance.LeftHand;
|
||||
var pointer = hand.PointerPose;
|
||||
transform.position = pointer.position;
|
||||
transform.rotation = pointer.rotation;
|
||||
|
||||
var prevPosition = InteractionPosition;
|
||||
var currPosition = transform.position;
|
||||
Velocity = (currPosition - prevPosition) / Time.deltaTime;
|
||||
InteractionPosition = currPosition;
|
||||
|
||||
_pinchStateModule.UpdateState(hand, _focusedInteractable);
|
||||
_rayToolView.ToolActivateState = _pinchStateModule.PinchSteadyOnFocusedObject ||
|
||||
_pinchStateModule.PinchDownOnFocusedObject;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Avoid hand collider during raycasts so move origin some distance away from where tool is.
|
||||
/// </summary>
|
||||
/// <returns>Proper raycast origin.</returns>
|
||||
private Vector3 GetRayCastOrigin()
|
||||
{
|
||||
return transform.position + MINIMUM_RAY_CAST_DISTANCE * transform.forward;
|
||||
}
|
||||
|
||||
public override List<InteractableCollisionInfo> GetNextIntersectingObjects()
|
||||
{
|
||||
if (!_initialized)
|
||||
{
|
||||
return _currentIntersectingObjects;
|
||||
}
|
||||
|
||||
// if we already have focused on something, keep it until the angle between
|
||||
// our forward direction and object vector becomes too large
|
||||
if (_currInteractableCastedAgainst != null &&
|
||||
HasRayReleasedInteractable(_currInteractableCastedAgainst))
|
||||
{
|
||||
// reset state
|
||||
_currInteractableCastedAgainst = null;
|
||||
}
|
||||
|
||||
// Find target interactable if we haven't found one before.
|
||||
if (_currInteractableCastedAgainst == null)
|
||||
{
|
||||
_currentIntersectingObjects.Clear();
|
||||
_currInteractableCastedAgainst = FindTargetInteractable();
|
||||
|
||||
// If we have found one, query collision zones.
|
||||
if (_currInteractableCastedAgainst != null)
|
||||
{
|
||||
var targetHitPoint = _currInteractableCastedAgainst.transform.position;
|
||||
int numHits = Physics.OverlapSphereNonAlloc(targetHitPoint, COLLIDER_RADIUS, _collidersOverlapped);
|
||||
|
||||
// find all colliders encountered; focus only on ones belonging to target element
|
||||
for (int i = 0; i < numHits; i++)
|
||||
{
|
||||
Collider colliderHit = _collidersOverlapped[i];
|
||||
var colliderZone = colliderHit.GetComponent<ColliderZone>();
|
||||
if (colliderZone == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Interactable interactableComponent = colliderZone.ParentInteractable;
|
||||
if (interactableComponent == null || interactableComponent
|
||||
!= _currInteractableCastedAgainst)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
InteractableCollisionInfo collisionInfo = new InteractableCollisionInfo(colliderZone,
|
||||
colliderZone.CollisionDepth, this);
|
||||
_currentIntersectingObjects.Add(collisionInfo);
|
||||
}
|
||||
|
||||
// clear intersecting object if no collisions were found
|
||||
if (_currentIntersectingObjects.Count == 0)
|
||||
{
|
||||
_currInteractableCastedAgainst = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return _currentIntersectingObjects;
|
||||
}
|
||||
|
||||
private bool HasRayReleasedInteractable(Interactable focusedInteractable)
|
||||
{
|
||||
var ourPosition = transform.position;
|
||||
var forwardDirection = transform.forward;
|
||||
var hysteresisDotThreshold = Mathf.Cos(_coneAngleReleaseDegrees * Mathf.Deg2Rad);
|
||||
var vectorToFocusedObject = focusedInteractable.transform.position - ourPosition;
|
||||
vectorToFocusedObject.Normalize();
|
||||
var hysteresisDotProduct = Vector3.Dot(vectorToFocusedObject, forwardDirection);
|
||||
return hysteresisDotProduct < hysteresisDotThreshold;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Find all objects from primary ray cast or if that fails, all objects in a
|
||||
/// cone around main ray direction via a "secondary" cast.
|
||||
/// </summary>
|
||||
private Interactable FindTargetInteractable()
|
||||
{
|
||||
var rayOrigin = GetRayCastOrigin();
|
||||
var rayDirection = transform.forward;
|
||||
Interactable targetInteractable = null;
|
||||
|
||||
// attempt primary ray cast
|
||||
targetInteractable = FindPrimaryRaycastHit(rayOrigin, rayDirection);
|
||||
|
||||
// if primary cast fails, try secondary cone test
|
||||
if (targetInteractable == null)
|
||||
{
|
||||
targetInteractable = FindInteractableViaConeTest(rayOrigin, rayDirection);
|
||||
}
|
||||
|
||||
return targetInteractable;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Find first hit that is supports our tool's method of interaction.
|
||||
/// </summary>
|
||||
private Interactable FindPrimaryRaycastHit(Vector3 rayOrigin, Vector3 rayDirection)
|
||||
{
|
||||
Interactable interactableCastedAgainst = null;
|
||||
|
||||
// hit order not guaranteed, so find closest
|
||||
int numHits = Physics.RaycastNonAlloc(new Ray(rayOrigin, rayDirection), _primaryHits, Mathf.Infinity);
|
||||
float minDistance = 0.0f;
|
||||
for (int hitIndex = 0; hitIndex < numHits; hitIndex++)
|
||||
{
|
||||
RaycastHit raycastHit = _primaryHits[hitIndex];
|
||||
|
||||
// continue if something occludes it and that object is not an interactable
|
||||
var currentHitColliderZone = raycastHit.transform.GetComponent<ColliderZone>();
|
||||
if (currentHitColliderZone == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// at this point we have encountered an interactable. Only consider it if
|
||||
// it allows interaction with our tool. Otherwise ignore it.
|
||||
Interactable currentInteractable = currentHitColliderZone.ParentInteractable;
|
||||
if (currentInteractable == null || (currentInteractable.ValidToolTagsMask & (int)ToolTags) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var vectorToInteractable = currentInteractable.transform.position - rayOrigin;
|
||||
var distanceToInteractable = vectorToInteractable.magnitude;
|
||||
if (interactableCastedAgainst == null || distanceToInteractable < minDistance)
|
||||
{
|
||||
interactableCastedAgainst = currentInteractable;
|
||||
minDistance = distanceToInteractable;
|
||||
}
|
||||
}
|
||||
|
||||
return interactableCastedAgainst;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If primary cast fails, try secondary test to see if we can target an interactable.
|
||||
/// This target has to be far enough and support our tool via appropriate
|
||||
/// tags, and must be within a certain angle from our primary ray direction.
|
||||
/// </summary>
|
||||
/// <param name="rayOrigin">Primary ray origin.</param>
|
||||
/// <param name="rayDirection">Primary ray direction.</param>
|
||||
/// <returns>Interactable found, if any.</returns>
|
||||
private Interactable FindInteractableViaConeTest(Vector3 rayOrigin, Vector3 rayDirection)
|
||||
{
|
||||
Interactable targetInteractable = null;
|
||||
|
||||
float minDistance = 0.0f;
|
||||
float minDotProductThreshold = Mathf.Cos(_coneAngleDegrees * Mathf.Deg2Rad);
|
||||
// cone extends from center line, where angle is split between top and bottom half
|
||||
float halfAngle = Mathf.Deg2Rad * _coneAngleDegrees * 0.5f;
|
||||
float coneRadius = Mathf.Tan(halfAngle) * _farFieldMaxDistance;
|
||||
|
||||
int numColliders = Physics.OverlapBoxNonAlloc(
|
||||
rayOrigin + rayDirection * _farFieldMaxDistance * 0.5f, // center
|
||||
new Vector3(coneRadius, coneRadius, _farFieldMaxDistance * 0.5f), //half extents
|
||||
_secondaryOverlapResults, transform.rotation);
|
||||
|
||||
for (int i = 0; i < numColliders; i++)
|
||||
{
|
||||
Collider colliderHit = _secondaryOverlapResults[i];
|
||||
// skip invalid colliders
|
||||
var colliderZone = colliderHit.GetComponent<ColliderZone>();
|
||||
if (colliderZone == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// skip invalid components
|
||||
Interactable interactableComponent = colliderZone.ParentInteractable;
|
||||
if (interactableComponent == null ||
|
||||
(interactableComponent.ValidToolTagsMask & (int)ToolTags) == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var vectorToInteractable = interactableComponent.transform.position - rayOrigin;
|
||||
var distanceToInteractable = vectorToInteractable.magnitude;
|
||||
vectorToInteractable /= distanceToInteractable;
|
||||
var dotProduct = Vector3.Dot(vectorToInteractable, rayDirection);
|
||||
// must be inside cone!
|
||||
if (dotProduct < minDotProductThreshold)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (targetInteractable == null || distanceToInteractable < minDistance)
|
||||
{
|
||||
targetInteractable = interactableComponent;
|
||||
minDistance = distanceToInteractable;
|
||||
}
|
||||
}
|
||||
|
||||
return targetInteractable;
|
||||
}
|
||||
|
||||
public override void FocusOnInteractable(Interactable focusedInteractable,
|
||||
ColliderZone colliderZone)
|
||||
{
|
||||
_rayToolView.SetFocusedInteractable(focusedInteractable);
|
||||
_focusedInteractable = focusedInteractable;
|
||||
}
|
||||
|
||||
public override void DeFocus()
|
||||
{
|
||||
_rayToolView.SetFocusedInteractable(null);
|
||||
_focusedInteractable = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e5a3ef75653a3e84281bf84f8b8575c5
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,131 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.Assertions;
|
||||
|
||||
namespace OculusSampleFramework
|
||||
{
|
||||
/// <summary>
|
||||
/// Visual portion of ray tool.
|
||||
/// </summary>
|
||||
public class RayToolView : MonoBehaviour, InteractableToolView
|
||||
{
|
||||
private const int NUM_RAY_LINE_POSITIONS = 25;
|
||||
private const float DEFAULT_RAY_CAST_DISTANCE = 3.0f;
|
||||
|
||||
[SerializeField] private Transform _targetTransform = null;
|
||||
[SerializeField] private LineRenderer _lineRenderer = null;
|
||||
|
||||
public bool EnableState
|
||||
{
|
||||
get
|
||||
{
|
||||
return _lineRenderer.enabled;
|
||||
}
|
||||
set
|
||||
{
|
||||
_targetTransform.gameObject.SetActive(value);
|
||||
_lineRenderer.enabled = value;
|
||||
}
|
||||
}
|
||||
|
||||
private bool _toolActivateState = false;
|
||||
|
||||
public bool ToolActivateState
|
||||
{
|
||||
get { return _toolActivateState; }
|
||||
set
|
||||
{
|
||||
_toolActivateState = value;
|
||||
_lineRenderer.colorGradient = _toolActivateState ? _highLightColorGradient : _oldColorGradient;
|
||||
}
|
||||
}
|
||||
|
||||
private Transform _focusedTransform = null;
|
||||
private Vector3[] linePositions = new Vector3[NUM_RAY_LINE_POSITIONS];
|
||||
private Gradient _oldColorGradient, _highLightColorGradient;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
Assert.IsNotNull(_targetTransform);
|
||||
Assert.IsNotNull(_lineRenderer);
|
||||
_lineRenderer.positionCount = NUM_RAY_LINE_POSITIONS;
|
||||
|
||||
_oldColorGradient = _lineRenderer.colorGradient;
|
||||
_highLightColorGradient = new Gradient();
|
||||
_highLightColorGradient.SetKeys(
|
||||
new GradientColorKey[] { new GradientColorKey(new Color(0.90f, 0.90f, 0.90f), 0.0f),
|
||||
new GradientColorKey(new Color(0.90f, 0.90f, 0.90f), 1.0f) },
|
||||
new GradientAlphaKey[] { new GradientAlphaKey(1.0f, 0.0f), new GradientAlphaKey(1.0f, 1.0f) }
|
||||
);
|
||||
}
|
||||
|
||||
public InteractableTool InteractableTool { get; set; }
|
||||
|
||||
public void SetFocusedInteractable(Interactable interactable)
|
||||
{
|
||||
if (interactable == null)
|
||||
{
|
||||
_focusedTransform = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
_focusedTransform = interactable.transform;
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
var myPosition = InteractableTool.ToolTransform.position;
|
||||
var myForward = InteractableTool.ToolTransform.forward;
|
||||
|
||||
var targetPosition = _focusedTransform != null
|
||||
? _focusedTransform.position
|
||||
: myPosition + myForward * DEFAULT_RAY_CAST_DISTANCE;
|
||||
var targetVector = targetPosition - myPosition;
|
||||
var targetDistance = targetVector.magnitude;
|
||||
var p0 = myPosition;
|
||||
// make points in between based on my forward as opposed to targetvector
|
||||
// this way the curve "bends" toward to target
|
||||
var p1 = myPosition + myForward * targetDistance * 0.3333333f;
|
||||
var p2 = myPosition + myForward * targetDistance * 0.6666667f;
|
||||
var p3 = targetPosition;
|
||||
for (int i = 0; i < NUM_RAY_LINE_POSITIONS; i++)
|
||||
{
|
||||
linePositions[i] = GetPointOnBezierCurve(p0, p1, p2, p3, i / 25.0f);
|
||||
}
|
||||
|
||||
_lineRenderer.SetPositions(linePositions);
|
||||
_targetTransform.position = targetPosition;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns point on four-point Bezier curve.
|
||||
/// </summary>
|
||||
/// <param name="p0">Beginning point.</param>
|
||||
/// <param name="p1">t=1/3 point.</param>
|
||||
/// <param name="p2">t=2/3 point.</param>
|
||||
/// <param name="p3">End point.</param>
|
||||
/// <param name="t">Interpolation parameter.</param>
|
||||
/// <returns>Point along Bezier curve.</returns>
|
||||
public static Vector3 GetPointOnBezierCurve(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
|
||||
{
|
||||
t = Mathf.Clamp01(t);
|
||||
var oneMinusT = 1f - t;
|
||||
var oneMinusTSqr = oneMinusT * oneMinusT;
|
||||
var tSqr = t * t;
|
||||
return oneMinusT * oneMinusTSqr * p0 + 3f * oneMinusTSqr * t * p1 + 3f * oneMinusT * tSqr * p2 +
|
||||
t * tSqr * p3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a4e71869e3ccfde47a7a16e2f483b328
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 97567320ca54f20449bb0c3ad6a66a22
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,118 +0,0 @@
|
||||
/************************************************************************************
|
||||
|
||||
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
||||
|
||||
See SampleFramework license.txt for license terms. Unless required by applicable law
|
||||
or agreed to in writing, the sample code is provided <20>AS IS<49> WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
||||
language governing permissions and limitations under the license.
|
||||
|
||||
************************************************************************************/
|
||||
|
||||
Shader "Oculus Sample/Alpha Hand Outline"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
_ColorPrimary ("Color Primary", Color) = (0.396078, 0.725490, 1)
|
||||
_ColorTop ("Color Top", Color) = (0.031896, 0.0343398, 0.0368894)
|
||||
_ColorBottom ("Color Bottom", Color) = (0.0137021, 0.0144438, 0.0152085)
|
||||
_RimFactor ("Rim Factor", Range(0.01, 1.0)) = 0.65
|
||||
_FresnelPower ("Fresnel Power", Range(0.01,1.0)) = 0.16
|
||||
|
||||
_HandAlpha ("Hand Alpha", Range(0, 1)) = 1.0
|
||||
_MinVisibleAlpha ("Minimum Visible Alpha", Range(0,1)) = 0.15
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags {"Queue" = "Transparent" "Render" = "Transparent" "IgnoreProjector" = "True"}
|
||||
LOD 100
|
||||
|
||||
// Write depth values so that you see topmost layer.
|
||||
Pass
|
||||
{
|
||||
ZWrite On
|
||||
ColorMask 0
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
float4 vert(float4 vertex : POSITION) : SV_POSITION
|
||||
{
|
||||
return UnityObjectToClipPos(vertex);
|
||||
}
|
||||
|
||||
fixed4 frag() : SV_Target
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
CGPROGRAM
|
||||
#include "UnityCG.cginc"
|
||||
// no deferred. support lightmaps and one light. use half vector instead of
|
||||
// view vector (less accurate but faster)
|
||||
#pragma surface surf BlinnPhong alpha:fade exclude_path:prepass noforwardadd halfasview nolightmap
|
||||
|
||||
sampler2D _MainTex;
|
||||
|
||||
struct Input {
|
||||
float2 uv_MainTex;
|
||||
float3 worldRefl;
|
||||
float3 viewDir;
|
||||
INTERNAL_DATA
|
||||
};
|
||||
|
||||
#define ColorBlack half3(0, 0, 0)
|
||||
#define EmissionFactor (0.95)
|
||||
|
||||
fixed3 _ColorPrimary;
|
||||
fixed3 _ColorTop;
|
||||
fixed3 _ColorBottom;
|
||||
float _RimFactor;
|
||||
float _FresnelPower;
|
||||
|
||||
float _HandAlpha;
|
||||
float _MinVisibleAlpha;
|
||||
|
||||
float3 SafeNormalize(float3 normal) {
|
||||
float magSq = dot(normal, normal);
|
||||
if (magSq == 0) {
|
||||
return 0;
|
||||
}
|
||||
return normalize(normal);
|
||||
}
|
||||
|
||||
void surf(Input IN, inout SurfaceOutput o) {
|
||||
float3 normalDirection = SafeNormalize(o.Normal);
|
||||
float3 viewDir = SafeNormalize(IN.viewDir);
|
||||
half viewDotNormal = saturate(dot(viewDir, normalDirection));
|
||||
// the higher the rim factor, the greater the effect overall. by default,
|
||||
// it's strongest near edges
|
||||
half rim = pow(1.0 - viewDotNormal, 0.5) * (1.0 - _RimFactor) + _RimFactor;
|
||||
rim = saturate(rim);
|
||||
|
||||
half3 emission = lerp(ColorBlack, _ColorPrimary, rim);
|
||||
// brighten emission a bit, multiply by factor to reign it in
|
||||
emission += rim * 0.5;
|
||||
emission *= EmissionFactor;
|
||||
|
||||
// effect gets stronger toward edges. note that lerp can extrapolate! saturate first
|
||||
// potentially could schlick approx, like specColor + (1-specColor)*nDotLight^5
|
||||
// except here we woulduse nDotView instead of nDotLight
|
||||
float fresnel = saturate(pow(1.0 - viewDotNormal, _FresnelPower));
|
||||
fixed3 color = lerp(_ColorTop, _ColorBottom, fresnel);
|
||||
|
||||
fixed alphaValue = step(_MinVisibleAlpha, _HandAlpha) * _HandAlpha;
|
||||
|
||||
o.Albedo = 0;
|
||||
o.Gloss = 0;
|
||||
o.Specular = 0;
|
||||
o.Alpha = alphaValue;
|
||||
o.Emission = color * emission;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8aba22c2208aff640a2fdc9a5e45a9dd
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user