From 6c5fead0ba9f2650268a5b197544fa7cfd8f0103 Mon Sep 17 00:00:00 2001 From: Cole Schultz Date: Wed, 21 Apr 2021 11:26:38 -0500 Subject: [PATCH 1/9] Update some graphics settings --- Examples/Assets/SRP/UniversalRenderPipelineAsset.asset | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Examples/Assets/SRP/UniversalRenderPipelineAsset.asset b/Examples/Assets/SRP/UniversalRenderPipelineAsset.asset index 7b4abd1..93654ce 100644 --- a/Examples/Assets/SRP/UniversalRenderPipelineAsset.asset +++ b/Examples/Assets/SRP/UniversalRenderPipelineAsset.asset @@ -23,7 +23,7 @@ MonoBehaviour: m_RequireOpaqueTexture: 0 m_OpaqueDownsampling: 1 m_SupportsTerrainHoles: 1 - m_SupportsHDR: 1 + m_SupportsHDR: 0 m_MSAA: 1 m_RenderScale: 1 m_MainLightRenderingMode: 1 @@ -37,12 +37,12 @@ MonoBehaviour: m_AdditionalLightsShadowResolutionTierMedium: 512 m_AdditionalLightsShadowResolutionTierHigh: 1024 m_ShadowDistance: 50 - m_ShadowCascadeCount: 1 + m_ShadowCascadeCount: 3 m_Cascade2Split: 0.25 m_Cascade3Split: {x: 0.1, y: 0.3} m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467} m_CascadeBorder: 0.2 - m_ShadowDepthBias: 0 + m_ShadowDepthBias: 0.48 m_ShadowNormalBias: 0 m_SoftShadowsSupported: 1 m_UseSRPBatcher: 1 From d1f6f506a09c585495465cece90ee98e7cfc8cf8 Mon Sep 17 00:00:00 2001 From: Cole Schultz Date: Wed, 21 Apr 2021 11:27:00 -0500 Subject: [PATCH 2/9] [Chess] Create base chess piece prefabs --- .../Assets/2-Chess/Prefabs/ChessPiece.prefab | 128 ++++++++++++++++++ .../2-Chess/Prefabs/ChessPiece.prefab.meta | 7 + .../2-Chess/Prefabs/ChessPieceBishop.prefab | 101 ++++++++++++++ .../Prefabs/ChessPieceBishop.prefab.meta | 7 + .../2-Chess/Prefabs/ChessPieceKing.prefab | 76 +++++++++++ .../Prefabs/ChessPieceKing.prefab.meta | 7 + .../2-Chess/Prefabs/ChessPieceKnight.prefab | 76 +++++++++++ .../Prefabs/ChessPieceKnight.prefab.meta | 7 + .../2-Chess/Prefabs/ChessPiecePawn.prefab | 76 +++++++++++ .../Prefabs/ChessPiecePawn.prefab.meta | 7 + .../2-Chess/Prefabs/ChessPieceQueen.prefab | 76 +++++++++++ .../Prefabs/ChessPieceQueen.prefab.meta | 7 + .../2-Chess/Prefabs/ChessPieceRook.prefab | 76 +++++++++++ .../Prefabs/ChessPieceRook.prefab.meta | 7 + 14 files changed, 658 insertions(+) create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPiece.prefab create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPiece.prefab.meta create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceBishop.prefab create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceBishop.prefab.meta create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceKing.prefab create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceKing.prefab.meta create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceKnight.prefab create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceKnight.prefab.meta create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPiecePawn.prefab create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPiecePawn.prefab.meta create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceQueen.prefab create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceQueen.prefab.meta create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceRook.prefab create mode 100644 Examples/Assets/2-Chess/Prefabs/ChessPieceRook.prefab.meta diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPiece.prefab b/Examples/Assets/2-Chess/Prefabs/ChessPiece.prefab new file mode 100644 index 0000000..35c4018 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPiece.prefab @@ -0,0 +1,128 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1812032989495986861 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1812032989496153741} + - component: {fileID: 1812032989492762285} + - component: {fileID: 1812032989493728365} + m_Layer: 0 + m_Name: Model + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1812032989496153741 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812032989495986861} + m_LocalRotation: {x: 0.0000000218557, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 0.6666667, y: 0.6666667, z: 0.6666667} + m_Children: [] + m_Father: {fileID: 4954453973512217138} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1812032989492762285 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812032989495986861} + m_Mesh: {fileID: 0} +--- !u!23 &1812032989493728365 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812032989495986861} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: e62e815d106881342ad0363de99e4032, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &2230369837149406147 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4954453973512217138} + - component: {fileID: 2863982070394274075} + m_Layer: 0 + m_Name: ChessPiece + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4954453973512217138 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2230369837149406147} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1812032989496153741} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2863982070394274075 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2230369837149406147} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9b48b005af2d31e44a524862a63bf877, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPiece.prefab.meta b/Examples/Assets/2-Chess/Prefabs/ChessPiece.prefab.meta new file mode 100644 index 0000000..f615ef2 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPiece.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2171c4445fb8a384c964f7a4cfe4bd75 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceBishop.prefab b/Examples/Assets/2-Chess/Prefabs/ChessPieceBishop.prefab new file mode 100644 index 0000000..1a1beff --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceBishop.prefab @@ -0,0 +1,101 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &2812128829475687574 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1812032989492762285, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 66ad00b166b914e47acce78daea25aa6, type: 3} + - target: {fileID: 1812032989496153741, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 1812032989496153741, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1812032989496153741, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.y + value: -0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 1812032989496153741, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1812032989496153741, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -90 + objectReference: {fileID: 0} + - target: {fileID: 2230369837149406147, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Name + value: ChessPieceBishop + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 2171c4445fb8a384c964f7a4cfe4bd75, type: 3} diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceBishop.prefab.meta b/Examples/Assets/2-Chess/Prefabs/ChessPieceBishop.prefab.meta new file mode 100644 index 0000000..3d75397 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceBishop.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6e884ce33c0cb614183072a3b6d3428c +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceKing.prefab b/Examples/Assets/2-Chess/Prefabs/ChessPieceKing.prefab new file mode 100644 index 0000000..dd7acad --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceKing.prefab @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &5501202326134806219 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1812032989492762285, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300002, guid: a1edea9a41e71514f94a737abaf1410c, type: 3} + - target: {fileID: 2230369837149406147, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Name + value: ChessPieceKing + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 2171c4445fb8a384c964f7a4cfe4bd75, type: 3} diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceKing.prefab.meta b/Examples/Assets/2-Chess/Prefabs/ChessPieceKing.prefab.meta new file mode 100644 index 0000000..4195051 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceKing.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8064d5600829eac4193f1d236ee464e1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceKnight.prefab b/Examples/Assets/2-Chess/Prefabs/ChessPieceKnight.prefab new file mode 100644 index 0000000..7c40b47 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceKnight.prefab @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &5509134149362908669 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1812032989492762285, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 639050e749c3ce444a196d84e803b067, type: 3} + - target: {fileID: 2230369837149406147, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Name + value: ChessPieceKnight + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 2171c4445fb8a384c964f7a4cfe4bd75, type: 3} diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceKnight.prefab.meta b/Examples/Assets/2-Chess/Prefabs/ChessPieceKnight.prefab.meta new file mode 100644 index 0000000..00272a3 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceKnight.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fe6946c1e57f1e04da70f359e47f0b74 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPiecePawn.prefab b/Examples/Assets/2-Chess/Prefabs/ChessPiecePawn.prefab new file mode 100644 index 0000000..7442a25 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPiecePawn.prefab @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &795841906584429922 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1812032989492762285, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 8fbcce33444d4ce4db5b61f8d0eeb7aa, type: 3} + - target: {fileID: 2230369837149406147, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Name + value: PawnChessPiece + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 2171c4445fb8a384c964f7a4cfe4bd75, type: 3} diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPiecePawn.prefab.meta b/Examples/Assets/2-Chess/Prefabs/ChessPiecePawn.prefab.meta new file mode 100644 index 0000000..2589023 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPiecePawn.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 32b62efada760e849bd87da4273b3b53 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceQueen.prefab b/Examples/Assets/2-Chess/Prefabs/ChessPieceQueen.prefab new file mode 100644 index 0000000..030a52d --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceQueen.prefab @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &806771203401653252 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1812032989492762285, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: 5d7a66b35fd81564380721b6bfcaaa47, type: 3} + - target: {fileID: 2230369837149406147, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Name + value: ChessPieceQueen + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 2171c4445fb8a384c964f7a4cfe4bd75, type: 3} diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceQueen.prefab.meta b/Examples/Assets/2-Chess/Prefabs/ChessPieceQueen.prefab.meta new file mode 100644 index 0000000..64dd581 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceQueen.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5fe76d0647bbcf84aa5989b1d4582db1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceRook.prefab b/Examples/Assets/2-Chess/Prefabs/ChessPieceRook.prefab new file mode 100644 index 0000000..d9376c5 --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceRook.prefab @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &211110543383861039 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1812032989492762285, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Mesh + value: + objectReference: {fileID: 4300000, guid: c61872173bf5220469786c549644854f, type: 3} + - target: {fileID: 2230369837149406147, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_Name + value: ChessPieceRook + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4954453973512217138, guid: 2171c4445fb8a384c964f7a4cfe4bd75, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 2171c4445fb8a384c964f7a4cfe4bd75, type: 3} diff --git a/Examples/Assets/2-Chess/Prefabs/ChessPieceRook.prefab.meta b/Examples/Assets/2-Chess/Prefabs/ChessPieceRook.prefab.meta new file mode 100644 index 0000000..e1314bf --- /dev/null +++ b/Examples/Assets/2-Chess/Prefabs/ChessPieceRook.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0b18bbbd40b5c414c8dae0da35082cc2 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 7b90b18db0a8298182ca84373ac91a58601ed6db Mon Sep 17 00:00:00 2001 From: Cole Schultz Date: Wed, 21 Apr 2021 11:27:22 -0500 Subject: [PATCH 3/9] [Chess] Create ChessPiece material --- .../Assets/2-Chess/Materials/ChessPiece.mat | 129 ++++++++++++++++++ .../2-Chess/Materials/ChessPiece.mat.meta | 8 ++ 2 files changed, 137 insertions(+) create mode 100644 Examples/Assets/2-Chess/Materials/ChessPiece.mat create mode 100644 Examples/Assets/2-Chess/Materials/ChessPiece.mat.meta diff --git a/Examples/Assets/2-Chess/Materials/ChessPiece.mat b/Examples/Assets/2-Chess/Materials/ChessPiece.mat new file mode 100644 index 0000000..4797680 --- /dev/null +++ b/Examples/Assets/2-Chess/Materials/ChessPiece.mat @@ -0,0 +1,129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-3749607757857133310 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ChessPiece + m_Shader: {fileID: 4800000, guid: 8d2bb70cbf9db8d4da26e15b26e74248, type: 3} + m_ShaderKeywords: _SPECULAR_COLOR + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2000 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossinessSource: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Shininess: 0 + - _Smoothness: 0.5 + - _SmoothnessSource: 0 + - _SmoothnessTextureChannel: 0 + - _SpecSource: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999927, g: 0.19999927, b: 0.19999927, a: 0.5} + m_BuildTextureStacks: [] diff --git a/Examples/Assets/2-Chess/Materials/ChessPiece.mat.meta b/Examples/Assets/2-Chess/Materials/ChessPiece.mat.meta new file mode 100644 index 0000000..7240d37 --- /dev/null +++ b/Examples/Assets/2-Chess/Materials/ChessPiece.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e62e815d106881342ad0363de99e4032 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: From 9c6e1a8bf1f9443a32fdff328152fbb19d899ecb Mon Sep 17 00:00:00 2001 From: Cole Schultz Date: Wed, 21 Apr 2021 11:29:05 -0500 Subject: [PATCH 4/9] [Chess] Add ChessPieceSpawner - ChessPieceSpawner is a side effector that spawns in the correct pieces when the InitializeAction is triggered. - It also hooks up state listeners for each piece so they can be kept up to date on their location in the store --- Examples/Assets/2-Chess/Chess.unity | 69 ++++++++++- Examples/Assets/2-Chess/Scripts/Chess.asmdef | 4 +- .../2-Chess/Scripts/ChessPieceSpawner.cs | 113 ++++++++++++++++++ .../2-Chess/Scripts/ChessPieceSpawner.cs.meta | 3 + .../Scripts/ChessPieceStateListener.cs | 17 +++ .../Scripts/ChessPieceStateListener.cs.meta | 11 ++ .../2-Chess/Scripts/Common/ChessLocation.cs | 9 ++ .../2-Chess/Scripts/State/ChessStore.cs | 7 +- .../2-Chess/Scripts/State/Selectors.meta | 3 + .../Scripts/State/Selectors/Selectors.cs | 14 +++ .../Scripts/State/Selectors/Selectors.cs.meta | 3 + 11 files changed, 247 insertions(+), 6 deletions(-) create mode 100644 Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs create mode 100644 Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs.meta create mode 100644 Examples/Assets/2-Chess/Scripts/ChessPieceStateListener.cs create mode 100644 Examples/Assets/2-Chess/Scripts/ChessPieceStateListener.cs.meta create mode 100644 Examples/Assets/2-Chess/Scripts/State/Selectors.meta create mode 100644 Examples/Assets/2-Chess/Scripts/State/Selectors/Selectors.cs create mode 100644 Examples/Assets/2-Chess/Scripts/State/Selectors/Selectors.cs.meta diff --git a/Examples/Assets/2-Chess/Chess.unity b/Examples/Assets/2-Chess/Chess.unity index 9d60a1f..8fa7753 100644 --- a/Examples/Assets/2-Chess/Chess.unity +++ b/Examples/Assets/2-Chess/Chess.unity @@ -132,6 +132,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 18479229} + - component: {fileID: 18479230} m_Layer: 0 m_Name: PieceSpawner m_TagString: Untagged @@ -153,6 +154,33 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &18479230 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 18479228} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5eef96e5ff14464db4ce41c12e55a69a, type: 3} + m_Name: + m_EditorClassIdentifier: + baseMaterial: {fileID: 2100000, guid: e62e815d106881342ad0363de99e4032, type: 2} + whiteColor: {r: 0.745283, g: 0.745283, b: 0.745283, a: 0} + blackColor: {r: 0.3301887, g: 0.3301887, b: 0.3301887, a: 0} + pawnPrefab: {fileID: 1583218075738367649, guid: 32b62efada760e849bd87da4273b3b53, + type: 3} + bishopPrefab: {fileID: 4176364942238273365, guid: 6e884ce33c0cb614183072a3b6d3428c, + type: 3} + knightPrefab: {fileID: 5946930590886837822, guid: fe6946c1e57f1e04da70f359e47f0b74, + type: 3} + rookPrefab: {fileID: 2026019943357961452, guid: 0b18bbbd40b5c414c8dae0da35082cc2, + type: 3} + queenPrefab: {fileID: 1567788881234649031, guid: 5fe76d0647bbcf84aa5989b1d4582db1, + type: 3} + kingPrefab: {fileID: 5957118620367066376, guid: 8064d5600829eac4193f1d236ee464e1, + type: 3} --- !u!1 &835953010 GameObject: m_ObjectHideFlags: 0 @@ -164,6 +192,7 @@ GameObject: - component: {fileID: 835953013} - component: {fileID: 835953012} - component: {fileID: 835953011} + - component: {fileID: 835953014} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -236,6 +265,38 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!114 &835953014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835953010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 --- !u!1001 &990988795 PrefabInstance: m_ObjectHideFlags: 0 @@ -253,6 +314,11 @@ PrefabInstance: propertyPath: m_RootOrder value: 1 objectReference: {fileID: 0} + - target: {fileID: 7621059963395653558, guid: dd7ea297c8547c24d9b69c1d063cd660, + type: 3} + propertyPath: m_LocalScale.z + value: -1 + objectReference: {fileID: 0} - target: {fileID: 7621059963395653558, guid: dd7ea297c8547c24d9b69c1d063cd660, type: 3} propertyPath: m_LocalPosition.x @@ -348,6 +414,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2b9385cb5c9a3bf4aa966592c7c92f76, type: 3} m_Name: m_EditorClassIdentifier: + spawner: {fileID: 18479230} --- !u!1 &1943387544 GameObject: m_ObjectHideFlags: 0 @@ -389,7 +456,7 @@ Light: m_Strength: 1 m_Bias: 0.05 m_NormalBias: 0.4 - m_NearPlane: 0.2 + m_NearPlane: 0.1 m_CullingMatrixOverride: e00: 1 e01: 0 diff --git a/Examples/Assets/2-Chess/Scripts/Chess.asmdef b/Examples/Assets/2-Chess/Scripts/Chess.asmdef index 0a7db36..825c897 100644 --- a/Examples/Assets/2-Chess/Scripts/Chess.asmdef +++ b/Examples/Assets/2-Chess/Scripts/Chess.asmdef @@ -2,7 +2,9 @@ "name": "Chess", "rootNamespace": "PlayduxExamples.Chess", "references": [ - "GUID:1b0ba1c813752254a9500a93c914f473" + "GUID:1b0ba1c813752254a9500a93c914f473", + "GUID:560b04d1a97f54a4e82edc0cbbb69285", + "GUID:f51ebe6a0ceec4240a699833d6309b23" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs b/Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs new file mode 100644 index 0000000..b18f85f --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs @@ -0,0 +1,113 @@ +#nullable enable +using System; +using System.Collections.Generic; +using Cysharp.Threading.Tasks; +using Playdux.src.Store; +using PlayduxExamples.Chess.Scripts.Common; +using PlayduxExamples.Chess.Scripts.State; +using PlayduxExamples.Chess.Scripts.State.Selectors; +using UnityEngine; + +namespace PlayduxExamples.Chess.Scripts +{ + public class ChessPieceSpawner : MonoBehaviour, ISideEffector + { + [Header("Material Config")] + [SerializeField] private Material? baseMaterial; + [SerializeField] private Color whiteColor; + [SerializeField] private Color blackColor; + + [Header("Piece Prefabs")] + [SerializeField] private GameObject? pawnPrefab; + [SerializeField] private GameObject? bishopPrefab; + [SerializeField] private GameObject? knightPrefab; + [SerializeField] private GameObject? rookPrefab; + [SerializeField] private GameObject? queenPrefab; + [SerializeField] private GameObject? kingPrefab; + + public int Priority => 0; + + private Material? whiteMaterial; + private Material? blackMaterial; + + private readonly List existingInstanceObjects = new(); + + private void Awake() + { + whiteMaterial = new Material(baseMaterial!) { color = whiteColor }; + blackMaterial = new Material(baseMaterial!) { color = blackColor }; + } + + public bool PreEffect(DispatchedAction dispatchedAction, IStore store) => true; + + public void PostEffect(DispatchedAction dispatchedAction, IStore store) + { + if (dispatchedAction.Action is not InitializeAction) return; + + UniTask.Run(() => SpawnPieces(store)); + } + + private async UniTask SpawnPieces(IStateContainer store) + { + // Ensure Awake has been called prior to spawning pieces + if (whiteMaterial is null || blackMaterial is null) await UniTask.WaitUntil(() => whiteMaterial is not null && blackMaterial is not null); + + ClearExistingObjects(); + + var pieces = store.Select(state => state.Pieces); + + for (var i = 0; i < pieces.Length; i++) + { + var ((team, piece), loc, _) = pieces[i]; + + // Spawn piece instance + var prefab = PrefabFromPiece(piece); + var instanceObject = Instantiate(prefab, loc.ToVector3(), Quaternion.identity); + if (instanceObject is null) throw new InvalidOperationException("Instance of piece not properly created"); + + // Set piece orientation (black faces "down", white faces "up") + if (team is ChessTeam.White) instanceObject.transform.Rotate(Vector3.up, 180f); + + // Apply material + instanceObject.GetComponentInChildren().material = team switch + { + ChessTeam.Black => blackMaterial!, + ChessTeam.White => whiteMaterial!, + _ => throw new ArgumentOutOfRangeException(nameof(team), team, null) + }; + + // Initialize instance state listener + var stateListener = instanceObject.GetComponent(); + if (stateListener is null) throw new InvalidOperationException("Created instance did not have a component of type ChessPieceInstance"); + + stateListener.Initialize(store.ObservableFor(SelectorGenerator.ForPiece(i))); + + // Store piece instance + existingInstanceObjects.Add(instanceObject); + } + } + + private void ClearExistingObjects() + { + foreach (var existing in existingInstanceObjects) { Destroy(existing); } + existingInstanceObjects.Clear(); + } + + private void OnDestroy() + { + Destroy(whiteMaterial); + Destroy(blackMaterial); + } + + private GameObject PrefabFromPiece(ChessPiece piece) => piece switch + { + ChessPiece.Pawn => pawnPrefab!, + ChessPiece.Bishop => bishopPrefab!, + ChessPiece.Knight => knightPrefab!, + ChessPiece.Rook => rookPrefab!, + ChessPiece.Queen => queenPrefab!, + ChessPiece.King => kingPrefab!, + _ => throw new ArgumentOutOfRangeException(nameof(piece), piece, null) + }; + } +} \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs.meta b/Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs.meta new file mode 100644 index 0000000..90d976f --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5eef96e5ff14464db4ce41c12e55a69a +timeCreated: 1619012496 \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/ChessPieceStateListener.cs b/Examples/Assets/2-Chess/Scripts/ChessPieceStateListener.cs new file mode 100644 index 0000000..2af047c --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/ChessPieceStateListener.cs @@ -0,0 +1,17 @@ +#nullable enable +using System; +using PlayduxExamples.Chess.Scripts.Common; +using UniRx; +using UnityEngine; + +namespace PlayduxExamples.Chess.Scripts +{ + public class ChessPieceStateListener : MonoBehaviour + { + public void Initialize(IObservable stateStream) => + stateStream.Subscribe( + onNext: state => transform.position = state.Location.ToVector3(), + Debug.LogException + ); + } +} diff --git a/Examples/Assets/2-Chess/Scripts/ChessPieceStateListener.cs.meta b/Examples/Assets/2-Chess/Scripts/ChessPieceStateListener.cs.meta new file mode 100644 index 0000000..356fb4e --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/ChessPieceStateListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b48b005af2d31e44a524862a63bf877 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/Assets/2-Chess/Scripts/Common/ChessLocation.cs b/Examples/Assets/2-Chess/Scripts/Common/ChessLocation.cs index 214d687..4ea8a9b 100644 --- a/Examples/Assets/2-Chess/Scripts/Common/ChessLocation.cs +++ b/Examples/Assets/2-Chess/Scripts/Common/ChessLocation.cs @@ -1,5 +1,6 @@ #nullable enable using System; +using UnityEngine; namespace PlayduxExamples.Chess.Scripts.Common { @@ -11,4 +12,12 @@ public record ChessLocation(Rank Rank, File File) public enum Rank { One, Two, Three, Four, Five, Six, Seven, Eight } public enum File { A, B, C, D, E, F, G, H } + + public static class RankAndFileExtensions + { + public static int ToXPos(this File file) => (int)file; + public static int ToZPos(this Rank rank) => (int)rank; + + public static Vector3 ToVector3(this ChessLocation loc) => new(loc.File.ToXPos(), 0, loc.Rank.ToZPos()); + } } \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/ChessStore.cs b/Examples/Assets/2-Chess/Scripts/State/ChessStore.cs index d5a2290..ff5e239 100644 --- a/Examples/Assets/2-Chess/Scripts/State/ChessStore.cs +++ b/Examples/Assets/2-Chess/Scripts/State/ChessStore.cs @@ -6,10 +6,9 @@ namespace PlayduxExamples.Chess.Scripts.State { public class ChessStore : StoreBehaviour { - protected override Store InitializeStore() - { - return new(ChessState.InitialState, RootReducer); - } + [SerializeField] private ChessPieceSpawner? spawner; + + protected override Store InitializeStore() => new(ChessState.InitialState, RootReducer, new[] { spawner! }); private static ChessState RootReducer(ChessState state, IAction action) { diff --git a/Examples/Assets/2-Chess/Scripts/State/Selectors.meta b/Examples/Assets/2-Chess/Scripts/State/Selectors.meta new file mode 100644 index 0000000..89fa66b --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Selectors.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ff9ecc4ee9604473950b577a73be44a5 +timeCreated: 1619019675 \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/Selectors/Selectors.cs b/Examples/Assets/2-Chess/Scripts/State/Selectors/Selectors.cs new file mode 100644 index 0000000..7e99114 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Selectors/Selectors.cs @@ -0,0 +1,14 @@ +#nullable enable +using System; +using PlayduxExamples.Chess.Scripts.Common; + +namespace PlayduxExamples.Chess.Scripts.State.Selectors +{ + public static class Selector { } + + public static class SelectorGenerator + { + public static Func ForPiece(int index) => + state => state.Pieces[index]; + } +} \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/Selectors/Selectors.cs.meta b/Examples/Assets/2-Chess/Scripts/State/Selectors/Selectors.cs.meta new file mode 100644 index 0000000..df465f7 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Selectors/Selectors.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9e5a5fa641624ee29c4fa2d7d85b2b23 +timeCreated: 1619019681 \ No newline at end of file From 26295687692f3fb9e92930832e4b5bccd2eaf7e9 Mon Sep 17 00:00:00 2001 From: Cole Schultz Date: Wed, 21 Apr 2021 11:57:26 -0500 Subject: [PATCH 5/9] [Chess] Add new "MovePieceAction" and associated reducer - Additionally add a temp `RandomPieceMover` monobehaviour to test that the updated state is being represented correctly by the pieces --- .../2-Chess/Scripts/Common/ChessLocation.cs | 2 ++ .../2-Chess/Scripts/RandomPieceMover.cs | 26 +++++++++++++++++++ .../2-Chess/Scripts/RandomPieceMover.cs.meta | 3 +++ .../Assets/2-Chess/Scripts/State/Actions.meta | 3 +++ .../2-Chess/Scripts/State/Actions/Actions.cs | 8 ++++++ .../Scripts/State/Actions/Actions.cs.meta | 3 +++ .../2-Chess/Scripts/State/ChessStore.cs | 3 +++ .../2-Chess/Scripts/State/Reducers.meta | 3 +++ .../State/Reducers/MovePieceReducer.cs | 11 ++++++++ .../State/Reducers/MovePieceReducer.cs.meta | 3 +++ .../State/Reducers/PiecesReducerUtils.cs | 19 ++++++++++++++ .../State/Reducers/PiecesReducerUtils.cs.meta | 3 +++ 12 files changed, 87 insertions(+) create mode 100644 Examples/Assets/2-Chess/Scripts/RandomPieceMover.cs create mode 100644 Examples/Assets/2-Chess/Scripts/RandomPieceMover.cs.meta create mode 100644 Examples/Assets/2-Chess/Scripts/State/Actions.meta create mode 100644 Examples/Assets/2-Chess/Scripts/State/Actions/Actions.cs create mode 100644 Examples/Assets/2-Chess/Scripts/State/Actions/Actions.cs.meta create mode 100644 Examples/Assets/2-Chess/Scripts/State/Reducers.meta create mode 100644 Examples/Assets/2-Chess/Scripts/State/Reducers/MovePieceReducer.cs create mode 100644 Examples/Assets/2-Chess/Scripts/State/Reducers/MovePieceReducer.cs.meta create mode 100644 Examples/Assets/2-Chess/Scripts/State/Reducers/PiecesReducerUtils.cs create mode 100644 Examples/Assets/2-Chess/Scripts/State/Reducers/PiecesReducerUtils.cs.meta diff --git a/Examples/Assets/2-Chess/Scripts/Common/ChessLocation.cs b/Examples/Assets/2-Chess/Scripts/Common/ChessLocation.cs index 4ea8a9b..7e90cc0 100644 --- a/Examples/Assets/2-Chess/Scripts/Common/ChessLocation.cs +++ b/Examples/Assets/2-Chess/Scripts/Common/ChessLocation.cs @@ -19,5 +19,7 @@ public static class RankAndFileExtensions public static int ToZPos(this Rank rank) => (int)rank; public static Vector3 ToVector3(this ChessLocation loc) => new(loc.File.ToXPos(), 0, loc.Rank.ToZPos()); + + public static ChessLocation ChessLocationFromXZ(this ValueTuple loc) => new((Rank)loc.Item1, (File)loc.Item2); } } \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/RandomPieceMover.cs b/Examples/Assets/2-Chess/Scripts/RandomPieceMover.cs new file mode 100644 index 0000000..b293c1a --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/RandomPieceMover.cs @@ -0,0 +1,26 @@ +#nullable enable +using System; +using PlayduxExamples.Chess.Scripts.Common; +using PlayduxExamples.Chess.Scripts.State; +using PlayduxExamples.Chess.Scripts.State.Actions; +using UnityEngine; +using Random = UnityEngine.Random; + +namespace PlayduxExamples.Chess.Scripts +{ + public class RandomPieceMover : MonoBehaviour + { + [SerializeField] private ChessStore? store; + + private void Update() + { + if (!Input.GetKeyDown(KeyCode.Space)) return; + + var pieceIndex = Random.Range(0, store!.State.Pieces.Length - 1); + var newX = Random.Range(0, Enum.GetValues(typeof(File)).Length - 1); + var newZ = Random.Range(0, Enum.GetValues(typeof(Rank)).Length - 1); + + store.Dispatch(new MovePieceAction(pieceIndex, (newX, newZ).ChessLocationFromXZ())); + } + } +} \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/RandomPieceMover.cs.meta b/Examples/Assets/2-Chess/Scripts/RandomPieceMover.cs.meta new file mode 100644 index 0000000..c6bed32 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/RandomPieceMover.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 93b4c6956f914255af4b113d48ac3282 +timeCreated: 1619023636 \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/Actions.meta b/Examples/Assets/2-Chess/Scripts/State/Actions.meta new file mode 100644 index 0000000..4856f76 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Actions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 137358630b2545e59aa52f3a25bdc70d +timeCreated: 1619023092 \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/Actions/Actions.cs b/Examples/Assets/2-Chess/Scripts/State/Actions/Actions.cs new file mode 100644 index 0000000..e19d7d6 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Actions/Actions.cs @@ -0,0 +1,8 @@ +#nullable enable +using Playdux.src.Store; +using PlayduxExamples.Chess.Scripts.Common; + +namespace PlayduxExamples.Chess.Scripts.State.Actions +{ + public record MovePieceAction(int Index, ChessLocation NewLocation) : IAction; +} \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/Actions/Actions.cs.meta b/Examples/Assets/2-Chess/Scripts/State/Actions/Actions.cs.meta new file mode 100644 index 0000000..e0ea2b5 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Actions/Actions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d6cc3dccb9c34f7190a03fb41104d43e +timeCreated: 1619023097 \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/ChessStore.cs b/Examples/Assets/2-Chess/Scripts/State/ChessStore.cs index ff5e239..3b61d6f 100644 --- a/Examples/Assets/2-Chess/Scripts/State/ChessStore.cs +++ b/Examples/Assets/2-Chess/Scripts/State/ChessStore.cs @@ -1,5 +1,7 @@ #nullable enable using Playdux.src.Store; +using PlayduxExamples.Chess.Scripts.State.Actions; +using PlayduxExamples.Chess.Scripts.State.Reducers; using UnityEngine; namespace PlayduxExamples.Chess.Scripts.State @@ -15,6 +17,7 @@ private static ChessState RootReducer(ChessState state, IAction action) Debug.Log($"Action dispatched:\n\t{action}"); return action switch { + MovePieceAction a => state with { Pieces = MovePieceReducer.Reduce(state.Pieces, a) }, _ => state }; } diff --git a/Examples/Assets/2-Chess/Scripts/State/Reducers.meta b/Examples/Assets/2-Chess/Scripts/State/Reducers.meta new file mode 100644 index 0000000..3c263d9 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Reducers.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0cd7c00858db49b8921c2da41680b6f5 +timeCreated: 1619023191 \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/Reducers/MovePieceReducer.cs b/Examples/Assets/2-Chess/Scripts/State/Reducers/MovePieceReducer.cs new file mode 100644 index 0000000..09d1f31 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Reducers/MovePieceReducer.cs @@ -0,0 +1,11 @@ +using PlayduxExamples.Chess.Scripts.Common; +using PlayduxExamples.Chess.Scripts.State.Actions; + +namespace PlayduxExamples.Chess.Scripts.State.Reducers +{ + public static class MovePieceReducer + { + public static ChessPieceState[] Reduce(ChessPieceState[] pieces, MovePieceAction action) => + PiecesReducerUtils.SetChessPieceState(pieces, action.Index, pieces[action.Index] with { Location = action.NewLocation }); + } +} \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/Reducers/MovePieceReducer.cs.meta b/Examples/Assets/2-Chess/Scripts/State/Reducers/MovePieceReducer.cs.meta new file mode 100644 index 0000000..0a99c29 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Reducers/MovePieceReducer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d32696da3777466bb51141007362431e +timeCreated: 1619023201 \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/Reducers/PiecesReducerUtils.cs b/Examples/Assets/2-Chess/Scripts/State/Reducers/PiecesReducerUtils.cs new file mode 100644 index 0000000..85e3695 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Reducers/PiecesReducerUtils.cs @@ -0,0 +1,19 @@ +using System; +using PlayduxExamples.Chess.Scripts.Common; + +namespace PlayduxExamples.Chess.Scripts.State.Reducers +{ + public static class PiecesReducerUtils + { + public static ChessPieceState[] SetChessPieceState(ChessPieceState[] pieces, int index, ChessPieceState newState) + { + var newPieces = new ChessPieceState[pieces.Length]; + + Array.Copy(pieces, 0, newPieces, 0, index); + newPieces[index] = newState; + Array.Copy(pieces, index + 1, newPieces, index + 1, pieces.Length - (index + 1)); + + return newPieces; + } + } +} \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/State/Reducers/PiecesReducerUtils.cs.meta b/Examples/Assets/2-Chess/Scripts/State/Reducers/PiecesReducerUtils.cs.meta new file mode 100644 index 0000000..7d67c27 --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/Reducers/PiecesReducerUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7e0af35e702e4643accba45f31ef6872 +timeCreated: 1619023294 \ No newline at end of file From 711e4a593458a9e05ddf311a9d202bcea54be279 Mon Sep 17 00:00:00 2001 From: Cole Schultz Date: Wed, 21 Apr 2021 13:18:49 -0500 Subject: [PATCH 6/9] [Chess] Move chess piece spawner to State\SideEffectors --- Examples/Assets/2-Chess/Scripts/State/SideEffectors.meta | 3 +++ .../{ => State/SideEffectors}/ChessPieceSpawner.cs | 9 +++++---- .../{ => State/SideEffectors}/ChessPieceSpawner.cs.meta | 0 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 Examples/Assets/2-Chess/Scripts/State/SideEffectors.meta rename Examples/Assets/2-Chess/Scripts/{ => State/SideEffectors}/ChessPieceSpawner.cs (98%) rename Examples/Assets/2-Chess/Scripts/{ => State/SideEffectors}/ChessPieceSpawner.cs.meta (100%) diff --git a/Examples/Assets/2-Chess/Scripts/State/SideEffectors.meta b/Examples/Assets/2-Chess/Scripts/State/SideEffectors.meta new file mode 100644 index 0000000..da7389c --- /dev/null +++ b/Examples/Assets/2-Chess/Scripts/State/SideEffectors.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b3266e4229334085b305fe443b82b829 +timeCreated: 1619028560 \ No newline at end of file diff --git a/Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs b/Examples/Assets/2-Chess/Scripts/State/SideEffectors/ChessPieceSpawner.cs similarity index 98% rename from Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs rename to Examples/Assets/2-Chess/Scripts/State/SideEffectors/ChessPieceSpawner.cs index b18f85f..8c87a27 100644 --- a/Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs +++ b/Examples/Assets/2-Chess/Scripts/State/SideEffectors/ChessPieceSpawner.cs @@ -59,12 +59,12 @@ private async UniTask SpawnPieces(IStateContainer store) for (var i = 0; i < pieces.Length; i++) { var ((team, piece), loc, _) = pieces[i]; - + // Spawn piece instance var prefab = PrefabFromPiece(piece); var instanceObject = Instantiate(prefab, loc.ToVector3(), Quaternion.identity); if (instanceObject is null) throw new InvalidOperationException("Instance of piece not properly created"); - + // Set piece orientation (black faces "down", white faces "up") if (team is ChessTeam.White) instanceObject.transform.Rotate(Vector3.up, 180f); @@ -79,9 +79,9 @@ private async UniTask SpawnPieces(IStateContainer store) // Initialize instance state listener var stateListener = instanceObject.GetComponent(); if (stateListener is null) throw new InvalidOperationException("Created instance did not have a component of type ChessPieceInstance"); - + stateListener.Initialize(store.ObservableFor(SelectorGenerator.ForPiece(i))); - + // Store piece instance existingInstanceObjects.Add(instanceObject); } @@ -90,6 +90,7 @@ private async UniTask SpawnPieces(IStateContainer store) private void ClearExistingObjects() { foreach (var existing in existingInstanceObjects) { Destroy(existing); } + existingInstanceObjects.Clear(); } diff --git a/Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs.meta b/Examples/Assets/2-Chess/Scripts/State/SideEffectors/ChessPieceSpawner.cs.meta similarity index 100% rename from Examples/Assets/2-Chess/Scripts/ChessPieceSpawner.cs.meta rename to Examples/Assets/2-Chess/Scripts/State/SideEffectors/ChessPieceSpawner.cs.meta From cb2815be2038d722944bd222ed5da4f68c21f5c2 Mon Sep 17 00:00:00 2001 From: Cole Schultz Date: Wed, 21 Apr 2021 13:59:36 -0500 Subject: [PATCH 7/9] Use DOTween upm package instead of using it as a plugin in the Assets folder --- Examples/Assets/Plugins.meta | 8 - Examples/Assets/Plugins/Demigiant.meta | 8 - .../Assets/Plugins/Demigiant/DOTween.meta | 8 - .../Plugins/Demigiant/DOTween/DOTween.XML | 2769 ----------------- .../Demigiant/DOTween/DOTween.XML.meta | 4 - .../Plugins/Demigiant/DOTween/DOTween.dll | Bin 162304 -> 0 bytes .../Plugins/Demigiant/DOTween/DOTween.dll.mdb | Bin 61741 -> 0 bytes .../Demigiant/DOTween/DOTween.dll.mdb.meta | 4 - .../Demigiant/DOTween/DOTween.dll.meta | 22 - .../Plugins/Demigiant/DOTween/Editor.meta | 5 - .../DOTween/Editor/DOTweenEditor.XML | 107 - .../DOTween/Editor/DOTweenEditor.XML.meta | 4 - .../DOTween/Editor/DOTweenEditor.dll | Bin 57344 -> 0 bytes .../DOTween/Editor/DOTweenEditor.dll.mdb | Bin 10121 -> 0 bytes .../DOTween/Editor/DOTweenEditor.dll.mdb.meta | 4 - .../DOTween/Editor/DOTweenEditor.dll.meta | 22 - .../Demigiant/DOTween/Editor/Imgs.meta | 5 - .../DOTween/Editor/Imgs/DOTweenIcon.png | Bin 1565 -> 0 bytes .../DOTween/Editor/Imgs/DOTweenIcon.png.meta | 47 - .../Demigiant/DOTween/Editor/Imgs/Footer.png | Bin 4409 -> 0 bytes .../DOTween/Editor/Imgs/Footer.png.meta | 47 - .../DOTween/Editor/Imgs/Footer_dark.png | Bin 4429 -> 0 bytes .../DOTween/Editor/Imgs/Footer_dark.png.meta | 47 - .../Demigiant/DOTween/Editor/Imgs/Header.jpg | Bin 22787 -> 0 bytes .../DOTween/Editor/Imgs/Header.jpg.meta | 47 - .../Plugins/Demigiant/DOTween/Modules.meta | 5 - .../DOTween/Modules/DOTween.Modules.asmdef | 3 - .../Modules/DOTween.Modules.asmdef.meta | 7 - .../DOTween/Modules/DOTweenModuleAudio.cs | 202 -- .../Modules/DOTweenModuleAudio.cs.meta | 8 - .../DOTween/Modules/DOTweenModulePhysics.cs | 216 -- .../Modules/DOTweenModulePhysics.cs.meta | 8 - .../DOTween/Modules/DOTweenModulePhysics2D.cs | 168 - .../Modules/DOTweenModulePhysics2D.cs.meta | 8 - .../DOTween/Modules/DOTweenModuleSprite.cs | 93 - .../Modules/DOTweenModuleSprite.cs.meta | 8 - .../DOTween/Modules/DOTweenModuleUI.cs | 634 ---- .../DOTween/Modules/DOTweenModuleUI.cs.meta | 8 - .../Modules/DOTweenModuleUnityVersion.cs | 403 --- .../Modules/DOTweenModuleUnityVersion.cs.meta | 8 - .../DOTween/Modules/DOTweenModuleUtils.cs | 155 - .../Modules/DOTweenModuleUtils.cs.meta | 8 - .../Plugins/Demigiant/DOTween/readme.txt | 29 - .../Plugins/Demigiant/DOTween/readme.txt.meta | 4 - Examples/Packages/manifest.json | 6 +- Examples/Packages/packages-lock.json | 7 + .../PackageManagerSettings.asset | 1 + 47 files changed, 12 insertions(+), 5135 deletions(-) delete mode 100644 Examples/Assets/Plugins.meta delete mode 100644 Examples/Assets/Plugins/Demigiant.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/DOTween.XML delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/DOTween.dll delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/DOTween.dll.mdb delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/DOTween.dll.mdb.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/DOTween.dll.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.mdb delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.mdb.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/Imgs.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/DOTweenIcon.png.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer.png.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Footer_dark.png.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Editor/Imgs/Header.jpg.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTween.Modules.asmdef delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTween.Modules.asmdef.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleAudio.cs.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics.cs.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModulePhysics2D.cs.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleSprite.cs.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUI.cs.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/Modules/DOTweenModuleUtils.cs.meta delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/readme.txt delete mode 100644 Examples/Assets/Plugins/Demigiant/DOTween/readme.txt.meta diff --git a/Examples/Assets/Plugins.meta b/Examples/Assets/Plugins.meta deleted file mode 100644 index 2ef9153..0000000 --- a/Examples/Assets/Plugins.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 23b6aca329d14a44caeaf7b4718be22a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/Assets/Plugins/Demigiant.meta b/Examples/Assets/Plugins/Demigiant.meta deleted file mode 100644 index 7ff3c27..0000000 --- a/Examples/Assets/Plugins/Demigiant.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8e5bda14619f4de4695b2fc1295622d9 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/Assets/Plugins/Demigiant/DOTween.meta b/Examples/Assets/Plugins/Demigiant/DOTween.meta deleted file mode 100644 index ef6995a..0000000 --- a/Examples/Assets/Plugins/Demigiant/DOTween.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7338446198fab1946800bfea0c898650 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Examples/Assets/Plugins/Demigiant/DOTween/DOTween.XML b/Examples/Assets/Plugins/Demigiant/DOTween/DOTween.XML deleted file mode 100644 index 11e9215..0000000 --- a/Examples/Assets/Plugins/Demigiant/DOTween/DOTween.XML +++ /dev/null @@ -1,2769 +0,0 @@ - - - - DOTween - - - - - Types of autoPlay behaviours - - - - No tween is automatically played - - - Only Sequences are automatically played - - - Only Tweeners are automatically played - - - All tweens are automatically played - - - - What axis to constrain in case of Vector tweens - - - - Called the first time the tween is set in a playing state, after any eventual delay - - - - Used in place of System.Func, which is not available in mscorlib. - - - - - Used in place of System.Action. - - - - - Public so it can be used by lose scripts related to DOTween (like DOTweenAnimation) - - - - - Used to separate DOTween class from the MonoBehaviour instance (in order to use static constructors on DOTween). - Contains all instance-based methods - - - - Used internally inside Unity Editor, as a trick to update DOTween's inspector at every frame - - - - Directly sets the current max capacity of Tweeners and Sequences - (meaning how many Tweeners and Sequences can be running at the same time), - so that DOTween doesn't need to automatically increase them in case the max is reached - (which might lead to hiccups when that happens). - Sequences capacity must be less or equal to Tweeners capacity - (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). - Beware: use this method only when there are no tweens running. - - Max Tweeners capacity. - Default: 200 - Max Sequences capacity. - Default: 50 - - - - This class contains a C# port of the easing equations created by Robert Penner (http://robertpenner.com/easing). - - - - - Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in: accelerating from zero velocity. - - - Current time (in frames or seconds). - - - Expected easing duration (in frames or seconds). - - Unused: here to keep same delegate for all ease types. - Unused: here to keep same delegate for all ease types. - - The eased value. - - - - - Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out: decelerating from zero velocity. - - - Current time (in frames or seconds). - - - Expected easing duration (in frames or seconds). - - Unused: here to keep same delegate for all ease types. - Unused: here to keep same delegate for all ease types. - - The eased value. - - - - - Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out: acceleration until halfway, then deceleration. - - - Current time (in frames or seconds). - - - Expected easing duration (in frames or seconds). - - Unused: here to keep same delegate for all ease types. - Unused: here to keep same delegate for all ease types. - - The eased value. - - - - - Returns a value between 0 and 1 (inclusive) based on the elapsed time and ease selected - - - - - Returns a value between 0 and 1 (inclusive) based on the elapsed time and ease selected - - - - - Used to interpret AnimationCurves as eases. - Public so it can be used by external ease factories - - - - - Behaviour in case a tween nested inside a Sequence fails - - - - If the Sequence contains other elements, kill the failed tween but preserve the rest - - - Kill the whole Sequence - - - - Additional notices passed to plugins when updating. - Public so it can be used by custom plugins. Internally, only PathPlugin uses it - - - - - None - - - - - Lets the plugin know that we restarted or rewinded - - - - - OnRewind callback behaviour (can only be set via DOTween's Utility Panel) - - - - - When calling Rewind or PlayBackwards/SmoothRewind, OnRewind callbacks will be fired only if the tween isn't already rewinded - - - - - When calling Rewind, OnRewind callbacks will always be fired, even if the tween is already rewinded. - When calling PlayBackwards/SmoothRewind instead, OnRewind callbacks will be fired only if the tween isn't already rewinded - - - - - When calling Rewind or PlayBackwards/SmoothRewind, OnRewind callbacks will always be fired, even if the tween is already rewinded - - - - - Public only so custom shortcuts can access some of these methods - - - - - INTERNAL: used by DO shortcuts and Modules to set special startup mode - - - - - INTERNAL: used by DO shortcuts and Modules to set the tween as blendable - - - - - INTERNAL: used by DO shortcuts and Modules to prevent a tween from using a From setup even if passed - - - - - Used to dispatch commands that need to be captured externally, usually by Modules - - - - - Returns a Vector3 with z = 0 - - - - - Returns the 2D angle between two vectors - - - - - Uses approximate equality on each axis instead of Unity's Vector3 equality, - because the latter fails (in some cases) when assigning a Vector3 to a transform.position and then checking it. - - - - - Looks for the type within all possible project assembly names - - - - NO-GC METHOD: changes the start value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new start value - If bigger than 0 applies it as the new tween duration - - - NO-GC METHOD: changes the end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new end value - If TRUE the start value will become the current target's value, otherwise it will stay the same - - - NO-GC METHOD: changes the end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new end value - If bigger than 0 applies it as the new tween duration - If TRUE the start value will become the current target's value, otherwise it will stay the same - - - NO-GC METHOD: changes the start and end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new start value - The new end value - If bigger than 0 applies it as the new tween duration - - - - Struct that stores two colors (used for LineRenderer tweens) - - - - - Used for tween callbacks - - - - - Used for tween callbacks - - - - - Used for custom and animationCurve-based ease functions. Must return a value between 0 and 1. - - - - - Straight Quaternion plugin. Instead of using Vector3 values accepts Quaternion values directly. - Beware: doesn't work with LoopType.Incremental (neither directly nor if inside a LoopType.Incremental Sequence). - To use it, call DOTween.To with the plugin parameter overload, passing it PureQuaternionPlugin.Plug() as first parameter - (do not use any of the other public PureQuaternionPlugin methods): - DOTween.To(PureQuaternionPlugin.Plug(), ()=> myQuaternionProperty, x=> myQuaternionProperty = x, myQuaternionEndValue, duration); - - - - - Plug this plugin inside a DOTween.To call. - Example: - DOTween.To(PureQuaternionPlugin.Plug(), ()=> myQuaternionProperty, x=> myQuaternionProperty = x, myQuaternionEndValue, duration); - - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - INTERNAL: do not use - - - - Main DOTween class. Contains static methods to create and control tweens in a generic way - - - - DOTween's version - - - If TRUE (default) makes tweens slightly slower but safer, automatically taking care of a series of things - (like targets becoming null while a tween is playing). - Default: TRUE - - - Behaviour in case a tween nested inside a Sequence fails (caught by safe mode). - Default: NestedTweenFailureBehaviour.TryToPreserveSequence - - - If TRUE you will get a DOTween report when exiting play mode (only in the Editor). - Useful to know how many max Tweeners and Sequences you reached and optimize your final project accordingly. - Beware, this will slightly slow down your tweens while inside Unity Editor. - Default: FALSE - - - Global DOTween timeScale. - Default: 1 - - - If TRUE, DOTween will use Time.smoothDeltaTime instead of Time.deltaTime for UpdateType.Normal and UpdateType.Late tweens - (unless they're set as timeScaleIndependent, in which case a value between the last timestep - and will be used instead). - Setting this to TRUE will lead to smoother animations. - Default: FALSE - - - If is TRUE, this indicates the max timeStep that an independent update call can last. - Setting this to TRUE will lead to smoother animations. - Default: FALSE - - - DOTween's log behaviour. - Default: LogBehaviour.ErrorsOnly - - - Used to intercept DOTween's logs. If this method isn't NULL, DOTween will call it before writing a log via Unity's own Debug log methods. - Return TRUE if you want DOTween to proceed with the log, FALSE otherwise. - This method must return a bool and accept two parameters: - - LogType: the type of Unity log that DOTween is trying to log - - object: the log message that DOTween wants to log - - - If TRUE draws path gizmos in Unity Editor (if the gizmos button is active). - Deactivate this if you want to avoid gizmos overhead while in Unity Editor - - - If TRUE activates various debug options - - - Stores the target id so it can be used to give more info in case of safeMode error capturing. - Only active if both debugMode and useSafeMode are TRUE - - - Default updateType for new tweens. - Default: UpdateType.Normal - - - Sets whether Unity's timeScale should be taken into account by default or not. - Default: false - - - Default autoPlay behaviour for new tweens. - Default: AutoPlay.All - - - Default autoKillOnComplete behaviour for new tweens. - Default: TRUE - - - Default loopType applied to all new tweens. - Default: LoopType.Restart - - - If TRUE all newly created tweens are set as recyclable, otherwise not. - Default: FALSE - - - Default ease applied to all new Tweeners (not to Sequences which always have Ease.Linear as default). - Default: Ease.InOutQuad - - - Default overshoot/amplitude used for eases - Default: 1.70158f - - - Default period used for eases - Default: 0 - - - Used internally. Assigned/removed by DOTweenComponent.Create/DestroyInstance - - - - Must be called once, before the first ever DOTween call/reference, - otherwise it will be called automatically and will use default options. - Calling it a second time won't have any effect. - You can chain SetCapacity to this method, to directly set the max starting size of Tweeners and Sequences: - DOTween.Init(false, false, LogBehaviour.Default).SetCapacity(100, 20); - - If TRUE all new tweens will be set for recycling, meaning that when killed, - instead of being destroyed, they will be put in a pool and reused instead of creating new tweens. This option allows you to avoid - GC allocations by reusing tweens, but you will have to take care of tween references, since they might result active - even if they were killed (since they might have been respawned and are now being used for other tweens). - If you want to automatically set your tween references to NULL when a tween is killed - you can use the OnKill callback like this: - .OnKill(()=> myTweenReference = null) - You can change this setting at any time by changing the static property, - or you can set the recycling behaviour for each tween separately, using: - SetRecyclable(bool recyclable) - Default: FALSE - If TRUE makes tweens slightly slower but safer, automatically taking care of a series of things - (like targets becoming null while a tween is playing). - You can change this setting at any time by changing the static property. - Default: FALSE - Type of logging to use. - You can change this setting at any time by changing the static property. - Default: ErrorsOnly - - - - Directly sets the current max capacity of Tweeners and Sequences - (meaning how many Tweeners and Sequences can be running at the same time), - so that DOTween doesn't need to automatically increase them in case the max is reached - (which might lead to hiccups when that happens). - Sequences capacity must be less or equal to Tweeners capacity - (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). - Beware: use this method only when there are no tweens running. - - Max Tweeners capacity. - Default: 200 - Max Sequences capacity. - Default: 50 - - - - Kills all tweens, clears all cached tween pools and plugins and resets the max Tweeners/Sequences capacities to the default values. - - If TRUE also destroys DOTween's gameObject and resets its initializiation, default settings and everything else - (so that next time you use it it will need to be re-initialized) - - - - Clears all cached tween pools. - - - - - Checks all active tweens to find and remove eventually invalid ones (usually because their targets became NULL) - and returns the total number of invalid tweens found and removed. - IMPORTANT: this will cause an error on UWP platform, so don't use it there - BEWARE: this is a slightly expensive operation so use it with care - - - - - Updates all tweens that are set to . - - Manual deltaTime - Unscaled delta time (used with tweens set as timeScaleIndependent) - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a property or field to the given value using a custom plugin - The plugin to use. Each custom plugin implements a static Get() method - you'll need to call to assign the correct plugin in the correct way, like this: - CustomPlugin.Get() - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens only one axis of a Vector3 to the given value using default plugins. - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - The axis to tween - - - Tweens only the alpha of a Color to the given value using default plugins - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end value to reachThe tween's duration - - - Tweens a virtual property from the given start to the given end value - and implements a setter that allows to use that value with an external method or a lambda - Example: - To(MyMethod, 0, 12, 0.5f); - Where MyMethod is a function that accepts a float parameter (which will be the result of the virtual tween) - The action to perform with the tweened value - The value to start from - The end value to reach - The duration of the virtual tween - - - - Punches a Vector3 towards the given direction and then back to the starting one - as if it was connected to the starting position via an elastic. - This tween type generates some GC allocations at startup - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The direction and strength of the punch - The duration of the tween - Indicates how much will the punch vibrate - Represents how much (0 to 1) the vector will go beyond the starting position when bouncing backwards. - 1 creates a full oscillation between the direction and the opposite decaying direction, - while 0 oscillates only between the starting position and the decaying direction - - - Shakes a Vector3 with the given values. - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - 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 and behave like a random punch. - If TRUE only shakes on the X Y axis (looks better with things like cameras). - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Shakes a Vector3 with the given values. - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - 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 and behave like a random punch. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Tweens a property or field to the given values using default plugins. - Ease is applied between each segment and not as a whole. - This tween type generates some GC allocations at startup - A getter for the field or property to tween. - Example usage with lambda:()=> myProperty - A setter for the field or property to tween - Example usage with lambda:x=> myProperty = x - The end values to reach for each segment. This array must have the same length as durations - The duration of each segment. This array must have the same length as endValues - - - - Returns a new to be used for tween groups - - - - Completes all tweens and returns the number of actual tweens completed - (meaning tweens that don't have infinite loops and were not already complete) - For Sequences only: if TRUE also internal Sequence callbacks will be fired, - otherwise they will be ignored - - - Completes all tweens with the given ID or target and returns the number of actual tweens completed - (meaning the tweens that don't have infinite loops and were not already complete) - For Sequences only: if TRUE internal Sequence callbacks will be fired, - otherwise they will be ignored - - - Flips all tweens (changing their direction to forward if it was backwards and viceversa), - then returns the number of actual tweens flipped - - - Flips the tweens with the given ID or target (changing their direction to forward if it was backwards and viceversa), - then returns the number of actual tweens flipped - - - Sends all tweens to the given position (calculating also eventual loop cycles) and returns the actual tweens involved - - - Sends all tweens with the given ID or target to the given position (calculating also eventual loop cycles) - and returns the actual tweens involved - - - Kills all tweens and returns the number of actual tweens killed - If TRUE completes the tweens before killing them - - - Kills all tweens and returns the number of actual tweens killed - If TRUE completes the tweens before killing them - Eventual IDs or targets to exclude from the killing - - - Kills all tweens with the given ID or target and returns the number of actual tweens killed - If TRUE completes the tweens before killing them - - - Pauses all tweens and returns the number of actual tweens paused - - - Pauses all tweens with the given ID or target and returns the number of actual tweens paused - (meaning the tweens that were actually playing and have been paused) - - - Plays all tweens and returns the number of actual tweens played - (meaning tweens that were not already playing or complete) - - - Plays all tweens with the given ID or target and returns the number of actual tweens played - (meaning the tweens that were not already playing or complete) - - - Plays all tweens with the given target and the given ID, and returns the number of actual tweens played - (meaning the tweens that were not already playing or complete) - - - Plays backwards all tweens and returns the number of actual tweens played - (meaning tweens that were not already started, playing backwards or rewinded) - - - Plays backwards all tweens with the given ID or target and returns the number of actual tweens played - (meaning the tweens that were not already started, playing backwards or rewinded) - - - Plays backwards all tweens with the given target and ID and returns the number of actual tweens played - (meaning the tweens that were not already started, playing backwards or rewinded) - - - Plays forward all tweens and returns the number of actual tweens played - (meaning tweens that were not already playing forward or complete) - - - Plays forward all tweens with the given ID or target and returns the number of actual tweens played - (meaning the tweens that were not already playing forward or complete) - - - Plays forward all tweens with the given target and ID and returns the number of actual tweens played - (meaning the tweens that were not already started, playing backwards or rewinded) - - - Restarts all tweens, then returns the number of actual tweens restarted - - - Restarts all tweens with the given ID or target, then returns the number of actual tweens restarted - If TRUE includes the eventual tweens delays, otherwise skips them - If >= 0 changes the startup delay of all involved tweens to this value, otherwise doesn't touch it - - - Restarts all tweens with the given target and the given ID, and returns the number of actual tweens played - (meaning the tweens that were not already playing or complete) - If TRUE includes the eventual tweens delays, otherwise skips them - If >= 0 changes the startup delay of all involved tweens to this value, otherwise doesn't touch it - - - Rewinds and pauses all tweens, then returns the number of actual tweens rewinded - (meaning tweens that were not already rewinded) - - - Rewinds and pauses all tweens with the given ID or target, then returns the number of actual tweens rewinded - (meaning the tweens that were not already rewinded) - - - Smoothly rewinds all tweens (delays excluded), then returns the number of actual tweens rewinding/rewinded - (meaning tweens that were not already rewinded). - A "smooth rewind" animates the tween to its start position, - skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. - Note that a tween that was smoothly rewinded will have its play direction flipped - - - Smoothly rewinds all tweens (delays excluded) with the given ID or target, then returns the number of actual tweens rewinding/rewinded - (meaning the tweens that were not already rewinded). - A "smooth rewind" animates the tween to its start position, - skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. - Note that a tween that was smoothly rewinded will have its play direction flipped - - - Toggles the play state of all tweens and returns the number of actual tweens toggled - (meaning tweens that could be played or paused, depending on the toggle state) - - - Toggles the play state of all tweens with the given ID or target and returns the number of actual tweens toggled - (meaning the tweens that could be played or paused, depending on the toggle state) - - - - Returns TRUE if a tween with the given ID or target is active. - You can also use this to know if a shortcut tween is active for a given target. - Example: - transform.DOMoveX(45, 1); // transform is automatically added as the tween target - DOTween.IsTweening(transform); // Returns true - - The target or ID to look for - If FALSE (default) returns TRUE as long as a tween for the given target/ID is active, - otherwise also requires it to be playing - - - - Returns the total number of active and playing tweens. - A tween is considered as playing even if its delay is actually playing - - - - - Returns a list of all active tweens in a playing state. - Returns NULL if there are no active playing tweens. - Beware: each time you call this method a new list is generated, so use it for debug only - - If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) - - - - Returns a list of all active tweens in a paused state. - Returns NULL if there are no active paused tweens. - Beware: each time you call this method a new list is generated, so use it for debug only - - If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) - - - - Returns a list of all active tweens with the given id. - Returns NULL if there are no active tweens with the given id. - Beware: each time you call this method a new list is generated - - If TRUE returns only the tweens with the given ID that are currently playing - If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) - - - - Returns a list of all active tweens with the given target. - Returns NULL if there are no active tweens with the given target. - Beware: each time you call this method a new list is generated - If TRUE returns only the tweens with the given target that are currently playing - If NULL creates a new list, otherwise clears and fills this one (and thus saves allocations) - - - - - Creates virtual tweens that can be used to change other elements via their OnUpdate calls - - - - - Tweens a virtual float. - You can add regular settings to the generated tween, - but do not use SetUpdate or you will overwrite the onVirtualUpdate parameter - - The value to start from - The value to tween to - The duration of the tween - A callback which must accept a parameter of type float, called at each update - - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The type of ease - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The type of ease - Eventual overshoot to use with Back ease - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The type of ease - Eventual amplitude to use with Elastic easeType - Eventual period to use with Elastic easeType - - - Returns a value based on the given ease and lifetime percentage (0 to 1) - The value to start from when lifetimePercentage is 0 - The value to reach when lifetimePercentage is 1 - The time percentage (0 to 1) at which the value should be taken - The AnimationCurve to use for ease - - - Fires the given callback after the given time. - Callback delay - Callback to fire when the delay has expired - If TRUE (default) ignores Unity's timeScale - - - - Don't assign this! It's assigned automatically when creating 0 duration tweens - - - - - Don't assign this! It's assigned automatically when setting the ease to an AnimationCurve or to a custom ease function - - - - - Allows to wrap ease method in special ways, adding extra features - - - - - Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS - - FPS at which the tween should be played - Ease type - - - - Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS - - FPS at which the tween should be played - AnimationCurve to use for the ease - - - - Converts the given ease so that it also creates a stop-motion effect, by playing the tween at the given FPS - - FPS at which the tween should be played - Custom ease function to use - - - - Used to allow method chaining with DOTween.Init - - - - - Directly sets the current max capacity of Tweeners and Sequences - (meaning how many Tweeners and Sequences can be running at the same time), - so that DOTween doesn't need to automatically increase them in case the max is reached - (which might lead to hiccups when that happens). - Sequences capacity must be less or equal to Tweeners capacity - (if you pass a low Tweener capacity it will be automatically increased to match the Sequence's). - Beware: use this method only when there are no tweens running. - - Max Tweeners capacity. - Default: 200 - Max Sequences capacity. - Default: 50 - - - - Behaviour that can be assigned when chaining a SetLink to a tween - - - - Pauses the tween when the link target is disabled - - - Pauses the tween when the link target is disabled, plays it when it's enabled - - - Pauses the tween when the link target is disabled, restarts it when it's enabled - - - Plays the tween when the link target is enabled - - - Restarts the tween when the link target is enabled - - - Kills the tween when the link target is disabled - - - Kills the tween when the link target is destroyed (becomes NULL). This is always active even if another behaviour is chosen - - - Completes the tween when the link target is disabled - - - Completes and kills the tween when the link target is disabled - - - Rewinds the tween (delay excluded) when the link target is disabled - - - Rewinds and kills the tween when the link target is disabled - - - - Path mode (used to determine correct LookAt orientation) - - - - Ignores the path mode (and thus LookAt behaviour) - - - Regular 3D path - - - 2D top-down path - - - 2D side-scroller path - - - - Type of path to use with DOPath tweens - - - - Linear, composed of straight segments between each waypoint - - - Curved path (which uses Catmull-Rom curves) - - - EXPERIMENTAL: Curved path (which uses Cubic Bezier curves, where each point requires two extra control points) - - - - Path control point - - - - - Path waypoints (modified by PathPlugin when setting relative end/change value or by CubicBezierDecoder) and by DOTweenPathInspector - - - - - Gets the point on the path at the given percentage (0 to 1) - - The percentage (0 to 1) at which to get the point - If TRUE constant speed is taken into account, otherwise not - - - - Base interface for all tween plugins options - - - - Resets the plugin - - - - This plugin generates some GC allocations at startup - - - - - Path plugin works exclusively with Transforms - - - - - Rotation mode used with DORotate methods - - - - - Fastest way that never rotates beyond 360° - - - - - Fastest way that rotates beyond 360° - - - - - Adds the given rotation to the transform using world axis and an advanced precision mode - (like when using transform.Rotate(Space.World)). - In this mode the end value is is always considered relative - - - - - Adds the given rotation to the transform's local axis - (like when rotating an object with the "local" switch enabled in Unity's editor or using transform.Rotate(Space.Self)). - In this mode the end value is is always considered relative - - - - - Type of scramble to apply to string tweens - - - - - No scrambling of characters - - - - - A-Z + a-z + 0-9 characters - - - - - A-Z characters - - - - - a-z characters - - - - - 0-9 characters - - - - - Custom characters - - - - - Methods that extend Tween objects and allow to control or get data from them - - - - Completes the tween - - - Completes the tween - For Sequences only: if TRUE also internal Sequence callbacks will be fired, - otherwise they will be ignored - - - Flips the direction of this tween (backwards if it was going forward or viceversa) - - - Forces the tween to initialize its settings immediately - - - Send the tween to the given position in time - Time position to reach - (if higher than the whole tween duration the tween will simply reach its end) - If TRUE will play the tween after reaching the given position, otherwise it will pause it - - - Kills the tween - If TRUE completes the tween before killing it - - - Pauses the tween - - - Plays the tween - - - Sets the tween in a backwards direction and plays it - - - Sets the tween in a forward direction and plays it - - - Restarts the tween from the beginning - Ignored in case of Sequences. If TRUE includes the eventual tween delay, otherwise skips it - Ignored in case of Sequences. If >= 0 changes the startup delay to this value, otherwise doesn't touch it - - - Rewinds and pauses the tween - Ignored in case of Sequences. If TRUE includes the eventual tween delay, otherwise skips it - - - Smoothly rewinds the tween (delays excluded). - A "smooth rewind" animates the tween to its start position, - skipping all elapsed loops (except in case of LoopType.Incremental) while keeping the animation fluent. - If called on a tween who is still waiting for its delay to happen, it will simply set the delay to 0 and pause the tween. - Note that a tween that was smoothly rewinded will have its play direction flipped - - - Plays the tween if it was paused, pauses it if it was playing - - - Send a path tween to the given waypoint. - Has no effect if this is not a path tween. - BEWARE, this is a special utility method: - it works only with Linear eases. Also, the lookAt direction might be wrong after calling this and might need to be set manually - (because it relies on a smooth path movement and doesn't work well with jumps that encompass dramatic direction changes) - Waypoint index to reach - (if higher than the max waypoint index the tween will simply go to the last one) - If TRUE will play the tween after reaching the given waypoint, otherwise it will pause it - - - - Creates a yield instruction that waits until the tween is killed or complete. - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForCompletion(); - - - - - Creates a yield instruction that waits until the tween is killed or rewinded. - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForRewind(); - - - - - Creates a yield instruction that waits until the tween is killed. - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForKill(); - - - - - Creates a yield instruction 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. - Example usage:yield return myTween.WaitForElapsedLoops(2); - - Elapsed loops to wait for - - - - Creates a yield instruction that waits until the tween is killed or has reached the given position (loops included, delays excluded). - It can be used inside a coroutine as a yield. - Example usage:yield return myTween.WaitForPosition(2.5f); - - Position (loops included, delays excluded) to wait for - - - - Creates a yield instruction 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. - Example usage:yield return myTween.WaitForStart(); - - - - Returns the total number of loops completed by this tween - - - Returns the eventual delay set for this tween - - - Returns the eventual elapsed delay set for this tween - - - Returns the duration of this tween (delays excluded). - NOTE: when using settings like SpeedBased, the duration will be recalculated when the tween starts - If TRUE returns the full duration loops included, - otherwise the duration of a single loop cycle - - - Returns the elapsed time for this tween (delays exluded) - If TRUE returns the elapsed time since startup loops included, - otherwise the elapsed time within the current loop cycle - - - Returns the elapsed percentage (0 to 1) of this tween (delays exluded) - If TRUE returns the elapsed percentage since startup loops included, - otherwise the elapsed percentage within the current loop cycle - - - Returns the elapsed percentage (0 to 1) of this tween (delays exluded), - based on a single loop, and calculating eventual backwards Yoyo loops as 1 to 0 instead of 0 to 1 - - - Returns FALSE if this tween has been killed or is NULL, TRUE otherwise. - BEWARE: if this tween is recyclable it might have been spawned again for another use and thus return TRUE anyway. - When working with recyclable tweens you should take care to know when a tween has been killed and manually set your references to NULL. - If you want to be sure your references are set to NULL when a tween is killed you can use the OnKill callback like this: - .OnKill(()=> myTweenReference = null) - - - Returns TRUE if this tween was reversed and is set to go backwards - - - Returns TRUE if the tween is complete - (silently fails and returns FALSE if the tween has been killed) - - - Returns TRUE if this tween has been initialized - - - Returns TRUE if this tween is playing - - - Returns the total number of loops set for this tween - (returns -1 if the loops are infinite) - - - - Returns a point on a path based on the given path percentage. - Returns Vector3.zero if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. - A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). - You can force a path to be initialized by calling myTween.ForceInit(). - - Percentage of the path (0 to 1) on which to get the point - - - - Returns an array of points that can be used to draw the path. - Note that this method generates allocations, because it creates a new array. - Returns NULL if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. - A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). - You can force a path to be initialized by calling myTween.ForceInit(). - - How many points to create for each path segment (waypoint to waypoint). - Only used in case of non-Linear paths - - - - Returns the length of a path. - Returns -1 if this is not a path tween, if the tween is invalid, or if the path is not yet initialized. - A path is initialized after its tween starts, or immediately if the tween was created with the Path Editor (DOTween Pro feature). - You can force a path to be initialized by calling myTween.ForceInit(). - - - - - Types of loop - - - - Each loop cycle restarts from the beginning - - - The tween moves forward and backwards at alternate cycles - - - Continuously increments the tween at the end of each loop cycle (A to B, B to B+(A-B), and so on), thus always moving "onward". - In case of String tweens works only if the tween is set as relative - - - - Controls other tweens as a group - - - - - Methods that extend known Unity objects and allow to directly create and control tweens from their instances - - - - Tweens a Camera's aspect to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's backgroundColor to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's farClipPlane to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's fieldOfView to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's nearClipPlane to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's orthographicSize to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's pixelRect to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Camera's rect to the given value. - Also stores the camera as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Shakes a Camera's localPosition along its relative X Y axes with the given values. - Also stores the camera as the tween's target so it can be used for filtered operations - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - 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. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Shakes a Camera's localPosition along its relative X Y axes with the given values. - Also stores the camera as the tween's target so it can be used for filtered operations - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - 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. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Shakes a Camera's localRotation. - Also stores the camera as the tween's target so it can be used for filtered operations - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - 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. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Shakes a Camera's localRotation. - Also stores the camera as the tween's target so it can be used for filtered operations - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - 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. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Tweens a Light's color to the given value. - Also stores the light as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Light's intensity to the given value. - Also stores the light as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Light's shadowStrength to the given value. - Also stores the light as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a LineRenderer's color to the given value. - Also stores the LineRenderer as the tween's target so it can be used for filtered operations. - Note that this method requires to also insert the start colors for the tween, - since LineRenderers have no way to get them. - The start value to tween from - The end value to reachThe duration of the tween - - - Tweens a Material's color to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Material's named color property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween (like _Tint or _SpecColor) - The duration of the tween - - - Tweens a Material's named color 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 - The end value to reach - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a Material's alpha color to the given value - (will have no effect unless your material supports transparency). - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Material's alpha color to the given value - (will have no effect unless your material supports transparency). - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween (like _Tint or _SpecColor) - The duration of the tween - - - Tweens a Material's alpha color with the given ID to the given value - (will have no effect unless your material supports transparency). - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a Material's named float property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween - The duration of the tween - - - Tweens a Material's named float 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 - The end value to reach - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a Material's texture offset to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The duration of the tween - - - Tweens a Material's named texture offset property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween - The duration of the tween - - - Tweens a Material's texture scale to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The duration of the tween - - - Tweens a Material's named texture scale property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween - The duration of the tween - - - Tweens a Material's named Vector property to the given value. - Also stores the material as the tween's target so it can be used for filtered operations - The end value to reach - The name of the material property to tween - The duration of the tween - - - Tweens a Material's named Vector 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 - The end value to reach - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a TrailRenderer's startWidth/endWidth to the given value. - Also stores the TrailRenderer as the tween's target so it can be used for filtered operations - The end startWidth to reachThe end endWidth to reach - The duration of the tween - - - Tweens a TrailRenderer's time to the given value. - Also stores the TrailRenderer as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's position to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's X position to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's Y position to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's Z position to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's localPosition to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's X localPosition to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's Y localPosition to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's Z localPosition to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's rotation to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - Rotation mode - - - Tweens a Transform's rotation to the given value using pure quaternion values. - Also stores the transform as the tween's target so it can be used for filtered operations. - PLEASE NOTE: DORotate, which takes Vector3 values, is the preferred rotation method. - This method was implemented for very special cases, and doesn't support LoopType.Incremental loops - (neither for itself nor if placed inside a LoopType.Incremental Sequence) - - The end value to reachThe duration of the tween - - - Tweens a Transform's localRotation to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - Rotation mode - - - Tweens a Transform's rotation to the given value using pure quaternion values. - Also stores the transform as the tween's target so it can be used for filtered operations. - PLEASE NOTE: DOLocalRotate, which takes Vector3 values, is the preferred rotation method. - This method was implemented for very special cases, and doesn't support LoopType.Incremental loops - (neither for itself nor if placed inside a LoopType.Incremental Sequence) - - The end value to reachThe duration of the tween - - - Tweens a Transform's localScale to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's localScale uniformly to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's X localScale to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's Y localScale to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's Z localScale to the given value. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Transform's rotation so that it will look towards the given position. - Also stores the transform as the tween's target so it can be used for filtered operations - The position to look atThe duration of the tween - Eventual axis constraint for the rotation - The vector that defines in which direction up is (default: Vector3.up) - - - Punches a Transform's localPosition towards the given direction and then back to the starting one - as if it was connected to the starting position via an elastic. - The direction and strength of the punch (added to the Transform's current position) - The duration of the tween - Indicates how much will the punch vibrate - 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 - If TRUE the tween will smoothly snap all values to integers - - - Punches a Transform's localScale towards the given size and then back to the starting one - as if it was connected to the starting scale via an elastic. - The punch strength (added to the Transform's current scale) - The duration of the tween - Indicates how much will the punch vibrate - Represents how much (0 to 1) the vector will go beyond the starting size when bouncing backwards. - 1 creates a full oscillation between the punch scale and the opposite scale, - while 0 oscillates only between the punch scale and the start scale - - - Punches a Transform's localRotation towards the given size and then back to the starting one - as if it was connected to the starting rotation via an elastic. - The punch strength (added to the Transform's current rotation) - The duration of the tween - Indicates how much will the punch vibrate - Represents how much (0 to 1) the vector will go beyond the starting rotation when bouncing backwards. - 1 creates a full oscillation between the punch rotation and the opposite rotation, - while 0 oscillates only between the punch and the start rotation - - - Shakes a Transform's localPosition with the given values. - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - 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. - If TRUE the tween will smoothly snap all values to integers - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Shakes a Transform's localPosition with the given values. - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - 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. - If TRUE the tween will smoothly snap all values to integers - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Shakes a Transform's localRotation. - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - 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. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Shakes a Transform's localRotation. - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - 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. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Shakes a Transform's localScale. - The duration of the tween - The shake strength - Indicates how much will the shake vibrate - 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. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Shakes a Transform's localScale. - The duration of the tween - The shake strength on each axis - Indicates how much will the shake vibrate - 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. - If TRUE the shake will automatically fadeOut smoothly within the tween's duration, otherwise it will not - - - Tweens a Transform'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 transform as the tween's target so it can be used for filtered operations - The end value to reach - Power of the jump (the max height of the jump is represented by this plus the final Y offset) - Total number of jumps - The duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's localPosition to the given value, while also applying a jump effect along the Y axis. - Returns a Sequence instead of a Tweener. - Also stores the transform as the tween's target so it can be used for filtered operations - The end value to reach - Power of the jump (the max height of the jump is represented by this plus the final Y offset) - Total number of jumps - The duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's position through the given path waypoints, using the chosen path algorithm. - Also stores the transform as the tween's target so it can be used for filtered operations - The waypoints to go through - The duration of the tween - The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) - The path mode: 3D, side-scroller 2D, top-down 2D - 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 - The color of the path (shown when gizmos are active in the Play panel and the tween is running) - - - Tweens a Transform's localPosition through the given path waypoints, using the chosen path algorithm. - Also stores the transform as the tween's target so it can be used for filtered operations - The waypoint to go through - The duration of the tween - The type of path: Linear (straight path), CatmullRom (curved CatmullRom path) or CubicBezier (curved with control points) - The path mode: 3D, side-scroller 2D, top-down 2D - 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 - The color of the path (shown when gizmos are active in the Play panel and the tween is running) - - - IMPORTANT: Unless you really know what you're doing, you should use the overload that accepts a Vector3 array instead. - Tweens a Transform's position via the given path. - Also stores the transform as the tween's target so it can be used for filtered operations - The path to use - The duration of the tween - The path mode: 3D, side-scroller 2D, top-down 2D - - - IMPORTANT: Unless you really know what you're doing, you should use the overload that accepts a Vector3 array instead. - Tweens a Transform's localPosition via the given path. - Also stores the transform as the tween's target so it can be used for filtered operations - The path to use - The duration of the tween - The path mode: 3D, side-scroller 2D, top-down 2D - - - Tweens a Tween's timeScale to the given value. - Also stores the Tween as the tween's target so it can be used for filtered operations - The end value to reachThe duration of the tween - - - Tweens a Light'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 Light as the tween's target so it can be used for filtered operations - The value to tween toThe duration of the tween - - - Tweens a Material'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 Material as the tween's target so it can be used for filtered operations - The value to tween toThe duration of the tween - - - Tweens a Material's named color property 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 Material as the tween's target so it can be used for filtered operations - The value to tween to - The name of the material property to tween (like _Tint or _SpecColor) - The duration of the tween - - - Tweens a Material's named color property with the given ID 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 Material as the tween's target so it can be used for filtered operations - The value to tween to - The ID of the material property to tween (also called nameID in Unity's manual) - The duration of the tween - - - Tweens a Transform's position BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableMove tweens to work together on the same target, - instead than fight each other as multiple DOMove would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - Tweens a Transform's localPosition BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableMove tweens to work together on the same target, - instead than fight each other as multiple DOMove would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - If TRUE the tween will smoothly snap all values to integers - - - EXPERIMENTAL METHOD - Tweens a Transform's rotation BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableRotate tweens to work together on the same target, - instead than fight each other as multiple DORotate would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - Rotation mode - - - EXPERIMENTAL METHOD - Tweens a Transform's lcoalRotation BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableRotate tweens to work together on the same target, - instead than fight each other as multiple DORotate would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - Rotation mode - - - Punches a Transform's localRotation BY the given value and then back to the starting one - as if it was connected to the starting rotation via an elastic. Does it in a way that allows other - DOBlendableRotate tweens to work together on the same target - The punch strength (added to the Transform's current rotation) - The duration of the tween - Indicates how much will the punch vibrate - Represents how much (0 to 1) the vector will go beyond the starting rotation when bouncing backwards. - 1 creates a full oscillation between the punch rotation and the opposite rotation, - while 0 oscillates only between the punch and the start rotation - - - Tweens a Transform's localScale BY the given value (as if you chained a SetRelative), - in a way that allows other DOBlendableScale tweens to work together on the same target, - instead than fight each other as multiple DOScale would do. - Also stores the transform as the tween's target so it can be used for filtered operations - The value to tween byThe duration of the tween - - - - 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) - - For Sequences only: if TRUE also internal Sequence callbacks will be fired, - otherwise they will be ignored - - - - 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) - - For Sequences only: if TRUE also internal Sequence callbacks will be fired, - otherwise they will be ignored - - - - 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. - - If TRUE completes the tween before killing it - - - - 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. - - If TRUE completes the tween before killing it - - - - 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. - - - - - 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. - - - - - 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. - - Time position to reach - (if higher than the whole tween duration the tween will simply reach its end) - If TRUE will play the tween after reaching the given position, otherwise it will pause it - - - - 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. - - Time position to reach - (if higher than the whole tween duration the tween will simply reach its end) - If TRUE will play the tween after reaching the given position, otherwise it will pause it - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - 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. - - - - - This class serves only as a utility class to store tween settings to apply on multiple tweens. - It is in no way needed otherwise, since you can directly apply tween settings to a tween via chaining - - - - A variable you can eventually Clear and reuse when needed, - to avoid instantiating TweenParams objects - - - Creates a new TweenParams object, which you can use to store tween settings - to pass to multiple tweens via myTween.SetAs(myTweenParms) - - - Clears and resets this TweenParams instance using default values, - so it can be reused without instantiating another one - - - Sets the autoKill behaviour of the tween. - Has no effect if the tween has already started - If TRUE the tween will be automatically killed when complete - - - Sets an ID for the tween, which can then be used as a filter with DOTween's static methods. - The ID to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets the target for the tween, which can then be used as a filter with DOTween's static methods. - IMPORTANT: use it with caution. If you just want to set an ID for the tween use SetId instead. - When using shorcuts the shortcut target is already assigned as the tween's target, - so using this method will overwrite it and prevent shortcut-operations like myTarget.DOPause from working correctly. - The target to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets the looping options for the tween. - Has no effect if the tween has already started - Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) - Loop behaviour type (default: LoopType.Restart) - - - Sets the ease of the tween. - If applied to Sequences eases the whole sequence animation - Eventual overshoot or amplitude to use with Back or Elastic easeType (default is 1.70158) - Eventual period to use with Elastic easeType (default is 0) - - - Sets the ease of the tween using an AnimationCurve. - If applied to Sequences eases the whole sequence animation - - - Sets the ease of the tween using a custom ease function. - If applied to Sequences eases the whole sequence animation - - - Sets the recycling behaviour for the tween. - If TRUE the tween will be recycled after being killed, otherwise it will be destroyed. - - - Sets the update type to the one defined in DOTween.defaultUpdateType (UpdateType.Normal unless changed) - and lets you choose if it should be independent from Unity's Time.timeScale - If TRUE the tween will ignore Unity's Time.timeScale - - - Sets the type of update (default or independent) for the tween - The type of update (default: UpdateType.Normal) - If TRUE the tween will ignore Unity's Time.timeScale - - - Sets the onStart callback for the tween. - Called the first time the tween is set in a playing state, after any eventual delay - - - Sets the onPlay callback for the tween. - Called when the tween is set in a playing state, after any eventual delay. - Also called each time the tween resumes playing from a paused state - - - Sets the onRewind callback for the tween. - Called when the tween is rewinded, - either by calling Rewind or by reaching the start position while playing backwards. - Rewinding a tween that is already rewinded will not fire this callback - - - Sets the onUpdate callback for the tween. - Called each time the tween updates - - - Sets the onStepComplete callback for the tween. - Called the moment the tween completes one loop cycle, even when going backwards - - - Sets the onComplete callback for the tween. - Called the moment the tween reaches its final forward position, loops included - - - Sets the onKill callback for the tween. - Called the moment the tween is killed - - - Sets the onWaypointChange callback for the tween. - Called when a path tween reaches a new waypoint - - - Sets a delayed startup for the tween. - Has no effect on Sequences or if the tween has already started - - - If isRelative is TRUE sets the tween as relative - (the endValue will be calculated as startValue + endValue instead than being used directly). - Has no effect on Sequences or if the tween has already started - - - If isSpeedBased is TRUE sets the tween as speed based - (the duration will represent the number of units the tween moves x second). - Has no effect on Sequences, nested tweens, or if the tween has already started - - - - Methods that extend Tween objects and allow to set their parameters - - - - Sets the autoKill behaviour of the tween to TRUE. - Has no effect if the tween has already started or if it's added to a Sequence - - - Sets the autoKill behaviour of the tween. - Has no effect if the tween has already started or if it's added to a Sequence - If TRUE the tween will be automatically killed when complete - - - Sets an ID for the tween (), which can then be used as a filter with DOTween's static methods. - The ID to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets a string ID for the tween (), which can then be used as a filter with DOTween's static methods. - Filtering via string is 2X faster than using an object as an ID (using the alternate obejct overload) - The string ID to assign to this tween. - - - Sets an int ID for the tween (), which can then be used as a filter with DOTween's static methods. - Filtering via int is 4X faster than via object, 2X faster than via string (using the alternate object/string overloads) - The int ID to assign to this tween. - - - Allows to link this tween to a GameObject - so that it will be automatically killed when the GameObject is destroyed. - Has no effect if the tween is added to a Sequence - The link target (unrelated to the target set via SetTarget) - - - Allows to link this tween to a GameObject and assign a behaviour depending on it. - This will also automatically kill the tween when the GameObject is destroyed. - Has no effect if the tween is added to a Sequence - The link target (unrelated to the target set via SetTarget) - The behaviour to use ( is always evaluated even if you choose another one) - - - Sets the target for the tween, which can then be used as a filter with DOTween's static methods. - IMPORTANT: use it with caution. If you just want to set an ID for the tween use SetId instead. - When using shorcuts the shortcut target is already assigned as the tween's target, - so using this method will overwrite it and prevent shortcut-operations like myTarget.DOPause from working correctly. - The target to assign to this tween. Can be an int, a string, an object or anything else. - - - Sets the looping options for the tween. - Has no effect if the tween has already started - Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) - - - Sets the looping options for the tween. - Has no effect if the tween has already started - Number of cycles to play (-1 for infinite - will be converted to 1 in case the tween is nested in a Sequence) - Loop behaviour type (default: LoopType.Restart) - - - Sets the ease of the tween. - If applied to Sequences eases the whole sequence animation - - - Sets the ease of the tween. - If applied to Sequences eases the whole sequence animation - - Eventual overshoot to use with Back or Flash ease (default is 1.70158 - 1 for Flash). - In case of Flash ease it must be an intenger and sets the total number of flashes that will happen. - Using an even number will complete the tween on the starting value, while an odd one will complete it on the end value. - - - - Sets the ease of the tween. - If applied to Sequences eases the whole sequence animation - Eventual amplitude to use with Elastic easeType or overshoot to use with Flash easeType (default is 1.70158 - 1 for Flash). - In case of Flash ease it must be an integer and sets the total number of flashes that will happen. - Using an even number will complete the tween on the starting value, while an odd one will complete it on the end value. - - Eventual period to use with Elastic or Flash easeType (default is 0). - In case of Flash ease it indicates the power in time of the ease, and must be between -1 and 1. - 0 is balanced, 1 weakens the ease with time, -1 starts the ease weakened and gives it power towards the end. - - - - Sets the ease of the tween using an AnimationCurve. - If applied to Sequences eases the whole sequence animation - - - Sets the ease of the tween using a custom ease function (which must return a value between 0 and 1). - If applied to Sequences eases the whole sequence animation - - - Allows the tween to be recycled after being killed. - - - Sets the recycling behaviour for the tween. - If TRUE the tween will be recycled after being killed, otherwise it will be destroyed. - - - Sets the update type to UpdateType.Normal and lets you choose if it should be independent from Unity's Time.timeScale - If TRUE the tween will ignore Unity's Time.timeScale - - - Sets the type of update for the tween - The type of update (defalt: UpdateType.Normal) - - - Sets the type of update for the tween and lets you choose if it should be independent from Unity's Time.timeScale - The type of update - If TRUE the tween will ignore Unity's Time.timeScale - - - Sets the onStart callback for the tween, clearing any previous onStart callback that was set. - Called the first time the tween is set in a playing state, after any eventual delay - - - Sets the onPlay callback for the tween, clearing any previous onPlay callback that was set. - Called when the tween is set in a playing state, after any eventual delay. - Also called each time the tween resumes playing from a paused state - - - Sets the onPause callback for the tween, clearing any previous onPause callback that was set. - Called when the tween state changes from playing to paused. - If the tween has autoKill set to FALSE, this is called also when the tween reaches completion. - - - Sets the onRewind callback for the tween, clearing any previous onRewind callback that was set. - Called when the tween is rewinded, - either by calling Rewind or by reaching the start position while playing backwards. - Rewinding a tween that is already rewinded will not fire this callback - - - Sets the onUpdate callback for the tween, clearing any previous onUpdate callback that was set. - Called each time the tween updates - - - Sets the onStepComplete callback for the tween, clearing any previous onStepComplete callback that was set. - Called the moment the tween completes one loop cycle, even when going backwards - - - Sets the onComplete callback for the tween, clearing any previous onComplete callback that was set. - Called the moment the tween reaches its final forward position, loops included - - - Sets the onKill callback for the tween, clearing any previous onKill callback that was set. - Called the moment the tween is killed - - - Sets the onWaypointChange callback for the tween, clearing any previous onWaypointChange callback that was set. - Called when a path tween's current waypoint changes - - - Sets the parameters of the tween (id, ease, loops, delay, timeScale, callbacks, etc) as the parameters of the given one. - Doesn't copy specific SetOptions settings: those will need to be applied manually each time. - Has no effect if the tween has already started. - NOTE: the tween's target will not be changed - Tween from which to copy the parameters - - - Sets the parameters of the tween (id, ease, loops, delay, timeScale, callbacks, etc) as the parameters of the given TweenParams. - Has no effect if the tween has already started. - TweenParams from which to copy the parameters - - - Adds the given tween to the end of the Sequence. - Has no effect if the Sequence has already started - The tween to append - - - Adds the given tween to the beginning of the Sequence, pushing forward the other nested content. - Has no effect if the Sequence has already started - The tween to prepend - - - Inserts the given tween at the same time position of the last tween, callback or intervale added to the Sequence. - Note that, in case of a Join after an interval, the insertion time will be the time where the interval starts, not where it finishes. - Has no effect if the Sequence has already started - - - Inserts the given tween at the given time position in the Sequence, - automatically adding an interval if needed. - Has no effect if the Sequence has already started - The time position where the tween will be placed - The tween to insert - - - Adds the given interval to the end of the Sequence. - Has no effect if the Sequence has already started - The interval duration - - - Adds the given interval to the beginning of the Sequence, pushing forward the other nested content. - Has no effect if the Sequence has already started - The interval duration - - - Adds the given callback to the end of the Sequence. - Has no effect if the Sequence has already started - The callback to append - - - Adds the given callback to the beginning of the Sequence, pushing forward the other nested content. - Has no effect if the Sequence has already started - The callback to prepend - - - Inserts the given callback at the given time position in the Sequence, - automatically adding an interval if needed. - Has no effect if the Sequence has already started - The time position where the callback will be placed - The callback to insert - - - Changes a TO tween into a FROM tween: sets the current target's position as the tween's endValue - then immediately sends the target to the previously set endValue. - - - Changes a TO tween into a FROM tween: sets the current target's position as the tween's endValue - then immediately sends the target to the previously set endValue. - If TRUE the FROM value will be calculated as relative to the current one - - - Changes a TO tween into a FROM tween: sets the tween's starting value to the given one - and eventually sets the tween's target to that value immediately. - Value to start from - If TRUE sets the target to from value immediately, otherwise waits for the tween to start - - - Changes a TO tween into a FROM tween: sets the tween's starting value to the given one - and eventually sets the tween's target to that value immediately. - Alpha value to start from (in case of Fade tweens) - If TRUE sets the target to from value immediately, otherwise waits for the tween to start - - - Changes a TO tween into a FROM tween: sets the tween's starting value to the given one - and eventually sets the tween's target to that value immediately. - Value to start from (in case of Vector tweens that act on a single coordinate or scale tweens) - If TRUE sets the target to from value immediately, otherwise waits for the tween to start - - - Sets a delayed startup for the tween. - In case of Sequences behaves the same as , - which means the delay will repeat in case of loops (while with tweens it's ignored after the first loop cycle). - Has no effect if the tween has already started - - - EXPERIMENTAL: implemented in v1.2.340. - Sets a delayed startup for the tween with options to choose how the delay is applied in case of Sequences. - Has no effect if the tween has already started - Only used by types: If FALSE sets the delay as a one-time occurrence - (defaults to this for types), - otherwise as a Sequence interval which will repeat at the beginning of every loop cycle - - - Sets the tween as relative - (the endValue will be calculated as startValue + endValue instead than being used directly). - Has no effect on Sequences or if the tween has already started - - - If isRelative is TRUE sets the tween as relative - (the endValue will be calculated as startValue + endValue instead than being used directly). - Has no effect on Sequences or if the tween has already started - - - If isSpeedBased is TRUE sets the tween as speed based - (the duration will represent the number of units the tween moves x second). - Has no effect on Sequences, nested tweens, or if the tween has already started - - - If isSpeedBased is TRUE sets the tween as speed based - (the duration will represent the number of units the tween moves x second). - Has no effect on Sequences, nested tweens, or if the tween has already started - - - Options for float tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector2 tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector2 tweens - Selecting an axis will tween the vector only on that axis, leaving the others untouched - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector3 tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector3 tweens - Selecting an axis will tween the vector only on that axis, leaving the others untouched - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector4 tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector4 tweens - Selecting an axis will tween the vector only on that axis, leaving the others untouched - If TRUE the tween will smoothly snap all values to integers - - - Options for Quaternion tweens - If TRUE (default) the rotation will take the shortest route, and will not rotate more than 360°. - If FALSE the rotation will be fully accounted. Is always FALSE if the tween is set as relative - - - Options for Color tweens - If TRUE only the alpha value of the color will be tweened - - - Options for Vector4 tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector4 tweens - If TRUE, rich text will be interpreted correctly while animated, - otherwise all tags will be considered as normal text - The type of scramble to use, if any - 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 to use default ones - - - Options for Vector3Array tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Vector3Array tweens - If TRUE the tween will smoothly snap all values to integers - - - Options for Path tweens (created via the DOPath shortcut) - The eventual movement axis to lock. You can input multiple axis if you separate them like this: - AxisConstrain.X | AxisConstraint.Y - The eventual rotation axis to lock. You can input multiple axis if you separate them like this: - AxisConstrain.X | AxisConstraint.Y - - - Options for Path tweens (created via the DOPath shortcut) - If TRUE the path will be automatically closed - The eventual movement axis to lock. You can input multiple axis if you separate them like this: - AxisConstrain.X | AxisConstraint.Y - The eventual rotation axis to lock. You can input multiple axis if you separate them like this: - AxisConstrain.X | AxisConstraint.Y - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target towards the given position. - Must be chained directly to the tween creation method or to a SetOptions - The position to look at - The eventual direction to consider as "forward". - If left to NULL defaults to the regular forward side of the transform - The vector that defines in which direction up is (default: Vector3.up) - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target towards the given position with options to keep the Z rotation stable. - Must be chained directly to the tween creation method or to a SetOptions - The position to look at - If TRUE doesn't rotate the target along the Z axis - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target towards another transform. - Must be chained directly to the tween creation method or to a SetOptions - The transform to look at - The eventual direction to consider as "forward". - If left to NULL defaults to the regular forward side of the transform - The vector that defines in which direction up is (default: Vector3.up) - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target towards another transform with options to keep the Z rotation stable. - Must be chained directly to the tween creation method or to a SetOptions - The transform to look at - If TRUE doesn't rotate the target along the Z axis - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the target to the path, with the given lookAhead. - Must be chained directly to the tween creation method or to a SetOptions - The percentage of lookAhead to use (0 to 1) - The eventual direction to consider as "forward". - If left to NULL defaults to the regular forward side of the transform - The vector that defines in which direction up is (default: Vector3.up) - - - Additional LookAt options for Path tweens (created via the DOPath shortcut). - Orients the path with options to keep the Z rotation stable. - Must be chained directly to the tween creation method or to a SetOptions - The percentage of lookAhead to use (0 to 1) - If TRUE doesn't rotate the target along the Z axis - - - - Types of log behaviours - - - - Log only warnings and errors - - - Log warnings, errors and additional infos - - - Log only errors - - - - Indicates either a Tweener or a Sequence - - - - TimeScale for the tween - - - If TRUE the tween wil go backwards - - - Object ID (usable for filtering with DOTween static methods). Can be anything except a string or an int - (use or for those) - - - String ID (usable for filtering with DOTween static methods). 2X faster than using an object id - - - Int ID (usable for filtering with DOTween static methods). 4X faster than using an object id, 2X faster than using a string id. - Default is -999 so avoid using an ID like that or it will capture all unset intIds - - - Tween target (usable for filtering with DOTween static methods). Automatically set by tween creation shortcuts - - - Called when the tween is set in a playing state, after any eventual delay. - Also called each time the tween resumes playing from a paused state - - - Called when the tween state changes from playing to paused. - If the tween has autoKill set to FALSE, this is called also when the tween reaches completion. - - - Called when the tween is rewinded, - either by calling Rewind or by reaching the start position while playing backwards. - Rewinding a tween that is already rewinded will not fire this callback - - - Called each time the tween updates - - - Called the moment the tween completes one loop cycle - - - Called the moment the tween reaches completion (loops included) - - - Called the moment the tween is killed - - - Called when a path tween's current waypoint changes - - - Tweeners-only (ignored by Sequences), returns TRUE if the tween was set as relative - - - - Set by SetTarget if DOTween's Debug Mode is on (see DOTween Utility Panel -> "Store GameObject's ID" debug option - - - - FALSE when tween is (or should be) despawned - set only by TweenManager - - - Gets and sets the time position (loops included, delays excluded) of the tween - - - Returns TRUE if the tween is set to loop (either a set number of times or infinitely) - - - TRUE after the tween was set in a play state at least once, AFTER any delay is elapsed - - - Time position within a single loop cycle - - - - Animates a single value - - - - Changes the start value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new start value - If bigger than 0 applies it as the new tween duration - - - Changes the end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new end value - If bigger than 0 applies it as the new tween duration - If TRUE the start value will become the current target's value, otherwise it will stay the same - - - Changes the end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new end value - If TRUE the start value will become the current target's value, otherwise it will stay the same - - - Changes the start and end value of a tween and rewinds it (without pausing it). - Has no effect with tweens that are inside Sequences - The new start value - The new end value - If bigger than 0 applies it as the new tween duration - - - - Used internally - - - - - Update type - - - - Updates every frame during Update calls - - - Updates every frame during LateUpdate calls - - - Updates using FixedUpdate calls - - - Updates using manual update calls - - - diff --git a/Examples/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta b/Examples/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta deleted file mode 100644 index 7a866b5..0000000 --- a/Examples/Assets/Plugins/Demigiant/DOTween/DOTween.XML.meta +++ /dev/null @@ -1,4 +0,0 @@ -fileFormatVersion: 2 -guid: 34192c5e0d14aee43a0e86cc4823268a -TextScriptImporter: - userData: diff --git a/Examples/Assets/Plugins/Demigiant/DOTween/DOTween.dll b/Examples/Assets/Plugins/Demigiant/DOTween/DOTween.dll deleted file mode 100644 index 986eb70f88f11d4578783c5c0d33df41148f511b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162304 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

Q8)giSP|Ju-L%y%037A0j2U6YV1>zTn$uIyZE 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 - - - DOTweenEditor - - - -

- Starts the update loop of tween in the editor. Has no effect during playMode. - - Eventual callback to call after every update - - - - Stops the update loop and clears the onPreviewUpdated callback. - - If TRUE also resets the tweened objects to their original state - - - - Readies the tween for editor preview by setting its UpdateType to Manual plus eventual extra settings. - - The tween to ready - If TRUE (recommended) removes all callbacks (OnComplete/Rewind/etc) - If TRUE prevents the tween from being auto-killed at completion - If TRUE starts playing the tween immediately - - - Full major version + first minor version (ex: 2018.1f) - - - Major version - - - First minor version (ex: in 2018.1 it would be 1) - - - - Checks that the given editor texture use the correct import settings, - and applies them if they're incorrect. - - - - - Returns TRUE if setup is required - - - - - Returns TRUE if the file/directory at the given path exists. - - Path, relative to Unity's project folder - - - - - Converts the given project-relative path to a full path, - with backward (\) slashes). - - - - - 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). - - - - - Connects to a 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). - - Asset type - File path (relative to Unity's project folder) - If TRUE and the requested asset doesn't exist, forces its creation - - - - Full path for the given loaded assembly, assembly file included - - - - - Adds the given global define if it's not already present - - - - - Removes the given global define if it's present - - - - - Returns TRUE if the given global define is present in all the - or only in the given , depending on passed parameters. - - - to use. Leave NULL to check in all of them. - - - - Not used as menu item anymore, but as a utiity function - - - - diff --git a/Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta b/Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta deleted file mode 100644 index 7cec113..0000000 --- a/Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.XML.meta +++ /dev/null @@ -1,4 +0,0 @@ -fileFormatVersion: 2 -guid: 2e2c6224d345d9249acfa6e8ef40bb2d -TextScriptImporter: - userData: diff --git a/Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll b/Examples/Assets/Plugins/Demigiant/DOTween/Editor/DOTweenEditor.dll deleted file mode 100644 index 42fbb48e29ac8d25744d2187d2d20356d15b900b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57344 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