messy messy merge >n<
This commit is contained in:
commit
1611962ae9
|
@ -22,6 +22,7 @@ build:
|
|||
- echo "cloned to $GIT_CLONE_PATH"
|
||||
- chmod +x ./ci/build.sh
|
||||
- ./ci/build.sh $UNITY_VERSION
|
||||
- cp ./readme.txt $BUILD_DIR
|
||||
|
||||
artifacts:
|
||||
name: $CI_PROJECT_NAME-$CI_PIPELINE_ID
|
||||
|
|
29
ci/build.sh
29
ci/build.sh
|
@ -12,6 +12,9 @@ echo "removing previous editor log..."
|
|||
|
||||
echo "starting build using unity v$unityversion..."
|
||||
|
||||
unitypid=-1
|
||||
|
||||
launch_unity () {
|
||||
# launch unity in batch mode
|
||||
open -g $editorpath --args \
|
||||
-batchmode \
|
||||
|
@ -22,20 +25,28 @@ open -g $editorpath --args \
|
|||
-logFile $editorlogpath \
|
||||
-projectPath "$(pwd)/game"
|
||||
|
||||
# wait for editor log to exist
|
||||
tries=60
|
||||
count=0
|
||||
unitypid=`pgrep -n Unity`
|
||||
echo "launched unity ($unitypid)"
|
||||
}
|
||||
|
||||
launch_unity
|
||||
|
||||
while [ ! -f $editorlogpath ]
|
||||
do
|
||||
sleep 1
|
||||
if ps -p $unitypid > /dev/null
|
||||
then
|
||||
echo "waiting for unity ($unitypid)"
|
||||
else
|
||||
echo "unity is no longer running - trying again"
|
||||
|
||||
# decrement
|
||||
count=`expr $count + 1`
|
||||
# reset launch attempts
|
||||
launch_unity
|
||||
|
||||
if [ $count -eq $tries ] ; then
|
||||
echo "early timeout - $tries seconds elapsed since launch attempt"
|
||||
exit 1
|
||||
continue
|
||||
fi
|
||||
|
||||
# wait a second
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# use a safe directory that is automatically removed by the shell when the script exists
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 337aa5d792078174ba9a5991458704a4
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: ae6e55e2712dfc24690fb49efb296230
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
|
@ -0,0 +1,112 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 199d2370a6266f64587a1a9b8d2c337d
|
||||
ModelImporter:
|
||||
serializedVersion: 20200
|
||||
internalIDToNameTable: []
|
||||
externalObjects:
|
||||
- first:
|
||||
type: UnityEngine:Material
|
||||
assembly: UnityEngine.CoreModule
|
||||
name: ORB_LOW_Group5685Mat
|
||||
second: {fileID: 2100000, guid: d04f54074428c82489a700d4208c5532, type: 2}
|
||||
- first:
|
||||
type: UnityEngine:Material
|
||||
assembly: UnityEngine.CoreModule
|
||||
name: Ring_Low_Group63568Mat
|
||||
second: {fileID: 2100000, guid: d04f54074428c82489a700d4208c5532, type: 2}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 0
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
|
@ -0,0 +1,105 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6049a3ac54bafac41831a7a97b6b0c7e
|
||||
ModelImporter:
|
||||
serializedVersion: 20200
|
||||
internalIDToNameTable:
|
||||
- first:
|
||||
74: 1827226128182048838
|
||||
second: Take 001
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 0
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 5240c932eba90b042829dc130599d5ce
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_BaseColor.png (Stored with Git LFS)
Normal file
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_BaseColor.png (Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -0,0 +1,144 @@
|
|||
fileFormatVersion: 2
|
||||
guid: a2e6f3d878ecfc7418724c9e950c02ed
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: 2
|
||||
mipBias: -100
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Emissive.png (Stored with Git LFS)
Normal file
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Emissive.png (Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -0,0 +1,144 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 49cf6831f4fdfb14ca0da2f2b4cba3ad
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: 2
|
||||
mipBias: -100
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Height.png (Stored with Git LFS)
Normal file
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Height.png (Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -0,0 +1,144 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 1e939620d235cd54ebe979b288421314
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: 2
|
||||
mipBias: -100
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Metallic.png (Stored with Git LFS)
Normal file
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Metallic.png (Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -0,0 +1,144 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 4394e74068b8e5a419fcb60f39b0d9da
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: 2
|
||||
mipBias: -100
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Normal.png (Stored with Git LFS)
Normal file
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Normal.png (Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -0,0 +1,144 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 13bcb9385640733409b6a7c756c24b15
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 0
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: 2
|
||||
mipBias: -100
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 1
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Roughness.png (Stored with Git LFS)
Normal file
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Roughness.png (Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -0,0 +1,144 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 456811828e35c3343afacc957dba80fb
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: 2
|
||||
mipBias: -100
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Smoothness.png (Stored with Git LFS)
Normal file
BIN
game/Assets/3D Assets/Artefacts/Orb Freeze/Text/ORB_Low_initialShadingGroup_Smoothness.png (Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -0,0 +1,144 @@
|
|||
fileFormatVersion: 2
|
||||
guid: a6482166787d0804cb31dc3237dc9a42
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: 2
|
||||
mipBias: -100
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 8192
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,124 @@
|
|||
%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: orb_MAT
|
||||
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
|
||||
m_ShaderKeywords: _EMISSION _METALLICSPECGLOSSMAP _NORMALMAP _PARALLAXMAP
|
||||
m_LightmapFlags: 2
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: 2000
|
||||
stringTagMap:
|
||||
RenderType: Opaque
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BaseMap:
|
||||
m_Texture: {fileID: 2800000, guid: 8e93b1c758b8a3b438b0d7844c063367, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 2800000, guid: 1b4589dbbea565b4e8cc4b61e98c64f7, type: 3}
|
||||
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: 2800000, guid: f7b2251cc58bc884cbf3087301816671, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 8e93b1c758b8a3b438b0d7844c063367, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 2800000, guid: ff2993c63fa88024395a9569248e2d18, type: 3}
|
||||
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: 2800000, guid: 26c048fd9c781ce4faf6fb43cff77a8a, type: 3}
|
||||
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}
|
||||
- unity_Lightmaps:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_LightmapsInd:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_ShadowMasks:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _AlphaClip: 0
|
||||
- _Blend: 0
|
||||
- _BumpScale: 1
|
||||
- _ClearCoatMask: 0
|
||||
- _ClearCoatSmoothness: 0
|
||||
- _Cull: 2
|
||||
- _Cutoff: 0.5
|
||||
- _DetailAlbedoMapScale: 1
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _EnvironmentReflections: 1
|
||||
- _GlossMapScale: 0
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 0
|
||||
- _Metallic: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.005
|
||||
- _QueueOffset: 0
|
||||
- _ReceiveShadows: 1
|
||||
- _Smoothness: 0.546
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _Surface: 0
|
||||
- _WorkflowMode: 1
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
--- !u!114 &7081404539000308866
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 11
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
version: 4
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: d04f54074428c82489a700d4208c5532
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
game/Assets/AlphaChar/A_Walk.fbx (Stored with Git LFS)
BIN
game/Assets/AlphaChar/A_Walk.fbx (Stored with Git LFS)
Binary file not shown.
|
@ -1,159 +0,0 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1107 &-4669982441730671944
|
||||
AnimatorStateMachine:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Base Layer
|
||||
m_ChildStates:
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: 2131420891638955038}
|
||||
m_Position: {x: 90, y: 170, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -748621450404397517}
|
||||
m_Position: {x: 90, y: 80, z: 0}
|
||||
m_ChildStateMachines: []
|
||||
m_AnyStateTransitions: []
|
||||
m_EntryTransitions: []
|
||||
m_StateMachineTransitions: {}
|
||||
m_StateMachineBehaviours: []
|
||||
m_AnyStatePosition: {x: -110, y: 10, z: 0}
|
||||
m_EntryPosition: {x: 110, y: 270, z: 0}
|
||||
m_ExitPosition: {x: 800, y: 120, z: 0}
|
||||
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
||||
m_DefaultState: {fileID: 2131420891638955038}
|
||||
--- !u!1102 &-748621450404397517
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Walk
|
||||
m_Speed: 5
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: 1187370376802235764}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 7400000, guid: 85e9b3e9f334ee44e840d547fdd6f304, type: 2}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!91 &9100000
|
||||
AnimatorController:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Char Ctrl
|
||||
serializedVersion: 5
|
||||
m_AnimatorParameters:
|
||||
- m_Name: Is Walking
|
||||
m_Type: 4
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
m_AnimatorLayers:
|
||||
- serializedVersion: 5
|
||||
m_Name: Base Layer
|
||||
m_StateMachine: {fileID: -4669982441730671944}
|
||||
m_Mask: {fileID: 0}
|
||||
m_Motions: []
|
||||
m_Behaviours: []
|
||||
m_BlendingMode: 0
|
||||
m_SyncedLayerIndex: -1
|
||||
m_DefaultWeight: 0
|
||||
m_IKPass: 0
|
||||
m_SyncedLayerAffectsTiming: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
--- !u!1101 &1187370376802235764
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: Is Walking
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 2131420891638955038}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.25
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.90566045
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1102 &2131420891638955038
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Idle
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: 4452622808242892610}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 1827226128182048838, guid: dc837b43c4e9cd44d8b86fefed7e0f0e, type: 3}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1101 &4452622808242892610
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: StartWalking
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 1
|
||||
m_ConditionEvent: Is Walking
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: -748621450404397517}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.25
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.9884527
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
Binary file not shown.
|
@ -0,0 +1,105 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6cfe6c0ef6afb4f439385e34a5486ecf
|
||||
ModelImporter:
|
||||
serializedVersion: 20200
|
||||
internalIDToNameTable:
|
||||
- first:
|
||||
74: 1827226128182048838
|
||||
second: Take 001
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 0
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
|
@ -0,0 +1,105 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 2fc348bd669c9b74ea8f07ad1c281eb3
|
||||
ModelImporter:
|
||||
serializedVersion: 20200
|
||||
internalIDToNameTable:
|
||||
- first:
|
||||
74: 1827226128182048838
|
||||
second: Take 001
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 0
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
|
@ -0,0 +1,105 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 30db38f9e3b5a88438a6278460306135
|
||||
ModelImporter:
|
||||
serializedVersion: 20200
|
||||
internalIDToNameTable:
|
||||
- first:
|
||||
74: 1827226128182048838
|
||||
second: Take 001
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 0
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
|
@ -0,0 +1,105 @@
|
|||
fileFormatVersion: 2
|
||||
guid: be4164daf5813fc40a05977ffd5542f0
|
||||
ModelImporter:
|
||||
serializedVersion: 20200
|
||||
internalIDToNameTable:
|
||||
- first:
|
||||
74: 1827226128182048838
|
||||
second: Take 001
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 0
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
|
@ -0,0 +1,105 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 98c2cd39b2a3a324792ea610b532654e
|
||||
ModelImporter:
|
||||
serializedVersion: 20200
|
||||
internalIDToNameTable:
|
||||
- first:
|
||||
74: 1827226128182048838
|
||||
second: Take 001
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 0
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
|
@ -1,11 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: f56ca56a969bf2844a912c84e69bbcdf
|
||||
guid: ac247fb003b929844b101e718dc3ca13
|
||||
ModelImporter:
|
||||
serializedVersion: 20200
|
||||
internalIDToNameTable:
|
||||
- first:
|
||||
74: 1827226128182048838
|
||||
second: Walk
|
||||
second: Take 001
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
|
@ -33,36 +33,7 @@ ModelImporter:
|
|||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations:
|
||||
- serializedVersion: 16
|
||||
name: Walk
|
||||
takeName: Take 001
|
||||
internalID: 0
|
||||
firstFrame: 1300
|
||||
lastFrame: 1459
|
||||
wrapMode: 0
|
||||
orientationOffsetY: 0
|
||||
level: 0
|
||||
cycleOffset: 0
|
||||
loop: 0
|
||||
hasAdditiveReferencePose: 0
|
||||
loopTime: 1
|
||||
loopBlend: 0
|
||||
loopBlendOrientation: 0
|
||||
loopBlendPositionY: 0
|
||||
loopBlendPositionXZ: 0
|
||||
keepOriginalOrientation: 0
|
||||
keepOriginalPositionY: 1
|
||||
keepOriginalPositionXZ: 0
|
||||
heightFromFeet: 0
|
||||
mirror: 0
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events: []
|
||||
transformMask: []
|
||||
maskType: 3
|
||||
maskSource: {instanceID: 0}
|
||||
additiveReferencePoseFrame: 1300
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 862a19d8877420b4387f911a8c68110c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 27061ef040be78341a048a60a7740aa8
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 4dfa008826a8a5e4caa29a9f4b4e9fbe
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 400a0aac0b38d2c429ba53b3f5d47cc5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: f94f0f6129b7c334d8fd3147d2f4b628
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,5 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 85e9b3e9f334ee44e840d547fdd6f304
|
||||
guid: 4992e4c74822c624da6c52ac33801b96
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
|
@ -0,0 +1,608 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1101 &-8633728715219653837
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions: []
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 7417648013747824764}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 1
|
||||
m_HasExitTime: 1
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 4
|
||||
m_OrderedInterruption: 0
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1101 &-8237246380781921263
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 1
|
||||
m_ConditionEvent: InBoostState
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 3221672209289342883}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 4
|
||||
m_OrderedInterruption: 0
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1101 &-7916693450357402312
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: InJumpState
|
||||
m_EventTreshold: 0
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: InBoostState
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 6158004599323219404}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 4
|
||||
m_OrderedInterruption: 0
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1101 &-7402131631877207942
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 1
|
||||
m_ConditionEvent: InJumpState
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: -7175674927923829264}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 4
|
||||
m_OrderedInterruption: 0
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1102 &-7175674927923829264
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Jump Begin
|
||||
m_Speed: 5
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: 6627086963765148649}
|
||||
- {fileID: -3069531632362253192}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 7400000, guid: 400a0aac0b38d2c429ba53b3f5d47cc5, type: 2}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1107 &-4669982441730671944
|
||||
AnimatorStateMachine:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Base Layer
|
||||
m_ChildStates:
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: 2131420891638955038}
|
||||
m_Position: {x: 90, y: 170, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -748621450404397517}
|
||||
m_Position: {x: -160, y: 170, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -908005854898768128}
|
||||
m_Position: {x: -290, y: -80, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: -7175674927923829264}
|
||||
m_Position: {x: -290, y: -10, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: 3221672209289342883}
|
||||
m_Position: {x: -290, y: -150, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: 6158004599323219404}
|
||||
m_Position: {x: -30, y: -110, z: 0}
|
||||
- serializedVersion: 1
|
||||
m_State: {fileID: 7417648013747824764}
|
||||
m_Position: {x: -290, y: -220, z: 0}
|
||||
m_ChildStateMachines: []
|
||||
m_AnyStateTransitions: []
|
||||
m_EntryTransitions: []
|
||||
m_StateMachineTransitions: {}
|
||||
m_StateMachineBehaviours: []
|
||||
m_AnyStatePosition: {x: -210, y: 370, z: 0}
|
||||
m_EntryPosition: {x: 110, y: 270, z: 0}
|
||||
m_ExitPosition: {x: 800, y: 120, z: 0}
|
||||
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
|
||||
m_DefaultState: {fileID: 2131420891638955038}
|
||||
--- !u!1101 &-3069531632362253192
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions: []
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: -908005854898768128}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 1
|
||||
m_HasExitTime: 1
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 1
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1101 &-2107755844975236895
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: InJumpState
|
||||
m_EventTreshold: 0
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: InBoostState
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 6158004599323219404}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 4
|
||||
m_OrderedInterruption: 0
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1102 &-908005854898768128
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Jump In-Air
|
||||
m_Speed: 5
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: -7916693450357402312}
|
||||
- {fileID: -8237246380781921263}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 7400000, guid: 27061ef040be78341a048a60a7740aa8, type: 2}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1102 &-748621450404397517
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Walk
|
||||
m_Speed: 5
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: 1575648880716201585}
|
||||
- {fileID: 1187370376802235764}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 7400000, guid: f94f0f6129b7c334d8fd3147d2f4b628, type: 2}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!91 &9100000
|
||||
AnimatorController:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Char Ctrl
|
||||
serializedVersion: 5
|
||||
m_AnimatorParameters:
|
||||
- m_Name: IsWalking
|
||||
m_Type: 4
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 0}
|
||||
- m_Name: InJumpState
|
||||
m_Type: 4
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 0}
|
||||
- m_Name: InBoostState
|
||||
m_Type: 4
|
||||
m_DefaultFloat: 0
|
||||
m_DefaultInt: 0
|
||||
m_DefaultBool: 0
|
||||
m_Controller: {fileID: 0}
|
||||
m_AnimatorLayers:
|
||||
- serializedVersion: 5
|
||||
m_Name: Base Layer
|
||||
m_StateMachine: {fileID: -4669982441730671944}
|
||||
m_Mask: {fileID: 0}
|
||||
m_Motions: []
|
||||
m_Behaviours: []
|
||||
m_BlendingMode: 0
|
||||
m_SyncedLayerIndex: -1
|
||||
m_DefaultWeight: 0
|
||||
m_IKPass: 0
|
||||
m_SyncedLayerAffectsTiming: 0
|
||||
m_Controller: {fileID: 9100000}
|
||||
--- !u!1101 &1187370376802235764
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: IsWalking
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 2131420891638955038}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.25
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.90566045
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1101 &1575648880716201585
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 1
|
||||
m_ConditionEvent: InJumpState
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: -7175674927923829264}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 4
|
||||
m_OrderedInterruption: 0
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1102 &2131420891638955038
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Idle
|
||||
m_Speed: 1
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: -7402131631877207942}
|
||||
- {fileID: 4452622808242892610}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 1827226128182048838, guid: dc837b43c4e9cd44d8b86fefed7e0f0e, type: 3}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1101 &2544625993618665896
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: IsWalking
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 2131420891638955038}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.08
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.8
|
||||
m_HasExitTime: 1
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1101 &2660762485539089672
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 1
|
||||
m_ConditionEvent: IsWalking
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: -748621450404397517}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.25
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0
|
||||
m_HasExitTime: 1
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1102 &3221672209289342883
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Jump Boost
|
||||
m_Speed: 5
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: -2107755844975236895}
|
||||
- {fileID: -8633728715219653837}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 7400000, guid: 862a19d8877420b4387f911a8c68110c, type: 2}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1101 &4452622808242892610
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: StartWalking
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 1
|
||||
m_ConditionEvent: IsWalking
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: -748621450404397517}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0.25
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.9884527
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 0
|
||||
m_OrderedInterruption: 1
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1101 &5991315514625531727
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: InJumpState
|
||||
m_EventTreshold: 0
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: InBoostState
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 6158004599323219404}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0.86238533
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 4
|
||||
m_OrderedInterruption: 0
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1102 &6158004599323219404
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Jump Land
|
||||
m_Speed: 5
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: 2544625993618665896}
|
||||
- {fileID: 2660762485539089672}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 7400000, guid: 4dfa008826a8a5e4caa29a9f4b4e9fbe, type: 2}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
||||
--- !u!1101 &6627086963765148649
|
||||
AnimatorStateTransition:
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name:
|
||||
m_Conditions:
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: InJumpState
|
||||
m_EventTreshold: 0
|
||||
- m_ConditionMode: 2
|
||||
m_ConditionEvent: InBoostState
|
||||
m_EventTreshold: 0
|
||||
m_DstStateMachine: {fileID: 0}
|
||||
m_DstState: {fileID: 6158004599323219404}
|
||||
m_Solo: 0
|
||||
m_Mute: 0
|
||||
m_IsExit: 0
|
||||
serializedVersion: 3
|
||||
m_TransitionDuration: 0
|
||||
m_TransitionOffset: 0
|
||||
m_ExitTime: 0
|
||||
m_HasExitTime: 0
|
||||
m_HasFixedDuration: 1
|
||||
m_InterruptionSource: 4
|
||||
m_OrderedInterruption: 0
|
||||
m_CanTransitionToSelf: 1
|
||||
--- !u!1102 &7417648013747824764
|
||||
AnimatorState:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 1
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Jump In-Air Post-Boost
|
||||
m_Speed: 5
|
||||
m_CycleOffset: 0
|
||||
m_Transitions:
|
||||
- {fileID: 5991315514625531727}
|
||||
m_StateMachineBehaviours: []
|
||||
m_Position: {x: 50, y: 50, z: 0}
|
||||
m_IKOnFeet: 0
|
||||
m_WriteDefaultValues: 1
|
||||
m_Mirror: 0
|
||||
m_SpeedParameterActive: 0
|
||||
m_MirrorParameterActive: 0
|
||||
m_CycleOffsetParameterActive: 0
|
||||
m_TimeParameterActive: 0
|
||||
m_Motion: {fileID: 7400000, guid: 27061ef040be78341a048a60a7740aa8, type: 2}
|
||||
m_Tag:
|
||||
m_SpeedParameter:
|
||||
m_MirrorParameter:
|
||||
m_CycleOffsetParameter:
|
||||
m_TimeParameter:
|
|
@ -15,3 +15,4 @@ MonoBehaviour:
|
|||
_artefactID: 0
|
||||
_dialogueKey:
|
||||
_name:
|
||||
_prefab: {fileID: 3799998566341120319, guid: e48f46564bce92e4aa707fd447afd68e, type: 3}
|
||||
|
|
|
@ -15,4 +15,5 @@ MonoBehaviour:
|
|||
_artefactID: 10
|
||||
_dialogueKey: PA_DASH
|
||||
_name: Blink
|
||||
_prefab: {fileID: 3799998566341120319, guid: e48f46564bce92e4aa707fd447afd68e, type: 3}
|
||||
_power: {fileID: 11400000, guid: b47ea197a7cc2ed4eb15271cef672997, type: 2}
|
||||
|
|
|
@ -15,4 +15,5 @@ MonoBehaviour:
|
|||
_artefactID: 11
|
||||
_dialogueKey: PA_BOOST
|
||||
_name: Boost
|
||||
_prefab: {fileID: 3799998566341120319, guid: e48f46564bce92e4aa707fd447afd68e, type: 3}
|
||||
_power: {fileID: 11400000, guid: d5ed942937d8cca478f3ec97f6b9c8a2, type: 2}
|
||||
|
|
|
@ -15,3 +15,4 @@ MonoBehaviour:
|
|||
_artefactID: 20
|
||||
_dialogueKey: WA_0
|
||||
_name: Widget
|
||||
_prefab: {fileID: 3799998566341120319, guid: e48f46564bce92e4aa707fd447afd68e, type: 3}
|
||||
|
|
|
@ -12,6 +12,16 @@ MonoBehaviour:
|
|||
m_Script: {fileID: 11500000, guid: a6a4c7f569d69ca4e8498fdcd96476ce, type: 3}
|
||||
m_Name: Dialogue Settings
|
||||
m_EditorClassIdentifier:
|
||||
_gamepadInputPrompts:
|
||||
blink: 1
|
||||
boost: 5
|
||||
timeFreeze: 3
|
||||
interact: 7
|
||||
_keyboardInputPrompts:
|
||||
blink: 2
|
||||
boost: 0
|
||||
timeFreeze: 4
|
||||
interact: 6
|
||||
_hideAfter: 5
|
||||
_radioDialogueKey: event:/VO/Radio Dialogue Line
|
||||
_dialogueClips:
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3a977303773797047b37664649362484, type: 3}
|
||||
m_Name: UIClose
|
||||
m_EditorClassIdentifier:
|
||||
_logRaised: 0
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: d8c4272694282b64e9cd1d4a42477262
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,15 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3a977303773797047b37664649362484, type: 3}
|
||||
m_Name: UIOpen
|
||||
m_EditorClassIdentifier:
|
||||
_logRaised: 0
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 0fc36e00903fc7047b48bb1844e6f12b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,16 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 76553ada4233edc458c3fed9b69e128f, type: 3}
|
||||
m_Name: Safe Time
|
||||
m_EditorClassIdentifier:
|
||||
_initialValue: 0
|
||||
_readOnly: 0
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 27c10a061baeec8469e96d4f995c1445
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 859b47edaf12fe14782789af604151d5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: c78921add991a914aa4263c80d69a9d6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,10 @@
|
|||
fileFormatVersion: 2
|
||||
guid: fded9f896ea32473eb30ae61b640a176
|
||||
folderAsset: yes
|
||||
timeCreated: 1519645413
|
||||
licenseType: Store
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 76c2f3171eae9954aa317277dbffd478
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 366e41d4e3408334aad31e48f28757e4
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,43 @@
|
|||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using PathCreation;
|
||||
|
||||
namespace PathCreationEditor
|
||||
{
|
||||
public static class MouseUtility
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines mouse position in world. If PathSpace is xy/xz, the position will be locked to that plane.
|
||||
/// If PathSpace is xyz, then depthFor3DSpace will be used as distance from scene camera.
|
||||
/// </summary>
|
||||
public static Vector3 GetMouseWorldPosition(PathSpace space, float depthFor3DSpace = 10)
|
||||
{
|
||||
Ray mouseRay = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
|
||||
Vector3 worldMouse = mouseRay.GetPoint(depthFor3DSpace);
|
||||
|
||||
// Mouse can only move on XY plane
|
||||
if (space == PathSpace.xy)
|
||||
{
|
||||
float zDir = mouseRay.direction.z;
|
||||
if (zDir != 0)
|
||||
{
|
||||
float dstToXYPlane = Mathf.Abs(mouseRay.origin.z / zDir);
|
||||
worldMouse = mouseRay.GetPoint(dstToXYPlane);
|
||||
}
|
||||
}
|
||||
// Mouse can only move on XZ plane
|
||||
else if (space == PathSpace.xz)
|
||||
{
|
||||
float yDir = mouseRay.direction.y;
|
||||
if (yDir != 0)
|
||||
{
|
||||
float dstToXZPlane = Mathf.Abs(mouseRay.origin.y / yDir);
|
||||
worldMouse = mouseRay.GetPoint(dstToXZPlane);
|
||||
}
|
||||
}
|
||||
|
||||
return worldMouse;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 44966bb2b773ce145a9d6c7c9f42aeba
|
||||
guid: bd0de63ca5c52504a8d2063418a326c3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
|
@ -0,0 +1,237 @@
|
|||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using PathCreation;
|
||||
|
||||
namespace PathCreationEditor
|
||||
{
|
||||
public static class PathHandle
|
||||
{
|
||||
|
||||
public const float extraInputRadius = .005f;
|
||||
|
||||
static Vector2 handleDragMouseStart;
|
||||
static Vector2 handleDragMouseEnd;
|
||||
static Vector3 handleDragWorldStart;
|
||||
|
||||
static int selectedHandleID;
|
||||
static bool mouseIsOverAHandle;
|
||||
|
||||
public enum HandleInputType
|
||||
{
|
||||
None,
|
||||
LMBPress,
|
||||
LMBClick,
|
||||
LMBDrag,
|
||||
LMBRelease,
|
||||
};
|
||||
|
||||
static float dstMouseToDragPointStart;
|
||||
|
||||
static List<int> ids;
|
||||
static HashSet<int> idHash;
|
||||
|
||||
static PathHandle()
|
||||
{
|
||||
ids = new List<int>();
|
||||
idHash = new HashSet<int>();
|
||||
|
||||
dstMouseToDragPointStart = float.MaxValue;
|
||||
}
|
||||
|
||||
public static Vector3 DrawHandle(Vector3 position, PathSpace space, bool isInteractive, float handleDiameter, Handles.CapFunction capFunc, HandleColours colours, out HandleInputType inputType, int handleIndex)
|
||||
{
|
||||
int id = GetID(handleIndex);
|
||||
Vector3 screenPosition = Handles.matrix.MultiplyPoint(position);
|
||||
Matrix4x4 cachedMatrix = Handles.matrix;
|
||||
|
||||
inputType = HandleInputType.None;
|
||||
|
||||
EventType eventType = Event.current.GetTypeForControl(id);
|
||||
float handleRadius = handleDiameter / 2f;
|
||||
float dstToHandle = HandleUtility.DistanceToCircle(position, handleRadius + extraInputRadius);
|
||||
float dstToMouse = HandleUtility.DistanceToCircle(position, 0);
|
||||
|
||||
// Handle input events
|
||||
if (isInteractive)
|
||||
{
|
||||
// Repaint if mouse is entering/exiting handle (for highlight colour)
|
||||
if (dstToHandle == 0)
|
||||
{
|
||||
if (!mouseIsOverAHandle)
|
||||
{
|
||||
HandleUtility.Repaint();
|
||||
mouseIsOverAHandle = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mouseIsOverAHandle)
|
||||
{
|
||||
HandleUtility.Repaint();
|
||||
mouseIsOverAHandle = false;
|
||||
}
|
||||
}
|
||||
switch (eventType)
|
||||
{
|
||||
case EventType.MouseDown:
|
||||
if (Event.current.button == 0 && Event.current.modifiers != EventModifiers.Alt)
|
||||
{
|
||||
if (dstToHandle == 0 && dstToMouse < dstMouseToDragPointStart)
|
||||
{
|
||||
dstMouseToDragPointStart = dstToMouse;
|
||||
GUIUtility.hotControl = id;
|
||||
handleDragMouseEnd = handleDragMouseStart = Event.current.mousePosition;
|
||||
handleDragWorldStart = position;
|
||||
selectedHandleID = id;
|
||||
inputType = HandleInputType.LMBPress;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case EventType.MouseUp:
|
||||
dstMouseToDragPointStart = float.MaxValue;
|
||||
if (GUIUtility.hotControl == id && Event.current.button == 0)
|
||||
{
|
||||
GUIUtility.hotControl = 0;
|
||||
selectedHandleID = -1;
|
||||
Event.current.Use();
|
||||
|
||||
inputType = HandleInputType.LMBRelease;
|
||||
|
||||
|
||||
if (Event.current.mousePosition == handleDragMouseStart)
|
||||
{
|
||||
inputType = HandleInputType.LMBClick;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case EventType.MouseDrag:
|
||||
if (GUIUtility.hotControl == id && Event.current.button == 0)
|
||||
{
|
||||
handleDragMouseEnd += new Vector2(Event.current.delta.x, -Event.current.delta.y);
|
||||
Vector3 position2 = Camera.current.WorldToScreenPoint(Handles.matrix.MultiplyPoint(handleDragWorldStart))
|
||||
+ (Vector3)(handleDragMouseEnd - handleDragMouseStart);
|
||||
inputType = HandleInputType.LMBDrag;
|
||||
// Handle can move freely in 3d space
|
||||
if (space == PathSpace.xyz)
|
||||
{
|
||||
position = Handles.matrix.inverse.MultiplyPoint(Camera.current.ScreenToWorldPoint(position2));
|
||||
}
|
||||
// Handle is clamped to xy or xz plane
|
||||
else
|
||||
{
|
||||
position = MouseUtility.GetMouseWorldPosition(space);
|
||||
}
|
||||
|
||||
GUI.changed = true;
|
||||
Event.current.Use();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (eventType)
|
||||
{
|
||||
case EventType.Repaint:
|
||||
Color originalColour = Handles.color;
|
||||
Handles.color = (isInteractive) ? colours.defaultColour : colours.disabledColour;
|
||||
|
||||
if (id == GUIUtility.hotControl)
|
||||
{
|
||||
Handles.color = colours.selectedColour;
|
||||
}
|
||||
else if (dstToHandle == 0 && selectedHandleID == -1 && isInteractive)
|
||||
{
|
||||
Handles.color = colours.highlightedColour;
|
||||
}
|
||||
|
||||
|
||||
Handles.matrix = Matrix4x4.identity;
|
||||
Vector3 lookForward = Vector3.up;
|
||||
Camera cam = Camera.current;
|
||||
if (cam != null)
|
||||
{
|
||||
if (cam.orthographic)
|
||||
{
|
||||
lookForward= -cam.transform.forward;
|
||||
}
|
||||
else
|
||||
{
|
||||
lookForward = (cam.transform.position - position);
|
||||
}
|
||||
}
|
||||
|
||||
capFunc(id, screenPosition, Quaternion.LookRotation(lookForward), handleDiameter, EventType.Repaint);
|
||||
Handles.matrix = cachedMatrix;
|
||||
|
||||
Handles.color = originalColour;
|
||||
break;
|
||||
|
||||
case EventType.Layout:
|
||||
Handles.matrix = Matrix4x4.identity;
|
||||
HandleUtility.AddControl(id, HandleUtility.DistanceToCircle(screenPosition, handleDiameter / 2f));
|
||||
Handles.matrix = cachedMatrix;
|
||||
break;
|
||||
}
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
public struct HandleColours
|
||||
{
|
||||
public Color defaultColour;
|
||||
public Color highlightedColour;
|
||||
public Color selectedColour;
|
||||
public Color disabledColour;
|
||||
|
||||
public HandleColours(Color defaultColour, Color highlightedColour, Color selectedColour, Color disabledColour)
|
||||
{
|
||||
this.defaultColour = defaultColour;
|
||||
this.highlightedColour = highlightedColour;
|
||||
this.selectedColour = selectedColour;
|
||||
this.disabledColour = disabledColour;
|
||||
}
|
||||
}
|
||||
|
||||
static void AddIDs(int upToIndex)
|
||||
{
|
||||
int numIDAtStart = ids.Count;
|
||||
int numToAdd = (upToIndex - numIDAtStart) + 1;
|
||||
for (int i = 0; i < numToAdd; i++)
|
||||
{
|
||||
string hashString = string.Format("pathhandle({0})", numIDAtStart + i);
|
||||
int hash = hashString.GetHashCode();
|
||||
|
||||
int id = GUIUtility.GetControlID(hash, FocusType.Passive);
|
||||
int numIts = 0;
|
||||
|
||||
// This is a bit of a shot in the dark at fixing a reported bug that I've been unable to reproduce.
|
||||
// The problem is that multiple handles are being selected when just one is clicked on.
|
||||
// I assume this is because they're somehow being assigned the same id.
|
||||
while (idHash.Contains(id)) {
|
||||
numIts ++;
|
||||
id += numIts * numIts;
|
||||
if (numIts > 100) {
|
||||
Debug.LogError("Failed to generate unique handle id.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
idHash.Add(id);
|
||||
ids.Add(id);
|
||||
}
|
||||
}
|
||||
|
||||
static int GetID(int handleIndex)
|
||||
{
|
||||
if (handleIndex >= ids.Count)
|
||||
{
|
||||
AddIDs(handleIndex);
|
||||
}
|
||||
|
||||
return ids[handleIndex];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 804ddb43548540a4ca3b0a534a75c4b3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,215 @@
|
|||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using PathCreation;
|
||||
using PathCreation.Utility;
|
||||
|
||||
namespace PathCreationEditor
|
||||
{
|
||||
public class ScreenSpacePolyLine
|
||||
{
|
||||
const int accuracyMultiplier = 10;
|
||||
// dont allow vertices to be spaced too far apart, as screenspace-worldspace conversion can then be noticeably off
|
||||
const float intermediaryThreshold = .2f;
|
||||
|
||||
public readonly List<Vector3> verticesWorld;
|
||||
// For each point in the polyline, says which bezier segment it belongs to
|
||||
readonly List<int> vertexToPathSegmentMap;
|
||||
// Stores the index in the vertices list where the start point of each segment is
|
||||
readonly int[] segmentStartIndices;
|
||||
|
||||
readonly float pathLengthWorld;
|
||||
readonly float[] cumululativeLengthWorld;
|
||||
|
||||
Vector2[] points;
|
||||
|
||||
Vector3 prevCamPos;
|
||||
Quaternion prevCamRot;
|
||||
bool premCamIsOrtho;
|
||||
|
||||
readonly Transform transform;
|
||||
readonly Vector3 transformPosition;
|
||||
readonly Quaternion transformRotation;
|
||||
readonly Vector3 transformScale;
|
||||
|
||||
public ScreenSpacePolyLine(BezierPath bezierPath, Transform transform, float maxAngleError, float minVertexDst, float accuracy = 1)
|
||||
{
|
||||
this.transform = transform;
|
||||
transformPosition = transform.position;
|
||||
transformRotation = transform.rotation;
|
||||
transformScale = transform.localScale;
|
||||
|
||||
// Split path in vertices based on angle error
|
||||
verticesWorld = new List<Vector3>();
|
||||
vertexToPathSegmentMap = new List<int>();
|
||||
segmentStartIndices = new int[bezierPath.NumSegments+1];
|
||||
|
||||
verticesWorld.Add(bezierPath[0]);
|
||||
vertexToPathSegmentMap.Add(0);
|
||||
Vector3 prevPointOnPath = bezierPath[0];
|
||||
float dstSinceLastVertex = 0;
|
||||
Vector3 lastAddedPoint = prevPointOnPath;
|
||||
float dstSinceLastIntermediary = 0;
|
||||
|
||||
for (int segmentIndex = 0; segmentIndex < bezierPath.NumSegments; segmentIndex++)
|
||||
{
|
||||
Vector3[] segmentPoints = bezierPath.GetPointsInSegment(segmentIndex);
|
||||
verticesWorld.Add(segmentPoints[0]);
|
||||
vertexToPathSegmentMap.Add(segmentIndex);
|
||||
segmentStartIndices[segmentIndex] = verticesWorld.Count-1;
|
||||
|
||||
prevPointOnPath = segmentPoints[0];
|
||||
lastAddedPoint = prevPointOnPath;
|
||||
dstSinceLastVertex = 0;
|
||||
dstSinceLastIntermediary = 0;
|
||||
|
||||
float estimatedSegmentLength = CubicBezierUtility.EstimateCurveLength(segmentPoints[0], segmentPoints[1], segmentPoints[2], segmentPoints[3]);
|
||||
int divisions = Mathf.CeilToInt(estimatedSegmentLength * accuracy * accuracyMultiplier);
|
||||
float increment = 1f / divisions;
|
||||
|
||||
for (float t = increment; t <= 1; t += increment)
|
||||
{
|
||||
Vector3 pointOnPath = CubicBezierUtility.EvaluateCurve(segmentPoints[0], segmentPoints[1], segmentPoints[2], segmentPoints[3], t);
|
||||
Vector3 nextPointOnPath = CubicBezierUtility.EvaluateCurve(segmentPoints[0], segmentPoints[1], segmentPoints[2], segmentPoints[3], t + increment);
|
||||
|
||||
// angle at current point on path
|
||||
float localAngle = 180 - MathUtility.MinAngle(prevPointOnPath, pointOnPath, nextPointOnPath);
|
||||
// angle between the last added vertex, the current point on the path, and the next point on the path
|
||||
float angleFromPrevVertex = 180 - MathUtility.MinAngle(lastAddedPoint, pointOnPath, nextPointOnPath);
|
||||
float angleError = Mathf.Max(localAngle, angleFromPrevVertex);
|
||||
|
||||
|
||||
if (angleError > maxAngleError && dstSinceLastVertex >= minVertexDst)
|
||||
{
|
||||
dstSinceLastVertex = 0;
|
||||
dstSinceLastIntermediary = 0;
|
||||
verticesWorld.Add(pointOnPath);
|
||||
vertexToPathSegmentMap.Add(segmentIndex);
|
||||
lastAddedPoint = pointOnPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dstSinceLastIntermediary > intermediaryThreshold)
|
||||
{
|
||||
verticesWorld.Add(pointOnPath);
|
||||
vertexToPathSegmentMap.Add(segmentIndex);
|
||||
dstSinceLastIntermediary = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
dstSinceLastIntermediary += (pointOnPath - prevPointOnPath).magnitude;
|
||||
}
|
||||
dstSinceLastVertex += (pointOnPath - prevPointOnPath).magnitude;
|
||||
}
|
||||
prevPointOnPath = pointOnPath;
|
||||
}
|
||||
}
|
||||
|
||||
segmentStartIndices[bezierPath.NumSegments] = verticesWorld.Count;
|
||||
|
||||
// ensure final point gets added (unless path is closed loop)
|
||||
if (!bezierPath.IsClosed)
|
||||
{
|
||||
verticesWorld.Add(bezierPath[bezierPath.NumPoints - 1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
verticesWorld.Add(bezierPath[0]);
|
||||
}
|
||||
|
||||
// Calculate length
|
||||
cumululativeLengthWorld = new float[verticesWorld.Count];
|
||||
for (int i = 0; i < verticesWorld.Count; i++)
|
||||
{
|
||||
verticesWorld[i] = MathUtility.TransformPoint(verticesWorld[i], transform, bezierPath.Space);
|
||||
if (i > 0) {
|
||||
pathLengthWorld += (verticesWorld[i - 1] - verticesWorld[i]).magnitude;
|
||||
cumululativeLengthWorld[i] = pathLengthWorld;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ComputeScreenSpace()
|
||||
{
|
||||
if (Camera.current.transform.position != prevCamPos || Camera.current.transform.rotation != prevCamRot || Camera.current.orthographic != premCamIsOrtho)
|
||||
{
|
||||
points = new Vector2[verticesWorld.Count];
|
||||
for (int i = 0; i < verticesWorld.Count; i++)
|
||||
{
|
||||
points[i] = HandleUtility.WorldToGUIPoint(verticesWorld[i]);
|
||||
}
|
||||
|
||||
prevCamPos = Camera.current.transform.position;
|
||||
prevCamRot = Camera.current.transform.rotation;
|
||||
premCamIsOrtho = Camera.current.orthographic;
|
||||
}
|
||||
}
|
||||
|
||||
public MouseInfo CalculateMouseInfo()
|
||||
{
|
||||
ComputeScreenSpace();
|
||||
|
||||
Vector2 mousePos = Event.current.mousePosition;
|
||||
float minDst = float.MaxValue;
|
||||
int closestPolyLineSegmentIndex = 0;
|
||||
int closestBezierSegmentIndex = 0;
|
||||
|
||||
for (int i = 0; i < points.Length - 1; i++)
|
||||
{
|
||||
float dst = HandleUtility.DistancePointToLineSegment(mousePos, points[i], points[i + 1]);
|
||||
|
||||
if (dst < minDst)
|
||||
{
|
||||
minDst = dst;
|
||||
closestPolyLineSegmentIndex = i;
|
||||
closestBezierSegmentIndex = vertexToPathSegmentMap[i];
|
||||
}
|
||||
}
|
||||
|
||||
Vector2 closestPointOnLine = MathUtility.ClosestPointOnLineSegment(mousePos, points[closestPolyLineSegmentIndex], points[closestPolyLineSegmentIndex + 1]);
|
||||
float dstToPointOnLine = (points[closestPolyLineSegmentIndex] - closestPointOnLine).magnitude;
|
||||
float percentBetweenVertices = dstToPointOnLine / (points[closestPolyLineSegmentIndex] - points[closestPolyLineSegmentIndex + 1]).magnitude;
|
||||
Vector3 closestPoint3D = Vector3.Lerp(verticesWorld[closestPolyLineSegmentIndex], verticesWorld[closestPolyLineSegmentIndex + 1], percentBetweenVertices);
|
||||
|
||||
float distanceAlongPathWorld = cumululativeLengthWorld[closestPolyLineSegmentIndex] + Vector3.Distance(verticesWorld[closestPolyLineSegmentIndex], closestPoint3D);
|
||||
float timeAlongPath = distanceAlongPathWorld / pathLengthWorld;
|
||||
|
||||
// Calculate how far between the current bezier segment the closest point on the line is
|
||||
|
||||
int bezierSegmentStartIndex = segmentStartIndices[closestBezierSegmentIndex];
|
||||
int bezierSegmentEndIndex = segmentStartIndices[closestBezierSegmentIndex+1];
|
||||
float bezierSegmentLength = cumululativeLengthWorld[bezierSegmentEndIndex] - cumululativeLengthWorld[bezierSegmentStartIndex];
|
||||
float distanceAlongBezierSegment = distanceAlongPathWorld - cumululativeLengthWorld[bezierSegmentStartIndex];
|
||||
float timeAlongBezierSegment = distanceAlongBezierSegment/bezierSegmentLength;
|
||||
|
||||
return new MouseInfo(minDst, closestPoint3D, distanceAlongPathWorld, timeAlongPath, timeAlongBezierSegment, closestBezierSegmentIndex);
|
||||
}
|
||||
|
||||
public bool TransformIsOutOfDate() {
|
||||
return transform.position != transformPosition || transform.rotation != transformRotation || transform.localScale != transformScale;
|
||||
}
|
||||
|
||||
|
||||
public struct MouseInfo
|
||||
{
|
||||
public readonly float mouseDstToLine;
|
||||
public readonly Vector3 closestWorldPointToMouse;
|
||||
public readonly float distanceAlongPathWorld;
|
||||
public readonly float timeOnPath;
|
||||
public readonly float timeOnBezierSegment;
|
||||
public readonly int closestSegmentIndex;
|
||||
|
||||
|
||||
public MouseInfo(float mouseDstToLine, Vector3 closestWorldPointToMouse, float distanceAlongPathWorld, float timeOnPath, float timeOnBezierSegment, int closestSegmentIndex)
|
||||
{
|
||||
this.mouseDstToLine = mouseDstToLine;
|
||||
this.closestWorldPointToMouse = closestWorldPointToMouse;
|
||||
this.distanceAlongPathWorld = distanceAlongPathWorld;
|
||||
this.timeOnPath = timeOnPath;
|
||||
this.timeOnBezierSegment = timeOnBezierSegment;
|
||||
this.closestSegmentIndex = closestSegmentIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 05aed72a972059e45a62e31c2bb60fc4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"name": "PathCreatorEditor",
|
||||
"references": [
|
||||
"PathCreator"
|
||||
],
|
||||
"optionalUnityReferences": [],
|
||||
"includePlatforms": [
|
||||
"Editor"
|
||||
],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": []
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 92ee438f32d811247a22ca14bf2a3fe0
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,736 @@
|
|||
using System.Collections.Generic;
|
||||
using PathCreation;
|
||||
using PathCreation.Utility;
|
||||
using UnityEditor;
|
||||
using UnityEditor.IMGUI.Controls;
|
||||
using UnityEngine;
|
||||
|
||||
namespace PathCreationEditor {
|
||||
/// Editor class for the creation of Bezier and Vertex paths
|
||||
|
||||
[CustomEditor (typeof (PathCreator))]
|
||||
public class PathEditor : Editor {
|
||||
|
||||
#region Fields
|
||||
|
||||
// Interaction:
|
||||
const float segmentSelectDistanceThreshold = 10f;
|
||||
const float screenPolylineMaxAngleError = .3f;
|
||||
const float screenPolylineMinVertexDst = .01f;
|
||||
|
||||
// Help messages:
|
||||
const string helpInfo = "Shift-click to add or insert new points. Control-click to delete points. For more detailed infomation, please refer to the documentation.";
|
||||
static readonly string[] spaceNames = { "3D (xyz)", "2D (xy)", "Top-down (xz)" };
|
||||
static readonly string[] tabNames = { "Bézier Path", "Vertex Path" };
|
||||
const string constantSizeTooltip = "If true, anchor and control points will keep a constant size when zooming in the editor.";
|
||||
|
||||
// Display
|
||||
const int inspectorSectionSpacing = 10;
|
||||
const float constantHandleScale = .01f;
|
||||
const float normalsSpacing = .2f;
|
||||
GUIStyle boldFoldoutStyle;
|
||||
|
||||
// References:
|
||||
PathCreator creator;
|
||||
Editor globalDisplaySettingsEditor;
|
||||
ScreenSpacePolyLine screenSpaceLine;
|
||||
ScreenSpacePolyLine.MouseInfo pathMouseInfo;
|
||||
GlobalDisplaySettings globalDisplaySettings;
|
||||
PathHandle.HandleColours splineAnchorColours;
|
||||
PathHandle.HandleColours splineControlColours;
|
||||
Dictionary<GlobalDisplaySettings.HandleType, Handles.CapFunction> capFunctions;
|
||||
ArcHandle anchorAngleHandle = new ArcHandle ();
|
||||
VertexPath normalsVertexPath;
|
||||
|
||||
// State variables:
|
||||
int selectedSegmentIndex;
|
||||
int draggingHandleIndex;
|
||||
int mouseOverHandleIndex;
|
||||
int handleIndexToDisplayAsTransform;
|
||||
|
||||
bool shiftLastFrame;
|
||||
bool hasUpdatedScreenSpaceLine;
|
||||
bool hasUpdatedNormalsVertexPath;
|
||||
bool editingNormalsOld;
|
||||
|
||||
Vector3 transformPos;
|
||||
Vector3 transformScale;
|
||||
Quaternion transformRot;
|
||||
|
||||
Color handlesStartCol;
|
||||
|
||||
// Constants
|
||||
const int bezierPathTab = 0;
|
||||
const int vertexPathTab = 1;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Inspectors
|
||||
|
||||
public override void OnInspectorGUI () {
|
||||
// Initialize GUI styles
|
||||
if (boldFoldoutStyle == null) {
|
||||
boldFoldoutStyle = new GUIStyle (EditorStyles.foldout);
|
||||
boldFoldoutStyle.fontStyle = FontStyle.Bold;
|
||||
}
|
||||
|
||||
Undo.RecordObject (creator, "Path settings changed");
|
||||
|
||||
// Draw Bezier and Vertex tabs
|
||||
int tabIndex = GUILayout.Toolbar (data.tabIndex, tabNames);
|
||||
if (tabIndex != data.tabIndex) {
|
||||
data.tabIndex = tabIndex;
|
||||
TabChanged ();
|
||||
}
|
||||
|
||||
// Draw inspector for active tab
|
||||
switch (data.tabIndex) {
|
||||
case bezierPathTab:
|
||||
DrawBezierPathInspector ();
|
||||
break;
|
||||
case vertexPathTab:
|
||||
DrawVertexPathInspector ();
|
||||
break;
|
||||
}
|
||||
|
||||
// Notify of undo/redo that might modify the path
|
||||
if (Event.current.type == EventType.ValidateCommand && Event.current.commandName == "UndoRedoPerformed") {
|
||||
data.PathModifiedByUndo ();
|
||||
}
|
||||
}
|
||||
|
||||
void DrawBezierPathInspector () {
|
||||
using (var check = new EditorGUI.ChangeCheckScope ()) {
|
||||
// Path options:
|
||||
data.showPathOptions = EditorGUILayout.Foldout (data.showPathOptions, new GUIContent ("Bézier Path Options"), true, boldFoldoutStyle);
|
||||
if (data.showPathOptions) {
|
||||
bezierPath.Space = (PathSpace) EditorGUILayout.Popup ("Space", (int) bezierPath.Space, spaceNames);
|
||||
bezierPath.ControlPointMode = (BezierPath.ControlMode) EditorGUILayout.EnumPopup (new GUIContent ("Control Mode"), bezierPath.ControlPointMode);
|
||||
if (bezierPath.ControlPointMode == BezierPath.ControlMode.Automatic) {
|
||||
bezierPath.AutoControlLength = EditorGUILayout.Slider (new GUIContent ("Control Spacing"), bezierPath.AutoControlLength, 0, 1);
|
||||
}
|
||||
|
||||
bezierPath.IsClosed = EditorGUILayout.Toggle ("Closed Path", bezierPath.IsClosed);
|
||||
data.showTransformTool = EditorGUILayout.Toggle (new GUIContent ("Enable Transforms"), data.showTransformTool);
|
||||
|
||||
Tools.hidden = !data.showTransformTool;
|
||||
|
||||
// Check if out of bounds (can occur after undo operations)
|
||||
if (handleIndexToDisplayAsTransform >= bezierPath.NumPoints) {
|
||||
handleIndexToDisplayAsTransform = -1;
|
||||
}
|
||||
|
||||
// If a point has been selected
|
||||
if (handleIndexToDisplayAsTransform != -1) {
|
||||
EditorGUILayout.LabelField ("Selected Point:");
|
||||
|
||||
using (new EditorGUI.IndentLevelScope ()) {
|
||||
var currentPosition = creator.bezierPath[handleIndexToDisplayAsTransform];
|
||||
var newPosition = EditorGUILayout.Vector3Field ("Position", currentPosition);
|
||||
if (newPosition != currentPosition) {
|
||||
Undo.RecordObject (creator, "Move point");
|
||||
creator.bezierPath.MovePoint (handleIndexToDisplayAsTransform, newPosition);
|
||||
}
|
||||
// Don't draw the angle field if we aren't selecting an anchor point/not in 3d space
|
||||
if (handleIndexToDisplayAsTransform % 3 == 0 && creator.bezierPath.Space == PathSpace.xyz) {
|
||||
var anchorIndex = handleIndexToDisplayAsTransform / 3;
|
||||
var currentAngle = creator.bezierPath.GetAnchorNormalAngle (anchorIndex);
|
||||
var newAngle = EditorGUILayout.FloatField ("Angle", currentAngle);
|
||||
if (newAngle != currentAngle) {
|
||||
Undo.RecordObject (creator, "Set Angle");
|
||||
creator.bezierPath.SetAnchorNormalAngle (anchorIndex, newAngle);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (data.showTransformTool & (handleIndexToDisplayAsTransform == -1)) {
|
||||
if (GUILayout.Button ("Centre Transform")) {
|
||||
|
||||
Vector3 worldCentre = bezierPath.CalculateBoundsWithTransform (creator.transform).center;
|
||||
Vector3 transformPos = creator.transform.position;
|
||||
if (bezierPath.Space == PathSpace.xy) {
|
||||
transformPos = new Vector3 (transformPos.x, transformPos.y, 0);
|
||||
} else if (bezierPath.Space == PathSpace.xz) {
|
||||
transformPos = new Vector3 (transformPos.x, 0, transformPos.z);
|
||||
}
|
||||
Vector3 worldCentreToTransform = transformPos - worldCentre;
|
||||
|
||||
if (worldCentre != creator.transform.position) {
|
||||
//Undo.RecordObject (creator, "Centralize Transform");
|
||||
if (worldCentreToTransform != Vector3.zero) {
|
||||
Vector3 localCentreToTransform = MathUtility.InverseTransformVector (worldCentreToTransform, creator.transform, bezierPath.Space);
|
||||
for (int i = 0; i < bezierPath.NumPoints; i++) {
|
||||
bezierPath.SetPoint (i, bezierPath.GetPoint (i) + localCentreToTransform, true);
|
||||
}
|
||||
}
|
||||
|
||||
creator.transform.position = worldCentre;
|
||||
bezierPath.NotifyPathModified ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (GUILayout.Button ("Reset Path")) {
|
||||
Undo.RecordObject (creator, "Reset Path");
|
||||
bool in2DEditorMode = EditorSettings.defaultBehaviorMode == EditorBehaviorMode.Mode2D;
|
||||
data.ResetBezierPath (creator.transform.position, in2DEditorMode);
|
||||
EditorApplication.QueuePlayerLoopUpdate ();
|
||||
}
|
||||
|
||||
GUILayout.Space (inspectorSectionSpacing);
|
||||
}
|
||||
|
||||
data.showNormals = EditorGUILayout.Foldout (data.showNormals, new GUIContent ("Normals Options"), true, boldFoldoutStyle);
|
||||
if (data.showNormals) {
|
||||
bezierPath.FlipNormals = EditorGUILayout.Toggle (new GUIContent ("Flip Normals"), bezierPath.FlipNormals);
|
||||
if (bezierPath.Space == PathSpace.xyz) {
|
||||
bezierPath.GlobalNormalsAngle = EditorGUILayout.Slider (new GUIContent ("Global Angle"), bezierPath.GlobalNormalsAngle, 0, 360);
|
||||
|
||||
if (GUILayout.Button ("Reset Normals")) {
|
||||
Undo.RecordObject (creator, "Reset Normals");
|
||||
bezierPath.FlipNormals = false;
|
||||
bezierPath.ResetNormalAngles ();
|
||||
}
|
||||
}
|
||||
GUILayout.Space (inspectorSectionSpacing);
|
||||
}
|
||||
|
||||
// Editor display options
|
||||
data.showDisplayOptions = EditorGUILayout.Foldout (data.showDisplayOptions, new GUIContent ("Display Options"), true, boldFoldoutStyle);
|
||||
if (data.showDisplayOptions) {
|
||||
data.showPathBounds = GUILayout.Toggle (data.showPathBounds, new GUIContent ("Show Path Bounds"));
|
||||
data.showPerSegmentBounds = GUILayout.Toggle (data.showPerSegmentBounds, new GUIContent ("Show Segment Bounds"));
|
||||
data.displayAnchorPoints = GUILayout.Toggle (data.displayAnchorPoints, new GUIContent ("Show Anchor Points"));
|
||||
if (!(bezierPath.ControlPointMode == BezierPath.ControlMode.Automatic && globalDisplaySettings.hideAutoControls)) {
|
||||
data.displayControlPoints = GUILayout.Toggle (data.displayControlPoints, new GUIContent ("Show Control Points"));
|
||||
}
|
||||
data.keepConstantHandleSize = GUILayout.Toggle (data.keepConstantHandleSize, new GUIContent ("Constant Point Size", constantSizeTooltip));
|
||||
data.bezierHandleScale = Mathf.Max (0, EditorGUILayout.FloatField (new GUIContent ("Handle Scale"), data.bezierHandleScale));
|
||||
DrawGlobalDisplaySettingsInspector ();
|
||||
}
|
||||
|
||||
if (check.changed) {
|
||||
SceneView.RepaintAll ();
|
||||
EditorApplication.QueuePlayerLoopUpdate ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawVertexPathInspector () {
|
||||
|
||||
GUILayout.Space (inspectorSectionSpacing);
|
||||
EditorGUILayout.LabelField ("Vertex count: " + creator.path.NumPoints);
|
||||
GUILayout.Space (inspectorSectionSpacing);
|
||||
|
||||
data.showVertexPathOptions = EditorGUILayout.Foldout (data.showVertexPathOptions, new GUIContent ("Vertex Path Options"), true, boldFoldoutStyle);
|
||||
if (data.showVertexPathOptions) {
|
||||
using (var check = new EditorGUI.ChangeCheckScope ()) {
|
||||
data.vertexPathMaxAngleError = EditorGUILayout.Slider (new GUIContent ("Max Angle Error"), data.vertexPathMaxAngleError, 0, 45);
|
||||
data.vertexPathMinVertexSpacing = EditorGUILayout.Slider (new GUIContent ("Min Vertex Dst"), data.vertexPathMinVertexSpacing, 0, 1);
|
||||
|
||||
GUILayout.Space (inspectorSectionSpacing);
|
||||
if (check.changed) {
|
||||
data.VertexPathSettingsChanged ();
|
||||
SceneView.RepaintAll ();
|
||||
EditorApplication.QueuePlayerLoopUpdate ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data.showVertexPathDisplayOptions = EditorGUILayout.Foldout (data.showVertexPathDisplayOptions, new GUIContent ("Display Options"), true, boldFoldoutStyle);
|
||||
if (data.showVertexPathDisplayOptions) {
|
||||
using (var check = new EditorGUI.ChangeCheckScope ()) {
|
||||
data.showNormalsInVertexMode = GUILayout.Toggle (data.showNormalsInVertexMode, new GUIContent ("Show Normals"));
|
||||
data.showBezierPathInVertexMode = GUILayout.Toggle (data.showBezierPathInVertexMode, new GUIContent ("Show Bezier Path"));
|
||||
|
||||
if (check.changed) {
|
||||
SceneView.RepaintAll ();
|
||||
EditorApplication.QueuePlayerLoopUpdate ();
|
||||
}
|
||||
}
|
||||
DrawGlobalDisplaySettingsInspector ();
|
||||
}
|
||||
}
|
||||
|
||||
void DrawGlobalDisplaySettingsInspector () {
|
||||
using (var check = new EditorGUI.ChangeCheckScope ()) {
|
||||
data.globalDisplaySettingsFoldout = EditorGUILayout.InspectorTitlebar (data.globalDisplaySettingsFoldout, globalDisplaySettings);
|
||||
if (data.globalDisplaySettingsFoldout) {
|
||||
CreateCachedEditor (globalDisplaySettings, null, ref globalDisplaySettingsEditor);
|
||||
globalDisplaySettingsEditor.OnInspectorGUI ();
|
||||
}
|
||||
if (check.changed) {
|
||||
UpdateGlobalDisplaySettings ();
|
||||
SceneView.RepaintAll ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Scene GUI
|
||||
|
||||
void OnSceneGUI () {
|
||||
if (!globalDisplaySettings.visibleBehindObjects) {
|
||||
Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual;
|
||||
}
|
||||
|
||||
EventType eventType = Event.current.type;
|
||||
|
||||
using (var check = new EditorGUI.ChangeCheckScope ()) {
|
||||
handlesStartCol = Handles.color;
|
||||
switch (data.tabIndex) {
|
||||
case bezierPathTab:
|
||||
if (eventType != EventType.Repaint && eventType != EventType.Layout) {
|
||||
ProcessBezierPathInput (Event.current);
|
||||
}
|
||||
|
||||
DrawBezierPathSceneEditor ();
|
||||
break;
|
||||
case vertexPathTab:
|
||||
if (eventType == EventType.Repaint) {
|
||||
DrawVertexPathSceneEditor ();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Don't allow clicking over empty space to deselect the object
|
||||
if (eventType == EventType.Layout) {
|
||||
HandleUtility.AddDefaultControl (0);
|
||||
}
|
||||
|
||||
if (check.changed) {
|
||||
EditorApplication.QueuePlayerLoopUpdate ();
|
||||
}
|
||||
}
|
||||
|
||||
SetTransformState ();
|
||||
}
|
||||
|
||||
void DrawVertexPathSceneEditor () {
|
||||
|
||||
Color bezierCol = globalDisplaySettings.bezierPath;
|
||||
bezierCol.a *= .5f;
|
||||
|
||||
if (data.showBezierPathInVertexMode) {
|
||||
for (int i = 0; i < bezierPath.NumSegments; i++) {
|
||||
Vector3[] points = bezierPath.GetPointsInSegment (i);
|
||||
for (int j = 0; j < points.Length; j++) {
|
||||
points[j] = MathUtility.TransformPoint (points[j], creator.transform, bezierPath.Space);
|
||||
}
|
||||
Handles.DrawBezier (points[0], points[3], points[1], points[2], bezierCol, null, 2);
|
||||
}
|
||||
}
|
||||
|
||||
Handles.color = globalDisplaySettings.vertexPath;
|
||||
|
||||
for (int i = 0; i < creator.path.NumPoints; i++) {
|
||||
int nextIndex = (i + 1) % creator.path.NumPoints;
|
||||
if (nextIndex != 0 || bezierPath.IsClosed) {
|
||||
Handles.DrawLine (creator.path.GetPoint (i), creator.path.GetPoint (nextIndex));
|
||||
}
|
||||
}
|
||||
|
||||
if (data.showNormalsInVertexMode) {
|
||||
Handles.color = globalDisplaySettings.normals;
|
||||
Vector3[] normalLines = new Vector3[creator.path.NumPoints * 2];
|
||||
for (int i = 0; i < creator.path.NumPoints; i++) {
|
||||
normalLines[i * 2] = creator.path.GetPoint (i);
|
||||
normalLines[i * 2 + 1] = creator.path.GetPoint (i) + creator.path.localNormals[i] * globalDisplaySettings.normalsLength;
|
||||
}
|
||||
Handles.DrawLines (normalLines);
|
||||
}
|
||||
}
|
||||
|
||||
void ProcessBezierPathInput (Event e) {
|
||||
// Find which handle mouse is over. Start by looking at previous handle index first, as most likely to still be closest to mouse
|
||||
int previousMouseOverHandleIndex = (mouseOverHandleIndex == -1) ? 0 : mouseOverHandleIndex;
|
||||
mouseOverHandleIndex = -1;
|
||||
for (int i = 0; i < bezierPath.NumPoints; i += 3) {
|
||||
|
||||
int handleIndex = (previousMouseOverHandleIndex + i) % bezierPath.NumPoints;
|
||||
float handleRadius = GetHandleDiameter (globalDisplaySettings.anchorSize * data.bezierHandleScale, bezierPath[handleIndex]) / 2f;
|
||||
Vector3 pos = MathUtility.TransformPoint (bezierPath[handleIndex], creator.transform, bezierPath.Space);
|
||||
float dst = HandleUtility.DistanceToCircle (pos, handleRadius);
|
||||
if (dst == 0) {
|
||||
mouseOverHandleIndex = handleIndex;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Shift-left click (when mouse not over a handle) to split or add segment
|
||||
if (mouseOverHandleIndex == -1) {
|
||||
if (e.type == EventType.MouseDown && e.button == 0 && e.shift) {
|
||||
UpdatePathMouseInfo ();
|
||||
// Insert point along selected segment
|
||||
if (selectedSegmentIndex != -1 && selectedSegmentIndex < bezierPath.NumSegments) {
|
||||
Vector3 newPathPoint = pathMouseInfo.closestWorldPointToMouse;
|
||||
newPathPoint = MathUtility.InverseTransformPoint (newPathPoint, creator.transform, bezierPath.Space);
|
||||
Undo.RecordObject (creator, "Split segment");
|
||||
bezierPath.SplitSegment (newPathPoint, selectedSegmentIndex, pathMouseInfo.timeOnBezierSegment);
|
||||
}
|
||||
// If path is not a closed loop, add new point on to the end of the path
|
||||
else if (!bezierPath.IsClosed) {
|
||||
// insert new point at same dst from scene camera as the point that comes before it (for a 3d path)
|
||||
float dstCamToEndpoint = (Camera.current.transform.position - bezierPath[bezierPath.NumPoints - 1]).magnitude;
|
||||
Vector3 newPathPoint = MouseUtility.GetMouseWorldPosition (bezierPath.Space, dstCamToEndpoint);
|
||||
newPathPoint = MathUtility.InverseTransformPoint (newPathPoint, creator.transform, bezierPath.Space);
|
||||
|
||||
Undo.RecordObject (creator, "Add segment");
|
||||
if (e.control || e.command) {
|
||||
bezierPath.AddSegmentToStart (newPathPoint);
|
||||
} else {
|
||||
bezierPath.AddSegmentToEnd (newPathPoint);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Control click or backspace/delete to remove point
|
||||
if (e.keyCode == KeyCode.Backspace || e.keyCode == KeyCode.Delete || ((e.control || e.command) && e.type == EventType.MouseDown && e.button == 0)) {
|
||||
|
||||
if (mouseOverHandleIndex != -1) {
|
||||
Undo.RecordObject (creator, "Delete segment");
|
||||
bezierPath.DeleteSegment (mouseOverHandleIndex);
|
||||
if (mouseOverHandleIndex == handleIndexToDisplayAsTransform) {
|
||||
handleIndexToDisplayAsTransform = -1;
|
||||
}
|
||||
mouseOverHandleIndex = -1;
|
||||
Repaint ();
|
||||
}
|
||||
}
|
||||
|
||||
// Holding shift and moving mouse (but mouse not over a handle/dragging a handle)
|
||||
if (draggingHandleIndex == -1 && mouseOverHandleIndex == -1) {
|
||||
bool shiftDown = e.shift && !shiftLastFrame;
|
||||
if (shiftDown || ((e.type == EventType.MouseMove || e.type == EventType.MouseDrag) && e.shift)) {
|
||||
|
||||
UpdatePathMouseInfo ();
|
||||
|
||||
if (pathMouseInfo.mouseDstToLine < segmentSelectDistanceThreshold) {
|
||||
if (pathMouseInfo.closestSegmentIndex != selectedSegmentIndex) {
|
||||
selectedSegmentIndex = pathMouseInfo.closestSegmentIndex;
|
||||
HandleUtility.Repaint ();
|
||||
}
|
||||
} else {
|
||||
selectedSegmentIndex = -1;
|
||||
HandleUtility.Repaint ();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
shiftLastFrame = e.shift;
|
||||
|
||||
}
|
||||
|
||||
void DrawBezierPathSceneEditor () {
|
||||
|
||||
bool displayControlPoints = data.displayControlPoints && (bezierPath.ControlPointMode != BezierPath.ControlMode.Automatic || !globalDisplaySettings.hideAutoControls);
|
||||
Bounds bounds = bezierPath.CalculateBoundsWithTransform (creator.transform);
|
||||
|
||||
if (Event.current.type == EventType.Repaint) {
|
||||
for (int i = 0; i < bezierPath.NumSegments; i++) {
|
||||
Vector3[] points = bezierPath.GetPointsInSegment (i);
|
||||
for (int j = 0; j < points.Length; j++) {
|
||||
points[j] = MathUtility.TransformPoint (points[j], creator.transform, bezierPath.Space);
|
||||
}
|
||||
|
||||
if (data.showPerSegmentBounds) {
|
||||
Bounds segmentBounds = CubicBezierUtility.CalculateSegmentBounds (points[0], points[1], points[2], points[3]);
|
||||
Handles.color = globalDisplaySettings.segmentBounds;
|
||||
Handles.DrawWireCube (segmentBounds.center, segmentBounds.size);
|
||||
}
|
||||
|
||||
// Draw lines between control points
|
||||
if (displayControlPoints) {
|
||||
Handles.color = (bezierPath.ControlPointMode == BezierPath.ControlMode.Automatic) ? globalDisplaySettings.handleDisabled : globalDisplaySettings.controlLine;
|
||||
Handles.DrawLine (points[1], points[0]);
|
||||
Handles.DrawLine (points[2], points[3]);
|
||||
}
|
||||
|
||||
// Draw path
|
||||
bool highlightSegment = (i == selectedSegmentIndex && Event.current.shift && draggingHandleIndex == -1 && mouseOverHandleIndex == -1);
|
||||
Color segmentCol = (highlightSegment) ? globalDisplaySettings.highlightedPath : globalDisplaySettings.bezierPath;
|
||||
Handles.DrawBezier (points[0], points[3], points[1], points[2], segmentCol, null, 2);
|
||||
}
|
||||
|
||||
if (data.showPathBounds) {
|
||||
Handles.color = globalDisplaySettings.bounds;
|
||||
Handles.DrawWireCube (bounds.center, bounds.size);
|
||||
}
|
||||
|
||||
// Draw normals
|
||||
if (data.showNormals) {
|
||||
if (!hasUpdatedNormalsVertexPath) {
|
||||
normalsVertexPath = new VertexPath (bezierPath, creator.transform, normalsSpacing);
|
||||
hasUpdatedNormalsVertexPath = true;
|
||||
}
|
||||
|
||||
if (editingNormalsOld != data.showNormals) {
|
||||
editingNormalsOld = data.showNormals;
|
||||
Repaint ();
|
||||
}
|
||||
|
||||
Vector3[] normalLines = new Vector3[normalsVertexPath.NumPoints * 2];
|
||||
Handles.color = globalDisplaySettings.normals;
|
||||
for (int i = 0; i < normalsVertexPath.NumPoints; i++) {
|
||||
normalLines[i * 2] = normalsVertexPath.GetPoint (i);
|
||||
normalLines[i * 2 + 1] = normalsVertexPath.GetPoint (i) + normalsVertexPath.GetNormal (i) * globalDisplaySettings.normalsLength;
|
||||
}
|
||||
Handles.DrawLines (normalLines);
|
||||
}
|
||||
}
|
||||
|
||||
if (data.displayAnchorPoints) {
|
||||
for (int i = 0; i < bezierPath.NumPoints; i += 3) {
|
||||
DrawHandle (i);
|
||||
}
|
||||
}
|
||||
if (displayControlPoints) {
|
||||
for (int i = 1; i < bezierPath.NumPoints - 1; i += 3) {
|
||||
DrawHandle (i);
|
||||
DrawHandle (i + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawHandle (int i) {
|
||||
Vector3 handlePosition = MathUtility.TransformPoint (bezierPath[i], creator.transform, bezierPath.Space);
|
||||
|
||||
float anchorHandleSize = GetHandleDiameter (globalDisplaySettings.anchorSize * data.bezierHandleScale, bezierPath[i]);
|
||||
float controlHandleSize = GetHandleDiameter (globalDisplaySettings.controlSize * data.bezierHandleScale, bezierPath[i]);
|
||||
|
||||
bool isAnchorPoint = i % 3 == 0;
|
||||
bool isInteractive = isAnchorPoint || bezierPath.ControlPointMode != BezierPath.ControlMode.Automatic;
|
||||
float handleSize = (isAnchorPoint) ? anchorHandleSize : controlHandleSize;
|
||||
bool doTransformHandle = i == handleIndexToDisplayAsTransform;
|
||||
|
||||
PathHandle.HandleColours handleColours = (isAnchorPoint) ? splineAnchorColours : splineControlColours;
|
||||
if (i == handleIndexToDisplayAsTransform) {
|
||||
handleColours.defaultColour = (isAnchorPoint) ? globalDisplaySettings.anchorSelected : globalDisplaySettings.controlSelected;
|
||||
}
|
||||
var cap = capFunctions[(isAnchorPoint) ? globalDisplaySettings.anchorShape : globalDisplaySettings.controlShape];
|
||||
PathHandle.HandleInputType handleInputType;
|
||||
handlePosition = PathHandle.DrawHandle (handlePosition, bezierPath.Space, isInteractive, handleSize, cap, handleColours, out handleInputType, i);
|
||||
|
||||
if (doTransformHandle) {
|
||||
// Show normals rotate tool
|
||||
if (data.showNormals && Tools.current == Tool.Rotate && isAnchorPoint && bezierPath.Space == PathSpace.xyz) {
|
||||
Handles.color = handlesStartCol;
|
||||
|
||||
int attachedControlIndex = (i == bezierPath.NumPoints - 1) ? i - 1 : i + 1;
|
||||
Vector3 dir = (bezierPath[attachedControlIndex] - handlePosition).normalized;
|
||||
float handleRotOffset = (360 + bezierPath.GlobalNormalsAngle) % 360;
|
||||
anchorAngleHandle.radius = handleSize * 3;
|
||||
anchorAngleHandle.angle = handleRotOffset + bezierPath.GetAnchorNormalAngle (i / 3);
|
||||
Vector3 handleDirection = Vector3.Cross (dir, Vector3.up);
|
||||
Matrix4x4 handleMatrix = Matrix4x4.TRS (
|
||||
handlePosition,
|
||||
Quaternion.LookRotation (handleDirection, dir),
|
||||
Vector3.one
|
||||
);
|
||||
|
||||
using (new Handles.DrawingScope (handleMatrix)) {
|
||||
// draw the handle
|
||||
EditorGUI.BeginChangeCheck ();
|
||||
anchorAngleHandle.DrawHandle ();
|
||||
if (EditorGUI.EndChangeCheck ()) {
|
||||
Undo.RecordObject (creator, "Set angle");
|
||||
bezierPath.SetAnchorNormalAngle (i / 3, anchorAngleHandle.angle - handleRotOffset);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
handlePosition = Handles.DoPositionHandle (handlePosition, Quaternion.identity);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
switch (handleInputType) {
|
||||
case PathHandle.HandleInputType.LMBDrag:
|
||||
draggingHandleIndex = i;
|
||||
handleIndexToDisplayAsTransform = -1;
|
||||
Repaint ();
|
||||
break;
|
||||
case PathHandle.HandleInputType.LMBRelease:
|
||||
draggingHandleIndex = -1;
|
||||
handleIndexToDisplayAsTransform = -1;
|
||||
Repaint ();
|
||||
break;
|
||||
case PathHandle.HandleInputType.LMBClick:
|
||||
draggingHandleIndex = -1;
|
||||
if (Event.current.shift) {
|
||||
handleIndexToDisplayAsTransform = -1; // disable move tool if new point added
|
||||
} else {
|
||||
if (handleIndexToDisplayAsTransform == i) {
|
||||
handleIndexToDisplayAsTransform = -1; // disable move tool if clicking on point under move tool
|
||||
} else {
|
||||
handleIndexToDisplayAsTransform = i;
|
||||
}
|
||||
}
|
||||
Repaint ();
|
||||
break;
|
||||
case PathHandle.HandleInputType.LMBPress:
|
||||
if (handleIndexToDisplayAsTransform != i) {
|
||||
handleIndexToDisplayAsTransform = -1;
|
||||
Repaint ();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Vector3 localHandlePosition = MathUtility.InverseTransformPoint (handlePosition, creator.transform, bezierPath.Space);
|
||||
|
||||
if (bezierPath[i] != localHandlePosition) {
|
||||
Undo.RecordObject (creator, "Move point");
|
||||
bezierPath.MovePoint (i, localHandlePosition);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Internal methods
|
||||
|
||||
void OnDisable () {
|
||||
Tools.hidden = false;
|
||||
}
|
||||
|
||||
void OnEnable () {
|
||||
creator = (PathCreator) target;
|
||||
bool in2DEditorMode = EditorSettings.defaultBehaviorMode == EditorBehaviorMode.Mode2D;
|
||||
creator.InitializeEditorData (in2DEditorMode);
|
||||
|
||||
data.bezierCreated -= ResetState;
|
||||
data.bezierCreated += ResetState;
|
||||
Undo.undoRedoPerformed -= OnUndoRedo;
|
||||
Undo.undoRedoPerformed += OnUndoRedo;
|
||||
|
||||
LoadDisplaySettings ();
|
||||
UpdateGlobalDisplaySettings ();
|
||||
ResetState ();
|
||||
SetTransformState (true);
|
||||
}
|
||||
|
||||
void SetTransformState (bool initialize = false) {
|
||||
Transform t = creator.transform;
|
||||
if (!initialize) {
|
||||
if (transformPos != t.position || t.localScale != transformScale || t.rotation != transformRot) {
|
||||
data.PathTransformed ();
|
||||
}
|
||||
}
|
||||
transformPos = t.position;
|
||||
transformScale = t.localScale;
|
||||
transformRot = t.rotation;
|
||||
}
|
||||
|
||||
void OnUndoRedo () {
|
||||
hasUpdatedScreenSpaceLine = false;
|
||||
hasUpdatedNormalsVertexPath = false;
|
||||
selectedSegmentIndex = -1;
|
||||
|
||||
Repaint ();
|
||||
}
|
||||
|
||||
void TabChanged () {
|
||||
SceneView.RepaintAll ();
|
||||
RepaintUnfocusedSceneViews ();
|
||||
}
|
||||
|
||||
void LoadDisplaySettings () {
|
||||
globalDisplaySettings = GlobalDisplaySettings.Load ();
|
||||
|
||||
capFunctions = new Dictionary<GlobalDisplaySettings.HandleType, Handles.CapFunction> ();
|
||||
capFunctions.Add (GlobalDisplaySettings.HandleType.Circle, Handles.CylinderHandleCap);
|
||||
capFunctions.Add (GlobalDisplaySettings.HandleType.Sphere, Handles.SphereHandleCap);
|
||||
capFunctions.Add (GlobalDisplaySettings.HandleType.Square, Handles.CubeHandleCap);
|
||||
}
|
||||
|
||||
void UpdateGlobalDisplaySettings () {
|
||||
var gds = globalDisplaySettings;
|
||||
splineAnchorColours = new PathHandle.HandleColours (gds.anchor, gds.anchorHighlighted, gds.anchorSelected, gds.handleDisabled);
|
||||
splineControlColours = new PathHandle.HandleColours (gds.control, gds.controlHighlighted, gds.controlSelected, gds.handleDisabled);
|
||||
|
||||
anchorAngleHandle.fillColor = new Color (1, 1, 1, .05f);
|
||||
anchorAngleHandle.wireframeColor = Color.grey;
|
||||
anchorAngleHandle.radiusHandleColor = Color.clear;
|
||||
anchorAngleHandle.angleHandleColor = Color.white;
|
||||
}
|
||||
|
||||
void ResetState () {
|
||||
selectedSegmentIndex = -1;
|
||||
draggingHandleIndex = -1;
|
||||
mouseOverHandleIndex = -1;
|
||||
handleIndexToDisplayAsTransform = -1;
|
||||
hasUpdatedScreenSpaceLine = false;
|
||||
hasUpdatedNormalsVertexPath = false;
|
||||
|
||||
bezierPath.OnModified -= OnPathModifed;
|
||||
bezierPath.OnModified += OnPathModifed;
|
||||
|
||||
SceneView.RepaintAll ();
|
||||
EditorApplication.QueuePlayerLoopUpdate ();
|
||||
}
|
||||
|
||||
void OnPathModifed () {
|
||||
hasUpdatedScreenSpaceLine = false;
|
||||
hasUpdatedNormalsVertexPath = false;
|
||||
|
||||
RepaintUnfocusedSceneViews ();
|
||||
}
|
||||
|
||||
void RepaintUnfocusedSceneViews () {
|
||||
// If multiple scene views are open, repaint those which do not have focus.
|
||||
if (SceneView.sceneViews.Count > 1) {
|
||||
foreach (SceneView sv in SceneView.sceneViews) {
|
||||
if (EditorWindow.focusedWindow != (EditorWindow) sv) {
|
||||
sv.Repaint ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdatePathMouseInfo () {
|
||||
|
||||
if (!hasUpdatedScreenSpaceLine || (screenSpaceLine != null && screenSpaceLine.TransformIsOutOfDate ())) {
|
||||
screenSpaceLine = new ScreenSpacePolyLine (bezierPath, creator.transform, screenPolylineMaxAngleError, screenPolylineMinVertexDst);
|
||||
hasUpdatedScreenSpaceLine = true;
|
||||
}
|
||||
pathMouseInfo = screenSpaceLine.CalculateMouseInfo ();
|
||||
}
|
||||
|
||||
float GetHandleDiameter (float diameter, Vector3 handlePosition) {
|
||||
float scaledDiameter = diameter * constantHandleScale;
|
||||
if (data.keepConstantHandleSize) {
|
||||
scaledDiameter *= HandleUtility.GetHandleSize (handlePosition) * 2.5f;
|
||||
}
|
||||
return scaledDiameter;
|
||||
}
|
||||
|
||||
BezierPath bezierPath {
|
||||
get {
|
||||
return data.bezierPath;
|
||||
}
|
||||
}
|
||||
|
||||
PathCreatorData data {
|
||||
get {
|
||||
return creator.EditorData;
|
||||
}
|
||||
}
|
||||
|
||||
bool editingNormals {
|
||||
get {
|
||||
return Tools.current == Tool.Rotate && handleIndexToDisplayAsTransform % 3 == 0 && bezierPath.Space == PathSpace.xyz;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 45d81a20743ff42a3b0dfbd499d4797e
|
||||
timeCreated: 1516864234
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: c62dae0f992c5174a951248617cc5720
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 2b76edb14a39ed944b9c906e5f1d3aaa
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,678 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using PathCreation.Utility;
|
||||
using UnityEngine;
|
||||
|
||||
namespace PathCreation {
|
||||
/// A bezier path is a path made by stitching together any number of (cubic) bezier curves.
|
||||
/// A single cubic bezier curve is defined by 4 points: anchor1, control1, control2, anchor2
|
||||
/// The curve moves between the 2 anchors, and the shape of the curve is affected by the positions of the 2 control points
|
||||
|
||||
/// When two curves are stitched together, they share an anchor point (end anchor of curve 1 = start anchor of curve 2).
|
||||
/// So while one curve alone consists of 4 points, two curves are defined by 7 unique points.
|
||||
|
||||
/// Apart from storing the points, this class also provides methods for working with the path.
|
||||
/// For example, adding, inserting, and deleting points.
|
||||
|
||||
[System.Serializable]
|
||||
public class BezierPath {
|
||||
public event System.Action OnModified;
|
||||
public enum ControlMode { Aligned, Mirrored, Free, Automatic };
|
||||
|
||||
#region Fields
|
||||
|
||||
[SerializeField, HideInInspector]
|
||||
List<Vector3> points;
|
||||
[SerializeField, HideInInspector]
|
||||
bool isClosed;
|
||||
[SerializeField, HideInInspector]
|
||||
PathSpace space;
|
||||
[SerializeField, HideInInspector]
|
||||
ControlMode controlMode;
|
||||
[SerializeField, HideInInspector]
|
||||
float autoControlLength = .3f;
|
||||
[SerializeField, HideInInspector]
|
||||
bool boundsUpToDate;
|
||||
[SerializeField, HideInInspector]
|
||||
Bounds bounds;
|
||||
|
||||
// Normals settings
|
||||
[SerializeField, HideInInspector]
|
||||
List<float> perAnchorNormalsAngle;
|
||||
[SerializeField, HideInInspector]
|
||||
float globalNormalsAngle;
|
||||
[SerializeField, HideInInspector]
|
||||
bool flipNormals;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary> Creates a two-anchor path centred around the given centre point </summary>
|
||||
///<param name="isClosed"> Should the end point connect back to the start point? </param>
|
||||
///<param name="space"> Determines if the path is in 3d space, or clamped to the xy/xz plane </param>
|
||||
public BezierPath (Vector3 centre, bool isClosed = false, PathSpace space = PathSpace.xyz) {
|
||||
|
||||
Vector3 dir = (space == PathSpace.xz) ? Vector3.forward : Vector3.up;
|
||||
float width = 2;
|
||||
float controlHeight = .5f;
|
||||
float controlWidth = 1f;
|
||||
points = new List<Vector3> {
|
||||
centre + Vector3.left * width,
|
||||
centre + Vector3.left * controlWidth + dir * controlHeight,
|
||||
centre + Vector3.right * controlWidth - dir * controlHeight,
|
||||
centre + Vector3.right * width
|
||||
};
|
||||
|
||||
perAnchorNormalsAngle = new List<float> () { 0, 0 };
|
||||
|
||||
Space = space;
|
||||
IsClosed = isClosed;
|
||||
}
|
||||
|
||||
/// <summary> Creates a path from the supplied 3D points </summary>
|
||||
///<param name="points"> List or array of points to create the path from. </param>
|
||||
///<param name="isClosed"> Should the end point connect back to the start point? </param>
|
||||
///<param name="space"> Determines if the path is in 3d space, or clamped to the xy/xz plane </param>
|
||||
public BezierPath (IEnumerable<Vector3> points, bool isClosed = false, PathSpace space = PathSpace.xyz) {
|
||||
Vector3[] pointsArray = points.ToArray ();
|
||||
|
||||
if (pointsArray.Length < 2) {
|
||||
Debug.LogError ("Path requires at least 2 anchor points.");
|
||||
} else {
|
||||
controlMode = ControlMode.Automatic;
|
||||
this.points = new List<Vector3> { pointsArray[0], Vector3.zero, Vector3.zero, pointsArray[1] };
|
||||
perAnchorNormalsAngle = new List<float> (new float[] { 0, 0 });
|
||||
|
||||
for (int i = 2; i < pointsArray.Length; i++) {
|
||||
AddSegmentToEnd (pointsArray[i]);
|
||||
perAnchorNormalsAngle.Add (0);
|
||||
}
|
||||
}
|
||||
|
||||
this.Space = space;
|
||||
this.IsClosed = isClosed;
|
||||
}
|
||||
|
||||
/// <summary> Creates a path from the positions of the supplied 2D points </summary>
|
||||
///<param name="transforms"> List or array of transforms to create the path from. </param>
|
||||
///<param name="isClosed"> Should the end point connect back to the start point? </param>
|
||||
///<param name="space"> Determines if the path is in 3d space, or clamped to the xy/xz plane </param>
|
||||
public BezierPath (IEnumerable<Vector2> transforms, bool isClosed = false, PathSpace space = PathSpace.xy):
|
||||
this (transforms.Select (p => new Vector3 (p.x, p.y)), isClosed, space) { }
|
||||
|
||||
/// <summary> Creates a path from the positions of the supplied transforms </summary>
|
||||
///<param name="transforms"> List or array of transforms to create the path from. </param>
|
||||
///<param name="isClosed"> Should the end point connect back to the start point? </param>
|
||||
///<param name="space"> Determines if the path is in 3d space, or clamped to the xy/xz plane </param>
|
||||
public BezierPath (IEnumerable<Transform> transforms, bool isClosed = false, PathSpace space = PathSpace.xy):
|
||||
this (transforms.Select (t => t.position), isClosed, space) { }
|
||||
|
||||
/// <summary> Creates a path from the supplied 2D points </summary>
|
||||
///<param name="points"> List or array of 2d points to create the path from. </param>
|
||||
///<param name="isClosed"> Should the end point connect back to the start point? </param>
|
||||
///<param name="pathSpace"> Determines if the path is in 3d space, or clamped to the xy/xz plane </param>
|
||||
public BezierPath (IEnumerable<Vector2> points, PathSpace space = PathSpace.xyz, bool isClosed = false):
|
||||
this (points.Select (p => new Vector3 (p.x, p.y)), isClosed, space) { }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public methods and accessors
|
||||
|
||||
/// Get world space position of point
|
||||
public Vector3 this [int i] {
|
||||
get {
|
||||
return GetPoint (i);
|
||||
}
|
||||
}
|
||||
|
||||
/// Get world space position of point
|
||||
public Vector3 GetPoint (int i) {
|
||||
return points[i];
|
||||
}
|
||||
|
||||
/// Get world space position of point
|
||||
public void SetPoint (int i, Vector3 localPosition, bool suppressPathModifiedEvent = false) {
|
||||
points[i] = localPosition;
|
||||
if (!suppressPathModifiedEvent) {
|
||||
NotifyPathModified();
|
||||
}
|
||||
}
|
||||
|
||||
/// Total number of points in the path (anchors and controls)
|
||||
public int NumPoints {
|
||||
get {
|
||||
return points.Count;
|
||||
}
|
||||
}
|
||||
|
||||
/// Number of anchor points making up the path
|
||||
public int NumAnchorPoints {
|
||||
get {
|
||||
return (IsClosed) ? points.Count / 3 : (points.Count + 2) / 3;
|
||||
}
|
||||
}
|
||||
|
||||
/// Number of bezier curves making up this path
|
||||
public int NumSegments {
|
||||
get {
|
||||
return points.Count / 3;
|
||||
}
|
||||
}
|
||||
|
||||
/// Path can exist in 3D (xyz), 2D (xy), or Top-Down (xz) space
|
||||
/// In xy or xz space, points will be clamped to that plane (so in a 2D path, for example, points will always be at 0 on z axis)
|
||||
public PathSpace Space {
|
||||
get {
|
||||
return space;
|
||||
}
|
||||
set {
|
||||
if (value != space) {
|
||||
PathSpace previousSpace = space;
|
||||
space = value;
|
||||
UpdateToNewPathSpace (previousSpace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// If closed, path will loop back from end point to start point
|
||||
public bool IsClosed {
|
||||
get {
|
||||
return isClosed;
|
||||
}
|
||||
set {
|
||||
if (isClosed != value) {
|
||||
isClosed = value;
|
||||
UpdateClosedState ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The control mode determines the behaviour of control points.
|
||||
/// Possible modes are:
|
||||
/// Aligned = controls stay in straight line around their anchor
|
||||
/// Mirrored = controls stay in straight, equidistant line around their anchor
|
||||
/// Free = no constraints (use this if sharp corners are needed)
|
||||
/// Automatic = controls placed automatically to try make the path smooth
|
||||
public ControlMode ControlPointMode {
|
||||
get {
|
||||
return controlMode;
|
||||
}
|
||||
set {
|
||||
if (controlMode != value) {
|
||||
controlMode = value;
|
||||
if (controlMode == ControlMode.Automatic) {
|
||||
AutoSetAllControlPoints ();
|
||||
NotifyPathModified ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// When using automatic control point placement, this value scales how far apart controls are placed
|
||||
public float AutoControlLength {
|
||||
get {
|
||||
return autoControlLength;
|
||||
}
|
||||
set {
|
||||
value = Mathf.Max (value, .01f);
|
||||
if (autoControlLength != value) {
|
||||
autoControlLength = value;
|
||||
AutoSetAllControlPoints ();
|
||||
NotifyPathModified ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Add new anchor point to end of the path
|
||||
public void AddSegmentToEnd (Vector3 anchorPos) {
|
||||
if (isClosed) {
|
||||
return;
|
||||
}
|
||||
|
||||
int lastAnchorIndex = points.Count - 1;
|
||||
// Set position for new control to be mirror of its counterpart
|
||||
Vector3 secondControlForOldLastAnchorOffset = (points[lastAnchorIndex] - points[lastAnchorIndex - 1]);
|
||||
if (controlMode != ControlMode.Mirrored && controlMode != ControlMode.Automatic) {
|
||||
// Set position for new control to be aligned with its counterpart, but with a length of half the distance from prev to new anchor
|
||||
float dstPrevToNewAnchor = (points[lastAnchorIndex] - anchorPos).magnitude;
|
||||
secondControlForOldLastAnchorOffset = (points[lastAnchorIndex] - points[lastAnchorIndex - 1]).normalized * dstPrevToNewAnchor * .5f;
|
||||
}
|
||||
Vector3 secondControlForOldLastAnchor = points[lastAnchorIndex] + secondControlForOldLastAnchorOffset;
|
||||
Vector3 controlForNewAnchor = (anchorPos + secondControlForOldLastAnchor) * .5f;
|
||||
|
||||
points.Add (secondControlForOldLastAnchor);
|
||||
points.Add (controlForNewAnchor);
|
||||
points.Add (anchorPos);
|
||||
perAnchorNormalsAngle.Add (perAnchorNormalsAngle[perAnchorNormalsAngle.Count - 1]);
|
||||
|
||||
if (controlMode == ControlMode.Automatic) {
|
||||
AutoSetAllAffectedControlPoints (points.Count - 1);
|
||||
}
|
||||
|
||||
NotifyPathModified ();
|
||||
}
|
||||
|
||||
/// Add new anchor point to start of the path
|
||||
public void AddSegmentToStart (Vector3 anchorPos) {
|
||||
if (isClosed) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Set position for new control to be mirror of its counterpart
|
||||
Vector3 secondControlForOldFirstAnchorOffset = (points[0] - points[1]);
|
||||
if (controlMode != ControlMode.Mirrored && controlMode != ControlMode.Automatic) {
|
||||
// Set position for new control to be aligned with its counterpart, but with a length of half the distance from prev to new anchor
|
||||
float dstPrevToNewAnchor = (points[0] - anchorPos).magnitude;
|
||||
secondControlForOldFirstAnchorOffset = secondControlForOldFirstAnchorOffset.normalized * dstPrevToNewAnchor * .5f;
|
||||
}
|
||||
|
||||
Vector3 secondControlForOldFirstAnchor = points[0] + secondControlForOldFirstAnchorOffset;
|
||||
Vector3 controlForNewAnchor = (anchorPos + secondControlForOldFirstAnchor) * .5f;
|
||||
points.Insert (0, anchorPos);
|
||||
points.Insert (1, controlForNewAnchor);
|
||||
points.Insert (2, secondControlForOldFirstAnchor);
|
||||
perAnchorNormalsAngle.Insert (0, perAnchorNormalsAngle[0]);
|
||||
|
||||
if (controlMode == ControlMode.Automatic) {
|
||||
AutoSetAllAffectedControlPoints (0);
|
||||
}
|
||||
NotifyPathModified ();
|
||||
}
|
||||
|
||||
/// Insert new anchor point at given position. Automatically place control points around it so as to keep shape of curve the same
|
||||
public void SplitSegment (Vector3 anchorPos, int segmentIndex, float splitTime) {
|
||||
splitTime = Mathf.Clamp01 (splitTime);
|
||||
|
||||
if (controlMode == ControlMode.Automatic) {
|
||||
points.InsertRange (segmentIndex * 3 + 2, new Vector3[] { Vector3.zero, anchorPos, Vector3.zero });
|
||||
AutoSetAllAffectedControlPoints (segmentIndex * 3 + 3);
|
||||
} else {
|
||||
// Split the curve to find where control points can be inserted to least affect shape of curve
|
||||
// Curve will probably be deformed slightly since splitTime is only an estimate (for performance reasons, and so doesn't correspond exactly with anchorPos)
|
||||
Vector3[][] splitSegment = CubicBezierUtility.SplitCurve (GetPointsInSegment (segmentIndex), splitTime);
|
||||
points.InsertRange (segmentIndex * 3 + 2, new Vector3[] { splitSegment[0][2], splitSegment[1][0], splitSegment[1][1] });
|
||||
int newAnchorIndex = segmentIndex * 3 + 3;
|
||||
MovePoint (newAnchorIndex - 2, splitSegment[0][1], true);
|
||||
MovePoint (newAnchorIndex + 2, splitSegment[1][2], true);
|
||||
MovePoint (newAnchorIndex, anchorPos, true);
|
||||
|
||||
if (controlMode == ControlMode.Mirrored) {
|
||||
float avgDst = ((splitSegment[0][2] - anchorPos).magnitude + (splitSegment[1][1] - anchorPos).magnitude) / 2;
|
||||
MovePoint (newAnchorIndex + 1, anchorPos + (splitSegment[1][1] - anchorPos).normalized * avgDst, true);
|
||||
}
|
||||
}
|
||||
|
||||
// Insert angle for new anchor (value should be set inbetween neighbour anchor angles)
|
||||
int newAnchorAngleIndex = (segmentIndex + 1) % perAnchorNormalsAngle.Count;
|
||||
int numAngles = perAnchorNormalsAngle.Count;
|
||||
float anglePrev = perAnchorNormalsAngle[segmentIndex];
|
||||
float angleNext = perAnchorNormalsAngle[newAnchorAngleIndex];
|
||||
float splitAngle = Mathf.LerpAngle (anglePrev, angleNext, splitTime);
|
||||
perAnchorNormalsAngle.Insert (newAnchorAngleIndex, splitAngle);
|
||||
|
||||
NotifyPathModified ();
|
||||
}
|
||||
|
||||
/// Delete the anchor point at given index, as well as its associated control points
|
||||
public void DeleteSegment (int anchorIndex) {
|
||||
// Don't delete segment if its the last one remaining (or if only two segments in a closed path)
|
||||
if (NumSegments > 2 || !isClosed && NumSegments > 1) {
|
||||
if (anchorIndex == 0) {
|
||||
if (isClosed) {
|
||||
points[points.Count - 1] = points[2];
|
||||
}
|
||||
points.RemoveRange (0, 3);
|
||||
} else if (anchorIndex == points.Count - 1 && !isClosed) {
|
||||
points.RemoveRange (anchorIndex - 2, 3);
|
||||
} else {
|
||||
points.RemoveRange (anchorIndex - 1, 3);
|
||||
}
|
||||
|
||||
perAnchorNormalsAngle.RemoveAt (anchorIndex / 3);
|
||||
|
||||
if (controlMode == ControlMode.Automatic) {
|
||||
AutoSetAllControlPoints ();
|
||||
}
|
||||
|
||||
NotifyPathModified ();
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns an array of the 4 points making up the segment (anchor1, control1, control2, anchor2)
|
||||
public Vector3[] GetPointsInSegment (int segmentIndex) {
|
||||
segmentIndex = Mathf.Clamp (segmentIndex, 0, NumSegments - 1);
|
||||
return new Vector3[] { this [segmentIndex * 3], this [segmentIndex * 3 + 1], this [segmentIndex * 3 + 2], this [LoopIndex (segmentIndex * 3 + 3)] };
|
||||
}
|
||||
|
||||
/// Move an existing point to a new position
|
||||
public void MovePoint (int i, Vector3 pointPos, bool suppressPathModifiedEvent = false) {
|
||||
|
||||
if (space == PathSpace.xy) {
|
||||
pointPos.z = 0;
|
||||
} else if (space == PathSpace.xz) {
|
||||
pointPos.y = 0;
|
||||
}
|
||||
Vector3 deltaMove = pointPos - points[i];
|
||||
bool isAnchorPoint = i % 3 == 0;
|
||||
|
||||
// Don't process control point if control mode is set to automatic
|
||||
if (isAnchorPoint || controlMode != ControlMode.Automatic) {
|
||||
points[i] = pointPos;
|
||||
|
||||
if (controlMode == ControlMode.Automatic) {
|
||||
AutoSetAllAffectedControlPoints (i);
|
||||
} else {
|
||||
// Move control points with anchor point
|
||||
if (isAnchorPoint) {
|
||||
if (i + 1 < points.Count || isClosed) {
|
||||
points[LoopIndex (i + 1)] += deltaMove;
|
||||
}
|
||||
if (i - 1 >= 0 || isClosed) {
|
||||
points[LoopIndex (i - 1)] += deltaMove;
|
||||
}
|
||||
}
|
||||
// If not in free control mode, then move attached control point to be aligned/mirrored (depending on mode)
|
||||
else if (controlMode != ControlMode.Free) {
|
||||
bool nextPointIsAnchor = (i + 1) % 3 == 0;
|
||||
int attachedControlIndex = (nextPointIsAnchor) ? i + 2 : i - 2;
|
||||
int anchorIndex = (nextPointIsAnchor) ? i + 1 : i - 1;
|
||||
|
||||
if (attachedControlIndex >= 0 && attachedControlIndex < points.Count || isClosed) {
|
||||
float distanceFromAnchor = 0;
|
||||
// If in aligned mode, then attached control's current distance from anchor point should be maintained
|
||||
if (controlMode == ControlMode.Aligned) {
|
||||
distanceFromAnchor = (points[LoopIndex (anchorIndex)] - points[LoopIndex (attachedControlIndex)]).magnitude;
|
||||
}
|
||||
// If in mirrored mode, then both control points should have the same distance from the anchor point
|
||||
else if (controlMode == ControlMode.Mirrored) {
|
||||
distanceFromAnchor = (points[LoopIndex (anchorIndex)] - points[i]).magnitude;
|
||||
|
||||
}
|
||||
Vector3 dir = (points[LoopIndex (anchorIndex)] - pointPos).normalized;
|
||||
points[LoopIndex (attachedControlIndex)] = points[LoopIndex (anchorIndex)] + dir * distanceFromAnchor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!suppressPathModifiedEvent) {
|
||||
NotifyPathModified ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Update the bounding box of the path
|
||||
public Bounds CalculateBoundsWithTransform (Transform transform) {
|
||||
// Loop through all segments and keep track of the minmax points of all their bounding boxes
|
||||
MinMax3D minMax = new MinMax3D ();
|
||||
|
||||
for (int i = 0; i < NumSegments; i++) {
|
||||
Vector3[] p = GetPointsInSegment (i);
|
||||
for (int j = 0; j < p.Length; j++) {
|
||||
p[j] = MathUtility.TransformPoint (p[j], transform, space);
|
||||
}
|
||||
|
||||
minMax.AddValue (p[0]);
|
||||
minMax.AddValue (p[3]);
|
||||
|
||||
List<float> extremePointTimes = CubicBezierUtility.ExtremePointTimes (p[0], p[1], p[2], p[3]);
|
||||
foreach (float t in extremePointTimes) {
|
||||
minMax.AddValue (CubicBezierUtility.EvaluateCurve (p, t));
|
||||
}
|
||||
}
|
||||
|
||||
return new Bounds ((minMax.Min + minMax.Max) / 2, minMax.Max - minMax.Min);
|
||||
}
|
||||
|
||||
/// Flip the normal vectors 180 degrees
|
||||
public bool FlipNormals {
|
||||
get {
|
||||
return flipNormals;
|
||||
}
|
||||
set {
|
||||
if (flipNormals != value) {
|
||||
flipNormals = value;
|
||||
NotifyPathModified ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Global angle that all normal vectors are rotated by (only relevant for paths in 3D space)
|
||||
public float GlobalNormalsAngle {
|
||||
get {
|
||||
return globalNormalsAngle;
|
||||
}
|
||||
set {
|
||||
if (value != globalNormalsAngle) {
|
||||
globalNormalsAngle = value;
|
||||
NotifyPathModified ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the desired angle of the normal vector at a particular anchor (only relevant for paths in 3D space)
|
||||
public float GetAnchorNormalAngle (int anchorIndex) {
|
||||
return perAnchorNormalsAngle[anchorIndex] % 360;
|
||||
}
|
||||
|
||||
/// Set the desired angle of the normal vector at a particular anchor (only relevant for paths in 3D space)
|
||||
public void SetAnchorNormalAngle (int anchorIndex, float angle) {
|
||||
angle = (angle + 360) % 360;
|
||||
if (perAnchorNormalsAngle[anchorIndex] != angle) {
|
||||
perAnchorNormalsAngle[anchorIndex] = angle;
|
||||
NotifyPathModified ();
|
||||
}
|
||||
}
|
||||
|
||||
/// Reset global and anchor normal angles to 0
|
||||
public void ResetNormalAngles () {
|
||||
for (int i = 0; i < perAnchorNormalsAngle.Count; i++) {
|
||||
perAnchorNormalsAngle[i] = 0;
|
||||
}
|
||||
globalNormalsAngle = 0;
|
||||
NotifyPathModified ();
|
||||
}
|
||||
|
||||
/// Bounding box containing the path
|
||||
public Bounds PathBounds {
|
||||
get {
|
||||
if (!boundsUpToDate) {
|
||||
UpdateBounds ();
|
||||
}
|
||||
return bounds;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Internal methods and accessors
|
||||
|
||||
/// Update the bounding box of the path
|
||||
void UpdateBounds () {
|
||||
if (boundsUpToDate) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Loop through all segments and keep track of the minmax points of all their bounding boxes
|
||||
MinMax3D minMax = new MinMax3D ();
|
||||
|
||||
for (int i = 0; i < NumSegments; i++) {
|
||||
Vector3[] p = GetPointsInSegment (i);
|
||||
minMax.AddValue (p[0]);
|
||||
minMax.AddValue (p[3]);
|
||||
|
||||
List<float> extremePointTimes = CubicBezierUtility.ExtremePointTimes (p[0], p[1], p[2], p[3]);
|
||||
foreach (float t in extremePointTimes) {
|
||||
minMax.AddValue (CubicBezierUtility.EvaluateCurve (p, t));
|
||||
}
|
||||
}
|
||||
|
||||
boundsUpToDate = true;
|
||||
bounds = new Bounds ((minMax.Min + minMax.Max) / 2, minMax.Max - minMax.Min);
|
||||
}
|
||||
|
||||
/// Determines good positions (for a smooth path) for the control points affected by a moved/inserted anchor point
|
||||
void AutoSetAllAffectedControlPoints (int updatedAnchorIndex) {
|
||||
for (int i = updatedAnchorIndex - 3; i <= updatedAnchorIndex + 3; i += 3) {
|
||||
if (i >= 0 && i < points.Count || isClosed) {
|
||||
AutoSetAnchorControlPoints (LoopIndex (i));
|
||||
}
|
||||
}
|
||||
|
||||
AutoSetStartAndEndControls ();
|
||||
}
|
||||
|
||||
/// Determines good positions (for a smooth path) for all control points
|
||||
void AutoSetAllControlPoints () {
|
||||
if (NumAnchorPoints > 2) {
|
||||
for (int i = 0; i < points.Count; i += 3) {
|
||||
AutoSetAnchorControlPoints (i);
|
||||
}
|
||||
}
|
||||
|
||||
AutoSetStartAndEndControls ();
|
||||
}
|
||||
|
||||
/// Calculates good positions (to result in smooth path) for the controls around specified anchor
|
||||
void AutoSetAnchorControlPoints (int anchorIndex) {
|
||||
// Calculate a vector that is perpendicular to the vector bisecting the angle between this anchor and its two immediate neighbours
|
||||
// The control points will be placed along that vector
|
||||
Vector3 anchorPos = points[anchorIndex];
|
||||
Vector3 dir = Vector3.zero;
|
||||
float[] neighbourDistances = new float[2];
|
||||
|
||||
if (anchorIndex - 3 >= 0 || isClosed) {
|
||||
Vector3 offset = points[LoopIndex (anchorIndex - 3)] - anchorPos;
|
||||
dir += offset.normalized;
|
||||
neighbourDistances[0] = offset.magnitude;
|
||||
}
|
||||
if (anchorIndex + 3 >= 0 || isClosed) {
|
||||
Vector3 offset = points[LoopIndex (anchorIndex + 3)] - anchorPos;
|
||||
dir -= offset.normalized;
|
||||
neighbourDistances[1] = -offset.magnitude;
|
||||
}
|
||||
|
||||
dir.Normalize ();
|
||||
|
||||
// Set the control points along the calculated direction, with a distance proportional to the distance to the neighbouring control point
|
||||
for (int i = 0; i < 2; i++) {
|
||||
int controlIndex = anchorIndex + i * 2 - 1;
|
||||
if (controlIndex >= 0 && controlIndex < points.Count || isClosed) {
|
||||
points[LoopIndex (controlIndex)] = anchorPos + dir * neighbourDistances[i] * autoControlLength;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Determines good positions (for a smooth path) for the control points at the start and end of a path
|
||||
void AutoSetStartAndEndControls () {
|
||||
if (isClosed) {
|
||||
// Handle case with only 2 anchor points separately, as will otherwise result in straight line ()
|
||||
if (NumAnchorPoints == 2) {
|
||||
Vector3 dirAnchorAToB = (points[3] - points[0]).normalized;
|
||||
float dstBetweenAnchors = (points[0] - points[3]).magnitude;
|
||||
Vector3 perp = Vector3.Cross (dirAnchorAToB, (space == PathSpace.xy) ? Vector3.forward : Vector3.up);
|
||||
points[1] = points[0] + perp * dstBetweenAnchors / 2f;
|
||||
points[5] = points[0] - perp * dstBetweenAnchors / 2f;
|
||||
points[2] = points[3] + perp * dstBetweenAnchors / 2f;
|
||||
points[4] = points[3] - perp * dstBetweenAnchors / 2f;
|
||||
|
||||
} else {
|
||||
AutoSetAnchorControlPoints (0);
|
||||
AutoSetAnchorControlPoints (points.Count - 3);
|
||||
}
|
||||
} else {
|
||||
// Handle case with 2 anchor points separately, as otherwise minor adjustments cause path to constantly flip
|
||||
if (NumAnchorPoints == 2) {
|
||||
points[1] = points[0] + (points[3] - points[0]) * .25f;
|
||||
points[2] = points[3] + (points[0] - points[3]) * .25f;
|
||||
} else {
|
||||
points[1] = (points[0] + points[2]) * .5f;
|
||||
points[points.Count - 2] = (points[points.Count - 1] + points[points.Count - 3]) * .5f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Update point positions for new path space
|
||||
/// (for example, if changing from xy to xz path, y and z axes will be swapped so the path keeps its shape in the new space)
|
||||
void UpdateToNewPathSpace (PathSpace previousSpace) {
|
||||
// If changing from 3d to 2d space, first find the bounds of the 3d path.
|
||||
// The axis with the smallest bounds will be discarded.
|
||||
if (previousSpace == PathSpace.xyz) {
|
||||
Vector3 boundsSize = PathBounds.size;
|
||||
float minBoundsSize = Mathf.Min (boundsSize.x, boundsSize.y, boundsSize.z);
|
||||
|
||||
for (int i = 0; i < NumPoints; i++) {
|
||||
if (space == PathSpace.xy) {
|
||||
float x = (minBoundsSize == boundsSize.x) ? points[i].z : points[i].x;
|
||||
float y = (minBoundsSize == boundsSize.y) ? points[i].z : points[i].y;
|
||||
points[i] = new Vector3 (x, y, 0);
|
||||
} else if (space == PathSpace.xz) {
|
||||
float x = (minBoundsSize == boundsSize.x) ? points[i].y : points[i].x;
|
||||
float z = (minBoundsSize == boundsSize.z) ? points[i].y : points[i].z;
|
||||
points[i] = new Vector3 (x, 0, z);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Nothing needs to change when going to 3d space
|
||||
if (space != PathSpace.xyz) {
|
||||
for (int i = 0; i < NumPoints; i++) {
|
||||
// from xz to xy
|
||||
if (space == PathSpace.xy) {
|
||||
points[i] = new Vector3 (points[i].x, points[i].z, 0);
|
||||
}
|
||||
// from xy to xz
|
||||
else if (space == PathSpace.xz) {
|
||||
points[i] = new Vector3 (points[i].x, 0, points[i].y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NotifyPathModified ();
|
||||
}
|
||||
|
||||
/// Add/remove the extra 2 controls required for a closed path
|
||||
void UpdateClosedState () {
|
||||
if (isClosed) {
|
||||
// Set positions for new controls to mirror their counterparts
|
||||
Vector3 lastAnchorSecondControl = points[points.Count - 1] * 2 - points[points.Count - 2];
|
||||
Vector3 firstAnchorSecondControl = points[0] * 2 - points[1];
|
||||
if (controlMode != ControlMode.Mirrored && controlMode != ControlMode.Automatic) {
|
||||
// Set positions for new controls to be aligned with their counterparts, but with a length of half the distance between start/end anchor
|
||||
float dstBetweenStartAndEndAnchors = (points[points.Count - 1] - points[0]).magnitude;
|
||||
lastAnchorSecondControl = points[points.Count - 1] + (points[points.Count - 1] - points[points.Count - 2]).normalized * dstBetweenStartAndEndAnchors * .5f;
|
||||
firstAnchorSecondControl = points[0] + (points[0] - points[1]).normalized * dstBetweenStartAndEndAnchors * .5f;
|
||||
}
|
||||
points.Add (lastAnchorSecondControl);
|
||||
points.Add (firstAnchorSecondControl);
|
||||
} else {
|
||||
points.RemoveRange (points.Count - 2, 2);
|
||||
|
||||
}
|
||||
|
||||
if (controlMode == ControlMode.Automatic) {
|
||||
AutoSetStartAndEndControls ();
|
||||
}
|
||||
|
||||
if (OnModified != null) {
|
||||
OnModified ();
|
||||
}
|
||||
}
|
||||
|
||||
/// Loop index around to start/end of points array if out of bounds (useful when working with closed paths)
|
||||
int LoopIndex (int i) {
|
||||
return (i + points.Count) % points.Count;
|
||||
}
|
||||
|
||||
// Called when the path is modified
|
||||
public void NotifyPathModified () {
|
||||
boundsUpToDate = false;
|
||||
if (OnModified != null) {
|
||||
OnModified ();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 756209f371f304fb1920c53a8a25a5e2
|
||||
timeCreated: 1516786483
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,3 @@
|
|||
namespace PathCreation {
|
||||
public enum EndOfPathInstruction {Loop, Reverse, Stop};
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: c0d7fa70c03166e4180909b6e5d546c7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,70 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace PathCreation
|
||||
{
|
||||
//[CreateAssetMenu()]
|
||||
public class GlobalDisplaySettings : ScriptableObject
|
||||
{
|
||||
|
||||
public enum HandleType { Sphere, Circle, Square };
|
||||
|
||||
[Header("Appearance")]
|
||||
public float anchorSize = 10;
|
||||
public float controlSize = 7f;
|
||||
|
||||
[Tooltip("Should the path still be drawn when behind objects in the scene?")]
|
||||
public bool visibleBehindObjects = true;
|
||||
[Tooltip("Should the path be drawn even when the path object is not selected?")]
|
||||
public bool visibleWhenNotSelected = true;
|
||||
[Tooltip("If true, control points will be hidden when the control point mode is set to automatic. Otherwise they will inactive, but still visible.")]
|
||||
public bool hideAutoControls = true;
|
||||
public HandleType anchorShape;
|
||||
public HandleType controlShape;
|
||||
|
||||
|
||||
[Header("Anchor Colours")]
|
||||
public Color anchor = new Color(0.95f, 0.25f, 0.25f, 0.85f);
|
||||
public Color anchorHighlighted = new Color(1, 0.57f, 0.4f);
|
||||
public Color anchorSelected = Color.white;
|
||||
|
||||
[Header("Control Colours")]
|
||||
public Color control = new Color(0.35f, 0.6f, 1, 0.85f);
|
||||
public Color controlHighlighted = new Color(0.8f, 0.67f, 0.97f);
|
||||
public Color controlSelected = Color.white;
|
||||
public Color handleDisabled = new Color(1, 1, 1, 0.2f);
|
||||
public Color controlLine = new Color(0, 0, 0, 0.35f);
|
||||
|
||||
[Header("Bezier Path Colours")]
|
||||
public Color bezierPath = Color.green;
|
||||
public Color highlightedPath = new Color(1, 0.6f, 0);
|
||||
public Color bounds = new Color(1, 1, 1, .4f);
|
||||
public Color segmentBounds = new Color(1, 1, 1, .4f);
|
||||
|
||||
[Header("Vertex Path Colours")]
|
||||
public Color vertexPath = Color.white;
|
||||
|
||||
[Header("Normals")]
|
||||
public Color normals = Color.yellow;
|
||||
[Range(0,1)]
|
||||
public float normalsLength = .1f;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public static GlobalDisplaySettings Load() {
|
||||
string[] guids = UnityEditor.AssetDatabase.FindAssets("t:GlobalDisplaySettings");
|
||||
if (guids.Length == 0)
|
||||
{
|
||||
Debug.LogWarning("Could not find DisplaySettings asset. Will use default settings instead.");
|
||||
return ScriptableObject.CreateInstance<GlobalDisplaySettings>();
|
||||
}
|
||||
else
|
||||
{
|
||||
string path = UnityEditor.AssetDatabase.GUIDToAssetPath(guids[0]);
|
||||
return UnityEditor.AssetDatabase.LoadAssetAtPath<GlobalDisplaySettings>(path);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 46d5e8d803e252f4499b52e657f8e1a2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,21 @@
|
|||
using UnityEngine;
|
||||
|
||||
namespace PathCreation {
|
||||
public class MinMax3D {
|
||||
|
||||
public Vector3 Min { get; private set; }
|
||||
public Vector3 Max { get; private set; }
|
||||
|
||||
public MinMax3D()
|
||||
{
|
||||
Min = Vector3.one * float.MaxValue;
|
||||
Max = Vector3.one * float.MinValue;
|
||||
}
|
||||
|
||||
public void AddValue(Vector3 v)
|
||||
{
|
||||
Min = new Vector3(Mathf.Min(Min.x, v.x), Mathf.Min(Min.y,v.y), Mathf.Min(Min.z,v.z));
|
||||
Max = new Vector3(Mathf.Max(Max.x, v.x), Mathf.Max(Max.y,v.y), Mathf.Max(Max.z,v.z));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 194e1b7893dcbf940a71eb507d8b10f3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue