导入第一人称、高亮、DOTween插件
This commit is contained in:
parent
c8d493e600
commit
b811e2c61f
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: bb76236d4a7e17944ae1e59b77c5b561
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 0fa616d8a39d6934b8f5c2bab642ec00
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: c9670ac8dd6444942994a82589a32e56
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,33 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6e34401331a6989419fc6a45f3d726cd
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: a5db00ddfeb5e1b4988f77a7a87e9a4b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,144 @@
|
|||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>DOTweenEditor</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:DG.DOTweenEditor.EditorCompatibilityUtils">
|
||||
<summary>
|
||||
Contains compatibility methods taken from DemiEditor (for when DOTween is without it)
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorCompatibilityUtils.FindObjectOfType``1(System.Boolean)">
|
||||
<summary>
|
||||
Warning: some versions of this method don't have the includeInactive parameter so it won't be taken into account
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorCompatibilityUtils.FindObjectOfType(System.Type,System.Boolean)">
|
||||
<summary>
|
||||
Warning: some versions of this method don't have the includeInactive parameter so it won't be taken into account
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorCompatibilityUtils.FindObjectsOfType``1(System.Boolean)">
|
||||
<summary>
|
||||
Warning: some versions of this method don't have the includeInactive parameter so it won't be taken into account
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorCompatibilityUtils.FindObjectsOfType(System.Type,System.Boolean)">
|
||||
<summary>
|
||||
Warning: some versions of this method don't have the includeInactive parameter so it won't be taken into account
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.DOTweenEditorPreview.Start(System.Action)">
|
||||
<summary>
|
||||
Starts the update loop of tween in the editor. Has no effect during playMode.
|
||||
</summary>
|
||||
<param name="onPreviewUpdated">Eventual callback to call after every update</param>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.DOTweenEditorPreview.Stop(System.Boolean,System.Boolean)">
|
||||
<summary>
|
||||
Stops the update loop and clears the onPreviewUpdated callback.
|
||||
</summary>
|
||||
<param name="resetTweenTargets">If TRUE also resets the tweened objects to their original state.
|
||||
Note that this works by calling Rewind on all tweens, so it will work correctly
|
||||
only if you have a single tween type per object and it wasn't killed</param>
|
||||
<param name="clearTweens">If TRUE also kills any cached tween</param>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.DOTweenEditorPreview.PrepareTweenForPreview(DG.Tweening.Tween,System.Boolean,System.Boolean,System.Boolean)">
|
||||
<summary>
|
||||
Readies the tween for editor preview by setting its UpdateType to Manual plus eventual extra settings.
|
||||
</summary>
|
||||
<param name="t">The tween to ready</param>
|
||||
<param name="clearCallbacks">If TRUE (recommended) removes all callbacks (OnComplete/Rewind/etc)</param>
|
||||
<param name="preventAutoKill">If TRUE prevents the tween from being auto-killed at completion</param>
|
||||
<param name="andPlay">If TRUE starts playing the tween immediately</param>
|
||||
</member>
|
||||
<member name="F:DG.DOTweenEditor.EditorVersion.Version">
|
||||
<summary>Full major version + first minor version (ex: 2018.1f)</summary>
|
||||
</member>
|
||||
<member name="F:DG.DOTweenEditor.EditorVersion.MajorVersion">
|
||||
<summary>Major version</summary>
|
||||
</member>
|
||||
<member name="F:DG.DOTweenEditor.EditorVersion.MinorVersion">
|
||||
<summary>First minor version (ex: in 2018.1 it would be 1)</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.SetEditorTexture(UnityEngine.Texture2D,UnityEngine.FilterMode,System.Int32)">
|
||||
<summary>
|
||||
Checks that the given editor texture use the correct import settings,
|
||||
and applies them if they're incorrect.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.DOTweenSetupRequired">
|
||||
<summary>
|
||||
Returns TRUE if setup is required
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.AssetExists(System.String)">
|
||||
<summary>
|
||||
Returns TRUE if the file/directory at the given path exists.
|
||||
</summary>
|
||||
<param name="adbPath">Path, relative to Unity's project folder</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.ADBPathToFullPath(System.String)">
|
||||
<summary>
|
||||
Converts the given project-relative path to a full path,
|
||||
with backward (\) slashes).
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.FullPathToADBPath(System.String)">
|
||||
<summary>
|
||||
Converts the given full path to a path usable with AssetDatabase methods
|
||||
(relative to Unity's project folder, and with the correct Unity forward (/) slashes).
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.ConnectToSourceAsset``1(System.String,System.Boolean)">
|
||||
<summary>
|
||||
Connects to a <see cref="T:UnityEngine.ScriptableObject"/> asset.
|
||||
If the asset already exists at the given path, loads it and returns it.
|
||||
Otherwise, either returns NULL or automatically creates it before loading and returning it
|
||||
(depending on the given parameters).
|
||||
</summary>
|
||||
<typeparam name="T">Asset type</typeparam>
|
||||
<param name="adbFilePath">File path (relative to Unity's project folder)</param>
|
||||
<param name="createIfMissing">If TRUE and the requested asset doesn't exist, forces its creation</param>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.GetAssemblyFilePath(System.Reflection.Assembly)">
|
||||
<summary>
|
||||
Full path for the given loaded assembly, assembly file included
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.AddGlobalDefine(System.String)">
|
||||
<summary>
|
||||
Adds the given global define if it's not already present
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.RemoveGlobalDefine(System.String)">
|
||||
<summary>
|
||||
Removes the given global define if it's present
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:DG.DOTweenEditor.EditorUtils.HasGlobalDefine(System.String,System.Nullable{UnityEditor.BuildTargetGroup})">
|
||||
<summary>
|
||||
Returns TRUE if the given global define is present in all the <see cref="T:UnityEditor.BuildTargetGroup"/>
|
||||
or only in the given <see cref="T:UnityEditor.BuildTargetGroup"/>, depending on passed parameters.<para/>
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<param name="buildTargetGroup"><see cref="T:UnityEditor.BuildTargetGroup"/>to use. Leave NULL to check in all of them.</param>
|
||||
</member>
|
||||
<member name="T:DG.DOTweenEditor.DOTweenDefines">
|
||||
<summary>
|
||||
Not used as menu item anymore, but as a utility function
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:DG.DOTweenEditor.UnityEditorVersion.Version">
|
||||
<summary>Full major version + first minor version (ex: 2018.1f)</summary>
|
||||
</member>
|
||||
<member name="F:DG.DOTweenEditor.UnityEditorVersion.MajorVersion">
|
||||
<summary>Major version</summary>
|
||||
</member>
|
||||
<member name="F:DG.DOTweenEditor.UnityEditorVersion.MinorVersion">
|
||||
<summary>First minor version (ex: in 2018.1 it would be 1)</summary>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: a3b2ae74fd9a8e14ba009bf186d857b4
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 3dcd4aa6b33279f4a8dee4d043d11fde
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,33 @@
|
|||
fileFormatVersion: 2
|
||||
guid: b8651264cfd330c429b7aba333184a46
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 75ec2295e38406d4ca7d3da6e2490d62
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
|
@ -0,0 +1,127 @@
|
|||
fileFormatVersion: 2
|
||||
guid: a468423a8d4d59549b9515009f68d479
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
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
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 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
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
After Width: | Height: | Size: 319 B |
|
@ -0,0 +1,127 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 431f682345954f64ea3f62b140b4af34
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
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
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 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
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
|
@ -0,0 +1,127 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 4e6390733bd97be4fae0332289cca833
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 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: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 2
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 256
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 0
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
|
@ -0,0 +1,127 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 87963014ad9d16b42a59eb99f850c255
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
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
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 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
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
|
@ -0,0 +1,127 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 032c2ac9096e25c4db0e8a4bf95bce47
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 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: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 2
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 512
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 0
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: bea948af3f04ef34d90aac3117ac5fb5
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,198 @@
|
|||
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
// Created: 2018/07/13
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
using System;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Audio; // Required for AudioMixer
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModuleAudio
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
#region Audio
|
||||
|
||||
/// <summary>Tweens an AudioSource's volume to the given value.
|
||||
/// Also stores the AudioSource as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach (0 to 1)</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<float, float, FloatOptions> DOFade(this AudioSource target, float endValue, float duration)
|
||||
{
|
||||
if (endValue < 0) endValue = 0;
|
||||
else if (endValue > 1) endValue = 1;
|
||||
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.volume, x => target.volume = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens an AudioSource's pitch to the given value.
|
||||
/// Also stores the AudioSource as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<float, float, FloatOptions> DOPitch(this AudioSource target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.pitch, x => target.pitch = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region AudioMixer
|
||||
|
||||
/// <summary>Tweens an AudioMixer's exposed float to the given value.
|
||||
/// Also stores the AudioMixer as the tween's target so it can be used for filtered operations.
|
||||
/// Note that you need to manually expose a float in an AudioMixerGroup in order to be able to tween it from an AudioMixer.</summary>
|
||||
/// <param name="floatName">Name given to the exposed float to set</param>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<float, float, FloatOptions> DOSetFloat(this AudioMixer target, string floatName, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<float, float, FloatOptions> t = DOTween.To(()=> {
|
||||
float currVal;
|
||||
target.GetFloat(floatName, out currVal);
|
||||
return currVal;
|
||||
}, x=> target.SetFloat(floatName, x), endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#region Operation Shortcuts
|
||||
|
||||
/// <summary>
|
||||
/// Completes all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens completed
|
||||
/// (meaning the tweens that don't have infinite loops and were not already complete)
|
||||
/// </summary>
|
||||
/// <param name="withCallbacks">For Sequences only: if TRUE also internal Sequence callbacks will be fired,
|
||||
/// otherwise they will be ignored</param>
|
||||
public static int DOComplete(this AudioMixer target, bool withCallbacks = false)
|
||||
{
|
||||
return DOTween.Complete(target, withCallbacks);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Kills all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens killed.
|
||||
/// </summary>
|
||||
/// <param name="complete">If TRUE completes the tween before killing it</param>
|
||||
public static int DOKill(this AudioMixer target, bool complete = false)
|
||||
{
|
||||
return DOTween.Kill(target, complete);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens flipped.
|
||||
/// </summary>
|
||||
public static int DOFlip(this AudioMixer target)
|
||||
{
|
||||
return DOTween.Flip(target);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends to the given position all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens involved.
|
||||
/// </summary>
|
||||
/// <param name="to">Time position to reach
|
||||
/// (if higher than the whole tween duration the tween will simply reach its end)</param>
|
||||
/// <param name="andPlay">If TRUE will play the tween after reaching the given position, otherwise it will pause it</param>
|
||||
public static int DOGoto(this AudioMixer target, float to, bool andPlay = false)
|
||||
{
|
||||
return DOTween.Goto(target, to, andPlay);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Pauses all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens paused.
|
||||
/// </summary>
|
||||
public static int DOPause(this AudioMixer target)
|
||||
{
|
||||
return DOTween.Pause(target);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Plays all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens played.
|
||||
/// </summary>
|
||||
public static int DOPlay(this AudioMixer target)
|
||||
{
|
||||
return DOTween.Play(target);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Plays backwards all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens played.
|
||||
/// </summary>
|
||||
public static int DOPlayBackwards(this AudioMixer target)
|
||||
{
|
||||
return DOTween.PlayBackwards(target);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Plays forward all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens played.
|
||||
/// </summary>
|
||||
public static int DOPlayForward(this AudioMixer target)
|
||||
{
|
||||
return DOTween.PlayForward(target);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Restarts all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens restarted.
|
||||
/// </summary>
|
||||
public static int DORestart(this AudioMixer target)
|
||||
{
|
||||
return DOTween.Restart(target);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Rewinds all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens rewinded.
|
||||
/// </summary>
|
||||
public static int DORewind(this AudioMixer target)
|
||||
{
|
||||
return DOTween.Rewind(target);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Smoothly rewinds all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens rewinded.
|
||||
/// </summary>
|
||||
public static int DOSmoothRewind(this AudioMixer target)
|
||||
{
|
||||
return DOTween.SmoothRewind(target);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference
|
||||
/// (meaning tweens that were started from this target, or that had this target added as an Id)
|
||||
/// and returns the total number of tweens involved.
|
||||
/// </summary>
|
||||
public static int DOTogglePause(this AudioMixer target)
|
||||
{
|
||||
return DOTween.TogglePause(target);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 08316b88882678c478f093087890cb74
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,146 @@
|
|||
using UnityEngine;
|
||||
|
||||
#if false || EPO_DOTWEEN // MODULE_MARKER
|
||||
|
||||
using EPOOutline;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using DG.Tweening;
|
||||
using DG.Tweening.Core;
|
||||
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModuleEPOOutline
|
||||
{
|
||||
public static int DOKill(this SerializedPass target, bool complete)
|
||||
{
|
||||
return DOTween.Kill(target, complete);
|
||||
}
|
||||
|
||||
public static TweenerCore<float, float, FloatOptions> DOFloat(this SerializedPass target, string propertyName, float endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.GetFloat(propertyName), x => target.SetFloat(propertyName, x), endValue, duration);
|
||||
tweener.SetOptions(true).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOFade(this SerializedPass target, string propertyName, float endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.ToAlpha(() => target.GetColor(propertyName), x => target.SetColor(propertyName, x), endValue, duration);
|
||||
tweener.SetOptions(true).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOColor(this SerializedPass target, string propertyName, Color endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.GetColor(propertyName), x => target.SetColor(propertyName, x), endValue, duration);
|
||||
tweener.SetOptions(false).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
public static TweenerCore<Vector4, Vector4, VectorOptions> DOVector(this SerializedPass target, string propertyName, Vector4 endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.GetVector(propertyName), x => target.SetVector(propertyName, x), endValue, duration);
|
||||
tweener.SetOptions(false).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
public static TweenerCore<float, float, FloatOptions> DOFloat(this SerializedPass target, int propertyId, float endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.GetFloat(propertyId), x => target.SetFloat(propertyId, x), endValue, duration);
|
||||
tweener.SetOptions(true).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOFade(this SerializedPass target, int propertyId, float endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.ToAlpha(() => target.GetColor(propertyId), x => target.SetColor(propertyId, x), endValue, duration);
|
||||
tweener.SetOptions(true).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOColor(this SerializedPass target, int propertyId, Color endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.GetColor(propertyId), x => target.SetColor(propertyId, x), endValue, duration);
|
||||
tweener.SetOptions(false).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
public static TweenerCore<Vector4, Vector4, VectorOptions> DOVector(this SerializedPass target, int propertyId, Vector4 endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.GetVector(propertyId), x => target.SetVector(propertyId, x), endValue, duration);
|
||||
tweener.SetOptions(false).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
public static int DOKill(this Outlinable.OutlineProperties target, bool complete = false)
|
||||
{
|
||||
return DOTween.Kill(target, complete);
|
||||
}
|
||||
|
||||
public static int DOKill(this Outliner target, bool complete = false)
|
||||
{
|
||||
return DOTween.Kill(target, complete);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls the alpha (transparency) of the outline
|
||||
/// </summary>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Outlinable.OutlineProperties target, float endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.ToAlpha(() => target.Color, x => target.Color = x, endValue, duration);
|
||||
tweener.SetOptions(true).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls the color of the outline
|
||||
/// </summary>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Outlinable.OutlineProperties target, Color endValue, float duration)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.Color, x => target.Color = x, endValue, duration);
|
||||
tweener.SetOptions(false).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls the amount of blur applied to the outline
|
||||
/// </summary>
|
||||
public static TweenerCore<float, float, FloatOptions> DOBlurShift(this Outlinable.OutlineProperties target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.BlurShift, x => target.BlurShift = x, endValue, duration);
|
||||
tweener.SetOptions(snapping).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls the amount of blur applied to the outline
|
||||
/// </summary>
|
||||
public static TweenerCore<float, float, FloatOptions> DOBlurShift(this Outliner target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.BlurShift, x => target.BlurShift = x, endValue, duration);
|
||||
tweener.SetOptions(snapping).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls the amount of dilation applied to the outline
|
||||
/// </summary>
|
||||
public static TweenerCore<float, float, FloatOptions> DODilateShift(this Outlinable.OutlineProperties target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.DilateShift, x => target.DilateShift = x, endValue, duration);
|
||||
tweener.SetOptions(snapping).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls the amount of dilation applied to the outline
|
||||
/// </summary>
|
||||
public static TweenerCore<float, float, FloatOptions> DODilateShift(this Outliner target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
var tweener = DOTween.To(() => target.DilateShift, x => target.DilateShift = x, endValue, duration);
|
||||
tweener.SetOptions(snapping).SetTarget(target);
|
||||
return tweener;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 1ea379e2ae548dc4388fa2c5caad4de8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,216 @@
|
|||
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
// Created: 2018/07/13
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
using System;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Core.Enums;
|
||||
using DG.Tweening.Plugins;
|
||||
using DG.Tweening.Plugins.Core.PathCore;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using UnityEngine;
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModulePhysics
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
#region Rigidbody
|
||||
|
||||
/// <summary>Tweens a Rigidbody's position to the given value.
|
||||
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector3, Vector3, VectorOptions> DOMove(this Rigidbody target, Vector3 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody's X position to the given value.
|
||||
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector3, Vector3, VectorOptions> DOMoveX(this Rigidbody target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue, 0, 0), duration);
|
||||
t.SetOptions(AxisConstraint.X, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody's Y position to the given value.
|
||||
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector3, Vector3, VectorOptions> DOMoveY(this Rigidbody target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, endValue, 0), duration);
|
||||
t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody's Z position to the given value.
|
||||
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector3, Vector3, VectorOptions> DOMoveZ(this Rigidbody target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue), duration);
|
||||
t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody's rotation to the given value.
|
||||
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="mode">Rotation mode</param>
|
||||
public static TweenerCore<Quaternion, Vector3, QuaternionOptions> DORotate(this Rigidbody target, Vector3 endValue, float duration, RotateMode mode = RotateMode.Fast)
|
||||
{
|
||||
TweenerCore<Quaternion, Vector3, QuaternionOptions> t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
t.plugOptions.rotateMode = mode;
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody's rotation so that it will look towards the given position.
|
||||
/// Also stores the rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="towards">The position to look at</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="axisConstraint">Eventual axis constraint for the rotation</param>
|
||||
/// <param name="up">The vector that defines in which direction up is (default: Vector3.up)</param>
|
||||
public static TweenerCore<Quaternion, Vector3, QuaternionOptions> DOLookAt(this Rigidbody target, Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3? up = null)
|
||||
{
|
||||
TweenerCore<Quaternion, Vector3, QuaternionOptions> t = DOTween.To(() => target.rotation, target.MoveRotation, towards, duration)
|
||||
.SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetLookAt);
|
||||
t.plugOptions.axisConstraint = axisConstraint;
|
||||
t.plugOptions.up = (up == null) ? Vector3.up : (Vector3)up;
|
||||
return t;
|
||||
}
|
||||
|
||||
#region Special
|
||||
|
||||
/// <summary>Tweens a Rigidbody's position to the given value, while also applying a jump effect along the Y axis.
|
||||
/// Returns a Sequence instead of a Tweener.
|
||||
/// Also stores the Rigidbody as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param>
|
||||
/// <param name="jumpPower">Power of the jump (the max height of the jump is represented by this plus the final Y offset)</param>
|
||||
/// <param name="numJumps">Total number of jumps</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static Sequence DOJump(this Rigidbody target, Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping = false)
|
||||
{
|
||||
if (numJumps < 1) numJumps = 1;
|
||||
float startPosY = 0;
|
||||
float offsetY = -1;
|
||||
bool offsetYSet = false;
|
||||
Sequence s = DOTween.Sequence();
|
||||
Tween yTween = DOTween.To(() => target.position, target.MovePosition, new Vector3(0, jumpPower, 0), duration / (numJumps * 2))
|
||||
.SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative()
|
||||
.SetLoops(numJumps * 2, LoopType.Yoyo)
|
||||
.OnStart(() => startPosY = target.position.y);
|
||||
s.Append(DOTween.To(() => target.position, target.MovePosition, new Vector3(endValue.x, 0, 0), duration)
|
||||
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear)
|
||||
).Join(DOTween.To(() => target.position, target.MovePosition, new Vector3(0, 0, endValue.z), duration)
|
||||
.SetOptions(AxisConstraint.Z, snapping).SetEase(Ease.Linear)
|
||||
).Join(yTween)
|
||||
.SetTarget(target).SetEase(DOTween.defaultEaseType);
|
||||
yTween.OnUpdate(() => {
|
||||
if (!offsetYSet) {
|
||||
offsetYSet = true;
|
||||
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY;
|
||||
}
|
||||
Vector3 pos = target.position;
|
||||
pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad);
|
||||
target.MovePosition(pos);
|
||||
});
|
||||
return s;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody's position through the given path waypoints, using the chosen path algorithm.
|
||||
/// Also stores the Rigidbody as the tween's target so it can be used for filtered operations.
|
||||
/// <para>NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened.</para>
|
||||
/// <para>BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug).
|
||||
/// If you plan to publish there you should use a regular transform.DOPath.</para></summary>
|
||||
/// <param name="path">The waypoints to go through</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="pathType">The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points)</param>
|
||||
/// <param name="pathMode">The path mode: 3D, side-scroller 2D, top-down 2D</param>
|
||||
/// <param name="resolution">The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive.
|
||||
/// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints</param>
|
||||
/// <param name="gizmoColor">The color of the path (shown when gizmos are active in the Play panel and the tween is running)</param>
|
||||
public static TweenerCore<Vector3, Path, PathOptions> DOPath(
|
||||
this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear,
|
||||
PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null
|
||||
)
|
||||
{
|
||||
if (resolution < 1) resolution = 1;
|
||||
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, new Path(pathType, path, resolution, gizmoColor), duration)
|
||||
.SetTarget(target).SetUpdate(UpdateType.Fixed);
|
||||
|
||||
t.plugOptions.isRigidbody = true;
|
||||
t.plugOptions.mode = pathMode;
|
||||
return t;
|
||||
}
|
||||
/// <summary>Tweens a Rigidbody's localPosition through the given path waypoints, using the chosen path algorithm.
|
||||
/// Also stores the Rigidbody as the tween's target so it can be used for filtered operations
|
||||
/// <para>NOTE: to tween a rigidbody correctly it should be set to kinematic at least while being tweened.</para>
|
||||
/// <para>BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug).
|
||||
/// If you plan to publish there you should use a regular transform.DOLocalPath.</para></summary>
|
||||
/// <param name="path">The waypoint to go through</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="pathType">The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points)</param>
|
||||
/// <param name="pathMode">The path mode: 3D, side-scroller 2D, top-down 2D</param>
|
||||
/// <param name="resolution">The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive.
|
||||
/// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints</param>
|
||||
/// <param name="gizmoColor">The color of the path (shown when gizmos are active in the Play panel and the tween is running)</param>
|
||||
public static TweenerCore<Vector3, Path, PathOptions> DOLocalPath(
|
||||
this Rigidbody target, Vector3[] path, float duration, PathType pathType = PathType.Linear,
|
||||
PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null
|
||||
)
|
||||
{
|
||||
if (resolution < 1) resolution = 1;
|
||||
Transform trans = target.transform;
|
||||
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path, resolution, gizmoColor), duration)
|
||||
.SetTarget(target).SetUpdate(UpdateType.Fixed);
|
||||
|
||||
t.plugOptions.isRigidbody = true;
|
||||
t.plugOptions.mode = pathMode;
|
||||
t.plugOptions.useLocalPosition = true;
|
||||
return t;
|
||||
}
|
||||
// Used by path editor when creating the actual tween, so it can pass a pre-compiled path
|
||||
internal static TweenerCore<Vector3, Path, PathOptions> DOPath(
|
||||
this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D
|
||||
)
|
||||
{
|
||||
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => target.position, target.MovePosition, path, duration)
|
||||
.SetTarget(target);
|
||||
|
||||
t.plugOptions.isRigidbody = true;
|
||||
t.plugOptions.mode = pathMode;
|
||||
return t;
|
||||
}
|
||||
internal static TweenerCore<Vector3, Path, PathOptions> DOLocalPath(
|
||||
this Rigidbody target, Path path, float duration, PathMode pathMode = PathMode.Full3D
|
||||
)
|
||||
{
|
||||
Transform trans = target.transform;
|
||||
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), path, duration)
|
||||
.SetTarget(target);
|
||||
|
||||
t.plugOptions.isRigidbody = true;
|
||||
t.plugOptions.mode = pathMode;
|
||||
t.plugOptions.useLocalPosition = true;
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6686ce3275e2cdd4abbd5d5557cb249b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,193 @@
|
|||
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
// Created: 2018/07/13
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
using System;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins;
|
||||
using DG.Tweening.Plugins.Core.PathCore;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using UnityEngine;
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModulePhysics2D
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
#region Rigidbody2D Shortcuts
|
||||
|
||||
/// <summary>Tweens a Rigidbody2D's position to the given value.
|
||||
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOMove(this Rigidbody2D target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody2D's X position to the given value.
|
||||
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOMoveX(this Rigidbody2D target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector2(endValue, 0), duration);
|
||||
t.SetOptions(AxisConstraint.X, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody2D's Y position to the given value.
|
||||
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOMoveY(this Rigidbody2D target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.position, target.MovePosition, new Vector2(0, endValue), duration);
|
||||
t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody2D's rotation to the given value.
|
||||
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<float, float, FloatOptions> DORotate(this Rigidbody2D target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.rotation, target.MoveRotation, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#region Special
|
||||
|
||||
/// <summary>Tweens a Rigidbody2D's position to the given value, while also applying a jump effect along the Y axis.
|
||||
/// Returns a Sequence instead of a Tweener.
|
||||
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations.
|
||||
/// <para>IMPORTANT: a rigidbody2D can't be animated in a jump arc using MovePosition, so the tween will directly set the position</para></summary>
|
||||
/// <param name="endValue">The end value to reach</param>
|
||||
/// <param name="jumpPower">Power of the jump (the max height of the jump is represented by this plus the final Y offset)</param>
|
||||
/// <param name="numJumps">Total number of jumps</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static Sequence DOJump(this Rigidbody2D target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false)
|
||||
{
|
||||
if (numJumps < 1) numJumps = 1;
|
||||
float startPosY = 0;
|
||||
float offsetY = -1;
|
||||
bool offsetYSet = false;
|
||||
Sequence s = DOTween.Sequence();
|
||||
Tween yTween = DOTween.To(() => target.position, x => target.position = x, new Vector2(0, jumpPower), duration / (numJumps * 2))
|
||||
.SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative()
|
||||
.SetLoops(numJumps * 2, LoopType.Yoyo)
|
||||
.OnStart(() => startPosY = target.position.y);
|
||||
s.Append(DOTween.To(() => target.position, x => target.position = x, new Vector2(endValue.x, 0), duration)
|
||||
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear)
|
||||
).Join(yTween)
|
||||
.SetTarget(target).SetEase(DOTween.defaultEaseType);
|
||||
yTween.OnUpdate(() => {
|
||||
if (!offsetYSet) {
|
||||
offsetYSet = true;
|
||||
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY;
|
||||
}
|
||||
Vector3 pos = target.position;
|
||||
pos.y += DOVirtual.EasedValue(0, offsetY, yTween.ElapsedPercentage(), Ease.OutQuad);
|
||||
target.MovePosition(pos);
|
||||
});
|
||||
return s;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Rigidbody2D's position through the given path waypoints, using the chosen path algorithm.
|
||||
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations.
|
||||
/// <para>NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened.</para>
|
||||
/// <para>BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug).
|
||||
/// If you plan to publish there you should use a regular transform.DOPath.</para></summary>
|
||||
/// <param name="path">The waypoints to go through</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="pathType">The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points)</param>
|
||||
/// <param name="pathMode">The path mode: 3D, side-scroller 2D, top-down 2D</param>
|
||||
/// <param name="resolution">The resolution of the path (useless in case of Linear paths): higher resolutions make for more detailed curved paths but are more expensive.
|
||||
/// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints</param>
|
||||
/// <param name="gizmoColor">The color of the path (shown when gizmos are active in the Play panel and the tween is running)</param>
|
||||
public static TweenerCore<Vector3, Path, PathOptions> DOPath(
|
||||
this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear,
|
||||
PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null
|
||||
)
|
||||
{
|
||||
if (resolution < 1) resolution = 1;
|
||||
int len = path.Length;
|
||||
Vector3[] path3D = new Vector3[len];
|
||||
for (int i = 0; i < len; ++i) path3D[i] = path[i];
|
||||
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => target.position, x => target.MovePosition(x), new Path(pathType, path3D, resolution, gizmoColor), duration)
|
||||
.SetTarget(target).SetUpdate(UpdateType.Fixed);
|
||||
|
||||
t.plugOptions.isRigidbody2D = true;
|
||||
t.plugOptions.mode = pathMode;
|
||||
return t;
|
||||
}
|
||||
/// <summary>Tweens a Rigidbody2D's localPosition through the given path waypoints, using the chosen path algorithm.
|
||||
/// Also stores the Rigidbody2D as the tween's target so it can be used for filtered operations
|
||||
/// <para>NOTE: to tween a Rigidbody2D correctly it should be set to kinematic at least while being tweened.</para>
|
||||
/// <para>BEWARE: doesn't work on Windows Phone store (waiting for Unity to fix their own bug).
|
||||
/// If you plan to publish there you should use a regular transform.DOLocalPath.</para></summary>
|
||||
/// <param name="path">The waypoint to go through</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="pathType">The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points)</param>
|
||||
/// <param name="pathMode">The path mode: 3D, side-scroller 2D, top-down 2D</param>
|
||||
/// <param name="resolution">The resolution of the path: higher resolutions make for more detailed curved paths but are more expensive.
|
||||
/// Defaults to 10, but a value of 5 is usually enough if you don't have dramatic long curves between waypoints</param>
|
||||
/// <param name="gizmoColor">The color of the path (shown when gizmos are active in the Play panel and the tween is running)</param>
|
||||
public static TweenerCore<Vector3, Path, PathOptions> DOLocalPath(
|
||||
this Rigidbody2D target, Vector2[] path, float duration, PathType pathType = PathType.Linear,
|
||||
PathMode pathMode = PathMode.Full3D, int resolution = 10, Color? gizmoColor = null
|
||||
)
|
||||
{
|
||||
if (resolution < 1) resolution = 1;
|
||||
int len = path.Length;
|
||||
Vector3[] path3D = new Vector3[len];
|
||||
for (int i = 0; i < len; ++i) path3D[i] = path[i];
|
||||
Transform trans = target.transform;
|
||||
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), new Path(pathType, path3D, resolution, gizmoColor), duration)
|
||||
.SetTarget(target).SetUpdate(UpdateType.Fixed);
|
||||
|
||||
t.plugOptions.isRigidbody2D = true;
|
||||
t.plugOptions.mode = pathMode;
|
||||
t.plugOptions.useLocalPosition = true;
|
||||
return t;
|
||||
}
|
||||
// Used by path editor when creating the actual tween, so it can pass a pre-compiled path
|
||||
internal static TweenerCore<Vector3, Path, PathOptions> DOPath(
|
||||
this Rigidbody2D target, Path path, float duration, PathMode pathMode = PathMode.Full3D
|
||||
)
|
||||
{
|
||||
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => target.position, x => target.MovePosition(x), path, duration)
|
||||
.SetTarget(target);
|
||||
|
||||
t.plugOptions.isRigidbody2D = true;
|
||||
t.plugOptions.mode = pathMode;
|
||||
return t;
|
||||
}
|
||||
internal static TweenerCore<Vector3, Path, PathOptions> DOLocalPath(
|
||||
this Rigidbody2D target, Path path, float duration, PathMode pathMode = PathMode.Full3D
|
||||
)
|
||||
{
|
||||
Transform trans = target.transform;
|
||||
TweenerCore<Vector3, Path, PathOptions> t = DOTween.To(PathPlugin.Get(), () => trans.localPosition, x => target.MovePosition(trans.parent == null ? x : trans.parent.TransformPoint(x)), path, duration)
|
||||
.SetTarget(target);
|
||||
|
||||
t.plugOptions.isRigidbody2D = true;
|
||||
t.plugOptions.mode = pathMode;
|
||||
t.plugOptions.useLocalPosition = true;
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 545da64eeffb52a498ad13f6390274e9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,93 @@
|
|||
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
// Created: 2018/07/13
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModuleSprite
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
#region SpriteRenderer
|
||||
|
||||
/// <summary>Tweens a SpriteRenderer's color to the given value.
|
||||
/// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOColor(this SpriteRenderer target, Color endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Material's alpha color to the given value.
|
||||
/// Also stores the spriteRenderer as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOFade(this SpriteRenderer target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a SpriteRenderer's color using the given gradient
|
||||
/// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener).
|
||||
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="gradient">The gradient to use</param><param name="duration">The duration of the tween</param>
|
||||
public static Sequence DOGradientColor(this SpriteRenderer target, Gradient gradient, float duration)
|
||||
{
|
||||
Sequence s = DOTween.Sequence();
|
||||
GradientColorKey[] colors = gradient.colorKeys;
|
||||
int len = colors.Length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
GradientColorKey c = colors[i];
|
||||
if (i == 0 && c.time <= 0) {
|
||||
target.color = c.color;
|
||||
continue;
|
||||
}
|
||||
float colorDuration = i == len - 1
|
||||
? duration - s.Duration(false) // Verifies that total duration is correct
|
||||
: duration * (i == 0 ? c.time : c.time - colors[i - 1].time);
|
||||
s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear));
|
||||
}
|
||||
s.SetTarget(target);
|
||||
return s;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Blendables
|
||||
|
||||
#region SpriteRenderer
|
||||
|
||||
/// <summary>Tweens a SpriteRenderer's color to the given value,
|
||||
/// in a way that allows other DOBlendableColor tweens to work together on the same target,
|
||||
/// instead than fight each other as multiple DOColor would do.
|
||||
/// Also stores the SpriteRenderer as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The value to tween to</param><param name="duration">The duration of the tween</param>
|
||||
public static Tweener DOBlendableColor(this SpriteRenderer target, Color endValue, float duration)
|
||||
{
|
||||
endValue = endValue - target.color;
|
||||
Color to = new Color(0, 0, 0, 0);
|
||||
return DOTween.To(() => to, x => {
|
||||
Color diff = x - to;
|
||||
to = x;
|
||||
target.color += diff;
|
||||
}, endValue, duration)
|
||||
.Blendable().SetTarget(target);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: cc99c247524e74c46a2036e5bc0b8b42
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,662 @@
|
|||
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
// Created: 2018/07/13
|
||||
|
||||
#if true // MODULE_MARKER
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Core.Enums;
|
||||
using DG.Tweening.Plugins;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
using Outline = UnityEngine.UI.Outline;
|
||||
using Text = UnityEngine.UI.Text;
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
public static class DOTweenModuleUI
|
||||
{
|
||||
#region Shortcuts
|
||||
|
||||
#region CanvasGroup
|
||||
|
||||
/// <summary>Tweens a CanvasGroup's alpha color to the given value.
|
||||
/// Also stores the canvasGroup as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<float, float, FloatOptions> DOFade(this CanvasGroup target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.alpha, x => target.alpha = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Graphic
|
||||
|
||||
/// <summary>Tweens an Graphic's color to the given value.
|
||||
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Graphic target, Color endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens an Graphic's alpha color to the given value.
|
||||
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Graphic target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Image
|
||||
|
||||
/// <summary>Tweens an Image's color to the given value.
|
||||
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Image target, Color endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens an Image's alpha color to the given value.
|
||||
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Image target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens an Image's fillAmount to the given value.
|
||||
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach (0 to 1)</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<float, float, FloatOptions> DOFillAmount(this Image target, float endValue, float duration)
|
||||
{
|
||||
if (endValue > 1) endValue = 1;
|
||||
else if (endValue < 0) endValue = 0;
|
||||
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.fillAmount, x => target.fillAmount = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens an Image's colors using the given gradient
|
||||
/// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener).
|
||||
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="gradient">The gradient to use</param><param name="duration">The duration of the tween</param>
|
||||
public static Sequence DOGradientColor(this Image target, Gradient gradient, float duration)
|
||||
{
|
||||
Sequence s = DOTween.Sequence();
|
||||
GradientColorKey[] colors = gradient.colorKeys;
|
||||
int len = colors.Length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
GradientColorKey c = colors[i];
|
||||
if (i == 0 && c.time <= 0) {
|
||||
target.color = c.color;
|
||||
continue;
|
||||
}
|
||||
float colorDuration = i == len - 1
|
||||
? duration - s.Duration(false) // Verifies that total duration is correct
|
||||
: duration * (i == 0 ? c.time : c.time - colors[i - 1].time);
|
||||
s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear));
|
||||
}
|
||||
s.SetTarget(target);
|
||||
return s;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region LayoutElement
|
||||
|
||||
/// <summary>Tweens an LayoutElement's flexibleWidth/Height to the given value.
|
||||
/// Also stores the LayoutElement as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOFlexibleSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.flexibleWidth, target.flexibleHeight), x => {
|
||||
target.flexibleWidth = x.x;
|
||||
target.flexibleHeight = x.y;
|
||||
}, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens an LayoutElement's minWidth/Height to the given value.
|
||||
/// Also stores the LayoutElement as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOMinSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.minWidth, target.minHeight), x => {
|
||||
target.minWidth = x.x;
|
||||
target.minHeight = x.y;
|
||||
}, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens an LayoutElement's preferredWidth/Height to the given value.
|
||||
/// Also stores the LayoutElement as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOPreferredSize(this LayoutElement target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => new Vector2(target.preferredWidth, target.preferredHeight), x => {
|
||||
target.preferredWidth = x.x;
|
||||
target.preferredHeight = x.y;
|
||||
}, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Outline
|
||||
|
||||
/// <summary>Tweens a Outline's effectColor to the given value.
|
||||
/// Also stores the Outline as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Outline target, Color endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.effectColor, x => target.effectColor = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Outline's effectColor alpha to the given value.
|
||||
/// Also stores the Outline as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Outline target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.effectColor, x => target.effectColor = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Outline's effectDistance to the given value.
|
||||
/// Also stores the Outline as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOScale(this Outline target, Vector2 endValue, float duration)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.effectDistance, x => target.effectDistance = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region RectTransform
|
||||
|
||||
/// <summary>Tweens a RectTransform's anchoredPosition to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorPos(this RectTransform target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
/// <summary>Tweens a RectTransform's anchoredPosition X to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorPosX(this RectTransform target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue, 0), duration);
|
||||
t.SetOptions(AxisConstraint.X, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
/// <summary>Tweens a RectTransform's anchoredPosition Y to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorPosY(this RectTransform target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, endValue), duration);
|
||||
t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a RectTransform's anchoredPosition3D to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector3, Vector3, VectorOptions> DOAnchorPos3D(this RectTransform target, Vector3 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
/// <summary>Tweens a RectTransform's anchoredPosition3D X to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector3, Vector3, VectorOptions> DOAnchorPos3DX(this RectTransform target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(endValue, 0, 0), duration);
|
||||
t.SetOptions(AxisConstraint.X, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
/// <summary>Tweens a RectTransform's anchoredPosition3D Y to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector3, Vector3, VectorOptions> DOAnchorPos3DY(this RectTransform target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, endValue, 0), duration);
|
||||
t.SetOptions(AxisConstraint.Y, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
/// <summary>Tweens a RectTransform's anchoredPosition3D Z to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector3, Vector3, VectorOptions> DOAnchorPos3DZ(this RectTransform target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector3, Vector3, VectorOptions> t = DOTween.To(() => target.anchoredPosition3D, x => target.anchoredPosition3D = x, new Vector3(0, 0, endValue), duration);
|
||||
t.SetOptions(AxisConstraint.Z, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a RectTransform's anchorMax to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorMax(this RectTransform target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchorMax, x => target.anchorMax = x, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a RectTransform's anchorMin to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOAnchorMin(this RectTransform target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.anchorMin, x => target.anchorMin = x, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a RectTransform's pivot to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOPivot(this RectTransform target, Vector2 endValue, float duration)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.pivot, x => target.pivot = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
/// <summary>Tweens a RectTransform's pivot X to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOPivotX(this RectTransform target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(endValue, 0), duration);
|
||||
t.SetOptions(AxisConstraint.X).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
/// <summary>Tweens a RectTransform's pivot Y to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOPivotY(this RectTransform target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.pivot, x => target.pivot = x, new Vector2(0, endValue), duration);
|
||||
t.SetOptions(AxisConstraint.Y).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a RectTransform's sizeDelta to the given value.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOSizeDelta(this RectTransform target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.sizeDelta, x => target.sizeDelta = x, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Punches a RectTransform's anchoredPosition towards the given direction and then back to the starting one
|
||||
/// as if it was connected to the starting position via an elastic.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="punch">The direction and strength of the punch (added to the RectTransform's current position)</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="vibrato">Indicates how much will the punch vibrate</param>
|
||||
/// <param name="elasticity">Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards.
|
||||
/// 1 creates a full oscillation between the punch direction and the opposite direction,
|
||||
/// while 0 oscillates only between the punch and the start position</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static Tweener DOPunchAnchorPos(this RectTransform target, Vector2 punch, float duration, int vibrato = 10, float elasticity = 1, bool snapping = false)
|
||||
{
|
||||
return DOTween.Punch(() => target.anchoredPosition, x => target.anchoredPosition = x, punch, duration, vibrato, elasticity)
|
||||
.SetTarget(target).SetOptions(snapping);
|
||||
}
|
||||
|
||||
/// <summary>Shakes a RectTransform's anchoredPosition with the given values.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="strength">The shake strength</param>
|
||||
/// <param name="vibrato">Indicates how much will the shake vibrate</param>
|
||||
/// <param name="randomness">Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware).
|
||||
/// Setting it to 0 will shake along a single direction.</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
/// <param name="fadeOut">If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not</param>
|
||||
/// <param name="randomnessMode">Randomness mode</param>
|
||||
public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, float strength = 100, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true, ShakeRandomnessMode randomnessMode = ShakeRandomnessMode.Full)
|
||||
{
|
||||
return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, true, fadeOut, randomnessMode)
|
||||
.SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping);
|
||||
}
|
||||
/// <summary>Shakes a RectTransform's anchoredPosition with the given values.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="strength">The shake strength on each axis</param>
|
||||
/// <param name="vibrato">Indicates how much will the shake vibrate</param>
|
||||
/// <param name="randomness">Indicates how much the shake will be random (0 to 180 - values higher than 90 kind of suck, so beware).
|
||||
/// Setting it to 0 will shake along a single direction.</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
/// <param name="fadeOut">If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not</param>
|
||||
/// <param name="randomnessMode">Randomness mode</param>
|
||||
public static Tweener DOShakeAnchorPos(this RectTransform target, float duration, Vector2 strength, int vibrato = 10, float randomness = 90, bool snapping = false, bool fadeOut = true, ShakeRandomnessMode randomnessMode = ShakeRandomnessMode.Full)
|
||||
{
|
||||
return DOTween.Shake(() => target.anchoredPosition, x => target.anchoredPosition = x, duration, strength, vibrato, randomness, fadeOut, randomnessMode)
|
||||
.SetTarget(target).SetSpecialStartupMode(SpecialStartupMode.SetShake).SetOptions(snapping);
|
||||
}
|
||||
|
||||
#region Special
|
||||
|
||||
/// <summary>Tweens a RectTransform's anchoredPosition to the given value, while also applying a jump effect along the Y axis.
|
||||
/// Returns a Sequence instead of a Tweener.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param>
|
||||
/// <param name="jumpPower">Power of the jump (the max height of the jump is represented by this plus the final Y offset)</param>
|
||||
/// <param name="numJumps">Total number of jumps</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static Sequence DOJumpAnchorPos(this RectTransform target, Vector2 endValue, float jumpPower, int numJumps, float duration, bool snapping = false)
|
||||
{
|
||||
if (numJumps < 1) numJumps = 1;
|
||||
float startPosY = 0;
|
||||
float offsetY = -1;
|
||||
bool offsetYSet = false;
|
||||
|
||||
// Separate Y Tween so we can elaborate elapsedPercentage on that insted of on the Sequence
|
||||
// (in case users add a delay or other elements to the Sequence)
|
||||
Sequence s = DOTween.Sequence();
|
||||
Tween yTween = DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(0, jumpPower), duration / (numJumps * 2))
|
||||
.SetOptions(AxisConstraint.Y, snapping).SetEase(Ease.OutQuad).SetRelative()
|
||||
.SetLoops(numJumps * 2, LoopType.Yoyo)
|
||||
.OnStart(()=> startPosY = target.anchoredPosition.y);
|
||||
s.Append(DOTween.To(() => target.anchoredPosition, x => target.anchoredPosition = x, new Vector2(endValue.x, 0), duration)
|
||||
.SetOptions(AxisConstraint.X, snapping).SetEase(Ease.Linear)
|
||||
).Join(yTween)
|
||||
.SetTarget(target).SetEase(DOTween.defaultEaseType);
|
||||
s.OnUpdate(() => {
|
||||
if (!offsetYSet) {
|
||||
offsetYSet = true;
|
||||
offsetY = s.isRelative ? endValue.y : endValue.y - startPosY;
|
||||
}
|
||||
Vector2 pos = target.anchoredPosition;
|
||||
pos.y += DOVirtual.EasedValue(0, offsetY, s.ElapsedDirectionalPercentage(), Ease.OutQuad);
|
||||
target.anchoredPosition = pos;
|
||||
});
|
||||
return s;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#region ScrollRect
|
||||
|
||||
/// <summary>Tweens a ScrollRect's horizontal/verticalNormalizedPosition to the given value.
|
||||
/// Also stores the ScrollRect as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static Tweener DONormalizedPos(this ScrollRect target, Vector2 endValue, float duration, bool snapping = false)
|
||||
{
|
||||
return DOTween.To(() => new Vector2(target.horizontalNormalizedPosition, target.verticalNormalizedPosition),
|
||||
x => {
|
||||
target.horizontalNormalizedPosition = x.x;
|
||||
target.verticalNormalizedPosition = x.y;
|
||||
}, endValue, duration)
|
||||
.SetOptions(snapping).SetTarget(target);
|
||||
}
|
||||
/// <summary>Tweens a ScrollRect's horizontalNormalizedPosition to the given value.
|
||||
/// Also stores the ScrollRect as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static Tweener DOHorizontalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
return DOTween.To(() => target.horizontalNormalizedPosition, x => target.horizontalNormalizedPosition = x, endValue, duration)
|
||||
.SetOptions(snapping).SetTarget(target);
|
||||
}
|
||||
/// <summary>Tweens a ScrollRect's verticalNormalizedPosition to the given value.
|
||||
/// Also stores the ScrollRect as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static Tweener DOVerticalNormalizedPos(this ScrollRect target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
return DOTween.To(() => target.verticalNormalizedPosition, x => target.verticalNormalizedPosition = x, endValue, duration)
|
||||
.SetOptions(snapping).SetTarget(target);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Slider
|
||||
|
||||
/// <summary>Tweens a Slider's value to the given value.
|
||||
/// Also stores the Slider as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<float, float, FloatOptions> DOValue(this Slider target, float endValue, float duration, bool snapping = false)
|
||||
{
|
||||
TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.value, x => target.value = x, endValue, duration);
|
||||
t.SetOptions(snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Text
|
||||
|
||||
/// <summary>Tweens a Text's color to the given value.
|
||||
/// Also stores the Text as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOColor(this Text target, Color endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.To(() => target.color, x => target.color = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tweens a Text's text from one integer to another, with options for thousands separators
|
||||
/// </summary>
|
||||
/// <param name="fromValue">The value to start from</param>
|
||||
/// <param name="endValue">The end value to reach</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="addThousandsSeparator">If TRUE (default) also adds thousands separators</param>
|
||||
/// <param name="culture">The <see cref="CultureInfo"/> to use (InvariantCulture if NULL)</param>
|
||||
public static TweenerCore<int, int, NoOptions> DOCounter(
|
||||
this Text target, int fromValue, int endValue, float duration, bool addThousandsSeparator = true, CultureInfo culture = null
|
||||
){
|
||||
int v = fromValue;
|
||||
CultureInfo cInfo = !addThousandsSeparator ? null : culture ?? CultureInfo.InvariantCulture;
|
||||
TweenerCore<int, int, NoOptions> t = DOTween.To(() => v, x => {
|
||||
v = x;
|
||||
target.text = addThousandsSeparator
|
||||
? v.ToString("N0", cInfo)
|
||||
: v.ToString();
|
||||
}, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Text's alpha color to the given value.
|
||||
/// Also stores the Text as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Color, Color, ColorOptions> DOFade(this Text target, float endValue, float duration)
|
||||
{
|
||||
TweenerCore<Color, Color, ColorOptions> t = DOTween.ToAlpha(() => target.color, x => target.color = x, endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Text's text to the given value.
|
||||
/// Also stores the Text as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end string to tween to</param><param name="duration">The duration of the tween</param>
|
||||
/// <param name="richTextEnabled">If TRUE (default), rich text will be interpreted correctly while animated,
|
||||
/// otherwise all tags will be considered as normal text</param>
|
||||
/// <param name="scrambleMode">The type of scramble mode to use, if any</param>
|
||||
/// <param name="scrambleChars">A string containing the characters to use for scrambling.
|
||||
/// Use as many characters as possible (minimum 10) because DOTween uses a fast scramble mode which gives better results with more characters.
|
||||
/// Leave it to NULL (default) to use default ones</param>
|
||||
public static TweenerCore<string, string, StringOptions> DOText(this Text target, string endValue, float duration, bool richTextEnabled = true, ScrambleMode scrambleMode = ScrambleMode.None, string scrambleChars = null)
|
||||
{
|
||||
if (endValue == null) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogWarning("You can't pass a NULL string to DOText: an empty string will be used instead to avoid errors");
|
||||
endValue = "";
|
||||
}
|
||||
TweenerCore<string, string, StringOptions> t = DOTween.To(() => target.text, x => target.text = x, endValue, duration);
|
||||
t.SetOptions(richTextEnabled, scrambleMode, scrambleChars)
|
||||
.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Blendables
|
||||
|
||||
#region Graphic
|
||||
|
||||
/// <summary>Tweens a Graphic's color to the given value,
|
||||
/// in a way that allows other DOBlendableColor tweens to work together on the same target,
|
||||
/// instead than fight each other as multiple DOColor would do.
|
||||
/// Also stores the Graphic as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The value to tween to</param><param name="duration">The duration of the tween</param>
|
||||
public static Tweener DOBlendableColor(this Graphic target, Color endValue, float duration)
|
||||
{
|
||||
endValue = endValue - target.color;
|
||||
Color to = new Color(0, 0, 0, 0);
|
||||
return DOTween.To(() => to, x => {
|
||||
Color diff = x - to;
|
||||
to = x;
|
||||
target.color += diff;
|
||||
}, endValue, duration)
|
||||
.Blendable().SetTarget(target);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Image
|
||||
|
||||
/// <summary>Tweens a Image's color to the given value,
|
||||
/// in a way that allows other DOBlendableColor tweens to work together on the same target,
|
||||
/// instead than fight each other as multiple DOColor would do.
|
||||
/// Also stores the Image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The value to tween to</param><param name="duration">The duration of the tween</param>
|
||||
public static Tweener DOBlendableColor(this Image target, Color endValue, float duration)
|
||||
{
|
||||
endValue = endValue - target.color;
|
||||
Color to = new Color(0, 0, 0, 0);
|
||||
return DOTween.To(() => to, x => {
|
||||
Color diff = x - to;
|
||||
to = x;
|
||||
target.color += diff;
|
||||
}, endValue, duration)
|
||||
.Blendable().SetTarget(target);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Text
|
||||
|
||||
/// <summary>Tweens a Text's color BY the given value,
|
||||
/// in a way that allows other DOBlendableColor tweens to work together on the same target,
|
||||
/// instead than fight each other as multiple DOColor would do.
|
||||
/// Also stores the Text as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The value to tween to</param><param name="duration">The duration of the tween</param>
|
||||
public static Tweener DOBlendableColor(this Text target, Color endValue, float duration)
|
||||
{
|
||||
endValue = endValue - target.color;
|
||||
Color to = new Color(0, 0, 0, 0);
|
||||
return DOTween.To(() => to, x => {
|
||||
Color diff = x - to;
|
||||
to = x;
|
||||
target.color += diff;
|
||||
}, endValue, duration)
|
||||
.Blendable().SetTarget(target);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#region Shapes
|
||||
|
||||
/// <summary>Tweens a RectTransform's anchoredPosition so that it draws a circle around the given center.
|
||||
/// Also stores the RectTransform as the tween's target so it can be used for filtered operations.<para/>
|
||||
/// IMPORTANT: SetFrom(value) requires a <see cref="Vector2"/> instead of a float, where the X property represents the "from degrees value"</summary>
|
||||
/// <param name="center">Circle-center/pivot around which to rotate (in UI anchoredPosition coordinates)</param>
|
||||
/// <param name="endValueDegrees">The end value degrees to reach (to rotate counter-clockwise pass a negative value)</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
/// <param name="relativeCenter">If TRUE the <see cref="center"/> coordinates will be considered as relative to the target's current anchoredPosition</param>
|
||||
/// <param name="snapping">If TRUE the tween will smoothly snap all values to integers</param>
|
||||
public static TweenerCore<Vector2, Vector2, CircleOptions> DOShapeCircle(
|
||||
this RectTransform target, Vector2 center, float endValueDegrees, float duration, bool relativeCenter = false, bool snapping = false
|
||||
)
|
||||
{
|
||||
TweenerCore<Vector2, Vector2, CircleOptions> t = DOTween.To(
|
||||
CirclePlugin.Get(), () => target.anchoredPosition, x => target.anchoredPosition = x, center, duration
|
||||
);
|
||||
t.SetOptions(endValueDegrees, relativeCenter, snapping).SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
// ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
||||
public static class Utils
|
||||
{
|
||||
/// <summary>
|
||||
/// Converts the anchoredPosition of the first RectTransform to the second RectTransform,
|
||||
/// taking into consideration offset, anchors and pivot, and returns the new anchoredPosition
|
||||
/// </summary>
|
||||
public static Vector2 SwitchToRectTransform(RectTransform from, RectTransform to)
|
||||
{
|
||||
Vector2 localPoint;
|
||||
Vector2 fromPivotDerivedOffset = new Vector2(from.rect.width * 0.5f + from.rect.xMin, from.rect.height * 0.5f + from.rect.yMin);
|
||||
Vector2 screenP = RectTransformUtility.WorldToScreenPoint(null, from.position);
|
||||
screenP += fromPivotDerivedOffset;
|
||||
RectTransformUtility.ScreenPointToLocalPointInRectangle(to, screenP, null, out localPoint);
|
||||
Vector2 pivotDerivedOffset = new Vector2(to.rect.width * 0.5f + to.rect.xMin, to.rect.height * 0.5f + to.rect.yMin);
|
||||
return to.anchoredPosition + localPoint - pivotDerivedOffset;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: b3b53ff0082fc3e489adf16ee160d4f2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,389 @@
|
|||
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
// Created: 2018/07/13
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
//#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0)
|
||||
//using Task = System.Threading.Tasks.Task;
|
||||
//#endif
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
/// <summary>
|
||||
/// Shortcuts/functions that are not strictly related to specific Modules
|
||||
/// but are available only on some Unity versions
|
||||
/// </summary>
|
||||
public static class DOTweenModuleUnityVersion
|
||||
{
|
||||
#region Material
|
||||
|
||||
/// <summary>Tweens a Material's color using the given gradient
|
||||
/// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener).
|
||||
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="gradient">The gradient to use</param><param name="duration">The duration of the tween</param>
|
||||
public static Sequence DOGradientColor(this Material target, Gradient gradient, float duration)
|
||||
{
|
||||
Sequence s = DOTween.Sequence();
|
||||
GradientColorKey[] colors = gradient.colorKeys;
|
||||
int len = colors.Length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
GradientColorKey c = colors[i];
|
||||
if (i == 0 && c.time <= 0) {
|
||||
target.color = c.color;
|
||||
continue;
|
||||
}
|
||||
float colorDuration = i == len - 1
|
||||
? duration - s.Duration(false) // Verifies that total duration is correct
|
||||
: duration * (i == 0 ? c.time : c.time - colors[i - 1].time);
|
||||
s.Append(target.DOColor(c.color, colorDuration).SetEase(Ease.Linear));
|
||||
}
|
||||
s.SetTarget(target);
|
||||
return s;
|
||||
}
|
||||
/// <summary>Tweens a Material's named color property using the given gradient
|
||||
/// (NOTE 1: only uses the colors of the gradient, not the alphas - NOTE 2: creates a Sequence, not a Tweener).
|
||||
/// Also stores the image as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="gradient">The gradient to use</param>
|
||||
/// <param name="property">The name of the material property to tween (like _Tint or _SpecColor)</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
public static Sequence DOGradientColor(this Material target, Gradient gradient, string property, float duration)
|
||||
{
|
||||
Sequence s = DOTween.Sequence();
|
||||
GradientColorKey[] colors = gradient.colorKeys;
|
||||
int len = colors.Length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
GradientColorKey c = colors[i];
|
||||
if (i == 0 && c.time <= 0) {
|
||||
target.SetColor(property, c.color);
|
||||
continue;
|
||||
}
|
||||
float colorDuration = i == len - 1
|
||||
? duration - s.Duration(false) // Verifies that total duration is correct
|
||||
: duration * (i == 0 ? c.time : c.time - colors[i - 1].time);
|
||||
s.Append(target.DOColor(c.color, property, colorDuration).SetEase(Ease.Linear));
|
||||
}
|
||||
s.SetTarget(target);
|
||||
return s;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region CustomYieldInstructions
|
||||
|
||||
/// <summary>
|
||||
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed or complete.
|
||||
/// It can be used inside a coroutine as a yield.
|
||||
/// <para>Example usage:</para><code>yield return myTween.WaitForCompletion(true);</code>
|
||||
/// </summary>
|
||||
public static CustomYieldInstruction WaitForCompletion(this Tween t, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
return new DOTweenCYInstruction.WaitForCompletion(t);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed or rewinded.
|
||||
/// It can be used inside a coroutine as a yield.
|
||||
/// <para>Example usage:</para><code>yield return myTween.WaitForRewind();</code>
|
||||
/// </summary>
|
||||
public static CustomYieldInstruction WaitForRewind(this Tween t, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
return new DOTweenCYInstruction.WaitForRewind(t);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed.
|
||||
/// It can be used inside a coroutine as a yield.
|
||||
/// <para>Example usage:</para><code>yield return myTween.WaitForKill();</code>
|
||||
/// </summary>
|
||||
public static CustomYieldInstruction WaitForKill(this Tween t, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
return new DOTweenCYInstruction.WaitForKill(t);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed or has gone through the given amount of loops.
|
||||
/// It can be used inside a coroutine as a yield.
|
||||
/// <para>Example usage:</para><code>yield return myTween.WaitForElapsedLoops(2);</code>
|
||||
/// </summary>
|
||||
/// <param name="elapsedLoops">Elapsed loops to wait for</param>
|
||||
public static CustomYieldInstruction WaitForElapsedLoops(this Tween t, int elapsedLoops, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
return new DOTweenCYInstruction.WaitForElapsedLoops(t, elapsedLoops);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed
|
||||
/// or has reached the given time position (loops included, delays excluded).
|
||||
/// It can be used inside a coroutine as a yield.
|
||||
/// <para>Example usage:</para><code>yield return myTween.WaitForPosition(2.5f);</code>
|
||||
/// </summary>
|
||||
/// <param name="position">Position (loops included, delays excluded) to wait for</param>
|
||||
public static CustomYieldInstruction WaitForPosition(this Tween t, float position, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
return new DOTweenCYInstruction.WaitForPosition(t, position);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a <see cref="CustomYieldInstruction"/> that waits until the tween is killed or started
|
||||
/// (meaning when the tween is set in a playing state the first time, after any eventual delay).
|
||||
/// It can be used inside a coroutine as a yield.
|
||||
/// <para>Example usage:</para><code>yield return myTween.WaitForStart();</code>
|
||||
/// </summary>
|
||||
public static CustomYieldInstruction WaitForStart(this Tween t, bool returnCustomYieldInstruction)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return null;
|
||||
}
|
||||
return new DOTweenCYInstruction.WaitForStart(t);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#if UNITY_2018_1_OR_NEWER
|
||||
#region Unity 2018.1 or Newer
|
||||
|
||||
#region Material
|
||||
|
||||
/// <summary>Tweens a Material's named texture offset property with the given ID to the given value.
|
||||
/// Also stores the material as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param>
|
||||
/// <param name="propertyID">The ID of the material property to tween (also called nameID in Unity's manual)</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOOffset(this Material target, Vector2 endValue, int propertyID, float duration)
|
||||
{
|
||||
if (!target.HasProperty(propertyID)) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID);
|
||||
return null;
|
||||
}
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.GetTextureOffset(propertyID), x => target.SetTextureOffset(propertyID, x), endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
/// <summary>Tweens a Material's named texture scale property with the given ID to the given value.
|
||||
/// Also stores the material as the tween's target so it can be used for filtered operations</summary>
|
||||
/// <param name="endValue">The end value to reach</param>
|
||||
/// <param name="propertyID">The ID of the material property to tween (also called nameID in Unity's manual)</param>
|
||||
/// <param name="duration">The duration of the tween</param>
|
||||
public static TweenerCore<Vector2, Vector2, VectorOptions> DOTiling(this Material target, Vector2 endValue, int propertyID, float duration)
|
||||
{
|
||||
if (!target.HasProperty(propertyID)) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogMissingMaterialProperty(propertyID);
|
||||
return null;
|
||||
}
|
||||
TweenerCore<Vector2, Vector2, VectorOptions> t = DOTween.To(() => target.GetTextureScale(propertyID), x => target.SetTextureScale(propertyID, x), endValue, duration);
|
||||
t.SetTarget(target);
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region .NET 4.6 or Newer
|
||||
|
||||
#if UNITY_2018_1_OR_NEWER && (NET_4_6 || NET_STANDARD_2_0)
|
||||
|
||||
#region Async Instructions
|
||||
|
||||
/// <summary>
|
||||
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed or complete.
|
||||
/// It can be used inside an async operation.
|
||||
/// <para>Example usage:</para><code>await myTween.WaitForCompletion();</code>
|
||||
/// </summary>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForCompletion(this Tween t)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
while (t.active && !t.IsComplete()) await System.Threading.Tasks.Task.Yield();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed or rewinded.
|
||||
/// It can be used inside an async operation.
|
||||
/// <para>Example usage:</para><code>await myTween.AsyncWaitForRewind();</code>
|
||||
/// </summary>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForRewind(this Tween t)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
while (t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0)) await System.Threading.Tasks.Task.Yield();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed.
|
||||
/// It can be used inside an async operation.
|
||||
/// <para>Example usage:</para><code>await myTween.AsyncWaitForKill();</code>
|
||||
/// </summary>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForKill(this Tween t)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
while (t.active) await System.Threading.Tasks.Task.Yield();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed or has gone through the given amount of loops.
|
||||
/// It can be used inside an async operation.
|
||||
/// <para>Example usage:</para><code>await myTween.AsyncWaitForElapsedLoops();</code>
|
||||
/// </summary>
|
||||
/// <param name="elapsedLoops">Elapsed loops to wait for</param>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForElapsedLoops(this Tween t, int elapsedLoops)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
while (t.active && t.CompletedLoops() < elapsedLoops) await System.Threading.Tasks.Task.Yield();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed or started
|
||||
/// (meaning when the tween is set in a playing state the first time, after any eventual delay).
|
||||
/// It can be used inside an async operation.
|
||||
/// <para>Example usage:</para><code>await myTween.AsyncWaitForPosition();</code>
|
||||
/// </summary>
|
||||
/// <param name="position">Position (loops included, delays excluded) to wait for</param>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForPosition(this Tween t, float position)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
while (t.active && t.position * (t.CompletedLoops() + 1) < position) await System.Threading.Tasks.Task.Yield();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns an async <see cref="System.Threading.Tasks.Task"/> that waits until the tween is killed.
|
||||
/// It can be used inside an async operation.
|
||||
/// <para>Example usage:</para><code>await myTween.AsyncWaitForKill();</code>
|
||||
/// </summary>
|
||||
public static async System.Threading.Tasks.Task AsyncWaitForStart(this Tween t)
|
||||
{
|
||||
if (!t.active) {
|
||||
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
|
||||
return;
|
||||
}
|
||||
while (t.active && !t.playedOnce) await System.Threading.Tasks.Task.Yield();
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
#endif
|
||||
}
|
||||
|
||||
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
// ███ CLASSES █████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
||||
public static class DOTweenCYInstruction
|
||||
{
|
||||
public class WaitForCompletion : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && !t.IsComplete();
|
||||
}}
|
||||
readonly Tween t;
|
||||
public WaitForCompletion(Tween tween)
|
||||
{
|
||||
t = tween;
|
||||
}
|
||||
}
|
||||
|
||||
public class WaitForRewind : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0);
|
||||
}}
|
||||
readonly Tween t;
|
||||
public WaitForRewind(Tween tween)
|
||||
{
|
||||
t = tween;
|
||||
}
|
||||
}
|
||||
|
||||
public class WaitForKill : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active;
|
||||
}}
|
||||
readonly Tween t;
|
||||
public WaitForKill(Tween tween)
|
||||
{
|
||||
t = tween;
|
||||
}
|
||||
}
|
||||
|
||||
public class WaitForElapsedLoops : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && t.CompletedLoops() < elapsedLoops;
|
||||
}}
|
||||
readonly Tween t;
|
||||
readonly int elapsedLoops;
|
||||
public WaitForElapsedLoops(Tween tween, int elapsedLoops)
|
||||
{
|
||||
t = tween;
|
||||
this.elapsedLoops = elapsedLoops;
|
||||
}
|
||||
}
|
||||
|
||||
public class WaitForPosition : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && t.position * (t.CompletedLoops() + 1) < position;
|
||||
}}
|
||||
readonly Tween t;
|
||||
readonly float position;
|
||||
public WaitForPosition(Tween tween, float position)
|
||||
{
|
||||
t = tween;
|
||||
this.position = position;
|
||||
}
|
||||
}
|
||||
|
||||
public class WaitForStart : CustomYieldInstruction
|
||||
{
|
||||
public override bool keepWaiting { get {
|
||||
return t.active && !t.playedOnce;
|
||||
}}
|
||||
readonly Tween t;
|
||||
public WaitForStart(Tween tween)
|
||||
{
|
||||
t = tween;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 18d9445fb6655ae47ba1f4ea558de307
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,167 @@
|
|||
// Author: Daniele Giardini - http://www.demigiant.com
|
||||
// Created: 2018/07/13
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using UnityEngine;
|
||||
using DG.Tweening.Core;
|
||||
using DG.Tweening.Plugins.Core.PathCore;
|
||||
using DG.Tweening.Plugins.Options;
|
||||
|
||||
#pragma warning disable 1591
|
||||
namespace DG.Tweening
|
||||
{
|
||||
/// <summary>
|
||||
/// Utility functions that deal with available Modules.
|
||||
/// Modules defines:
|
||||
/// - DOTAUDIO
|
||||
/// - DOTPHYSICS
|
||||
/// - DOTPHYSICS2D
|
||||
/// - DOTSPRITE
|
||||
/// - DOTUI
|
||||
/// Extra defines set and used for implementation of external assets:
|
||||
/// - DOTWEEN_TMP ► TextMesh Pro
|
||||
/// - DOTWEEN_TK2D ► 2D Toolkit
|
||||
/// </summary>
|
||||
public static class DOTweenModuleUtils
|
||||
{
|
||||
static bool _initialized;
|
||||
|
||||
#region Reflection
|
||||
|
||||
/// <summary>
|
||||
/// Called via Reflection by DOTweenComponent on Awake
|
||||
/// </summary>
|
||||
#if UNITY_2018_1_OR_NEWER
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
#endif
|
||||
public static void Init()
|
||||
{
|
||||
if (_initialized) return;
|
||||
|
||||
_initialized = true;
|
||||
DOTweenExternalCommand.SetOrientationOnPath += Physics.SetOrientationOnPath;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1
|
||||
UnityEditor.EditorApplication.playmodeStateChanged += PlaymodeStateChanged;
|
||||
#else
|
||||
UnityEditor.EditorApplication.playModeStateChanged += PlaymodeStateChanged;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#if UNITY_2018_1_OR_NEWER
|
||||
#pragma warning disable
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
// Just used to preserve methods when building, never called
|
||||
static void Preserver()
|
||||
{
|
||||
Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
|
||||
MethodInfo mi = typeof(MonoBehaviour).GetMethod("Stub");
|
||||
}
|
||||
#pragma warning restore
|
||||
#endif
|
||||
|
||||
#endregion
|
||||
|
||||
#if UNITY_EDITOR
|
||||
// Fires OnApplicationPause in DOTweenComponent even when Editor is paused (otherwise it's only fired at runtime)
|
||||
#if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1
|
||||
static void PlaymodeStateChanged()
|
||||
#else
|
||||
static void PlaymodeStateChanged(UnityEditor.PlayModeStateChange state)
|
||||
#endif
|
||||
{
|
||||
if (DOTween.instance == null) return;
|
||||
DOTween.instance.OnApplicationPause(UnityEditor.EditorApplication.isPaused);
|
||||
}
|
||||
#endif
|
||||
|
||||
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
// ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
// █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
|
||||
|
||||
public static class Physics
|
||||
{
|
||||
// Called via DOTweenExternalCommand callback
|
||||
public static void SetOrientationOnPath(PathOptions options, Tween t, Quaternion newRot, Transform trans)
|
||||
{
|
||||
#if true // PHYSICS_MARKER
|
||||
if (options.isRigidbody) ((Rigidbody)t.target).rotation = newRot;
|
||||
else trans.rotation = newRot;
|
||||
#else
|
||||
trans.rotation = newRot;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Returns FALSE if the DOTween's Physics2D Module is disabled, or if there's no Rigidbody2D attached
|
||||
public static bool HasRigidbody2D(Component target)
|
||||
{
|
||||
#if true // PHYSICS2D_MARKER
|
||||
return target.GetComponent<Rigidbody2D>() != null;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
#region Called via Reflection
|
||||
|
||||
|
||||
// Called via Reflection by DOTweenPathInspector
|
||||
// Returns FALSE if the DOTween's Physics Module is disabled, or if there's no rigidbody attached
|
||||
#if UNITY_2018_1_OR_NEWER
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
#endif
|
||||
public static bool HasRigidbody(Component target)
|
||||
{
|
||||
#if true // PHYSICS_MARKER
|
||||
return target.GetComponent<Rigidbody>() != null;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Called via Reflection by DOTweenPath
|
||||
#if UNITY_2018_1_OR_NEWER
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
#endif
|
||||
public static TweenerCore<Vector3, Path, PathOptions> CreateDOTweenPathTween(
|
||||
MonoBehaviour target, bool tweenRigidbody, bool isLocal, Path path, float duration, PathMode pathMode
|
||||
){
|
||||
TweenerCore<Vector3, Path, PathOptions> t = null;
|
||||
bool rBodyFoundAndTweened = false;
|
||||
#if true // PHYSICS_MARKER
|
||||
if (tweenRigidbody) {
|
||||
Rigidbody rBody = target.GetComponent<Rigidbody>();
|
||||
if (rBody != null) {
|
||||
rBodyFoundAndTweened = true;
|
||||
t = isLocal
|
||||
? rBody.DOLocalPath(path, duration, pathMode)
|
||||
: rBody.DOPath(path, duration, pathMode);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if true // PHYSICS2D_MARKER
|
||||
if (!rBodyFoundAndTweened && tweenRigidbody) {
|
||||
Rigidbody2D rBody2D = target.GetComponent<Rigidbody2D>();
|
||||
if (rBody2D != null) {
|
||||
rBodyFoundAndTweened = true;
|
||||
t = isLocal
|
||||
? rBody2D.DOLocalPath(path, duration, pathMode)
|
||||
: rBody2D.DOPath(path, duration, pathMode);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (!rBodyFoundAndTweened) {
|
||||
t = isLocal
|
||||
? target.transform.DOLocalPath(path, duration, pathMode)
|
||||
: target.transform.DOPath(path, duration, pathMode);
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 3bdc077a2bdb5324dafe472d24497d33
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,29 @@
|
|||
DOTween and DOTween Pro are copyright (c) 2014-2018 Daniele Giardini - Demigiant
|
||||
|
||||
// IMPORTANT!!! /////////////////////////////////////////////
|
||||
// Upgrading DOTween from versions older than 1.2.000 ///////
|
||||
// (or DOTween Pro older than 1.0.000) //////////////////////
|
||||
-------------------------------------------------------------
|
||||
If you're upgrading your project from a version of DOTween older than 1.2.000 (or DOTween Pro older than 1.0.000) please follow these instructions carefully.
|
||||
1) Import the new version in the same folder as the previous one, overwriting old files. A lot of errors will appear but don't worry
|
||||
2) Close and reopen Unity (and your project). This is fundamental: skipping this step will cause a bloodbath
|
||||
3) Open DOTween's Utility Panel (Tools > Demigiant > DOTween Utility Panel) if it doesn't open automatically, then press "Setup DOTween...": this will run the upgrade setup
|
||||
4) From the Add/Remove Modules panel that opens, activate/deactivate Modules for Unity systems and for external assets (Pro version only)
|
||||
|
||||
// GET STARTED //////////////////////////////////////////////
|
||||
|
||||
- After importing a new DOTween update, select DOTween's Utility Panel from the "Tools/Demigiant" menu (if it doesn't open automatically) and press the "Setup DOTween..." button to activate/deactivate Modules. You can also access a Preferences Tab from there to choose default settings for DOTween.
|
||||
- In your code, add "using DG.Tweening" to each class where you want to use DOTween.
|
||||
- You're ready to tween. Check out the links below for full documentation and license info.
|
||||
|
||||
|
||||
// LINKS ///////////////////////////////////////////////////////
|
||||
|
||||
DOTween website (documentation, examples, etc): http://dotween.demigiant.com
|
||||
DOTween license: http://dotween.demigiant.com/license.php
|
||||
DOTween repository (Google Code): https://code.google.com/p/dotween/
|
||||
Demigiant website (documentation, examples, etc): http://www.demigiant.com
|
||||
|
||||
// NOTES //////////////////////////////////////////////////////
|
||||
|
||||
- DOTween's Utility Panel can be found under "Tools > Demigiant > DOTween Utility Panel" and also contains other useful options, plus a tab to set DOTween's preferences
|
|
@ -0,0 +1,7 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 26cb44389b6669e479fed562495bc607
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 13d3639a276fe974c8db4da86dc6a69a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: c4d9487b5d51a5340b44d2df89c0d411
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,675 @@
|
|||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace HighlightPlus {
|
||||
|
||||
[CustomEditor(typeof(HighlightEffect))]
|
||||
[CanEditMultipleObjects]
|
||||
public class HighlightEffectEditor : Editor {
|
||||
|
||||
#pragma warning disable 0618
|
||||
|
||||
SerializedProperty profile, profileSync, camerasLayerMask, ignoreObjectVisibility, reflectionProbes, GPUInstancing;
|
||||
SerializedProperty ignore, previewInEditor, effectGroup, effectGroupLayer, effectNameFilter, combineMeshes, alphaCutOff, cullBackFaces, depthClip, normalsOption, subMeshMask;
|
||||
SerializedProperty highlighted, fadeInDuration, fadeOutDuration, flipY, constantWidth;
|
||||
SerializedProperty overlay, overlayMode, overlayColor, overlayAnimationSpeed, overlayMinIntensity, overlayBlending, overlayTexture, overlayTextureUVSpace, overlayTextureScale;
|
||||
SerializedProperty outline, outlineColor, outlineColorStyle, outlineGradient, outlineGradientInLocalSpace, outlineWidth, outlineQuality, outlineDownsampling, outlineVisibility, outlineOptimalBlit, outlineBlitDebug, outlineIndependent;
|
||||
SerializedProperty glow, glowWidth, glowQuality, glowDownsampling, glowHQColor, glowDithering, glowMagicNumber1, glowMagicNumber2, glowAnimationSpeed, glowBlendPasses, glowPasses, glowVisibility, glowBlendMode, glowOptimalBlit, glowBlitDebug, glowIgnoreMask;
|
||||
SerializedProperty innerGlow, innerGlowWidth, innerGlowColor, innerGlowVisibility;
|
||||
SerializedProperty seeThrough, seeThroughOccluderMask, seeThroughOccluderMaskAccurate, seeThroughOccluderThreshold, seeThroughOccluderCheckInterval, seeThroughOccluderCheckIndividualObjects, seeThroughDepthOffset, seeThroughMaxDepth;
|
||||
SerializedProperty seeThroughIntensity, seeThroughTintAlpha, seeThroughTintColor, seeThroughNoise, seeThroughBorder, seeThroughBorderWidth, seeThroughBorderColor, seeThroughOrdered, seeThroughBorderOnly, seeThroughTexture, seeThroughTextureUVSpace, seeThroughTextureScale;
|
||||
SerializedProperty targetFX, targetFXTexture, targetFXColor, targetFXCenter, targetFXRotationSpeed, targetFXInitialScale, targetFXEndScale, targetFXScaleToRenderBounds;
|
||||
SerializedProperty targetFXAlignToGround, targetFXFadePower, targetFXGroundMaxDistance, targetFXGroundLayerMask, targetFXTransitionDuration, targetFXStayDuration, targetFXVisibility;
|
||||
SerializedProperty hitFxInitialIntensity, hitFxMode, hitFxFadeOutDuration, hitFxColor, hitFxRadius;
|
||||
SerializedProperty cameraDistanceFade, cameraDistanceFadeNear, cameraDistanceFadeFar;
|
||||
|
||||
HighlightEffect thisEffect;
|
||||
bool profileChanged, enableProfileApply;
|
||||
bool expandGeneralSettings, expandHighlightOptions;
|
||||
bool showCurrentOccluders;
|
||||
const string HP_GENERAL_SETTINGS = "HPGeneralSettings";
|
||||
const string HP_HIGHLIGHT_OPTIONS = "HPHighlightOptions";
|
||||
GUIStyle foldoutBold;
|
||||
|
||||
void OnEnable() {
|
||||
expandGeneralSettings = EditorPrefs.GetBool("HPGeneralSettings", true);
|
||||
expandHighlightOptions = EditorPrefs.GetBool("HPHighlightOptions", true);
|
||||
|
||||
profile = serializedObject.FindProperty("profile");
|
||||
profileSync = serializedObject.FindProperty("profileSync");
|
||||
camerasLayerMask = serializedObject.FindProperty("camerasLayerMask");
|
||||
reflectionProbes = serializedObject.FindProperty("reflectionProbes");
|
||||
ignoreObjectVisibility = serializedObject.FindProperty("ignoreObjectVisibility");
|
||||
GPUInstancing = serializedObject.FindProperty("GPUInstancing");
|
||||
normalsOption = serializedObject.FindProperty("normalsOption");
|
||||
subMeshMask = serializedObject.FindProperty("subMeshMask");
|
||||
ignore = serializedObject.FindProperty("ignore");
|
||||
previewInEditor = serializedObject.FindProperty("previewInEditor");
|
||||
effectGroup = serializedObject.FindProperty("effectGroup");
|
||||
effectGroupLayer = serializedObject.FindProperty("effectGroupLayer");
|
||||
effectNameFilter = serializedObject.FindProperty("effectNameFilter");
|
||||
combineMeshes = serializedObject.FindProperty("combineMeshes");
|
||||
alphaCutOff = serializedObject.FindProperty("alphaCutOff");
|
||||
cullBackFaces = serializedObject.FindProperty("cullBackFaces");
|
||||
depthClip = serializedObject.FindProperty("depthClip");
|
||||
highlighted = serializedObject.FindProperty("_highlighted");
|
||||
fadeInDuration = serializedObject.FindProperty("fadeInDuration");
|
||||
fadeOutDuration = serializedObject.FindProperty("fadeOutDuration");
|
||||
flipY = serializedObject.FindProperty("flipY");
|
||||
constantWidth = serializedObject.FindProperty("constantWidth");
|
||||
overlay = serializedObject.FindProperty("overlay");
|
||||
overlayMode = serializedObject.FindProperty("overlayMode");
|
||||
overlayColor = serializedObject.FindProperty("overlayColor");
|
||||
overlayAnimationSpeed = serializedObject.FindProperty("overlayAnimationSpeed");
|
||||
overlayMinIntensity = serializedObject.FindProperty("overlayMinIntensity");
|
||||
overlayBlending = serializedObject.FindProperty("overlayBlending");
|
||||
overlayTexture = serializedObject.FindProperty("overlayTexture");
|
||||
overlayTextureUVSpace = serializedObject.FindProperty("overlayTextureUVSpace");
|
||||
overlayTextureScale = serializedObject.FindProperty("overlayTextureScale");
|
||||
outline = serializedObject.FindProperty("outline");
|
||||
outlineColor = serializedObject.FindProperty("outlineColor");
|
||||
outlineColorStyle = serializedObject.FindProperty("outlineColorStyle");
|
||||
outlineGradient = serializedObject.FindProperty("outlineGradient");
|
||||
outlineGradientInLocalSpace = serializedObject.FindProperty("outlineGradientInLocalSpace");
|
||||
outlineWidth = serializedObject.FindProperty("outlineWidth");
|
||||
outlineQuality = serializedObject.FindProperty("outlineQuality");
|
||||
outlineDownsampling = serializedObject.FindProperty("outlineDownsampling");
|
||||
outlineVisibility = serializedObject.FindProperty("outlineVisibility");
|
||||
outlineOptimalBlit = serializedObject.FindProperty("outlineOptimalBlit");
|
||||
outlineBlitDebug = serializedObject.FindProperty("outlineBlitDebug");
|
||||
outlineIndependent = serializedObject.FindProperty("outlineIndependent");
|
||||
glow = serializedObject.FindProperty("glow");
|
||||
glowWidth = serializedObject.FindProperty("glowWidth");
|
||||
glowQuality = serializedObject.FindProperty("glowQuality");
|
||||
glowDownsampling = serializedObject.FindProperty("glowDownsampling");
|
||||
glowHQColor = serializedObject.FindProperty("glowHQColor");
|
||||
glowAnimationSpeed = serializedObject.FindProperty("glowAnimationSpeed");
|
||||
glowBlendPasses = serializedObject.FindProperty("glowBlendPasses");
|
||||
glowDithering = serializedObject.FindProperty("glowDithering");
|
||||
glowMagicNumber1 = serializedObject.FindProperty("glowMagicNumber1");
|
||||
glowMagicNumber2 = serializedObject.FindProperty("glowMagicNumber2");
|
||||
glowAnimationSpeed = serializedObject.FindProperty("glowAnimationSpeed");
|
||||
glowPasses = serializedObject.FindProperty("glowPasses");
|
||||
glowVisibility = serializedObject.FindProperty("glowVisibility");
|
||||
glowBlendMode = serializedObject.FindProperty("glowBlendMode");
|
||||
glowOptimalBlit = serializedObject.FindProperty("glowOptimalBlit");
|
||||
glowBlitDebug = serializedObject.FindProperty("glowBlitDebug");
|
||||
glowIgnoreMask = serializedObject.FindProperty("glowIgnoreMask");
|
||||
innerGlow = serializedObject.FindProperty("innerGlow");
|
||||
innerGlowColor = serializedObject.FindProperty("innerGlowColor");
|
||||
innerGlowWidth = serializedObject.FindProperty("innerGlowWidth");
|
||||
innerGlowVisibility = serializedObject.FindProperty("innerGlowVisibility");
|
||||
seeThrough = serializedObject.FindProperty("seeThrough");
|
||||
seeThroughOccluderMask = serializedObject.FindProperty("seeThroughOccluderMask");
|
||||
seeThroughOccluderMaskAccurate = serializedObject.FindProperty("seeThroughOccluderMaskAccurate");
|
||||
seeThroughOccluderThreshold = serializedObject.FindProperty("seeThroughOccluderThreshold");
|
||||
seeThroughOccluderCheckInterval = serializedObject.FindProperty("seeThroughOccluderCheckInterval");
|
||||
seeThroughOccluderCheckIndividualObjects = serializedObject.FindProperty("seeThroughOccluderCheckIndividualObjects");
|
||||
seeThroughDepthOffset = serializedObject.FindProperty("seeThroughDepthOffset");
|
||||
seeThroughMaxDepth = serializedObject.FindProperty("seeThroughMaxDepth");
|
||||
seeThroughIntensity = serializedObject.FindProperty("seeThroughIntensity");
|
||||
seeThroughTintAlpha = serializedObject.FindProperty("seeThroughTintAlpha");
|
||||
seeThroughTintColor = serializedObject.FindProperty("seeThroughTintColor");
|
||||
seeThroughNoise = serializedObject.FindProperty("seeThroughNoise");
|
||||
seeThroughBorder = serializedObject.FindProperty("seeThroughBorder");
|
||||
seeThroughBorderWidth = serializedObject.FindProperty("seeThroughBorderWidth");
|
||||
seeThroughBorderColor = serializedObject.FindProperty("seeThroughBorderColor");
|
||||
seeThroughOrdered = serializedObject.FindProperty("seeThroughOrdered");
|
||||
seeThroughBorderOnly = serializedObject.FindProperty("seeThroughBorderOnly");
|
||||
seeThroughTexture = serializedObject.FindProperty("seeThroughTexture");
|
||||
seeThroughTextureScale = serializedObject.FindProperty("seeThroughTextureScale");
|
||||
seeThroughTextureUVSpace = serializedObject.FindProperty("seeThroughTextureUVSpace");
|
||||
targetFX = serializedObject.FindProperty("targetFX");
|
||||
targetFXTexture = serializedObject.FindProperty("targetFXTexture");
|
||||
targetFXRotationSpeed = serializedObject.FindProperty("targetFXRotationSpeed");
|
||||
targetFXInitialScale = serializedObject.FindProperty("targetFXInitialScale");
|
||||
targetFXEndScale = serializedObject.FindProperty("targetFXEndScale");
|
||||
targetFXScaleToRenderBounds = serializedObject.FindProperty("targetFXScaleToRenderBounds");
|
||||
targetFXAlignToGround = serializedObject.FindProperty("targetFXAlignToGround");
|
||||
targetFXFadePower = serializedObject.FindProperty("targetFXFadePower");
|
||||
targetFXGroundMaxDistance = serializedObject.FindProperty("targetFXGroundMaxDistance");
|
||||
targetFXGroundLayerMask = serializedObject.FindProperty("targetFXGroundLayerMask");
|
||||
targetFXColor = serializedObject.FindProperty("targetFXColor");
|
||||
targetFXCenter = serializedObject.FindProperty("targetFXCenter");
|
||||
targetFXTransitionDuration = serializedObject.FindProperty("targetFXTransitionDuration");
|
||||
targetFXStayDuration = serializedObject.FindProperty("targetFXStayDuration");
|
||||
targetFXVisibility = serializedObject.FindProperty("targetFXVisibility");
|
||||
hitFxInitialIntensity = serializedObject.FindProperty("hitFxInitialIntensity");
|
||||
hitFxMode = serializedObject.FindProperty("hitFxMode");
|
||||
hitFxFadeOutDuration = serializedObject.FindProperty("hitFxFadeOutDuration");
|
||||
hitFxColor = serializedObject.FindProperty("hitFxColor");
|
||||
hitFxRadius = serializedObject.FindProperty("hitFxRadius");
|
||||
cameraDistanceFade = serializedObject.FindProperty("cameraDistanceFade");
|
||||
cameraDistanceFadeNear = serializedObject.FindProperty("cameraDistanceFadeNear");
|
||||
cameraDistanceFadeFar = serializedObject.FindProperty("cameraDistanceFadeFar");
|
||||
|
||||
thisEffect = (HighlightEffect)target;
|
||||
thisEffect.Refresh();
|
||||
}
|
||||
|
||||
private void OnDisable() {
|
||||
EditorPrefs.SetBool(HP_GENERAL_SETTINGS, expandGeneralSettings);
|
||||
EditorPrefs.SetBool(HP_HIGHLIGHT_OPTIONS, expandHighlightOptions);
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI() {
|
||||
bool isManager = IsDefaultEffectUsedByManager();
|
||||
EditorGUILayout.Separator();
|
||||
serializedObject.Update();
|
||||
|
||||
if (foldoutBold == null) {
|
||||
foldoutBold = new GUIStyle(EditorStyles.foldout);
|
||||
foldoutBold.fontStyle = FontStyle.Bold;
|
||||
}
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
HighlightProfile prevProfile = (HighlightProfile)profile.objectReferenceValue;
|
||||
EditorGUILayout.PropertyField(profile, new GUIContent("Profile", "Create or load stored presets."));
|
||||
if (profile.objectReferenceValue != null) {
|
||||
|
||||
if (prevProfile != profile.objectReferenceValue) {
|
||||
profileChanged = true;
|
||||
}
|
||||
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
GUILayout.Label("", GUILayout.Width(EditorGUIUtility.labelWidth));
|
||||
if (GUILayout.Button(new GUIContent("Create", "Creates a new profile which is a copy of the current settings."), GUILayout.Width(60))) {
|
||||
CreateProfile();
|
||||
profileChanged = false;
|
||||
enableProfileApply = false;
|
||||
GUIUtility.ExitGUI();
|
||||
return;
|
||||
}
|
||||
if (GUILayout.Button(new GUIContent("Load", "Updates settings with the profile configuration."), GUILayout.Width(60))) {
|
||||
profileChanged = true;
|
||||
}
|
||||
if (!enableProfileApply)
|
||||
GUI.enabled = false;
|
||||
if (GUILayout.Button(new GUIContent("Save", "Updates profile configuration with changes in this inspector."), GUILayout.Width(60))) {
|
||||
enableProfileApply = false;
|
||||
profileChanged = false;
|
||||
thisEffect.profile.Save(thisEffect);
|
||||
EditorUtility.SetDirty(thisEffect.profile);
|
||||
GUIUtility.ExitGUI();
|
||||
return;
|
||||
}
|
||||
GUI.enabled = true;
|
||||
if (GUILayout.Button(new GUIContent("Locate", "Finds the profile in the project"), GUILayout.Width(60))) {
|
||||
if (thisEffect.profile != null) {
|
||||
Selection.activeObject = thisEffect.profile;
|
||||
EditorGUIUtility.PingObject(thisEffect.profile);
|
||||
}
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.PropertyField(profileSync, new GUIContent("Sync With Profile", "If disabled, profile settings will only be loaded when clicking 'Load' which allows you to customize settings after loading a profile and keep those changes."));
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
} else {
|
||||
if (GUILayout.Button(new GUIContent("Create", "Creates a new profile which is a copy of the current settings."), GUILayout.Width(60))) {
|
||||
CreateProfile();
|
||||
GUIUtility.ExitGUI();
|
||||
return;
|
||||
}
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
|
||||
if (isManager) {
|
||||
EditorGUILayout.HelpBox("These are default settings for highlighted objects. If the highlighted object already has a Highlight Effect component, those properties will be used.", MessageType.Info);
|
||||
}
|
||||
|
||||
expandGeneralSettings = EditorGUILayout.Foldout(expandGeneralSettings, "General Settings", true, foldoutBold);
|
||||
if (expandGeneralSettings) {
|
||||
if (!isManager) {
|
||||
EditorGUILayout.PropertyField(previewInEditor);
|
||||
}
|
||||
|
||||
EditorGUILayout.PropertyField(camerasLayerMask);
|
||||
EditorGUILayout.PropertyField(ignoreObjectVisibility);
|
||||
if (thisEffect.staticChildren) {
|
||||
EditorGUILayout.HelpBox("This GameObject or one of its children is marked as static. If highlight is not visible, add a MeshCollider to them (the MeshCollider can be disabled).", MessageType.Warning);
|
||||
}
|
||||
|
||||
EditorGUILayout.PropertyField(reflectionProbes);
|
||||
EditorGUILayout.PropertyField(normalsOption);
|
||||
EditorGUILayout.PropertyField(subMeshMask);
|
||||
EditorGUILayout.PropertyField(GPUInstancing);
|
||||
EditorGUILayout.Separator();
|
||||
}
|
||||
|
||||
if (!isManager) {
|
||||
EditorGUILayout.LabelField("State", EditorStyles.boldLabel);
|
||||
if (isManager) {
|
||||
EditorGUILayout.LabelField(new GUIContent("Highlighted", "Highlight state (controlled by Highlight Manager)."), new GUIContent(thisEffect.highlighted.ToString()));
|
||||
} else {
|
||||
EditorGUILayout.PropertyField(highlighted);
|
||||
}
|
||||
EditorGUILayout.LabelField(new GUIContent("Selected", "Selection state (used by Highlight Trigger or Manager) when using multi-selection option."), new GUIContent(thisEffect.isSelected.ToString()));
|
||||
EditorGUILayout.Separator();
|
||||
}
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
expandHighlightOptions = EditorGUILayout.Foldout(expandHighlightOptions, "Highlight Options", true, foldoutBold);
|
||||
if (GUILayout.Button("Help", GUILayout.Width(50))) {
|
||||
EditorUtility.DisplayDialog("Quick Help", "Move the mouse over a setting for a short description.\n\nVisit kronnect.com's forum for support, questions and more cool assets.\n\nIf you like Highlight Plus please rate it or leave a review on the Asset Store! Thanks.", "Ok");
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
if (expandHighlightOptions) {
|
||||
EditorGUI.BeginChangeCheck();
|
||||
if (!isManager) {
|
||||
EditorGUILayout.PropertyField(ignore, new GUIContent("Ignore", "This object won't be highlighted."));
|
||||
}
|
||||
if (!ignore.boolValue) {
|
||||
EditorGUILayout.PropertyField(effectGroup, new GUIContent("Include", "Additional objects to highlight. Pro tip: when highlighting multiple objects at the same time include them in the same layer or under the same parent."));
|
||||
if (effectGroup.intValue == (int)TargetOptions.LayerInScene || effectGroup.intValue == (int)TargetOptions.LayerInChildren) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(effectGroupLayer, new GUIContent("Layer"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
bool usesHQEffects = (outlineQuality.intValue == (int)QualityLevel.Highest && outline.floatValue > 0) || (glowQuality.intValue == (int)QualityLevel.Highest && glow.floatValue > 0);
|
||||
if (effectGroup.intValue != (int)TargetOptions.OnlyThisObject) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(effectNameFilter, new GUIContent("Object Name Filter"));
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.PropertyField(combineMeshes);
|
||||
if (combineMeshes.boolValue) {
|
||||
if (GUILayout.Button("Refresh", GUILayout.Width(70))) {
|
||||
thisEffect.Refresh(true);
|
||||
}
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(alphaCutOff, new GUIContent("Alpha Cut Off", "Only for semi-transparent objects. Leave this to zero for normal opaque objects."));
|
||||
EditorGUILayout.PropertyField(cullBackFaces);
|
||||
EditorGUILayout.PropertyField(fadeInDuration);
|
||||
EditorGUILayout.PropertyField(fadeOutDuration);
|
||||
EditorGUILayout.PropertyField(cameraDistanceFade);
|
||||
if (cameraDistanceFade.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(cameraDistanceFadeNear, new GUIContent("Near Distance"));
|
||||
EditorGUILayout.PropertyField(cameraDistanceFadeFar, new GUIContent("Far Distance"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
if (usesHQEffects) {
|
||||
EditorGUILayout.PropertyField(depthClip);
|
||||
if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS || EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) {
|
||||
EditorGUILayout.HelpBox("On mobile, consider enabling 'Depth Clip' option for better results.", MessageType.Info);
|
||||
}
|
||||
if (VRCheck.IsActive()) {
|
||||
EditorGUILayout.PropertyField(flipY, new GUIContent("Flip Y Fix", "Flips outline/glow effect to fix bug introduced in Unity 2019.1.0 when VR is enabled."));
|
||||
}
|
||||
}
|
||||
if (glowQuality.intValue != (int)QualityLevel.Highest || outlineQuality.intValue != (int)QualityLevel.Highest) {
|
||||
EditorGUILayout.PropertyField(constantWidth, new GUIContent("Constant Width", "Compensates outline/glow width with depth increase."));
|
||||
}
|
||||
EditorGUILayout.PropertyField(outlineIndependent, new GUIContent("Independent", "Do not combine outline or glow with other highlighted objects."));
|
||||
}
|
||||
}
|
||||
|
||||
if (!ignore.boolValue) {
|
||||
EditorGUILayout.Separator();
|
||||
EditorGUILayout.LabelField("Effects", EditorStyles.boldLabel);
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(outline, "Outline", outline.floatValue > 0);
|
||||
if (outline.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(outlineWidth, new GUIContent("Width"));
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
QualityPropertyField(outlineQuality);
|
||||
if (outlineQuality.intValue == (int)QualityLevel.Highest) {
|
||||
GUILayout.Label("(Screen-Space Effect)");
|
||||
} else {
|
||||
GUILayout.Label("(Mesh-based Effect)");
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
CheckVRSupport(outlineQuality.intValue);
|
||||
if (outlineQuality.intValue == (int)QualityLevel.Highest) {
|
||||
EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
|
||||
} else {
|
||||
EditorGUILayout.PropertyField(outlineColorStyle, new GUIContent("Color Style"));
|
||||
switch ((ColorStyle)outlineColorStyle.intValue) {
|
||||
case ColorStyle.SingleColor:
|
||||
EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
|
||||
break;
|
||||
case ColorStyle.Gradient:
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(outlineGradient, new GUIContent("Gradient"));
|
||||
EditorGUILayout.PropertyField(outlineGradientInLocalSpace, new GUIContent("In Local Space"));
|
||||
EditorGUI.indentLevel--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (outlineQuality.intValue == (int)QualityLevel.Highest) {
|
||||
EditorGUILayout.PropertyField(outlineDownsampling, new GUIContent("Downsampling"));
|
||||
EditorGUILayout.PropertyField(outlineOptimalBlit, new GUIContent("Optimal Blit", "Blits result over a section of the screen instead of rendering to the full screen buffer."));
|
||||
if (outlineOptimalBlit.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(outlineBlitDebug, new GUIContent("Debug View", "Shows the blitting rectangle on the screen."));
|
||||
if (outlineBlitDebug.boolValue && (!previewInEditor.boolValue || !highlighted.boolValue)) {
|
||||
EditorGUILayout.HelpBox("Enable \"Preview In Editor\" and \"Highlighted\" to display the outline Debug View.", MessageType.Warning);
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
}
|
||||
|
||||
GUI.enabled = outlineQuality.intValue != (int)QualityLevel.Highest || CheckForwardMSAA();
|
||||
if (outlineQuality.intValue == (int)QualityLevel.Highest && glowQuality.intValue == (int)QualityLevel.Highest && glow.floatValue > 0) {
|
||||
EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
|
||||
} else {
|
||||
EditorGUILayout.PropertyField(outlineVisibility, new GUIContent("Visibility"));
|
||||
}
|
||||
GUI.enabled = true;
|
||||
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(glow, "Outer Glow", glow.floatValue > 0);
|
||||
if (glow.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(glowWidth, new GUIContent("Width"));
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
QualityPropertyField(glowQuality);
|
||||
if (glowQuality.intValue == (int)QualityLevel.Highest) {
|
||||
GUILayout.Label("(Screen-Space Effect)");
|
||||
} else {
|
||||
GUILayout.Label("(Mesh-based Effect)");
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
CheckVRSupport(glowQuality.intValue);
|
||||
if (glowQuality.intValue == (int)QualityLevel.Highest) {
|
||||
EditorGUILayout.PropertyField(glowDownsampling, new GUIContent("Downsampling"));
|
||||
EditorGUILayout.PropertyField(glowHQColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(glowOptimalBlit, new GUIContent("Optimal Blit", "Blits result over a section of the screen instead of rendering to the full screen buffer."));
|
||||
if (glowOptimalBlit.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(glowBlitDebug, new GUIContent("Debug View", "Shows the blitting rectangle on the screen."));
|
||||
if (glowBlitDebug.boolValue && (!previewInEditor.boolValue || !highlighted.boolValue)) {
|
||||
EditorGUILayout.HelpBox("Enable \"Preview In Editor\" and \"Highlighted\" to display the glow Debug View.", MessageType.Warning);
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
GUI.enabled = glowQuality.intValue != (int)QualityLevel.Highest || CheckForwardMSAA();
|
||||
EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
|
||||
EditorGUILayout.PropertyField(glowBlendMode, new GUIContent("Blend Mode"));
|
||||
GUI.enabled = true;
|
||||
} else {
|
||||
GUI.enabled = glowQuality.intValue != (int)QualityLevel.Highest || CheckForwardMSAA();
|
||||
EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
|
||||
GUI.enabled = true;
|
||||
EditorGUILayout.PropertyField(glowDithering, new GUIContent("Dithering"));
|
||||
if (glowDithering.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(glowMagicNumber1, new GUIContent("Magic Number 1"));
|
||||
EditorGUILayout.PropertyField(glowMagicNumber2, new GUIContent("Magic Number 2"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(glowBlendPasses, new GUIContent("Blend Passes"));
|
||||
if (!glowBlendPasses.boolValue) {
|
||||
HighlightEffect ef = (HighlightEffect)target;
|
||||
if (ef.glowPasses != null) {
|
||||
for (int k = 0; k < ef.glowPasses.Length - 1; k++) {
|
||||
if (ef.glowPasses[k].offset > ef.glowPasses[k + 1].offset) {
|
||||
EditorGUILayout.HelpBox("Glow pass " + k + " has a greater offset than the next one. Reduce it to ensure the next glow pass is visible.", MessageType.Warning);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EditorGUILayout.PropertyField(glowPasses, true);
|
||||
}
|
||||
EditorGUILayout.PropertyField(glowAnimationSpeed, new GUIContent("Animation Speed"));
|
||||
EditorGUILayout.PropertyField(glowIgnoreMask, new GUIContent("Ignore Mask"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(innerGlow, "Inner Glow", innerGlow.floatValue > 0);
|
||||
if (innerGlow.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(innerGlowColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(innerGlowWidth, new GUIContent("Width"));
|
||||
EditorGUILayout.PropertyField(innerGlowVisibility, new GUIContent("Visibility"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(overlay, "Overlay", overlay.floatValue > 0);
|
||||
if (overlay.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(overlayMode, new GUIContent("Mode"));
|
||||
EditorGUILayout.PropertyField(overlayColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(overlayTexture, new GUIContent("Texture"));
|
||||
if (overlayTexture.objectReferenceValue != null) {
|
||||
EditorGUILayout.PropertyField(overlayTextureUVSpace, new GUIContent("UV Space"));
|
||||
EditorGUILayout.PropertyField(overlayTextureScale, new GUIContent("Texture Scale"));
|
||||
}
|
||||
EditorGUILayout.PropertyField(overlayBlending, new GUIContent("Blending"));
|
||||
EditorGUILayout.PropertyField(overlayMinIntensity, new GUIContent("Min Intensity"));
|
||||
EditorGUILayout.PropertyField(overlayAnimationSpeed, new GUIContent("Animation Speed"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(targetFX, "Target", targetFX.boolValue);
|
||||
if (targetFX.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(targetFXTexture, new GUIContent("Texture", "The texture that contains the shape to be drawn over the highlighted object."));
|
||||
EditorGUILayout.PropertyField(targetFXColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(targetFXCenter, new GUIContent("Center", "Optionally assign a transform. Target will follow transform. If the object is skinned, you can also assign a bone to reflect currenct animation position."));
|
||||
EditorGUILayout.PropertyField(targetFXRotationSpeed, new GUIContent("Rotation Speed"));
|
||||
EditorGUILayout.PropertyField(targetFXInitialScale, new GUIContent("Initial Scale"));
|
||||
EditorGUILayout.PropertyField(targetFXEndScale, new GUIContent("End Scale"));
|
||||
EditorGUILayout.PropertyField(targetFXScaleToRenderBounds, new GUIContent("Scale To Object Bounds"));
|
||||
EditorGUILayout.PropertyField(targetFXAlignToGround, new GUIContent("Align To Ground"));
|
||||
if (targetFXAlignToGround.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
if (thisEffect.includedObjectsCount > 1 && targetFXCenter.objectReferenceValue == null && effectGroup.intValue != (int)TargetOptions.OnlyThisObject) {
|
||||
EditorGUILayout.HelpBox("It's recommended to specify in the 'Center' property above, the specific object used to position the target fx image (will be rendered under that object on the ground).", MessageType.Info);
|
||||
}
|
||||
EditorGUILayout.PropertyField(targetFXGroundMaxDistance, new GUIContent("Ground Max Distance"));
|
||||
EditorGUILayout.PropertyField(targetFXGroundLayerMask, new GUIContent("Ground Layer Mask"));
|
||||
HighlightEffect he = (HighlightEffect)target;
|
||||
if ((targetFXGroundLayerMask.intValue & (1 << he.gameObject.layer)) != 0) {
|
||||
EditorGUILayout.HelpBox("Ground Layer Mask should not include this object layer.", MessageType.Warning);
|
||||
}
|
||||
EditorGUILayout.PropertyField(targetFXFadePower, new GUIContent("Fade Power"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(targetFXTransitionDuration, new GUIContent("Transition Duration"));
|
||||
EditorGUILayout.PropertyField(targetFXStayDuration, new GUIContent("Stay Duration"));
|
||||
EditorGUILayout.PropertyField(targetFXVisibility, new GUIContent("Visibility"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
}
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
EditorGUILayout.PropertyField(seeThrough);
|
||||
if (seeThrough.intValue != (int)SeeThroughMode.Never) {
|
||||
if (isManager && seeThrough.intValue == (int)SeeThroughMode.AlwaysWhenOccluded) {
|
||||
EditorGUILayout.HelpBox("This option is not valid in Manager.\nTo make an object always visible add a Highlight Effect component to the gameobject and enable this option on the component.", MessageType.Error);
|
||||
}
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderMask, new GUIContent("Occluder Layer"));
|
||||
if (seeThroughOccluderMask.intValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderMaskAccurate, new GUIContent("Accurate"));
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderThreshold, new GUIContent("Radius Threshold", "Multiplier to the object bounds. Making the bounds smaller prevents false occlusion tests."));
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderCheckInterval, new GUIContent("Check Interval", "Interval in seconds between occlusion tests."));
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderCheckIndividualObjects, new GUIContent("Check Individual Objects"));
|
||||
if (!showCurrentOccluders && Camera.main != null) {
|
||||
GUI.enabled = Application.isPlaying;
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
GUILayout.Label("", GUILayout.Width(30));
|
||||
if (GUILayout.Button(" Show Current Occluders (only during Play Mode) ")) {
|
||||
showCurrentOccluders = true;
|
||||
}
|
||||
GUILayout.FlexibleSpace();
|
||||
EditorGUILayout.EndHorizontal();
|
||||
GUI.enabled = true;
|
||||
}
|
||||
if (showCurrentOccluders) {
|
||||
HighlightEffect h = (HighlightEffect)target;
|
||||
List<Renderer> occluders = h.GetOccluders(Camera.main);
|
||||
int count = occluders != null ? occluders.Count : 0;
|
||||
if (count == 0) {
|
||||
EditorGUILayout.LabelField("No occluders found (using main camera)");
|
||||
} else {
|
||||
EditorGUILayout.LabelField("Occluders found (using main camera):");
|
||||
for (int k = 0; k < count; k++) {
|
||||
if (occluders[k] == null) continue;
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField(occluders[k].name);
|
||||
if (GUILayout.Button("Select")) {
|
||||
Selection.activeGameObject = occluders[k].gameObject;
|
||||
GUIUtility.ExitGUI();
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
}
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(seeThroughDepthOffset, new GUIContent("Depth Offset" + ((seeThroughDepthOffset.floatValue > 0) ? " •" : "")));
|
||||
EditorGUILayout.PropertyField(seeThroughMaxDepth, new GUIContent("Max Depth" + ((seeThroughMaxDepth.floatValue > 0) ? " •" : "")));
|
||||
EditorGUILayout.PropertyField(seeThroughIntensity, new GUIContent("Intensity"));
|
||||
EditorGUILayout.PropertyField(seeThroughTintColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(seeThroughTintAlpha, new GUIContent("Color Blend"));
|
||||
EditorGUILayout.PropertyField(seeThroughNoise, new GUIContent("Noise"));
|
||||
EditorGUILayout.PropertyField(seeThroughTexture, new GUIContent("Texture"));
|
||||
if (seeThroughTexture.objectReferenceValue != null) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(seeThroughTextureUVSpace, new GUIContent("UV Space"));
|
||||
EditorGUILayout.PropertyField(seeThroughTextureScale, new GUIContent("Texture Scale"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(seeThroughBorder, new GUIContent("Border When Hidden" + ((seeThroughBorder.floatValue > 0) ? " •" : "")));
|
||||
if (seeThroughBorder.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(seeThroughBorderWidth, new GUIContent("Width"));
|
||||
EditorGUILayout.PropertyField(seeThroughBorderColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(seeThroughBorderOnly, new GUIContent("Border Only"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(seeThroughOrdered, new GUIContent("Ordered"));
|
||||
|
||||
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(hitFxInitialIntensity, "Hit FX", hitFxInitialIntensity.floatValue > 0);
|
||||
if (hitFxInitialIntensity.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(hitFxMode, new GUIContent("Mode"));
|
||||
EditorGUILayout.PropertyField(hitFxFadeOutDuration, new GUIContent("Fade Out Duration"));
|
||||
EditorGUILayout.PropertyField(hitFxColor, new GUIContent("Color"));
|
||||
if ((HitFxMode)hitFxMode.intValue == HitFxMode.LocalHit) {
|
||||
EditorGUILayout.PropertyField(hitFxRadius, new GUIContent("Radius"));
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
if (!Application.isPlaying) {
|
||||
EditorGUILayout.HelpBox("Enter Play Mode to test this feature. In your code, call effect.HitFX() method to execute this hit effect.", MessageType.Info);
|
||||
} else {
|
||||
EditorGUI.indentLevel++;
|
||||
if (GUILayout.Button("Execute Hit")) {
|
||||
thisEffect.HitFX();
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
|
||||
if (serializedObject.ApplyModifiedProperties() || profileChanged || Event.current.commandName == "UndoRedoPerformed") {
|
||||
if (thisEffect.profile != null) {
|
||||
if (profileChanged) {
|
||||
thisEffect.profile.Load(thisEffect);
|
||||
profileChanged = false;
|
||||
enableProfileApply = false;
|
||||
} else {
|
||||
enableProfileApply = true;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (HighlightEffect effect in targets) {
|
||||
effect.Refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawSectionField(SerializedProperty property, string label, bool active) {
|
||||
EditorGUILayout.PropertyField(property, new GUIContent(active ? label + " •" : label));
|
||||
}
|
||||
|
||||
void CheckVRSupport(int qualityLevel) {
|
||||
if (qualityLevel == (int)QualityLevel.Highest && VRCheck.IsActive()) {
|
||||
if (PlayerSettings.stereoRenderingPath != StereoRenderingPath.MultiPass) {
|
||||
EditorGUILayout.HelpBox("Highest Quality only supports VR Multi-Pass as CommandBuffers do not support this VR mode yet. Either switch to 'High Quality' or change VR Stereo mode to Multi-Pass.", MessageType.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CheckForwardMSAA() {
|
||||
if (QualitySettings.antiAliasing > 1) {
|
||||
if (Camera.main != null && Camera.main.allowMSAA && !depthClip.boolValue) {
|
||||
EditorGUILayout.HelpBox("Effect will be shown always on top due to MSAA. To enable depth clipping enable 'Depth Clip' option above OR disable MSAA in Quality Settings OR choose a different quality level.", MessageType.Info);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static readonly int[] qualityValues = { 0, 3, 1, 2 };
|
||||
static readonly GUIContent[] qualityTexts = { new GUIContent("Fastest"), new GUIContent("Medium"), new GUIContent("High"), new GUIContent("Highest") };
|
||||
|
||||
public static void QualityPropertyField(SerializedProperty prop) {
|
||||
prop.intValue = EditorGUILayout.IntPopup(new GUIContent("Quality", "Default and High use a mesh displacement technique. Highest quality can provide best look and also performance depending on the complexity of mesh."), prop.intValue, qualityTexts, qualityValues);
|
||||
}
|
||||
|
||||
bool IsDefaultEffectUsedByManager() {
|
||||
MonoBehaviour[] components = thisEffect.GetComponents<MonoBehaviour>();
|
||||
if (components != null) {
|
||||
for (int k = 0; k < components.Length; k++) {
|
||||
if (components[k] == null || !components[k].enabled)
|
||||
continue;
|
||||
string name = components[k].GetType().Name;
|
||||
if ("HighlightManager".Equals(name)) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#region Profile handling
|
||||
|
||||
void CreateProfile() {
|
||||
|
||||
HighlightProfile newProfile = CreateInstance<HighlightProfile>();
|
||||
newProfile.Save(thisEffect);
|
||||
|
||||
AssetDatabase.CreateAsset(newProfile, "Assets/Highlight Plus Profile.asset");
|
||||
AssetDatabase.SaveAssets();
|
||||
|
||||
EditorUtility.FocusProjectWindow();
|
||||
Selection.activeObject = newProfile;
|
||||
|
||||
thisEffect.profile = newProfile;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#pragma warning restore 0618
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: be287539f47634552a716f0705710448
|
||||
timeCreated: 1542886545
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,71 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace HighlightPlus {
|
||||
[CustomEditor(typeof(HighlightManager))]
|
||||
public class HighlightManagerEditor : Editor {
|
||||
|
||||
SerializedProperty highlightOnHover, layerMask, raycastCamera, raycastSource, minDistance, maxDistance, respectUI;
|
||||
SerializedProperty selectOnClick, selectedProfile, selectedAndHighlightedProfile, singleSelection, toggleOnClick, keepSelection;
|
||||
|
||||
void OnEnable() {
|
||||
highlightOnHover = serializedObject.FindProperty("highlightOnHover");
|
||||
layerMask = serializedObject.FindProperty("layerMask");
|
||||
raycastCamera = serializedObject.FindProperty("raycastCamera");
|
||||
raycastSource = serializedObject.FindProperty("raycastSource");
|
||||
minDistance = serializedObject.FindProperty("minDistance");
|
||||
maxDistance = serializedObject.FindProperty("maxDistance");
|
||||
respectUI = serializedObject.FindProperty("respectUI");
|
||||
selectOnClick = serializedObject.FindProperty("selectOnClick");
|
||||
selectedProfile = serializedObject.FindProperty("selectedProfile");
|
||||
selectedAndHighlightedProfile = serializedObject.FindProperty("selectedAndHighlightedProfile");
|
||||
singleSelection = serializedObject.FindProperty("singleSelection");
|
||||
toggleOnClick = serializedObject.FindProperty("toggle");
|
||||
keepSelection = serializedObject.FindProperty("keepSelection");
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI() {
|
||||
EditorGUILayout.Separator();
|
||||
EditorGUILayout.HelpBox("Only objects with a collider can be highlighted automatically.", MessageType.Info);
|
||||
|
||||
serializedObject.Update();
|
||||
|
||||
EditorGUILayout.PropertyField(layerMask);
|
||||
EditorGUILayout.PropertyField(raycastCamera);
|
||||
EditorGUILayout.PropertyField(raycastSource);
|
||||
EditorGUILayout.PropertyField(minDistance);
|
||||
EditorGUILayout.PropertyField(maxDistance);
|
||||
EditorGUILayout.PropertyField(respectUI);
|
||||
EditorGUILayout.PropertyField(highlightOnHover);
|
||||
EditorGUILayout.PropertyField(selectOnClick);
|
||||
if (selectOnClick.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(selectedProfile);
|
||||
EditorGUILayout.PropertyField(selectedAndHighlightedProfile);
|
||||
EditorGUILayout.PropertyField(singleSelection);
|
||||
EditorGUILayout.PropertyField(toggleOnClick);
|
||||
EditorGUILayout.PropertyField(keepSelection);
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
|
||||
[MenuItem("GameObject/Effects/Highlight Plus/Create Manager", false, 10)]
|
||||
static void CreateManager(MenuCommand menuCommand) {
|
||||
HighlightManager manager = FindObjectOfType<HighlightManager>();
|
||||
if (manager == null) {
|
||||
GameObject managerGO = new GameObject("HighlightPlusManager");
|
||||
manager = managerGO.AddComponent<HighlightManager>();
|
||||
// Register root object for undo.
|
||||
Undo.RegisterCreatedObjectUndo(manager, "Create Highlight Plus Manager");
|
||||
}
|
||||
Selection.activeObject = manager;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: ace58d1d278d649c98e5a2b5a066b3cd
|
||||
timeCreated: 1548711355
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,355 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace HighlightPlus {
|
||||
|
||||
[CustomEditor(typeof(HighlightProfile))]
|
||||
[CanEditMultipleObjects]
|
||||
public class HighlightProfileEditor : Editor {
|
||||
|
||||
SerializedProperty effectGroup, effectGroupLayer, effectNameFilter, combineMeshes, alphaCutOff, cullBackFaces, depthClip, normalsOption;
|
||||
SerializedProperty overlay, overlayMode, overlayColor, overlayAnimationSpeed, overlayMinIntensity, overlayTexture, overlayTextureScale, overlayTextureUVSpace, overlayBlending;
|
||||
SerializedProperty fadeInDuration, fadeOutDuration, constantWidth;
|
||||
SerializedProperty outline, outlineColor, outlineColorStyle, outlineGradient, outlineGradientInLocalSpace, outlineWidth, outlineQuality, outlineDownsampling, outlineOptimalBlit, outlineVisibility, outlineIndependent;
|
||||
SerializedProperty glow, glowWidth, glowQuality, glowOptimalBlit, glowDownsampling, glowHQColor, glowDithering, glowMagicNumber1, glowMagicNumber2, glowAnimationSpeed, glowVisibility, glowBlendMode, glowBlendPasses, glowPasses, glowIgnoreMask;
|
||||
SerializedProperty innerGlow, innerGlowWidth, innerGlowColor, innerGlowVisibility;
|
||||
SerializedProperty targetFX, targetFXTexture, targetFXColor, targetFXRotationSpeed, targetFXInitialScale, targetFXEndScale, targetFXScaleToRenderBounds;
|
||||
SerializedProperty targetFXAlignToGround, targetFXFadePower, targetFXGroundMaxDistance, targetFXGroundLayerMask, targetFXTransitionDuration, targetFXStayDuration, targetFXVisibility;
|
||||
SerializedProperty seeThrough, seeThroughOccluderMask, seeThroughOccluderMaskAccurate, seeThroughOccluderThreshold, seeThroughOccluderCheckInterval, seeThroughOccluderCheckIndividualObjects, seeThroughDepthOffset, seeThroughMaxDepth;
|
||||
SerializedProperty seeThroughIntensity, seeThroughTintAlpha, seeThroughTintColor, seeThroughNoise, seeThroughBorder, seeThroughBorderWidth, seeThroughBorderColor, seeThroughOrdered, seeThroughBorderOnly, seeThroughTexture, seeThroughTextureUVSpace, seeThroughTextureScale;
|
||||
SerializedProperty hitFxInitialIntensity, hitFxMode, hitFxFadeOutDuration, hitFxColor, hitFxRadius;
|
||||
SerializedProperty cameraDistanceFade, cameraDistanceFadeNear, cameraDistanceFadeFar;
|
||||
|
||||
void OnEnable() {
|
||||
effectGroup = serializedObject.FindProperty("effectGroup");
|
||||
effectGroupLayer = serializedObject.FindProperty("effectGroupLayer");
|
||||
effectNameFilter = serializedObject.FindProperty("effectNameFilter");
|
||||
combineMeshes = serializedObject.FindProperty("combineMeshes");
|
||||
alphaCutOff = serializedObject.FindProperty("alphaCutOff");
|
||||
cullBackFaces = serializedObject.FindProperty("cullBackFaces");
|
||||
depthClip = serializedObject.FindProperty("depthClip");
|
||||
normalsOption = serializedObject.FindProperty("normalsOption");
|
||||
fadeInDuration = serializedObject.FindProperty("fadeInDuration");
|
||||
fadeOutDuration = serializedObject.FindProperty("fadeOutDuration");
|
||||
constantWidth = serializedObject.FindProperty("constantWidth");
|
||||
overlay = serializedObject.FindProperty("overlay");
|
||||
overlayMode = serializedObject.FindProperty("overlayMode");
|
||||
overlayColor = serializedObject.FindProperty("overlayColor");
|
||||
overlayAnimationSpeed = serializedObject.FindProperty("overlayAnimationSpeed");
|
||||
overlayMinIntensity = serializedObject.FindProperty("overlayMinIntensity");
|
||||
overlayBlending = serializedObject.FindProperty("overlayBlending");
|
||||
overlayTexture = serializedObject.FindProperty("overlayTexture");
|
||||
overlayTextureUVSpace = serializedObject.FindProperty("overlayTextureUVSpace");
|
||||
overlayTextureScale = serializedObject.FindProperty("overlayTextureScale");
|
||||
outline = serializedObject.FindProperty("outline");
|
||||
outlineColor = serializedObject.FindProperty("outlineColor");
|
||||
outlineColorStyle = serializedObject.FindProperty("outlineColorStyle");
|
||||
outlineGradient = serializedObject.FindProperty("outlineGradient");
|
||||
outlineGradientInLocalSpace = serializedObject.FindProperty("outlineGradientInLocalSpace");
|
||||
outlineWidth = serializedObject.FindProperty("outlineWidth");
|
||||
outlineQuality = serializedObject.FindProperty("outlineQuality");
|
||||
outlineOptimalBlit = serializedObject.FindProperty("outlineOptimalBlit");
|
||||
outlineDownsampling = serializedObject.FindProperty("outlineDownsampling");
|
||||
outlineVisibility = serializedObject.FindProperty("outlineVisibility");
|
||||
outlineIndependent = serializedObject.FindProperty("outlineIndependent");
|
||||
glow = serializedObject.FindProperty("glow");
|
||||
glowWidth = serializedObject.FindProperty("glowWidth");
|
||||
glowQuality = serializedObject.FindProperty("glowQuality");
|
||||
glowOptimalBlit = serializedObject.FindProperty("glowOptimalBlit");
|
||||
glowDownsampling = serializedObject.FindProperty("glowDownsampling");
|
||||
glowHQColor = serializedObject.FindProperty("glowHQColor");
|
||||
glowAnimationSpeed = serializedObject.FindProperty("glowAnimationSpeed");
|
||||
glowDithering = serializedObject.FindProperty("glowDithering");
|
||||
glowMagicNumber1 = serializedObject.FindProperty("glowMagicNumber1");
|
||||
glowMagicNumber2 = serializedObject.FindProperty("glowMagicNumber2");
|
||||
glowAnimationSpeed = serializedObject.FindProperty("glowAnimationSpeed");
|
||||
glowBlendPasses = serializedObject.FindProperty("glowBlendPasses");
|
||||
glowVisibility = serializedObject.FindProperty("glowVisibility");
|
||||
glowBlendMode = serializedObject.FindProperty("glowBlendMode");
|
||||
glowPasses = serializedObject.FindProperty("glowPasses");
|
||||
glowIgnoreMask = serializedObject.FindProperty("glowIgnoreMask");
|
||||
innerGlow = serializedObject.FindProperty("innerGlow");
|
||||
innerGlowColor = serializedObject.FindProperty("innerGlowColor");
|
||||
innerGlowWidth = serializedObject.FindProperty("innerGlowWidth");
|
||||
innerGlowVisibility = serializedObject.FindProperty("innerGlowVisibility");
|
||||
targetFX = serializedObject.FindProperty("targetFX");
|
||||
targetFXTexture = serializedObject.FindProperty("targetFXTexture");
|
||||
targetFXRotationSpeed = serializedObject.FindProperty("targetFXRotationSpeed");
|
||||
targetFXInitialScale = serializedObject.FindProperty("targetFXInitialScale");
|
||||
targetFXEndScale = serializedObject.FindProperty("targetFXEndScale");
|
||||
targetFXScaleToRenderBounds = serializedObject.FindProperty("targetFXScaleToRenderBounds");
|
||||
targetFXAlignToGround = serializedObject.FindProperty("targetFXAlignToGround");
|
||||
targetFXGroundMaxDistance = serializedObject.FindProperty("targetFXGroundMaxDistance");
|
||||
targetFXGroundLayerMask = serializedObject.FindProperty("targetFXGroundLayerMask");
|
||||
targetFXFadePower = serializedObject.FindProperty("targetFXFadePower");
|
||||
targetFXColor = serializedObject.FindProperty("targetFXColor");
|
||||
targetFXTransitionDuration = serializedObject.FindProperty("targetFXTransitionDuration");
|
||||
targetFXStayDuration = serializedObject.FindProperty("targetFXStayDuration");
|
||||
targetFXVisibility = serializedObject.FindProperty("targetFXVisibility");
|
||||
seeThrough = serializedObject.FindProperty("seeThrough");
|
||||
seeThroughOccluderMask = serializedObject.FindProperty("seeThroughOccluderMask");
|
||||
seeThroughOccluderMaskAccurate = serializedObject.FindProperty("seeThroughOccluderMaskAccurate");
|
||||
seeThroughOccluderThreshold = serializedObject.FindProperty("seeThroughOccluderThreshold");
|
||||
seeThroughOccluderCheckInterval = serializedObject.FindProperty("seeThroughOccluderCheckInterval");
|
||||
seeThroughOccluderCheckIndividualObjects = serializedObject.FindProperty("seeThroughOccluderCheckIndividualObjects");
|
||||
seeThroughDepthOffset = serializedObject.FindProperty("seeThroughDepthOffset");
|
||||
seeThroughMaxDepth = serializedObject.FindProperty("seeThroughMaxDepth");
|
||||
seeThroughIntensity = serializedObject.FindProperty("seeThroughIntensity");
|
||||
seeThroughTintAlpha = serializedObject.FindProperty("seeThroughTintAlpha");
|
||||
seeThroughTintColor = serializedObject.FindProperty("seeThroughTintColor");
|
||||
seeThroughNoise = serializedObject.FindProperty("seeThroughNoise");
|
||||
seeThroughBorder = serializedObject.FindProperty("seeThroughBorder");
|
||||
seeThroughBorderWidth = serializedObject.FindProperty("seeThroughBorderWidth");
|
||||
seeThroughBorderColor = serializedObject.FindProperty("seeThroughBorderColor");
|
||||
seeThroughBorderOnly = serializedObject.FindProperty("seeThroughBorderOnly");
|
||||
seeThroughOrdered = serializedObject.FindProperty("seeThroughOrdered");
|
||||
seeThroughTexture = serializedObject.FindProperty("seeThroughTexture");
|
||||
seeThroughTextureScale = serializedObject.FindProperty("seeThroughTextureScale");
|
||||
seeThroughTextureUVSpace = serializedObject.FindProperty("seeThroughTextureUVSpace");
|
||||
hitFxInitialIntensity = serializedObject.FindProperty("hitFxInitialIntensity");
|
||||
hitFxMode = serializedObject.FindProperty("hitFxMode");
|
||||
hitFxFadeOutDuration = serializedObject.FindProperty("hitFxFadeOutDuration");
|
||||
hitFxColor = serializedObject.FindProperty("hitFxColor");
|
||||
hitFxRadius = serializedObject.FindProperty("hitFxRadius");
|
||||
cameraDistanceFade = serializedObject.FindProperty("cameraDistanceFade");
|
||||
cameraDistanceFadeNear = serializedObject.FindProperty("cameraDistanceFadeNear");
|
||||
cameraDistanceFadeFar = serializedObject.FindProperty("cameraDistanceFadeFar");
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI() {
|
||||
|
||||
EditorGUILayout.Separator();
|
||||
EditorGUILayout.LabelField("Highlight Options", EditorStyles.boldLabel);
|
||||
EditorGUILayout.PropertyField(effectGroup, new GUIContent("Include"));
|
||||
if (effectGroup.intValue == (int)TargetOptions.LayerInScene || effectGroup.intValue == (int)TargetOptions.LayerInChildren) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(effectGroupLayer, new GUIContent("Layer"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
if (effectGroup.intValue != (int)TargetOptions.OnlyThisObject && effectGroup.intValue != (int)TargetOptions.Scripting) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(effectNameFilter, new GUIContent("Object Name Filter"));
|
||||
EditorGUILayout.PropertyField(combineMeshes);
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(alphaCutOff);
|
||||
EditorGUILayout.PropertyField(cullBackFaces);
|
||||
EditorGUILayout.PropertyField(normalsOption);
|
||||
EditorGUILayout.PropertyField(depthClip);
|
||||
EditorGUILayout.PropertyField(fadeInDuration);
|
||||
EditorGUILayout.PropertyField(fadeOutDuration);
|
||||
EditorGUILayout.PropertyField(cameraDistanceFade);
|
||||
if (cameraDistanceFade.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(cameraDistanceFadeNear, new GUIContent("Near Distance"));
|
||||
EditorGUILayout.PropertyField(cameraDistanceFadeFar, new GUIContent("Far Distance"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(constantWidth);
|
||||
EditorGUILayout.PropertyField(outlineIndependent, new GUIContent("Independent", "Do not combine outline with other highlighted objects."));
|
||||
|
||||
EditorGUILayout.Separator();
|
||||
EditorGUILayout.LabelField("Effects", EditorStyles.boldLabel);
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(outline, "Outline", outline.floatValue > 0);
|
||||
if (outline.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(outlineWidth, new GUIContent("Width"));
|
||||
HighlightEffectEditor.QualityPropertyField(outlineQuality);
|
||||
if (outlineQuality.intValue == (int)QualityLevel.Highest) {
|
||||
EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
|
||||
} else {
|
||||
EditorGUILayout.PropertyField(outlineColorStyle, new GUIContent("Color Style"));
|
||||
switch ((ColorStyle)outlineColorStyle.intValue) {
|
||||
case ColorStyle.SingleColor:
|
||||
EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
|
||||
break;
|
||||
case ColorStyle.Gradient:
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(outlineGradient, new GUIContent("Gradient"));
|
||||
EditorGUILayout.PropertyField(outlineGradientInLocalSpace, new GUIContent("In Local Space"));
|
||||
EditorGUI.indentLevel--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (outlineQuality.intValue == (int)QualityLevel.Highest) {
|
||||
EditorGUILayout.PropertyField(outlineDownsampling, new GUIContent("Downsampling"));
|
||||
EditorGUILayout.PropertyField(outlineOptimalBlit, new GUIContent("Optimal Blit", "Blits result over a section of the screen instead of rendering to the full screen buffer."));
|
||||
}
|
||||
if (outlineQuality.intValue == (int)QualityLevel.Highest && glowQuality.intValue == (int)QualityLevel.Highest) {
|
||||
EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
|
||||
} else {
|
||||
EditorGUILayout.PropertyField(outlineVisibility, new GUIContent("Visibility"));
|
||||
}
|
||||
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(glow, "Outer Glow", glow.floatValue > 0);
|
||||
if (glow.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(glowWidth, new GUIContent("Width"));
|
||||
HighlightEffectEditor.QualityPropertyField(glowQuality);
|
||||
if (glowQuality.intValue == (int)QualityLevel.Highest) {
|
||||
EditorGUILayout.PropertyField(glowDownsampling, new GUIContent("Downsampling"));
|
||||
EditorGUILayout.PropertyField(glowHQColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(glowOptimalBlit, new GUIContent("Optimal Blit", "Blits result over a section of the screen instead of rendering to the full screen buffer."));
|
||||
}
|
||||
EditorGUILayout.PropertyField(glowAnimationSpeed, new GUIContent("Animation Speed"));
|
||||
EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
|
||||
EditorGUILayout.PropertyField(glowBlendMode, new GUIContent("Blend Mode"));
|
||||
if (glowQuality.intValue != (int)QualityLevel.Highest) {
|
||||
EditorGUILayout.PropertyField(glowDithering, new GUIContent("Dithering"));
|
||||
if (glowDithering.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(glowMagicNumber1, new GUIContent("Magic Number 1"));
|
||||
EditorGUILayout.PropertyField(glowMagicNumber2, new GUIContent("Magic Number 2"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(glowBlendPasses, new GUIContent("Blend Passes"));
|
||||
EditorGUILayout.PropertyField(glowPasses, true);
|
||||
EditorGUILayout.PropertyField(glowIgnoreMask, new GUIContent("Ignore Mask"));
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(innerGlow, "Inner Glow", innerGlow.floatValue > 0);
|
||||
if (innerGlow.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(innerGlowColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(innerGlowWidth, new GUIContent("Width"));
|
||||
EditorGUILayout.PropertyField(innerGlowVisibility, new GUIContent("Visibility"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(overlay, "Overlay", overlay.floatValue > 0);
|
||||
if (overlay.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(overlayMode, new GUIContent("Mode"));
|
||||
EditorGUILayout.PropertyField(overlayColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(overlayTexture, new GUIContent("Texture"));
|
||||
if (overlayTexture.objectReferenceValue != null) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(overlayTextureUVSpace, new GUIContent("UV Space"));
|
||||
EditorGUILayout.PropertyField(overlayTextureScale, new GUIContent("Texture Scale"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(overlayBlending, new GUIContent("Blending"));
|
||||
EditorGUILayout.PropertyField(overlayMinIntensity, new GUIContent("Min Intensity"));
|
||||
EditorGUILayout.PropertyField(overlayAnimationSpeed, new GUIContent("Animation Speed"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(targetFX, "Target", targetFX.boolValue);
|
||||
if (targetFX.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(targetFXTexture, new GUIContent("Texture"));
|
||||
EditorGUILayout.PropertyField(targetFXColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(targetFXRotationSpeed, new GUIContent("Rotation Speed"));
|
||||
EditorGUILayout.PropertyField(targetFXInitialScale, new GUIContent("Initial Scale"));
|
||||
EditorGUILayout.PropertyField(targetFXEndScale, new GUIContent("End Scale"));
|
||||
EditorGUILayout.PropertyField(targetFXScaleToRenderBounds, new GUIContent("Scale To Object Bounds"));
|
||||
EditorGUILayout.PropertyField(targetFXAlignToGround, new GUIContent("Align To Ground"));
|
||||
if (targetFXAlignToGround.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(targetFXGroundMaxDistance, new GUIContent("Ground Max Distance"));
|
||||
EditorGUILayout.PropertyField(targetFXGroundLayerMask, new GUIContent("Ground Layer Mask"));
|
||||
EditorGUILayout.PropertyField(targetFXFadePower, new GUIContent("Fade Power"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(targetFXTransitionDuration, new GUIContent("Transition Duration"));
|
||||
EditorGUILayout.PropertyField(targetFXStayDuration, new GUIContent("Stay Duration"));
|
||||
EditorGUILayout.PropertyField(targetFXVisibility, new GUIContent("Visibility"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
EditorGUILayout.PropertyField(seeThrough);
|
||||
if (seeThrough.intValue != (int)SeeThroughMode.Never) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderMask, new GUIContent("Occluder Layer"));
|
||||
if (seeThroughOccluderMask.intValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderMaskAccurate, new GUIContent("Accurate"));
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderThreshold, new GUIContent("Radius Threshold", "Multiplier to the object bounds. Making the bounds smaller prevents false occlusion tests."));
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderCheckInterval, new GUIContent("Check Interval", "Interval in seconds between occlusion tests."));
|
||||
EditorGUILayout.PropertyField(seeThroughOccluderCheckIndividualObjects, new GUIContent("Check Individual Objects", "Interval in seconds between occlusion tests."));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(seeThroughDepthOffset, new GUIContent("Depth Offset" + ((seeThroughDepthOffset.floatValue > 0) ? " •" : "")));
|
||||
EditorGUILayout.PropertyField(seeThroughMaxDepth, new GUIContent("Max Depth" + ((seeThroughMaxDepth.floatValue > 0) ? " •" : "")));
|
||||
EditorGUILayout.PropertyField(seeThroughIntensity, new GUIContent("Intensity"));
|
||||
EditorGUILayout.PropertyField(seeThroughTintColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(seeThroughTintAlpha, new GUIContent("Color Blend"));
|
||||
EditorGUILayout.PropertyField(seeThroughNoise, new GUIContent("Noise"));
|
||||
EditorGUILayout.PropertyField(seeThroughTexture, new GUIContent("Texture"));
|
||||
if (seeThroughTexture.objectReferenceValue != null) {
|
||||
EditorGUILayout.PropertyField(seeThroughTextureUVSpace, new GUIContent("UV Space"));
|
||||
EditorGUILayout.PropertyField(seeThroughTextureScale, new GUIContent("Texture Scale"));
|
||||
}
|
||||
EditorGUILayout.PropertyField(seeThroughBorder, new GUIContent("Border When Hidden"));
|
||||
if (seeThroughBorder.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(seeThroughBorderWidth, new GUIContent("Width"));
|
||||
EditorGUILayout.PropertyField(seeThroughBorderColor, new GUIContent("Color"));
|
||||
EditorGUILayout.PropertyField(seeThroughBorderOnly, new GUIContent("Border Only"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.PropertyField(seeThroughOrdered, new GUIContent("Ordered"));
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
EditorGUILayout.BeginVertical(GUI.skin.box);
|
||||
DrawSectionField(hitFxInitialIntensity, "Hit FX", hitFxInitialIntensity.floatValue > 0);
|
||||
if (hitFxInitialIntensity.floatValue > 0) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(hitFxInitialIntensity, new GUIContent("Initial Intensity"));
|
||||
EditorGUILayout.PropertyField(hitFxMode, new GUIContent("Mode"));
|
||||
EditorGUILayout.PropertyField(hitFxFadeOutDuration, new GUIContent("Fade Out Duration"));
|
||||
EditorGUILayout.PropertyField(hitFxColor, new GUIContent("Color"));
|
||||
if ((HitFxMode)hitFxMode.intValue == HitFxMode.LocalHit) {
|
||||
EditorGUILayout.PropertyField(hitFxRadius, new GUIContent("Radius"));
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
if (serializedObject.ApplyModifiedProperties() || (Event.current.type == EventType.ValidateCommand &&
|
||||
Event.current.commandName == "UndoRedoPerformed")) {
|
||||
|
||||
// Triggers profile reload on all Highlight Effect scripts
|
||||
HighlightEffect[] effects = FindObjectsOfType<HighlightEffect>();
|
||||
for (int t = 0; t < targets.Length; t++) {
|
||||
HighlightProfile profile = (HighlightProfile)targets[t];
|
||||
for (int k = 0; k < effects.Length; k++) {
|
||||
if (effects[k] != null && effects[k].profile == profile && effects[k].profileSync) {
|
||||
profile.Load(effects[k]);
|
||||
effects[k].Refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
EditorUtility.SetDirty(target);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void DrawSectionField(SerializedProperty property, string label, bool active) {
|
||||
EditorGUILayout.PropertyField(property, new GUIContent(active ? label + " •" : label));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: b3b0e551d6f4f4f3987e8e5be2e89285
|
||||
timeCreated: 1542886545
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,33 @@
|
|||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace HighlightPlus {
|
||||
|
||||
[CustomEditor(typeof(HighlightSeeThroughOccluder))]
|
||||
public class HighlightSeeThroughOccluderEditor : Editor {
|
||||
|
||||
SerializedProperty mode, detectionMethod;
|
||||
|
||||
void OnEnable() {
|
||||
mode = serializedObject.FindProperty("mode");
|
||||
detectionMethod = serializedObject.FindProperty("detectionMethod");
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI() {
|
||||
|
||||
serializedObject.Update();
|
||||
|
||||
EditorGUILayout.PropertyField(mode);
|
||||
if (mode.intValue == (int)OccluderMode.BlocksSeeThrough) {
|
||||
EditorGUILayout.HelpBox("This object will occlude any see-through effect.", MessageType.Info);
|
||||
EditorGUILayout.PropertyField(detectionMethod);
|
||||
} else {
|
||||
EditorGUILayout.HelpBox("This object will trigger see-through effect. Use only on objects that do not write to depth buffer normally, like sprites or transparent objects.", MessageType.Info);
|
||||
}
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 11e725ecbe4d74569b232e1a0d57efba
|
||||
timeCreated: 1548711355
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,105 @@
|
|||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace HighlightPlus {
|
||||
[CustomEditor(typeof(HighlightTrigger))]
|
||||
public class HighlightTriggerEditor : Editor {
|
||||
|
||||
SerializedProperty highlightOnHover, triggerMode, raycastCamera, raycastSource, raycastLayerMask;
|
||||
SerializedProperty minDistance, maxDistance, respectUI, volumeLayerMask;
|
||||
SerializedProperty selectOnClick, selectedProfile, selectedAndHighlightedProfile, singleSelection, toggleOnClick, keepSelection;
|
||||
HighlightTrigger trigger;
|
||||
|
||||
void OnEnable() {
|
||||
highlightOnHover = serializedObject.FindProperty("highlightOnHover");
|
||||
triggerMode = serializedObject.FindProperty("triggerMode");
|
||||
raycastCamera = serializedObject.FindProperty("raycastCamera");
|
||||
raycastSource = serializedObject.FindProperty("raycastSource");
|
||||
raycastLayerMask = serializedObject.FindProperty("raycastLayerMask");
|
||||
minDistance = serializedObject.FindProperty("minDistance");
|
||||
maxDistance = serializedObject.FindProperty("maxDistance");
|
||||
respectUI = serializedObject.FindProperty("respectUI");
|
||||
volumeLayerMask = serializedObject.FindProperty("volumeLayerMask");
|
||||
selectOnClick = serializedObject.FindProperty("selectOnClick");
|
||||
selectedProfile = serializedObject.FindProperty("selectedProfile");
|
||||
selectedAndHighlightedProfile = serializedObject.FindProperty("selectedAndHighlightedProfile");
|
||||
singleSelection = serializedObject.FindProperty("singleSelection");
|
||||
toggleOnClick = serializedObject.FindProperty("toggle");
|
||||
keepSelection = serializedObject.FindProperty("keepSelection");
|
||||
trigger = (HighlightTrigger)target;
|
||||
trigger.Init();
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI() {
|
||||
|
||||
serializedObject.Update();
|
||||
|
||||
if (trigger.triggerMode == TriggerMode.RaycastOnThisObjectAndChildren) {
|
||||
if (trigger.colliders == null || trigger.colliders.Length == 0) {
|
||||
EditorGUILayout.HelpBox("No collider found on this object or any of its children. Add colliders to allow automatic highlighting.", MessageType.Warning);
|
||||
}
|
||||
} else {
|
||||
#if ENABLE_INPUT_SYSTEM
|
||||
if (trigger.triggerMode == TriggerMode.ColliderEventsOnlyOnThisObject) {
|
||||
EditorGUILayout.HelpBox("This trigger mode is not compatible with the new input system.", MessageType.Error);
|
||||
}
|
||||
#endif
|
||||
if (trigger.GetComponent<Collider>() == null) {
|
||||
EditorGUILayout.HelpBox("No collider found on this object. Add a collider to allow automatic highlighting.", MessageType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
EditorGUILayout.PropertyField(triggerMode);
|
||||
switch (trigger.triggerMode) {
|
||||
case TriggerMode.RaycastOnThisObjectAndChildren:
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(raycastCamera);
|
||||
EditorGUILayout.PropertyField(raycastSource);
|
||||
EditorGUILayout.PropertyField(raycastLayerMask);
|
||||
EditorGUILayout.PropertyField(minDistance);
|
||||
EditorGUILayout.PropertyField(maxDistance);
|
||||
EditorGUI.indentLevel--;
|
||||
break;
|
||||
case TriggerMode.Volume:
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(volumeLayerMask);
|
||||
EditorGUI.indentLevel--;
|
||||
break;
|
||||
}
|
||||
|
||||
if (trigger.triggerMode != TriggerMode.Volume) {
|
||||
EditorGUILayout.PropertyField(respectUI);
|
||||
}
|
||||
EditorGUILayout.PropertyField(highlightOnHover);
|
||||
EditorGUILayout.PropertyField(selectOnClick);
|
||||
if (selectOnClick.boolValue) {
|
||||
EditorGUI.indentLevel++;
|
||||
EditorGUILayout.PropertyField(selectedProfile);
|
||||
EditorGUILayout.PropertyField(selectedAndHighlightedProfile);
|
||||
EditorGUILayout.PropertyField(singleSelection);
|
||||
EditorGUILayout.PropertyField(toggleOnClick);
|
||||
if (trigger.triggerMode == TriggerMode.RaycastOnThisObjectAndChildren) {
|
||||
EditorGUI.BeginChangeCheck();
|
||||
EditorGUILayout.PropertyField(keepSelection);
|
||||
if (EditorGUI.EndChangeCheck()) {
|
||||
// Update all triggers
|
||||
HighlightTrigger[] triggers = FindObjectsOfType<HighlightTrigger>();
|
||||
foreach(HighlightTrigger t in triggers) {
|
||||
if (t.keepSelection != keepSelection.boolValue) {
|
||||
t.keepSelection = keepSelection.boolValue;
|
||||
EditorUtility.SetDirty(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
if (serializedObject.ApplyModifiedProperties()) {
|
||||
trigger.Init();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
fileFormatVersion: 2
|
||||
guid: eaf7f56fbcfa343efb5081d4309cb76b
|
||||
timeCreated: 1548711355
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,132 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEditor;
|
||||
|
||||
namespace HighlightPlus {
|
||||
|
||||
public class TransparentWithDepth {
|
||||
|
||||
static Material bmDepthOnly;
|
||||
static Material bmDepthClipping;
|
||||
|
||||
|
||||
[MenuItem ("GameObject/Effects/Highlight Plus/Add Depth To Transparent Object", false, 100)]
|
||||
static void AddDepthOption () {
|
||||
Renderer renderer = GetRenderer ();
|
||||
if (renderer == null)
|
||||
return;
|
||||
|
||||
if (!EditorUtility.DisplayDialog("Add Depth to Transparent Object", "This option will force the transparent object to write to the depth buffer by adding a new special material to the renderer (existing materials are preserved) so it can occlude and allow See-Through effect.\nOnly use on transparent objects.\n\nProceed?", "Yes", "No")) {
|
||||
return;
|
||||
}
|
||||
|
||||
Material[] materials = renderer.sharedMaterials;
|
||||
for (int k = 0; k < materials.Length; k++) {
|
||||
if (materials [k] == bmDepthOnly) {
|
||||
EditorUtility.DisplayDialog ("Depth Support", "Already set! Nothing to do.", "Ok");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (materials == null) {
|
||||
renderer.sharedMaterial = bmDepthOnly;
|
||||
} else {
|
||||
List<Material> newMaterials = new List<Material> (materials);
|
||||
newMaterials.Insert (0, bmDepthOnly);
|
||||
renderer.sharedMaterials = newMaterials.ToArray ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[MenuItem("GameObject/Effects/Highlight Plus/Make Transparent Object Compatible with Depth Clipping", false, 101)]
|
||||
static void AddDepthClippingOption() {
|
||||
Renderer renderer = GetRenderer();
|
||||
if (renderer == null)
|
||||
return;
|
||||
|
||||
if (!EditorUtility.DisplayDialog("Make Transparent Object Compatible with Depth Clipping", "This option will force the transparent object to write to _CameraDepthBuffer which is used by depth clip option (existing materials are preserved) so it can occlude outline and glow effects in High Quality mode.\nOnly use on transparent objects which need to occlude other outline / glow effects in high quality mode.\n\nProceed?", "Yes", "No")) {
|
||||
return;
|
||||
}
|
||||
|
||||
Material[] materials = renderer.sharedMaterials;
|
||||
for (int k = 0; k < materials.Length; k++) {
|
||||
if (materials[k] == bmDepthClipping) {
|
||||
EditorUtility.DisplayDialog("Depth Clipping Support", "Already set! Nothing to do.", "Ok");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (materials == null) {
|
||||
renderer.sharedMaterial = bmDepthClipping;
|
||||
} else {
|
||||
List<Material> newMaterials = new List<Material>(materials);
|
||||
newMaterials.Insert(0, bmDepthClipping);
|
||||
renderer.sharedMaterials = newMaterials.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[MenuItem("GameObject/Effects/Highlight Plus/Remove Depth Compatibility", false, 102)]
|
||||
static void RemoveDepthOption() {
|
||||
|
||||
Renderer renderer = GetRenderer();
|
||||
if (renderer == null)
|
||||
return;
|
||||
|
||||
bool found = false;
|
||||
Material[] materials = renderer.sharedMaterials;
|
||||
for (int k = 0; k < materials.Length; k++) {
|
||||
if (materials[k] == bmDepthOnly || materials[k] == bmDepthClipping) {
|
||||
materials[k] = null;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
List<Material> newMaterials = new List<Material>();
|
||||
for (int k = 0; k < materials.Length; k++) {
|
||||
if (materials[k] != null) {
|
||||
newMaterials.Add(materials[k]);
|
||||
}
|
||||
}
|
||||
renderer.sharedMaterials = newMaterials.ToArray();
|
||||
return;
|
||||
}
|
||||
|
||||
EditorUtility.DisplayDialog("Depth Support", "This object was not previously modified! Nothing to do.", "Ok");
|
||||
}
|
||||
|
||||
|
||||
static Renderer GetRenderer() {
|
||||
|
||||
if (Selection.activeGameObject == null) {
|
||||
EditorUtility.DisplayDialog("Depth Support", "This option can only be used on GameObjects.", "Ok");
|
||||
return null;
|
||||
}
|
||||
Renderer renderer = Selection.activeGameObject.GetComponent<Renderer>();
|
||||
if (renderer == null) {
|
||||
EditorUtility.DisplayDialog("Depth Support", "This option can only be used on GameObjects with a Renderer component attached.", "Ok");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (bmDepthOnly == null) {
|
||||
bmDepthOnly = Resources.Load<Material>("HighlightPlus/HighlightPlusDepthWrite");
|
||||
if (bmDepthOnly == null) {
|
||||
EditorUtility.DisplayDialog("Depth Support", "HighlightPlusDepthWrite material not found!", "Ok");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if (bmDepthClipping == null) {
|
||||
bmDepthClipping = Resources.Load<Material>("HighlightPlus/HighlightPlusDepthClipComp");
|
||||
if (bmDepthClipping == null) {
|
||||
EditorUtility.DisplayDialog("Depth Clipping Support", "HighlightPlusDepthClipComp material not found!", "Ok");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return renderer;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
fileFormatVersion: 2
|
||||
guid: be6e3be6d17ed49a3bd16d816815d6fd
|
||||
timeCreated: 1515683694
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,47 @@
|
|||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using UnityEngine.XR;
|
||||
|
||||
namespace HighlightPlus {
|
||||
public static class VRCheck {
|
||||
|
||||
#if UNITY_2019_3_OR_NEWER
|
||||
|
||||
static List<XRDisplaySubsystemDescriptor> displaysDescs = new List<XRDisplaySubsystemDescriptor>();
|
||||
static List<XRDisplaySubsystem> displays = new List<XRDisplaySubsystem>();
|
||||
|
||||
public static bool IsActive() {
|
||||
displaysDescs.Clear();
|
||||
SubsystemManager.GetSubsystemDescriptors(displaysDescs);
|
||||
|
||||
// If there are registered display descriptors that is a good indication that VR is most likely "enabled"
|
||||
return displaysDescs.Count > 0;
|
||||
}
|
||||
|
||||
public static bool IsVrRunning() {
|
||||
bool vrIsRunning = false;
|
||||
displays.Clear();
|
||||
SubsystemManager.GetInstances(displays);
|
||||
foreach (var displaySubsystem in displays) {
|
||||
if (displaySubsystem.running) {
|
||||
vrIsRunning = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return vrIsRunning;
|
||||
}
|
||||
#else
|
||||
public static bool IsActive() {
|
||||
return PlayerSettings.virtualRealitySupported;
|
||||
}
|
||||
|
||||
public static bool IsVrRunning() {
|
||||
return Application.isPlaying && PlayerSettings.virtualRealitySupported;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: e692cbce37dc14e29b436d0c876f45dc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,484 @@
|
|||
**************************************
|
||||
* HIGHLIGHT PLUS *
|
||||
* Created by Ramiro Oliva (Kronnect) *
|
||||
* README FILE *
|
||||
**************************************
|
||||
|
||||
|
||||
Quick help: how to use this asset?
|
||||
----------------------------------
|
||||
|
||||
1) Highlighting specific objects: add HighlightEffect.cs script to any GameObject. Customize the appearance options.
|
||||
In the Highlight Effect inspector, you can specify which objects, in addition to this one, are also affected by the effect:
|
||||
a) Only this object
|
||||
b) This object and its children
|
||||
c) All objects from the root to the children
|
||||
d) All objects belonging to a layer
|
||||
|
||||
2) Control highlight effect when mouse is over:
|
||||
Add HighlightTrigger.cs script to the GameObject. It will activate highlight on the gameobject when mouse pass over it.
|
||||
|
||||
3) Highlighting any object in the scene:
|
||||
Select top menu GameObject -> Effects -> Highlight Plus -> Create Manager.
|
||||
Customize appearance and behaviour of Highlight Manager. Those settings are default settings for all objects. If you want different settings for certain objects just add another HighlightEffect script to each different object. The manager will use those settings.
|
||||
|
||||
4) Make transparent shaders compatible with See-Through effect:
|
||||
If you want the See-Through effect be seen through other transparent objects, they need to be modified so they write to depth buffer (by default transparent objects do not write to z-buffer).
|
||||
To do so, select top menu GameObject -> Effects -> Highlight Plus -> Add Depth To Transparent Object.
|
||||
|
||||
5) Static batching:
|
||||
Objects marked as "static" need a MeshCollider in order to be highlighted. This is because Unity combines the meshes of static objects so it's not possible to highlight individual objects if their meshes are combined.
|
||||
To allow highlighting static objects make sure they have a MeshCollider attached (the MeshCollider can be disabled).
|
||||
|
||||
|
||||
|
||||
Help & Support Forum
|
||||
--------------------
|
||||
|
||||
Check the Documentation folder for detailed instructions:
|
||||
|
||||
Have any question or issue?
|
||||
* Support-Web: https://kronnect.com/support
|
||||
* Support-Discord: https://discord.gg/EH2GMaM
|
||||
* Email: contact@kronnect.com
|
||||
* Twitter: @Kronnect
|
||||
|
||||
If you like Highlight Plus, please rate it on the Asset Store. It encourages us to keep improving it! Thanks!
|
||||
|
||||
|
||||
|
||||
Universal Rendering Pipeline
|
||||
----------------------------
|
||||
|
||||
Customers can download a specific version of Highlight Plus designed for Universal Rendering Pipeline for free from our support forum on https://kronnect.com
|
||||
Please sign up on the forum and send a pm to "Kronnect" or email to contact@kronnect.com to get access to the private board.
|
||||
|
||||
The Unity Asset Store currently does not allow you to select which package according to the pipeline to download so we have to offer this way so you can download it.
|
||||
|
||||
|
||||
Future updates
|
||||
--------------
|
||||
|
||||
All our assets follow an incremental development process by which a few beta releases are published on our support forum (kronnect.com).
|
||||
We encourage you to signup and engage our forum. The forum is the primary support and feature discussions medium.
|
||||
|
||||
Of course, all updates of Highlight Plus will be eventually available on the Asset Store.
|
||||
|
||||
|
||||
|
||||
More Cool Assets!
|
||||
-----------------
|
||||
Check out our other assets here:
|
||||
https://assetstore.unity.com/publishers/15018
|
||||
|
||||
|
||||
|
||||
Version history
|
||||
---------------
|
||||
|
||||
Current version
|
||||
- Added new "UV Space" options to Overlay effect (now: triplanar, object space or screen space)
|
||||
- Added mask texture and "UV Space" options to See-Through effect
|
||||
- Camera Distance Fade now also affects the see-through effect
|
||||
|
||||
Version 9.5
|
||||
- Outline: added Color Style property and new Gradient option
|
||||
- Internal buffer for highest quality outline/glow format changed to R8 format to reduce memory and improve performance on mobile
|
||||
- API: Refresh(discardCachedMeshes): added discardCachedMeshes optional parameter to force refresh of cached meshes (useful for combined meshes that have changed)
|
||||
|
||||
Version 9.4
|
||||
- Highlight See Through Occluder: added mode for triggering the see-through offect on sprites and transparent objects
|
||||
- [Fix] Fixed a problem on Quest 2 standalone when using with other render features (ie. Liquid Volume Pro 2 irregular topology)
|
||||
|
||||
Version 9.3
|
||||
- Overlay: added "Mode" option (only when highlighted or always)
|
||||
- Nested highlight effects are now included unless the 'Ignore' option is selected
|
||||
- Cached meshes are now reconstructed when calling the Refresh() method
|
||||
|
||||
Version 9.2
|
||||
- Improved shared mesh cache handling
|
||||
- Improved see-through camera-layer based detection
|
||||
|
||||
Version 9.1.2
|
||||
- [Fix] Fixed outline/glow distortion due to floating point math issues at distant positions from origin
|
||||
|
||||
Version 9.1.1
|
||||
- Added support for Unity 2022
|
||||
- Added Layer Mask option to Highlight Trigger
|
||||
- Added "Keep Selection" option in Highlight Manager and Highlight Trigger
|
||||
- [Fix] Fixed a potential issue that could exceed the maximum 64k vertices when combining meshes
|
||||
|
||||
Version 9.0
|
||||
- Added "Camera Distance Fade" option
|
||||
- Improved see-through accurate method which now takes into account multi-part meshes from compound parents
|
||||
- [Fix] Fixed glow/outline aspect ratio in Single Pass Instanced VR mode
|
||||
|
||||
Version 8.5
|
||||
- Improved outline effect when combining "Independent" option with many elements in "Children" selection
|
||||
- Improved see-through border only effect
|
||||
|
||||
Version 8.4
|
||||
- Added "Border Only" option to See-Through effect
|
||||
- Outline/glow shape now properly cuts when partially occluded (instead of following the shape of the occluder)
|
||||
- Adding a Highlight Effect component to a parent no longer deactivates highlighted children
|
||||
|
||||
Version 8.3
|
||||
- Upgraded to Unity 2020.3.16
|
||||
- [Fix] Fixed outline/glow render issue when MSAA is enabled
|
||||
|
||||
Version 8.2
|
||||
- Added "Ignore Mask" option to glow. Can be used to render the glow effect alone
|
||||
- [Fix] Fixed issue with new input system and highlight manager/trigger if no Event System is present in the scene
|
||||
- [Fix] Fixed glow passes UI overlap in Unity 2021.3.3 due to reorderable array bug
|
||||
|
||||
Version 8.1
|
||||
- Selection state is now visible in inspector (used only by trigger and manager components)
|
||||
- [Fix] Fixed mobile input using the new input system
|
||||
- [Fix] Fixed outline settings mismatch when using a combination of Highlight Trigger and Manager
|
||||
|
||||
Version 8.0
|
||||
- Added SelectObject / ToggleObject / UnselectObject methods to Highlight Manager
|
||||
- Added ability to control rendering order of effects (check documentation: Custom sorting section)
|
||||
|
||||
Version 7.9.1
|
||||
- Default values for all effects are now 0 (disabled) except outline so desired effects must be enabled. This option allows you to ensure no extra/undesired effects are activated by mistake
|
||||
- Redesigned Highlight Plus Profile editor interface
|
||||
- Removed dependency of HighlightManager
|
||||
|
||||
Version 7.8
|
||||
- Added outer glow blend mode option
|
||||
- API: added OnObjectHighlightStart/End events to HighlightTrigger (check documentation for differences with similar events on Highlight Effect main script)
|
||||
- [Fix] API: Fixed specific issues with SetTarget method when used on shader graph based materials that don't use standard texture names
|
||||
|
||||
Version 7.7.2
|
||||
- [Fix] Fixed fade in/out issue when disabling/enabling objects
|
||||
|
||||
Version 7.7
|
||||
- Added support for the new Input System
|
||||
- [Fix] Fixes to the align to ground option of target fx effect
|
||||
|
||||
Version 7.6.2
|
||||
- [Fix] VR: fixed target effect "Align to Ground" issue with Single Pass Instanced
|
||||
|
||||
Version 7.6.1
|
||||
- [Fix] Fixed overlay animation speed issue
|
||||
|
||||
Version 7.6
|
||||
- Added "Target FX Align to Ground" option
|
||||
- Added isSeeThroughOccluded(camera). Is true when any see-through occluder using raycast mode is blocking the see-through effect
|
||||
- All shader keywords are now of local type reducing global keyword usage
|
||||
- Fixes and improvements to see-through when combined with outline/outer glow
|
||||
|
||||
Version 7.5.2
|
||||
- [Fix] See-through is now visible when using glow/outline/inner glow with Always Visible option
|
||||
|
||||
Version 7.5
|
||||
- Added new HitFX style: "Local Hit"
|
||||
- Added new demo scene showcasing the HitFx variations
|
||||
- Added "Overlay Texture" option
|
||||
- Added "Min Distance" option to Highlight Manager and Highlight Trigger
|
||||
- Added support for "Domain Reload" disabled option
|
||||
- API: added OnObjectHighlightStart, OnObjectHighlightEnd events to HighlightManager
|
||||
- [Fix] Fixed inner glow and overlay issue when MaterialPropertyBlock is used on the character material
|
||||
|
||||
Version 7.1
|
||||
- Added "Respect UI" to Highlight Manager and Trigger which blocks interaction if pointer is over an UI element
|
||||
|
||||
Version 7.0.2
|
||||
- Memory optimizations
|
||||
|
||||
Version 7.0.1
|
||||
- [Fix] Highest quality outline/glow fixes on mobile
|
||||
|
||||
Version 7.0
|
||||
- Added support for Single Pass Instanced
|
||||
- Internal improvements and fixes
|
||||
|
||||
Version 6.9
|
||||
- Internal improvements to see-through
|
||||
|
||||
Version 6.8
|
||||
- Changed see-through effect rendering order to improve support with other stencil effects
|
||||
- [Fix] Fixed properties not being reflected in scene immediately when invoking Undo
|
||||
|
||||
Version 6.7
|
||||
- Added "SeeThrough Max Depth" option. Limits the visibility of the see-through effect to certain distance from the occluders
|
||||
- Added "SeeThrough Check Individual Objects" option. If enabled, occlusion test is performed for each individual child of the object, instead of using combined bounds
|
||||
|
||||
Version 6.6
|
||||
- Added "SeeThrough Depth Offset" option. This option allows you to control the minimum distance from the occluder to the object before showing the see-through effect
|
||||
- Added "SeeThrough Non Overlap" option. Enable it only if the see-through effect produces flickering due to overlapping geometry in the hidden object
|
||||
- [Fix] Fixed properties not being reflected in scene immediately when invoking Undo
|
||||
|
||||
Version 6.5.1
|
||||
- Calling ProfileLoad() method will now assign that profile to the highlight effect component in addition to loading its values
|
||||
- Prevents _Time overflow which can cause glitching on some Android devices
|
||||
|
||||
Version 6.5
|
||||
- Name filter now is ignored when effect group is set to Only This Object
|
||||
- New shader "HighlightPlus/Geometry/UIMask" to cancel highlight effects when rendering through a UI Canvas (see documentation)
|
||||
|
||||
Version 6.4
|
||||
- Added "Cameras Layer Mask" to specify which cameras can render the effects
|
||||
- Hit FX color in Highlight Profile now exposes HDR color options
|
||||
|
||||
Version 6.3.1
|
||||
- Added "Single Selection" option to Highlight Manager/Trigger
|
||||
- Added "Toggle" option to Highlight Manager/Trigger
|
||||
- Selection is cleared now when clicking anywhere in the scene (requires Highlight Manager)
|
||||
- API: added SetGlowColor
|
||||
- Improved Highlight Manager inspector
|
||||
|
||||
Version 6.2
|
||||
- Added TargetFX Scale To Object Bounds (defaults to false)
|
||||
- Added support for HDR color to Hit FX color field
|
||||
- Option to list occluders in the inspector when See Through Occluder Mask "Accurate" option is enabled
|
||||
|
||||
Version 6.1
|
||||
- Added more accurate occluder layer system ("Accurate" option)
|
||||
- Added default hit fx settings to inspector & profile
|
||||
- Added hit fx modes (overlay or inner glow)
|
||||
|
||||
Version 6.0
|
||||
- Added Selection feature
|
||||
- Inspector: sections can be now collapsed to reduce screen space
|
||||
- API: added OnObjectSelected / OnObjectUnSelected events
|
||||
|
||||
Version 5.5
|
||||
- Added "Planar" mode to Normals option. Best choice for highlighting 2D meshes (quad/planes)
|
||||
|
||||
Version 5.4 5/Feb/2021
|
||||
- Added Visibility option to targete effect
|
||||
- Stencil mask is no longer computed when only overlay or inner glow is used improving performance
|
||||
|
||||
Version 5.3.5 22/Jan/2021
|
||||
- Added "CustomVertexTransform.cginc" file which can be used to include user-defined vertex transformations
|
||||
- Optimizations to material setters
|
||||
|
||||
Version 5.3.4
|
||||
- Improvements to combine meshes option
|
||||
|
||||
Version 5.3.3
|
||||
- Effects now reflect object transform changes when combines meshes option is enabled
|
||||
|
||||
Version 5.3.2
|
||||
- Memory optimizations
|
||||
|
||||
Version 5.3.1
|
||||
- Optimizations and fixes
|
||||
|
||||
Version 5.3
|
||||
- Added "Combine Meshes" option to profile
|
||||
|
||||
Version 5.2
|
||||
- Added "Object Name Filter" option to profile
|
||||
|
||||
Version 5.0
|
||||
- API: added "TargetFX" method to programmatically start the target effect
|
||||
- [Fix] Depth Clip option can now be used on mobile even with visibility set to Always On Top
|
||||
|
||||
Version 4.9
|
||||
- Added "Medium" quality level
|
||||
|
||||
Version 4.8.1
|
||||
- [Fix] Fixed outline/glow issue on iOS when using Highest Quality mode in Unity 2010.1
|
||||
|
||||
Version 4.8
|
||||
- Added "Outer Glow Blend Passes" option
|
||||
- Added support for HDR colors
|
||||
|
||||
Version 4.7
|
||||
- Added "Normals Option" with Smooth, Preserve and Reorient variants to improve results
|
||||
- Target effect now only renders once per gameobject if a specific target transform is specified
|
||||
- API: added OnTargetAnimates. Allows you to override center, rotation and scale of target effect on a per-frame basis.
|
||||
|
||||
Version 4.6
|
||||
- Added "SubMesh Mask" which allows to exclude certain submeshes
|
||||
- [Fix] Fixed shader compilation issue with Single Pass Instanced mode enabled
|
||||
|
||||
Version 4.5
|
||||
- Added "Preserve Original Mesh" option to inspector and profile
|
||||
|
||||
Version 4.4
|
||||
- Added HitFX effect
|
||||
- Improved quality of outer glow when using Highest Quality mode
|
||||
- Improvements to SeeThrough Occluder when Detection Mode is set to RayCast
|
||||
- API: added SetTargets(transform, renderers)
|
||||
- API: added static method HighlightEffect.DrawEffectsNow() to force render all effects on demand
|
||||
|
||||
Version 4.2
|
||||
- Added GPU Instancing support for outline / glow effects
|
||||
- Highlight Trigger: added volume collision detection
|
||||
|
||||
Version 4.1.1
|
||||
- [Fix] Fixed issue with grouped objects when independent option is enabled and Highest Quality outer glow or outline is used
|
||||
|
||||
Version 4.1
|
||||
- Improved "Outline Independent" option for Highest Quality Mode
|
||||
- Consistency: enabling "Outline Independent" in Highest Quality Mode now also affects Outer Glow is used
|
||||
|
||||
Version 4.0
|
||||
- Start up peformance & memory allocation optimizations
|
||||
- Added "Independent" support to outline in Highest Quality mode
|
||||
- Added "Make Transparent Object Compatible With Depth Clip" option
|
||||
|
||||
Version 3.9
|
||||
- Added "Depth Clip" option (only applies to HQ outline/glow effects)
|
||||
|
||||
Version 3.8
|
||||
- Glow/Outline downsampling and glow blend mode option added to profiles
|
||||
- [Fix] Fixed an issue which marked the scene as dirty
|
||||
- [Fix] Removed VR API usage console warning
|
||||
|
||||
Version 3.7
|
||||
- See Through: added "Occluder Mask" option. When set to a custom layer, it performs a BoxCast check to ensure only objects in the specific layers are occluding the target. Customize this behaviour using the Radius Threshold and Check Interval settings.
|
||||
- Added "Max Distance" to Highlight Trigger
|
||||
- Reduced allocations when averaging normals
|
||||
- [Fix] Fixed flickering of outer glow when used in Highest quality with thin objects
|
||||
|
||||
Version 3.6
|
||||
- Added "Outline Independent" option. Shows full outline regardless of any other highlighted object behind.
|
||||
|
||||
Version 3.5
|
||||
- Improved quality of Outline effect when quality level is set to Highest
|
||||
- Added "SeeThrough Border" feature
|
||||
- Added "Blend Mode" option to Outer Glow for highest quality level
|
||||
- [Fix] Fixed issue during Prefab editor mode
|
||||
|
||||
Version 3.4.4
|
||||
- Added option in occluder script to use raycast instead of stencil buffer to cancel see-through (useful for avoiding terrain triggering see-through effect)
|
||||
- [Fix] Fixed see-through in deferred rendering path
|
||||
|
||||
Version 3.4.2
|
||||
- [Fix] Fixed an issue when adding the effect at runtime with outline/glow in higuest quality
|
||||
|
||||
Version 3.4.1
|
||||
- [Fix] Fixed occluder objects removing glow effect when placed in the background
|
||||
- [Fix] Added missing SeeThrough noise option to Highlight Profile asset
|
||||
|
||||
Version 3.4
|
||||
- Added LayerInChildren option to "Include" filter
|
||||
- Improved occluder system
|
||||
- [Fix] Prevent an error when the mesh normals count does not match the vertex count
|
||||
|
||||
Version 3.3
|
||||
- Outline, Glow and Inner Glow "Always On Top" option expanded to "Normal", "Always On Top" or "Only When Occluded"
|
||||
- Added Noise slider to See-Through effect
|
||||
|
||||
Version 3.2.4
|
||||
- [Fix] Fixed flickering issue when combining mesh & skinned mesh renderers
|
||||
|
||||
Version 3.2.3
|
||||
- General improvements and fixes
|
||||
|
||||
Version 3.2.2
|
||||
- [Fix] Fixed issue when trying to read normals from a non-readable mesh
|
||||
|
||||
Version 3.2.1
|
||||
- [Fix] Fixed glow disappearing when object crosses camera near clip
|
||||
|
||||
Version 3.2
|
||||
- Added "Reflection Probes" option
|
||||
- Internal improvements and fixes
|
||||
|
||||
Version 3.1
|
||||
- Added "Constant Width" option to Glow/Outline in Fastest/High quality level
|
||||
- Added "Optimal Blit" option to Glow/Outline with Debug View
|
||||
|
||||
Version 3.0.2
|
||||
- API: added proxy methods ProfileLoad, ProfileReload, ProfileSaveChanges to load/store profile settings at runtime. You can also load/save changes between effect and profile using the Load/Save methods on the profile object itself.
|
||||
|
||||
Version 3.0.1
|
||||
- [Fix] Fixed an exception when glow was enabled, outline disabled in highest quality level
|
||||
|
||||
Version 3.0
|
||||
- Added HQ Highest quality glow and outline options
|
||||
- Added "Include" option to choose which objects are affected by the effects (same gameobject, children, root to children, or many objects in layer)
|
||||
- Added "Alpha CutOff"
|
||||
|
||||
Version 2.6.1
|
||||
- Minor internal improvements
|
||||
|
||||
Version 2.6
|
||||
- Added Target effect
|
||||
- Improved performance on Skinned Mesh Renderers. Slightly improved performance on normal renderers.
|
||||
|
||||
Version 2.5.2
|
||||
- [Fix] Fixed issue with HQ Outer Glow not showing when there's multiple selected objects parented to the same object
|
||||
|
||||
Version 2.5.1
|
||||
- Added support for orthographic camera
|
||||
|
||||
Version 2.5
|
||||
- Added support for VR Single Pass Instanced
|
||||
- Minor improvements and fixes
|
||||
|
||||
Version 2.4
|
||||
- New HighlightSeeThroughOccluder script. Add it to any object to cancel any see-through effect
|
||||
- Added "Fade In Duration" / "Fade Out Duration" to create smooth transition states
|
||||
- Added "Glow HQ" to produce better outer glow on certain shapes
|
||||
- Added "OnRendererHighlightStart" event
|
||||
- API: added "OverlayOnShot" method for impact effects
|
||||
|
||||
Version 2.3
|
||||
- Added "Raycast Source" to Highlight Trigger and Manager components
|
||||
- Added "Skinned Mesh Bake Mode" to optimize highlight on many models
|
||||
|
||||
Version 2.2
|
||||
- Added "Always On Top" option to Outline, Outer and Inner Glow
|
||||
- Added "Trigger Mode" to Highlight Trigger to support complex objects
|
||||
|
||||
Version 2.1
|
||||
- Added "Outline HQ" to inspector. Creates a better outline on certain shapes
|
||||
- Added "Ignore Object Visibility" to enable effects on disabled renderers or hidden objects
|
||||
|
||||
Version 2.0
|
||||
- Profiles. Store/load/share settings across different objects.
|
||||
- [Fix] Fixed issue when copying component values between two objects
|
||||
- [Fix] Fixed effects ignoring culling mask on additional cameras
|
||||
|
||||
Version 1.5
|
||||
- Added "Inner Glow" effect
|
||||
|
||||
Version 1.4
|
||||
- Added "Overlay Min Intensity" and "Overlay Blending" options
|
||||
- Added "Ignore" option
|
||||
- Minor improvements & fixes
|
||||
|
||||
Version 1.3
|
||||
- Added option to add depth compatibility for transparent shaders
|
||||
|
||||
Version 1.2.4
|
||||
- [Fix] Fix for multiple skinned models
|
||||
- [Fix] Fix for scaled skinned models
|
||||
|
||||
Version 1.2.3
|
||||
- [Fix] Fixes for Steam VR
|
||||
|
||||
Version 1.2.1
|
||||
- Internal improvements and fixes
|
||||
|
||||
Version 1.2.1
|
||||
- [Fix] Fixed script execution order issue with scripts changing transform in LateUpdate()
|
||||
|
||||
Version 1.2
|
||||
- Support for LOD groups
|
||||
|
||||
Version 1.1
|
||||
- Redesigned editor inspector
|
||||
- Minor improvements
|
||||
|
||||
Version 1.0.4
|
||||
- Supports meshes with negative scales
|
||||
|
||||
Version 1.0.3
|
||||
- Support for multiple submeshes
|
||||
|
||||
Version 1.0.2
|
||||
- [Fix] Fixed scale issue with grouped objects
|
||||
|
||||
Version 1.0.1
|
||||
- Supports combined meshes
|
||||
|
||||
Version 1.0 - Nov/2018
|
||||
- Initial release
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 53265a9967ed548efaf71f5807638781
|
||||
timeCreated: 1542901568
|
||||
licenseType: Pro
|
||||
TextScriptImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 3a476022645d74299b862c36d0daa1df
|
||||
folderAsset: yes
|
||||
timeCreated: 1542876301
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6bd97436761b94109a0785ed6823647c
|
||||
folderAsset: yes
|
||||
timeCreated: 1542893576
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,10 @@
|
|||
#ifndef CUSTOM_VERTEX_TRANSFORM_INCLUDED
|
||||
#define CUSTOM_VERTEX_TRANSFORM_INCLUDED
|
||||
|
||||
float4 ComputeVertexPosition(float4 vertex) {
|
||||
// Add here any custom vertex transform
|
||||
float4 pos = UnityObjectToClipPos(vertex);
|
||||
return pos;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: e25b1281ec6724b028e33a5df5a3f266
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,49 @@
|
|||
Shader "HighlightPlus/Geometry/JustDepth"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "RenderType"="Opaque" }
|
||||
ColorMask 0
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
#include "CustomVertexTransform.cginc"
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = ComputeVertexPosition(v.vertex);
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 058a572e30b2d446bade2dda32bcef0f
|
||||
timeCreated: 1515682635
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,43 @@
|
|||
Shader "HighlightPlus/Geometry/DepthClipComp"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Pass {
|
||||
Name "ShadowCaster"
|
||||
Tags { "LightMode" = "ShadowCaster" }
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma target 2.0
|
||||
#pragma multi_compile_shadowcaster
|
||||
#pragma multi_compile_instancing
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
struct v2f {
|
||||
V2F_SHADOW_CASTER;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2f vert( appdata_base v ) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
|
||||
return o;
|
||||
}
|
||||
|
||||
float4 frag( v2f i ) : SV_Target {
|
||||
SHADOW_CASTER_FRAGMENT(i)
|
||||
}
|
||||
ENDCG
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 0917f634da79a4983ad78bac83d5a715
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,158 @@
|
|||
Shader "HighlightPlus/Geometry/BlurGlow" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "white" {}
|
||||
_Color ("Color", Color) = (1,1,0) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
_BlurScale("Blur Scale", Float) = 2.0
|
||||
_Speed("Speed", Float) = 1
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
ZTest Always
|
||||
ZWrite Off
|
||||
Cull Off
|
||||
CGINCLUDE
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
|
||||
float4 _MainTex_TexelSize;
|
||||
float4 _MainTex_ST;
|
||||
float _BlurScale, _Speed;
|
||||
|
||||
struct appdata {
|
||||
float4 vertex : POSITION;
|
||||
float2 texcoord : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2fCross {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv: TEXCOORD0;
|
||||
float2 uv1: TEXCOORD1;
|
||||
float2 uv2: TEXCOORD2;
|
||||
float2 uv3: TEXCOORD3;
|
||||
float2 uv4: TEXCOORD4;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2fCross vertCross(appdata v) {
|
||||
v2fCross o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
#if UNITY_UV_STARTS_AT_TOP
|
||||
if (_MainTex_TexelSize.y < 0) {
|
||||
// Texture is inverted WRT the main texture
|
||||
v.texcoord.y = 1.0 - v.texcoord.y;
|
||||
}
|
||||
#endif
|
||||
o.uv = v.texcoord;
|
||||
float3 offsets = _MainTex_TexelSize.xyx * float3(1,1,-1);
|
||||
o.uv1 = v.texcoord - offsets.xy;
|
||||
o.uv2 = v.texcoord - offsets.zy;
|
||||
o.uv3 = v.texcoord + offsets.zy;
|
||||
o.uv4 = v.texcoord + offsets.xy;
|
||||
return o;
|
||||
}
|
||||
|
||||
|
||||
v2fCross vertBlurH(appdata v) {
|
||||
v2fCross o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
#if UNITY_UV_STARTS_AT_TOP
|
||||
if (_MainTex_TexelSize.y < 0) {
|
||||
// Texture is inverted WRT the main texture
|
||||
v.texcoord.y = 1.0 - v.texcoord.y;
|
||||
}
|
||||
#endif
|
||||
float animatedWidth = _BlurScale * (1.0 + 0.25 * sin(_Time.w * _Speed));
|
||||
o.uv = v.texcoord;
|
||||
float2 inc = float2(_MainTex_TexelSize.x * 1.3846153846 * animatedWidth, 0);
|
||||
o.uv1 = v.texcoord - inc;
|
||||
o.uv2 = v.texcoord + inc;
|
||||
float2 inc2 = float2(_MainTex_TexelSize.x * 3.2307692308 * animatedWidth, 0);
|
||||
o.uv3 = v.texcoord - inc2;
|
||||
o.uv4 = v.texcoord + inc2;
|
||||
return o;
|
||||
}
|
||||
|
||||
v2fCross vertBlurV(appdata v) {
|
||||
v2fCross o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
#if UNITY_UV_STARTS_AT_TOP
|
||||
if (_MainTex_TexelSize.y < 0) {
|
||||
// Texture is inverted WRT the main texture
|
||||
v.texcoord.y = 1.0 - v.texcoord.y;
|
||||
}
|
||||
#endif
|
||||
float animatedWidth = _BlurScale * (1.0 + 0.25 * sin(_Time.w * _Speed));
|
||||
o.uv = v.texcoord;
|
||||
float2 inc = float2(0, _MainTex_TexelSize.y * 1.3846153846 * animatedWidth);
|
||||
o.uv1 = v.texcoord - inc;
|
||||
o.uv2 = v.texcoord + inc;
|
||||
float2 inc2 = float2(0, _MainTex_TexelSize.y * 3.2307692308 * animatedWidth);
|
||||
o.uv3 = v.texcoord - inc2;
|
||||
o.uv4 = v.texcoord + inc2;
|
||||
return o;
|
||||
}
|
||||
|
||||
float4 fragBlur (v2fCross i): SV_Target {
|
||||
UNITY_SETUP_INSTANCE_ID(i);
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||||
float4 pixel = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv) * 0.2270270270
|
||||
+ (UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv1) + UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv2)) * 0.3162162162
|
||||
+ (UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv3) + UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv4)) * 0.0702702703;
|
||||
return pixel;
|
||||
}
|
||||
|
||||
float4 fragResample(v2fCross i) : SV_Target {
|
||||
UNITY_SETUP_INSTANCE_ID(i);
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||||
float4 c1 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv1);
|
||||
float4 c2 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv2);
|
||||
float4 c3 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv3);
|
||||
float4 c4 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv4);
|
||||
return (c1+c2+c3+c4) * 0.25;
|
||||
}
|
||||
|
||||
|
||||
ENDCG
|
||||
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma vertex vertBlurH
|
||||
#pragma fragment fragBlur
|
||||
#pragma fragmentoption ARB_precision_hint_fastest
|
||||
#pragma target 3.0
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma vertex vertBlurV
|
||||
#pragma fragment fragBlur
|
||||
#pragma fragmentoption ARB_precision_hint_fastest
|
||||
#pragma target 3.0
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma vertex vertCross
|
||||
#pragma fragment fragResample
|
||||
#pragma fragmentoption ARB_precision_hint_fastest
|
||||
#pragma target 3.0
|
||||
ENDCG
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 84c84ee93ec484bdda371ffbdebfcc7c
|
||||
timeCreated: 1556874239
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,156 @@
|
|||
Shader "HighlightPlus/Geometry/BlurOutline" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "white" {}
|
||||
_Color ("Color", Color) = (1,1,0) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
_BlurScale("Blur Scale", Float) = 2.0
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent+100" "RenderType"="Transparent" }
|
||||
ZTest Always
|
||||
ZWrite Off
|
||||
Cull Off
|
||||
CGINCLUDE
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
|
||||
float4 _MainTex_TexelSize;
|
||||
float4 _MainTex_ST;
|
||||
float _BlurScale;
|
||||
|
||||
struct appdata {
|
||||
float4 vertex : POSITION;
|
||||
float2 texcoord : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
|
||||
struct v2fCross {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv: TEXCOORD0;
|
||||
float2 uv1: TEXCOORD1;
|
||||
float2 uv2: TEXCOORD2;
|
||||
float2 uv3: TEXCOORD3;
|
||||
float2 uv4: TEXCOORD4;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2fCross vertCross(appdata v) {
|
||||
v2fCross o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
#if UNITY_UV_STARTS_AT_TOP
|
||||
if (_MainTex_TexelSize.y < 0) {
|
||||
// Texture is inverted WRT the main texture
|
||||
v.texcoord.y = 1.0 - v.texcoord.y;
|
||||
}
|
||||
#endif
|
||||
o.uv = v.texcoord;
|
||||
float3 offsets = _MainTex_TexelSize.xyx * float3(1,1,-1);
|
||||
o.uv1 = v.texcoord - offsets.xy;
|
||||
o.uv2 = v.texcoord - offsets.zy;
|
||||
o.uv3 = v.texcoord + offsets.zy;
|
||||
o.uv4 = v.texcoord + offsets.xy;
|
||||
return o;
|
||||
}
|
||||
|
||||
|
||||
v2fCross vertBlurH(appdata v) {
|
||||
v2fCross o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
#if UNITY_UV_STARTS_AT_TOP
|
||||
if (_MainTex_TexelSize.y < 0) {
|
||||
// Texture is inverted WRT the main texture
|
||||
v.texcoord.y = 1.0 - v.texcoord.y;
|
||||
}
|
||||
#endif
|
||||
o.uv = v.texcoord;
|
||||
float2 inc = float2(_MainTex_TexelSize.x * 1.3846153846 * _BlurScale, 0);
|
||||
o.uv1 = v.texcoord - inc;
|
||||
o.uv2 = v.texcoord + inc;
|
||||
float2 inc2 = float2(_MainTex_TexelSize.x * 3.2307692308 * _BlurScale, 0);
|
||||
o.uv3 = v.texcoord - inc2;
|
||||
o.uv4 = v.texcoord + inc2;
|
||||
return o;
|
||||
}
|
||||
|
||||
v2fCross vertBlurV(appdata v) {
|
||||
v2fCross o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
#if UNITY_UV_STARTS_AT_TOP
|
||||
if (_MainTex_TexelSize.y < 0) {
|
||||
// Texture is inverted WRT the main texture
|
||||
v.texcoord.y = 1.0 - v.texcoord.y;
|
||||
}
|
||||
#endif
|
||||
o.uv = v.texcoord;
|
||||
float2 inc = float2(0, _MainTex_TexelSize.y * 1.3846153846 * _BlurScale);
|
||||
o.uv1 = v.texcoord - inc;
|
||||
o.uv2 = v.texcoord + inc;
|
||||
float2 inc2 = float2(0, _MainTex_TexelSize.y * 3.2307692308 * _BlurScale);
|
||||
o.uv3 = v.texcoord - inc2;
|
||||
o.uv4 = v.texcoord + inc2;
|
||||
return o;
|
||||
}
|
||||
|
||||
float4 fragBlur (v2fCross i): SV_Target {
|
||||
UNITY_SETUP_INSTANCE_ID(i);
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||||
float4 pixel = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv) * 0.2270270270
|
||||
+ (UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv1) + UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv2)) * 0.3162162162
|
||||
+ (UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv3) + UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv4)) * 0.0702702703;
|
||||
return pixel;
|
||||
}
|
||||
|
||||
float4 fragResample(v2fCross i) : SV_Target {
|
||||
UNITY_SETUP_INSTANCE_ID(i);
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||||
float4 c1 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv1);
|
||||
float4 c2 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv2);
|
||||
float4 c3 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv3);
|
||||
float4 c4 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv4);
|
||||
return (c1+c2+c3+c4) * 0.25;
|
||||
}
|
||||
|
||||
|
||||
ENDCG
|
||||
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma vertex vertBlurH
|
||||
#pragma fragment fragBlur
|
||||
#pragma fragmentoption ARB_precision_hint_fastest
|
||||
#pragma target 3.0
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma vertex vertBlurV
|
||||
#pragma fragment fragBlur
|
||||
#pragma fragmentoption ARB_precision_hint_fastest
|
||||
#pragma target 3.0
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma vertex vertCross
|
||||
#pragma fragment fragResample
|
||||
#pragma fragmentoption ARB_precision_hint_fastest
|
||||
#pragma target 3.0
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 74f3491dcf1224f0c91238381c035439
|
||||
timeCreated: 1556874239
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,97 @@
|
|||
Shader "HighlightPlus/ClearStencil"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Stencil {
|
||||
Ref 8 // bit 8 is used by HighlightUIMask shader to prevent Clear Stencil passes
|
||||
Comp NotEqual
|
||||
Pass zero
|
||||
ReadMask 8
|
||||
WriteMask 6
|
||||
}
|
||||
ZTest Always
|
||||
ZWrite Off
|
||||
Cull Off
|
||||
ColorMask 0
|
||||
|
||||
Pass // Ordered full screen
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = float4(v.vertex.xy, 0, 0.5);
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass // Ordered object-space
|
||||
{
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
#include "CustomVertexTransform.cginc"
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = ComputeVertexPosition(v.vertex);
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 632d26701d1f14d9ab2950021e6fed87
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,147 @@
|
|||
Shader "HighlightPlus/Geometry/ComposeGlow" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "black" {}
|
||||
_Color ("Color", Color) = (1,1,1) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
[HideInInspector] _Cull ("Cull Mode", Int) = 2
|
||||
[HideInInspector] _ZTest ("ZTest Mode", Int) = 0
|
||||
[HideInInspector] _Flip("Flip", Vector) = (0, 1, 0)
|
||||
[HideInInspector] _BlendSrc("Blend Src", Int) = 1
|
||||
[HideInInspector] _BlendDst("Blend Dst", Int) = 1
|
||||
_Debug("Debug Color", Color) = (0,0,0,0)
|
||||
[HideInInspector] _GlowStencilComp ("Stencil Comp", Int) = 6
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent+102" "RenderType"="Transparent" }
|
||||
Blend [_BlendSrc] [_BlendDst]
|
||||
|
||||
// Compose effect on camera target
|
||||
Pass
|
||||
{
|
||||
ZWrite Off
|
||||
ZTest [_ZTest]
|
||||
Cull Off //[_Cull]
|
||||
Stencil {
|
||||
Ref 2
|
||||
Comp [_GlowStencilComp]
|
||||
Pass keep
|
||||
ReadMask 2
|
||||
WriteMask 2
|
||||
}
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
UNITY_DECLARE_SCREENSPACE_TEXTURE(_HPComposeGlowFinal);
|
||||
fixed4 _Color;
|
||||
float3 _Flip;
|
||||
fixed4 _Debug;
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos: SV_POSITION;
|
||||
float4 scrPos: TEXCOORD0;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.scrPos = ComputeScreenPos(o.pos);
|
||||
o.scrPos.y = o.scrPos.w * _Flip.x + o.scrPos.y * _Flip.y;
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||||
fixed4 glow = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_HPComposeGlowFinal, i.scrPos.xy/i.scrPos.w);
|
||||
fixed4 color = _Color;
|
||||
color *= glow.r;
|
||||
color += _Debug;
|
||||
color.a = saturate(color.a);
|
||||
return color;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
// Compose effect on camera target (full-screen blit)
|
||||
Pass
|
||||
{
|
||||
ZWrite Off
|
||||
ZTest Always //[_ZTest]
|
||||
Cull Off //[_Cull]
|
||||
|
||||
Stencil {
|
||||
Ref 2
|
||||
Comp NotEqual
|
||||
Pass keep
|
||||
ReadMask 2
|
||||
WriteMask 2
|
||||
}
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
|
||||
float4 _MainTex_ST;
|
||||
fixed4 _Color;
|
||||
float3 _Flip;
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos: SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2f vert(appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = UnityStereoScreenSpaceUVAdjust(v.uv, _MainTex_ST);
|
||||
o.uv.y = _Flip.x + o.uv.y * _Flip.y;
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag(v2f i) : SV_Target
|
||||
{
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||||
fixed4 glow = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
|
||||
fixed4 color = _Color;
|
||||
color *= glow.r;
|
||||
color.a = saturate(color.a);
|
||||
return color;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 975a91ee935da4d9c8a3e807fecd8047
|
||||
timeCreated: 1544699251
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,144 @@
|
|||
Shader "HighlightPlus/Geometry/ComposeOutline" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "black" {}
|
||||
_Color("Color", Color) = (1,1,1) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
_Cull("Cull Mode", Int) = 2
|
||||
_ZTest("ZTest Mode", Int) = 0
|
||||
_Flip("Flip", Vector) = (0, 1, 0)
|
||||
_Debug("Debug Color", Color) = (0,0,0,0)
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue" = "Transparent+120" "RenderType" = "Transparent" }
|
||||
Blend SrcAlpha OneMinusSrcAlpha
|
||||
|
||||
// Compose effect on camera target (optimal quad blit)
|
||||
Pass
|
||||
{
|
||||
ZWrite Off
|
||||
ZTest [_ZTest]
|
||||
Cull Off // [_Cull]
|
||||
Stencil {
|
||||
Ref 2
|
||||
Comp NotEqual
|
||||
Pass keep
|
||||
ReadMask 2
|
||||
WriteMask 2
|
||||
}
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
UNITY_DECLARE_SCREENSPACE_TEXTURE(_HPComposeOutlineFinal);
|
||||
|
||||
fixed4 _Color;
|
||||
float3 _Flip;
|
||||
fixed4 _Debug;
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos: SV_POSITION;
|
||||
float4 scrPos: TEXCOORD0;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.scrPos = ComputeScreenPos(o.pos);
|
||||
o.scrPos.y = o.scrPos.w * _Flip.x + o.scrPos.y * _Flip.y;
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||||
fixed4 outline = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_HPComposeOutlineFinal, i.scrPos.xy/i.scrPos.w);
|
||||
fixed4 color = _Color;
|
||||
color.a *= outline.r;
|
||||
color += _Debug;
|
||||
color.a = saturate(color.a);
|
||||
return color;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
// Compose effect on camera target (full-screen blit)
|
||||
Pass
|
||||
{
|
||||
ZWrite Off
|
||||
ZTest Always // [_ZTest]
|
||||
Cull Off // [_Cull]
|
||||
Stencil {
|
||||
Ref 2
|
||||
Comp NotEqual
|
||||
Pass keep
|
||||
ReadMask 2
|
||||
WriteMask 2
|
||||
}
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
|
||||
float4 _MainTex_ST;
|
||||
fixed4 _Color;
|
||||
float3 _Flip;
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos: SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2f vert(appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = UnityStereoScreenSpaceUVAdjust(v.uv, _MainTex_ST);
|
||||
o.uv.y = _Flip.x + o.uv.y * _Flip.y;
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag(v2f i) : SV_Target
|
||||
{
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||||
fixed4 outline = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
|
||||
fixed4 color = _Color;
|
||||
color.a *= outline.r;
|
||||
color = saturate(color);
|
||||
return color;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 0a6de74b6cfa9440182f8f56e4a0e4f1
|
||||
timeCreated: 1544699251
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,84 @@
|
|||
%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: HighlightGlow
|
||||
m_Shader: {fileID: 4800000, guid: 049d9e75e07674a78a703cf1203c07dd, type: 3}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 1
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _ConstantWidth: 1
|
||||
- _Cull: 2
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _GlowZTest: 4
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _Glow: {r: 1, g: 0.025, b: 0.75, a: 0.5}
|
||||
- _Glow2: {r: 0.01, g: 1, b: 0.5, a: 0}
|
||||
- _GlowColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _GlowDirection: {r: 1, g: 1, b: 0, a: 1}
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 60e964940a24547a585c3ffff7e52e9b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,114 @@
|
|||
Shader "HighlightPlus/Geometry/Glow" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "white" {}
|
||||
_Glow ("Glow", Vector) = (1, 0.025, 0.75, 0.5)
|
||||
_Glow2 ("Glow2", Vector) = (0.01, 1, 0.5, 0)
|
||||
_GlowColor ("Glow Color", Color) = (1,1,1)
|
||||
_Color ("Color", Color) = (1,1,1) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
_GlowDirection("GlowDir", Vector) = (1,1,0)
|
||||
_Cull ("Cull Mode", Int) = 2
|
||||
_ConstantWidth ("Constant Width", Float) = 1
|
||||
_GlowZTest ("ZTest", Int) = 4
|
||||
_GlowStencilOp ("Stencil Operation", Int) = 0
|
||||
_GlowStencilComp ("Stencil Comp", Int) = 6
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent+102" "RenderType"="Transparent" "DisableBatching"="True" }
|
||||
|
||||
// Glow passes
|
||||
Pass
|
||||
{
|
||||
Stencil {
|
||||
Ref 2
|
||||
Comp [_GlowStencilComp]
|
||||
Pass [_GlowStencilOp]
|
||||
ReadMask 2
|
||||
WriteMask 2
|
||||
}
|
||||
Blend SrcAlpha OneMinusSrcAlpha
|
||||
ZWrite Off
|
||||
Cull [_Cull]
|
||||
ZTest [_GlowZTest]
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma multi_compile_instancing
|
||||
#include "UnityCG.cginc"
|
||||
#include "CustomVertexTransform.cginc"
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
fixed4 color : COLOR;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
//float4 _Glow; // x = intensity, y = width, z = magic number 1, w = magic number 2
|
||||
float3 _Glow2; // x = outline width, y = glow speed, z = dither on/off
|
||||
float _ConstantWidth;
|
||||
|
||||
UNITY_INSTANCING_BUFFER_START(Props)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float4, _GlowColor)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float4, _Glow)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float4, _GlowDirection)
|
||||
UNITY_INSTANCING_BUFFER_END(Props)
|
||||
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
|
||||
float4 glowDirection = UNITY_ACCESS_INSTANCED_PROP(Props, _GlowDirection);
|
||||
#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) || defined(SINGLE_PASS_STEREO)
|
||||
glowDirection.x *= 2.0;
|
||||
#endif
|
||||
|
||||
v.vertex.xyz += v.normal * glowDirection.z;
|
||||
float4 pos = ComputeVertexPosition(v.vertex);
|
||||
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
|
||||
float2 offset = TransformViewToProjection(normalize(norm.xy));
|
||||
|
||||
offset += glowDirection.xy;
|
||||
float z = lerp(UNITY_Z_0_FAR_FROM_CLIPSPACE(pos.z), 2.0, UNITY_MATRIX_P[3][3]);
|
||||
z = _ConstantWidth * (z - 2.0) + 2.0;
|
||||
float outlineWidth = _Glow2.x;
|
||||
|
||||
float4 glow = UNITY_ACCESS_INSTANCED_PROP(Props, _Glow);
|
||||
|
||||
float animatedWidth = glow.y * (1.0 + 0.25 * sin(_Time.w * _Glow2.y));
|
||||
offset *= z * (outlineWidth + animatedWidth);
|
||||
pos.xy += offset;
|
||||
o.pos = pos;
|
||||
o.color = UNITY_ACCESS_INSTANCED_PROP(Props, _GlowColor);
|
||||
o.color.a = glow.x;
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
UNITY_SETUP_INSTANCE_ID(i);
|
||||
fixed4 color = i.color;
|
||||
float4 glow = UNITY_ACCESS_INSTANCED_PROP(Props, _Glow);
|
||||
float2 screenPos = floor( i.pos.xy * glow.z ) * glow.w;
|
||||
color.a *= saturate(_Glow2.z + frac(screenPos.x + screenPos.y));
|
||||
return color;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 049d9e75e07674a78a703cf1203c07dd
|
||||
timeCreated: 1544699250
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,95 @@
|
|||
Shader "HighlightPlus/Geometry/InnerGlow" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "white" {}
|
||||
_Color ("Color", Color) = (1,1,1) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
_InnerGlowColor ("Inner Glow Color", Color) = (1,1,1,1)
|
||||
_InnerGlowWidth ("Width", Float) = 1.0
|
||||
_CutOff("CutOff", Float ) = 0.5
|
||||
_Cull ("Cull Mode", Int) = 2
|
||||
_InnerGlowZTest ("ZTest", Int) = 4
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent+122" "RenderType"="Transparent" "DisableBatching"="True" }
|
||||
|
||||
// Inner Glow
|
||||
Pass
|
||||
{
|
||||
Stencil {
|
||||
Ref 4
|
||||
ReadMask 4
|
||||
Comp NotEqual
|
||||
Pass keep
|
||||
}
|
||||
Blend SrcAlpha One
|
||||
ZWrite Off
|
||||
ZTest [_InnerGlowZTest]
|
||||
Cull [_Cull]
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma multi_compile_local _ HP_ALPHACLIP
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
#include "CustomVertexTransform.cginc"
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float3 normal : NORMAL;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float3 wpos : TEXCOORD1;
|
||||
float3 normal : NORMAL;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
sampler2D _MainTex;
|
||||
float4 _MainTex_ST;
|
||||
fixed _CutOff;
|
||||
fixed4 _InnerGlowColor;
|
||||
fixed _InnerGlowWidth;
|
||||
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = ComputeVertexPosition(v.vertex);
|
||||
#if UNITY_REVERSED_Z
|
||||
o.pos.z += 0.0001;
|
||||
#else
|
||||
o.pos.z -= 0.0001;
|
||||
#endif
|
||||
o.wpos = mul(unity_ObjectToWorld, v.vertex).xyz;
|
||||
o.normal = UnityObjectToWorldNormal(v.normal);
|
||||
o.uv = TRANSFORM_TEX (v.uv, _MainTex);
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
#if HP_ALPHACLIP
|
||||
fixed4 color = tex2D(_MainTex, i.uv);
|
||||
clip(color.a - _CutOff);
|
||||
#endif
|
||||
|
||||
float3 viewDir = normalize(i.wpos - _WorldSpaceCameraPos.xyz);
|
||||
fixed dx = saturate(_InnerGlowWidth - abs(dot(viewDir, normalize(i.normal)))) / _InnerGlowWidth;
|
||||
fixed4 col = _InnerGlowColor * dx;
|
||||
return col;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: e5a069457bd344391acd5af227c0ce11
|
||||
timeCreated: 1544699250
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,140 @@
|
|||
Shader "HighlightPlus/Geometry/Mask" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "white" {}
|
||||
_Color ("Color", Color) = (1,1,1) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
_CutOff("CutOff", Float ) = 0.5
|
||||
_Cull ("Cull Mode", Int) = 2
|
||||
_ZTest ("ZTest", Int) = 4
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent+100" "RenderType"="Transparent" "DisableBatching"="True" }
|
||||
|
||||
CGINCLUDE
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
#include "CustomVertexTransform.cginc"
|
||||
|
||||
sampler2D _MainTex;
|
||||
float4 _MainTex_ST;
|
||||
float4 _MainTex_TexelSize;
|
||||
fixed _CutOff;
|
||||
UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos: SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
#if HP_DEPTHCLIP
|
||||
float4 scrPos : TEXCOORD1;
|
||||
float depth : TEXCOORD2;
|
||||
#endif
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = ComputeVertexPosition(v.vertex);
|
||||
o.uv = TRANSFORM_TEX (v.uv, _MainTex);
|
||||
#if HP_DEPTHCLIP
|
||||
o.scrPos = ComputeScreenPos(o.pos);
|
||||
COMPUTE_EYEDEPTH(o.depth);
|
||||
#endif
|
||||
#if UNITY_REVERSED_Z
|
||||
o.pos.z += 0.0001;
|
||||
#else
|
||||
o.pos.z -= 0.0001;
|
||||
#endif
|
||||
return o;
|
||||
}
|
||||
|
||||
float GetEyeDepth(float rawDepth) {
|
||||
float persp = LinearEyeDepth(rawDepth);
|
||||
float ortho = (_ProjectionParams.z-_ProjectionParams.y)*(1-rawDepth)+_ProjectionParams.y;
|
||||
return lerp(persp,ortho,unity_OrthoParams.w);
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
UNITY_SETUP_INSTANCE_ID(i);
|
||||
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||||
#if HP_ALPHACLIP
|
||||
fixed4 col = tex2D(_MainTex, i.uv);
|
||||
clip(col.a - _CutOff);
|
||||
#endif
|
||||
#if HP_DEPTHCLIP
|
||||
float sceneZ = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoTransformScreenSpaceTex(i.scrPos.xy / i.scrPos.w));
|
||||
float sceneDepth = GetEyeDepth(sceneZ);
|
||||
clip(sceneDepth - i.depth * 0.999);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
ENDCG
|
||||
|
||||
// Create mask
|
||||
Pass
|
||||
{
|
||||
Name "Mask"
|
||||
Stencil {
|
||||
Ref 2
|
||||
Comp always
|
||||
Pass replace
|
||||
WriteMask 2
|
||||
ReadMask 2
|
||||
}
|
||||
ColorMask 0
|
||||
ZWrite Off
|
||||
Cull [_Cull] // default Cull Back improves glow in high quality)
|
||||
ZTest [_ZTest]
|
||||
Offset -1, -1 // avoid issues on Quest 2 standalone when using with other render features (ie. Liquid Volume Pro 2 irregular topology)
|
||||
|
||||
CGPROGRAM
|
||||
#pragma multi_compile_local _ HP_ALPHACLIP
|
||||
#pragma multi_compile_local _ HP_DEPTHCLIP
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
ENDCG
|
||||
}
|
||||
|
||||
// Create mask for see-through (the only difference is the ZTest)
|
||||
Pass
|
||||
{
|
||||
Name "See-through Mask"
|
||||
Stencil {
|
||||
Ref 2
|
||||
Comp always
|
||||
Pass replace
|
||||
WriteMask 2
|
||||
ReadMask 2
|
||||
}
|
||||
ColorMask 0
|
||||
ZWrite Off
|
||||
Cull [_Cull] // default Cull Back improves glow in high quality)
|
||||
ZTest LEqual
|
||||
Offset -1, -1 // avoid issues on Quest 2 standalone when using with other render features (ie. Liquid Volume Pro 2 irregular topology)
|
||||
|
||||
CGPROGRAM
|
||||
#pragma multi_compile_local _ HP_ALPHACLIP
|
||||
#pragma multi_compile_local _ HP_DEPTHCLIP
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
ENDCG
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: e694fa934b6db4a00b8d4b9887115332
|
||||
timeCreated: 1544699251
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,62 @@
|
|||
Shader "HighlightPlus/Geometry/SeeThroughOccluder" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "white" {}
|
||||
_Color ("Color", Color) = (1,1,1) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent+100" "RenderType"="Transparent" "DisableBatching"="True" }
|
||||
|
||||
// Create mask
|
||||
Pass
|
||||
{
|
||||
Stencil {
|
||||
Ref 2
|
||||
Comp always
|
||||
Pass DecrWrap
|
||||
}
|
||||
ColorMask 0
|
||||
ZWrite Off
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
#if UNITY_REVERSED_Z
|
||||
o.pos.z += 0.0001;
|
||||
#else
|
||||
o.pos.z -= 0.0001;
|
||||
#endif
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 229baf997355a43cda580dd4cf86b71e
|
||||
timeCreated: 1544699251
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,83 @@
|
|||
%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: HighlightOutline
|
||||
m_Shader: {fileID: 4800000, guid: cbbf740e9c8644e8492d08b1a3fd0203, type: 3}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 1
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _ConstantWidth: 1
|
||||
- _Cull: 2
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _OutlineWidth: 0.01
|
||||
- _OutlineZTest: 4
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _OutlineColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _OutlineDirection: {r: 0, g: 0, b: 0, a: 1}
|
|
@ -0,0 +1,8 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 57729312cdd6d4eb685a81a3b0bf8a5b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,174 @@
|
|||
Shader "HighlightPlus/Geometry/Outline" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "white" {}
|
||||
_OutlineColor ("Outline Color", Color) = (0,0,0,1)
|
||||
_OutlineWidth ("Outline Offset", Float) = 0.01
|
||||
_OutlineDirection("Outline Direction", Vector) = (0,0,0)
|
||||
_OutlineGradientTex("Outline Gradient Tex", 2D) = "white" {}
|
||||
_Color ("Color", Color) = (1,1,1) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
_Cull ("Cull Mode", Int) = 2
|
||||
_ConstantWidth ("Constant Width", Float) = 1
|
||||
_OutlineZTest("ZTest", Int) = 4
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent+120" "RenderType"="Transparent" "DisableBatching"="True" }
|
||||
|
||||
Pass
|
||||
{
|
||||
Name "Outline"
|
||||
Stencil {
|
||||
Ref 2
|
||||
Comp NotEqual
|
||||
Pass replace
|
||||
ReadMask 2
|
||||
WriteMask 2
|
||||
}
|
||||
|
||||
Blend SrcAlpha OneMinusSrcAlpha
|
||||
ZWrite On
|
||||
Cull [_Cull]
|
||||
ZTest [_OutlineZTest]
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma multi_compile_instancing
|
||||
#pragma multi_compile_local _ HP_ALPHACLIP
|
||||
#pragma multi_compile_local _ HP_OUTLINE_GRADIENT_WS HP_OUTLINE_GRADIENT_LS
|
||||
#include "UnityCG.cginc"
|
||||
#include "CustomVertexTransform.cginc"
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
fixed yt : TEXCOORD0;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
fixed4 _OutlineColor;
|
||||
sampler2D _OutlineGradientTex;
|
||||
|
||||
float _OutlineWidth;
|
||||
float _ConstantWidth;
|
||||
float _OutlineVertexWidth;
|
||||
fixed2 _OutlineVertexData;
|
||||
|
||||
UNITY_INSTANCING_BUFFER_START(Props)
|
||||
UNITY_DEFINE_INSTANCED_PROP(float4, _OutlineDirection)
|
||||
UNITY_INSTANCING_BUFFER_END(Props)
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
|
||||
#if HP_OUTLINE_GRADIENT_WS
|
||||
float posy = mul(unity_ObjectToWorld, v.vertex).y;
|
||||
o.yt = saturate( (posy - _OutlineVertexData.x) / _OutlineVertexData.y);
|
||||
#else
|
||||
o.yt = saturate( (v.vertex.y - _OutlineVertexData.x) / _OutlineVertexData.y);
|
||||
#endif
|
||||
|
||||
v.vertex.xyz += v.normal * _OutlineVertexWidth;
|
||||
o.pos = ComputeVertexPosition(v.vertex);
|
||||
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
|
||||
float2 offset = TransformViewToProjection(normalize(norm.xy));
|
||||
float z = lerp(UNITY_Z_0_FAR_FROM_CLIPSPACE(o.pos.z), 2.0, UNITY_MATRIX_P[3][3]);
|
||||
z = _ConstantWidth * (z - 2.0) + 2.0;
|
||||
|
||||
float4 outlineDirection = UNITY_ACCESS_INSTANCED_PROP(Props, _OutlineDirection);
|
||||
#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) || defined(SINGLE_PASS_STEREO)
|
||||
outlineDirection.x *= 2.0;
|
||||
#endif
|
||||
o.pos.xy += offset * z * _OutlineWidth + outlineDirection.xy * z;
|
||||
return o;
|
||||
}
|
||||
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
#if HP_OUTLINE_GRADIENT_WS || HP_OUTLINE_GRADIENT_LS
|
||||
half4 color = tex2D(_OutlineGradientTex, float2(i.yt, 0));
|
||||
color.a *= _OutlineColor.a;
|
||||
#else
|
||||
half4 color = _OutlineColor;
|
||||
#endif
|
||||
return color;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
Pass
|
||||
{
|
||||
Name "Outline Clear Stencil"
|
||||
Stencil {
|
||||
Ref 8 // bit 8 is used by HighlightUIMask shader to prevent Clear Stencil passes
|
||||
Comp NotEqual
|
||||
Pass zero
|
||||
ReadMask 8
|
||||
WriteMask 6
|
||||
}
|
||||
|
||||
ColorMask 0
|
||||
ZWrite Off
|
||||
Cull [_Cull]
|
||||
ZTest Always
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
#include "CustomVertexTransform.cginc"
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
fixed4 _OutlineColor;
|
||||
float _OutlineWidth;
|
||||
float2 _OutlineDirection;
|
||||
float _ConstantWidth;
|
||||
float _OutlineVertexWidth;
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
v.vertex.xyz += v.normal * _OutlineVertexWidth;
|
||||
o.pos = ComputeVertexPosition(v.vertex);
|
||||
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
|
||||
float2 offset = TransformViewToProjection(normalize(norm.xy));
|
||||
float z = lerp(UNITY_Z_0_FAR_FROM_CLIPSPACE(o.pos.z), 2.0, UNITY_MATRIX_P[3][3]);
|
||||
z = _ConstantWidth * (z - 2.0) + 2.0;
|
||||
o.pos.xy += offset * z * _OutlineWidth + _OutlineDirection * z;
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: cbbf740e9c8644e8492d08b1a3fd0203
|
||||
timeCreated: 1544699250
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,143 @@
|
|||
Shader "HighlightPlus/Geometry/Overlay" {
|
||||
Properties {
|
||||
_MainTex ("Texture", Any) = "white" {}
|
||||
_Color ("Color", Color) = (1,1,1) // not used; dummy property to avoid inspector warning "material has no _Color property"
|
||||
_OverlayColor ("Overlay Color", Color) = (1,1,1,1)
|
||||
_OverlayBackColor ("Overlay Back Color", Color) = (1,1,1,1)
|
||||
_OverlayData("Overlay Data", Vector) = (1,0.5,1,1)
|
||||
_OverlayHitPosData("Overlay Hit Pos Data", Vector) = (0,0,0,0)
|
||||
_OverlayHitStartTime("Overlay Hit Start Time", Float) = 0
|
||||
_OverlayTexture("Overlay Texture", 2D) = "white" {}
|
||||
_CutOff("CutOff", Float ) = 0.5
|
||||
_Cull ("Cull Mode", Int) = 2
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent+121" "RenderType"="Transparent" "DisableBatching"="True" }
|
||||
|
||||
// Overlay
|
||||
Pass
|
||||
{
|
||||
Stencil {
|
||||
Ref 4
|
||||
ReadMask 4
|
||||
Comp NotEqual
|
||||
Pass keep
|
||||
}
|
||||
Blend SrcAlpha OneMinusSrcAlpha
|
||||
ZWrite Off
|
||||
Cull [_Cull]
|
||||
Offset -1, -1 // avoid issues on Quest 2 standalone when using with other render features (ie. Liquid Volume Pro 2 irregular topology)
|
||||
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma multi_compile_local _ HP_ALPHACLIP
|
||||
#pragma multi_compile_local _ HP_TEXTURE_TRIPLANAR HP_TEXTURE_SCREENSPACE HP_TEXTURE_OBJECTSPACE
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
#include "CustomVertexTransform.cginc"
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float3 norm : NORMAL;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float3 wpos : TEXCOORD1;
|
||||
#if HP_TEXTURE_TRIPLANAR
|
||||
float3 wnorm : TEXCOORD2;
|
||||
#endif
|
||||
#if HP_TEXTURE_SCREENSPACE
|
||||
float4 scrPos : TEXCOORD3;
|
||||
#endif
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
fixed4 _OverlayColor;
|
||||
sampler2D _MainTex;
|
||||
float4 _MainTex_ST;
|
||||
fixed4 _OverlayBackColor;
|
||||
fixed4 _OverlayData; // x = speed, y = MinIntensity, z = blend, w = texture scale
|
||||
float4 _OverlayHitPosData;
|
||||
float _OverlayHitStartTime;
|
||||
fixed _CutOff;
|
||||
sampler2D _OverlayTexture;
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = ComputeVertexPosition(v.vertex);
|
||||
#if HP_TEXTURE_SCREENSPACE
|
||||
o.scrPos = ComputeScreenPos(o.pos);
|
||||
o.scrPos.x *= _ScreenParams.x / _ScreenParams.y;
|
||||
#endif
|
||||
#if UNITY_REVERSED_Z
|
||||
o.pos.z += 0.0001;
|
||||
#else
|
||||
o.pos.z -= 0.0001;
|
||||
#endif
|
||||
o.wpos = mul(unity_ObjectToWorld, v.vertex).xyz;
|
||||
#if HP_TEXTURE_TRIPLANAR
|
||||
o.wnorm = UnityObjectToWorldNormal(v.norm);
|
||||
#endif
|
||||
o.uv = TRANSFORM_TEX (v.uv, _MainTex);
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
fixed4 color = tex2D(_MainTex, i.uv);
|
||||
#if HP_ALPHACLIP
|
||||
clip(color.a - _CutOff);
|
||||
#endif
|
||||
float time = _Time.y % 1000;
|
||||
fixed t = _OverlayData.y + (1.0 - _OverlayData.y) * 2.0 * abs(0.5 - frac(time * _OverlayData.x));
|
||||
fixed4 col = lerp(_OverlayColor, color * _OverlayBackColor * _OverlayColor, _OverlayData.z);
|
||||
col.a *= t;
|
||||
|
||||
if (_OverlayHitPosData.w>0) {
|
||||
float elapsed = _Time.y - _OverlayHitStartTime;
|
||||
float hitDist = distance(i.wpos, _OverlayHitPosData.xyz);
|
||||
float atten = saturate( min(elapsed, _OverlayHitPosData.w) / hitDist );
|
||||
col.a *= atten;
|
||||
}
|
||||
|
||||
#if HP_TEXTURE_TRIPLANAR
|
||||
half3 triblend = saturate(pow(i.wnorm, 4));
|
||||
triblend /= max(dot(triblend, half3(1,1,1)), 0.0001);
|
||||
|
||||
// triplanar uvs
|
||||
float3 tpos = i.wpos * _OverlayData.w;
|
||||
float2 uvX = tpos.zy;
|
||||
float2 uvY = tpos.xz;
|
||||
float2 uvZ = tpos.xy;
|
||||
|
||||
// albedo textures
|
||||
fixed4 colX = tex2D(_OverlayTexture, uvX);
|
||||
fixed4 colY = tex2D(_OverlayTexture, uvY);
|
||||
fixed4 colZ = tex2D(_OverlayTexture, uvZ);
|
||||
fixed4 tex = colX * triblend.x + colY * triblend.y + colZ * triblend.z;
|
||||
col *= tex;
|
||||
#elif HP_TEXTURE_SCREENSPACE
|
||||
col *= tex2D(_OverlayTexture, (i.scrPos.xy / i.scrPos.w) * _OverlayData.w);
|
||||
#elif HP_TEXTURE_OBJECTSPACE
|
||||
col *= tex2D(_OverlayTexture, i.uv * _OverlayData.w);
|
||||
#endif
|
||||
|
||||
return col;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: d17a98d19ada34bb7b4f86130e590159
|
||||
timeCreated: 1544699250
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,76 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: HighlightPlusDepthClipComp
|
||||
m_Shader: {fileID: 4800000, guid: 0917f634da79a4983ad78bac83d5a715, type: 3}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 94aad838a87c54e1b89e9ef47ecad5bf
|
||||
timeCreated: 1546857910
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -0,0 +1,76 @@
|
|||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: HighlightPlusDepthWrite
|
||||
m_Shader: {fileID: 4800000, guid: 058a572e30b2d446bade2dda32bcef0f, type: 3}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
@ -0,0 +1,9 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 825cb444e111842cf97788cbb7583edd
|
||||
timeCreated: 1546857910
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue