From fd8306645b0a36f5e49dca11f42725d242f4c219 Mon Sep 17 00:00:00 2001 From: Antoine H Date: Fri, 22 Jan 2021 17:34:44 +0100 Subject: [PATCH] Update Event system + Add basic HardObstacle --- .../Temporaires/Animations/clientFight.anim | 105 ++++++ .../Animations/clientFight.anim.meta | 8 + .../clientFight_animator.controller | 159 ++++++++ .../clientFight_animator.controller.meta | 8 + Assets/Arts/Temporaires/Sprites/smoke.png | Bin 0 -> 53026 bytes .../Arts/Temporaires/Sprites/smoke.png.meta | 346 ++++++++++++++++++ Assets/Prefabs/Characters/Client.prefab | 28 +- Assets/Prefabs/Obstacles/HardObstacle.prefab | 162 ++++++++ .../Obstacles/HardObstacle.prefab.meta | 7 + Assets/Resources/Events/HardObstacles.meta | 8 + .../HardObstacles/HardObstacle Variant.prefab | 76 ++++ .../HardObstacle Variant.prefab.meta | 7 + Assets/Resources/Events/SoftObstacles.meta | 8 + .../SoftObstacle Variant 1.prefab | 0 .../SoftObstacle Variant 1.prefab.meta | 0 .../SoftObstacle Variant 2.prefab | 0 .../SoftObstacle Variant 2.prefab.meta | 0 .../SoftObstacle Variant.prefab | 0 .../SoftObstacle Variant.prefab.meta | 0 Assets/Scenes/Tests/SampleScene.unity | 28 +- .../Tests/SampleScene/NavMesh-NavMesh 1.asset | Bin 0 -> 16624 bytes .../SampleScene/NavMesh-NavMesh 1.asset.meta | 8 + Assets/Scripts/Client_controller.cs | 52 ++- Assets/Scripts/Events.meta | 8 + Assets/Scripts/Events/HardObstacle.cs | 92 +++++ Assets/Scripts/Events/HardObstacle.cs.meta | 11 + Assets/Scripts/{ => Events}/SoftObstacle.cs | 13 +- .../Scripts/{ => Events}/SoftObstacle.cs.meta | 0 Assets/Scripts/GameSystems/ClientManager.cs | 29 +- Assets/Scripts/GameSystems/EventManager.cs | 142 +++++-- Assets/Scripts/Tavernkeeper_controller.cs | 2 +- Assets/Scripts/Workshops.meta | 8 + .../{ => Workshops}/Cleaning_workshop.cs | 0 .../{ => Workshops}/Cleaning_workshop.cs.meta | 0 .../{ => Workshops}/Production_workshop.cs | 0 .../Production_workshop.cs.meta | 0 Assets/Scripts/{ => Workshops}/Workshop.cs | 0 .../Scripts/{ => Workshops}/Workshop.cs.meta | 0 ProjectSettings/NavMeshAreas.asset | 2 +- 39 files changed, 1248 insertions(+), 69 deletions(-) create mode 100644 Assets/Arts/Temporaires/Animations/clientFight.anim create mode 100644 Assets/Arts/Temporaires/Animations/clientFight.anim.meta create mode 100644 Assets/Arts/Temporaires/Animations/clientFight_animator.controller create mode 100644 Assets/Arts/Temporaires/Animations/clientFight_animator.controller.meta create mode 100644 Assets/Arts/Temporaires/Sprites/smoke.png create mode 100644 Assets/Arts/Temporaires/Sprites/smoke.png.meta create mode 100644 Assets/Prefabs/Obstacles/HardObstacle.prefab create mode 100644 Assets/Prefabs/Obstacles/HardObstacle.prefab.meta create mode 100644 Assets/Resources/Events/HardObstacles.meta create mode 100644 Assets/Resources/Events/HardObstacles/HardObstacle Variant.prefab create mode 100644 Assets/Resources/Events/HardObstacles/HardObstacle Variant.prefab.meta create mode 100644 Assets/Resources/Events/SoftObstacles.meta rename Assets/Resources/Events/{ => SoftObstacles}/SoftObstacle Variant 1.prefab (100%) rename Assets/Resources/Events/{ => SoftObstacles}/SoftObstacle Variant 1.prefab.meta (100%) rename Assets/Resources/Events/{ => SoftObstacles}/SoftObstacle Variant 2.prefab (100%) rename Assets/Resources/Events/{ => SoftObstacles}/SoftObstacle Variant 2.prefab.meta (100%) rename Assets/Resources/Events/{ => SoftObstacles}/SoftObstacle Variant.prefab (100%) rename Assets/Resources/Events/{ => SoftObstacles}/SoftObstacle Variant.prefab.meta (100%) create mode 100644 Assets/Scenes/Tests/SampleScene/NavMesh-NavMesh 1.asset create mode 100644 Assets/Scenes/Tests/SampleScene/NavMesh-NavMesh 1.asset.meta create mode 100644 Assets/Scripts/Events.meta create mode 100644 Assets/Scripts/Events/HardObstacle.cs create mode 100644 Assets/Scripts/Events/HardObstacle.cs.meta rename Assets/Scripts/{ => Events}/SoftObstacle.cs (80%) rename Assets/Scripts/{ => Events}/SoftObstacle.cs.meta (100%) create mode 100644 Assets/Scripts/Workshops.meta rename Assets/Scripts/{ => Workshops}/Cleaning_workshop.cs (100%) rename Assets/Scripts/{ => Workshops}/Cleaning_workshop.cs.meta (100%) rename Assets/Scripts/{ => Workshops}/Production_workshop.cs (100%) rename Assets/Scripts/{ => Workshops}/Production_workshop.cs.meta (100%) rename Assets/Scripts/{ => Workshops}/Workshop.cs (100%) rename Assets/Scripts/{ => Workshops}/Workshop.cs.meta (100%) diff --git a/Assets/Arts/Temporaires/Animations/clientFight.anim b/Assets/Arts/Temporaires/Animations/clientFight.anim new file mode 100644 index 0000000..742c74b --- /dev/null +++ b/Assets/Arts/Temporaires/Animations/clientFight.anim @@ -0,0 +1,105 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: clientFight + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - curve: + - time: 0 + value: {fileID: -9087577266532155448, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + - time: 0.083333336 + value: {fileID: -1106684591460216115, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + - time: 0.16666667 + value: {fileID: -5983078005227543334, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + - time: 0.25 + value: {fileID: 7818055727696256662, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + - time: 0.33333334 + value: {fileID: 8013849657407384527, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + - time: 0.41666666 + value: {fileID: -5181280606106272151, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + - time: 0.5 + value: {fileID: -7197358887858680917, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + - time: 0.5833333 + value: {fileID: 5016423947855932505, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + - time: 0.6666667 + value: {fileID: 9222936549612893643, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + - time: 0.75 + value: {fileID: -8405810056075184875, guid: 4253ee9838e8504419ade6abdae8ca57, + type: 3} + attribute: m_Sprite + path: + classID: 212 + script: {fileID: 0} + m_SampleRate: 12 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + pptrCurveMapping: + - {fileID: -9087577266532155448, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + - {fileID: -1106684591460216115, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + - {fileID: -5983078005227543334, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + - {fileID: 7818055727696256662, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + - {fileID: 8013849657407384527, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + - {fileID: -5181280606106272151, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + - {fileID: -7197358887858680917, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + - {fileID: 5016423947855932505, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + - {fileID: 9222936549612893643, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + - {fileID: -8405810056075184875, guid: 4253ee9838e8504419ade6abdae8ca57, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.8333333 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/Arts/Temporaires/Animations/clientFight.anim.meta b/Assets/Arts/Temporaires/Animations/clientFight.anim.meta new file mode 100644 index 0000000..91a20b5 --- /dev/null +++ b/Assets/Arts/Temporaires/Animations/clientFight.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b4a8d327ed204ff44b68b1c6df1c66eb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Arts/Temporaires/Animations/clientFight_animator.controller b/Assets/Arts/Temporaires/Animations/clientFight_animator.controller new file mode 100644 index 0000000..8a10f06 --- /dev/null +++ b/Assets/Arts/Temporaires/Animations/clientFight_animator.controller @@ -0,0 +1,159 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1101 &-2207836258054923399 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: active fight + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 4800364795622535310} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.7 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-476213691089259077 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: clientFight + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -2207836258054923399} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: b4a8d327ed204ff44b68b1c6df1c66eb, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: clientFight_animator + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: active fight + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: 7885178700017951334} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1101 &1878572531684579299 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: active fight + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -476213691089259077} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &4800364795622535310 +AnimatorState: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Wait + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 1878572531684579299} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 0} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &7885178700017951334 +AnimatorStateMachine: + serializedVersion: 5 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 4800364795622535310} + m_Position: {x: 419.1192, y: 250.46849, z: 0} + - serializedVersion: 1 + m_State: {fileID: -476213691089259077} + m_Position: {x: 487.31512, y: 97.02763, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 140, y: 160, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 4800364795622535310} diff --git a/Assets/Arts/Temporaires/Animations/clientFight_animator.controller.meta b/Assets/Arts/Temporaires/Animations/clientFight_animator.controller.meta new file mode 100644 index 0000000..8489f13 --- /dev/null +++ b/Assets/Arts/Temporaires/Animations/clientFight_animator.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69f9597ecec38b842969d718306a8a66 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Arts/Temporaires/Sprites/smoke.png b/Assets/Arts/Temporaires/Sprites/smoke.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9f548465bdb662d7d2c1f57854980b65227007 GIT binary patch literal 53026 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 Md>d7K(<1Eu0V|Gm`v3p{ literal 0 HcmV?d00001 diff --git a/Assets/Arts/Temporaires/Sprites/smoke.png.meta b/Assets/Arts/Temporaires/Sprites/smoke.png.meta new file mode 100644 index 0000000..d2bcd79 --- /dev/null +++ b/Assets/Arts/Temporaires/Sprites/smoke.png.meta @@ -0,0 +1,346 @@ +fileFormatVersion: 2 +guid: 4253ee9838e8504419ade6abdae8ca57 +TextureImporter: + internalIDToNameTable: + - first: + 213: -9087577266532155448 + second: smoke_0 + - first: + 213: -1106684591460216115 + second: smoke_1 + - first: + 213: -5983078005227543334 + second: smoke_2 + - first: + 213: 7818055727696256662 + second: smoke_3 + - first: + 213: 8013849657407384527 + second: smoke_4 + - first: + 213: -5181280606106272151 + second: smoke_5 + - first: + 213: -7197358887858680917 + second: smoke_6 + - first: + 213: 5016423947855932505 + second: smoke_7 + - first: + 213: 9222936549612893643 + second: smoke_8 + - first: + 213: -8405810056075184875 + second: smoke_9 + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: smoke_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8cf7f67cf9072e180800000000000000 + internalID: -9087577266532155448 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: smoke_1 + rect: + serializedVersion: 2 + x: 128 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: dc29d9f3a3444a0f0800000000000000 + internalID: -1106684591460216115 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: smoke_2 + rect: + serializedVersion: 2 + x: 256 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: ad4a5f20146d7fca0800000000000000 + internalID: -5983078005227543334 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: smoke_3 + rect: + serializedVersion: 2 + x: 384 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 69e1b8333405f7c60800000000000000 + internalID: 7818055727696256662 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: smoke_4 + rect: + serializedVersion: 2 + x: 512 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: fcb2721edc9e63f60800000000000000 + internalID: 8013849657407384527 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: smoke_5 + rect: + serializedVersion: 2 + x: 640 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 96e3a678db46818b0800000000000000 + internalID: -5181280606106272151 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: smoke_6 + rect: + serializedVersion: 2 + x: 768 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: babce288938dd1c90800000000000000 + internalID: -7197358887858680917 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: smoke_7 + rect: + serializedVersion: 2 + x: 896 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 95c27be900bed9540800000000000000 + internalID: 5016423947855932505 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: smoke_8 + rect: + serializedVersion: 2 + x: 1024 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: bc5b4a93de37eff70800000000000000 + internalID: 9222936549612893643 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: smoke_9 + rect: + serializedVersion: 2 + x: 1152 + y: 0 + width: 128 + height: 128 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5157b363a40985b80800000000000000 + internalID: -8405810056075184875 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Characters/Client.prefab b/Assets/Prefabs/Characters/Client.prefab index 2c5a742..abe743d 100644 --- a/Assets/Prefabs/Characters/Client.prefab +++ b/Assets/Prefabs/Characters/Client.prefab @@ -15,6 +15,7 @@ GameObject: - component: {fileID: 5304524770463492233} - component: {fileID: 8842024822361446808} - component: {fileID: -7733974610363878313} + - component: {fileID: 3997251302917059352} m_Layer: 8 m_Name: Client m_TagString: Usable @@ -158,7 +159,7 @@ NavMeshAgent: m_GameObject: {fileID: 5304524770463492230} m_Enabled: 1 m_AgentTypeID: 0 - m_Radius: 0.32 + m_Radius: 0.25 m_Speed: 1 m_Acceleration: 8 avoidancePriority: 50 @@ -167,8 +168,8 @@ NavMeshAgent: m_AutoTraverseOffMeshLink: 1 m_AutoBraking: 1 m_AutoRepath: 1 - m_Height: 1.28 - m_BaseOffset: 0.64 + m_Height: 0.3 + m_BaseOffset: 0.025 m_WalkableMask: 4294967295 m_ObstacleAvoidanceType: 4 --- !u!208 &-7733974610363878313 @@ -187,6 +188,27 @@ NavMeshObstacle: m_CarveOnlyStationary: 1 m_Center: {x: 0, y: 0.2, z: 0} m_TimeToStationary: 0.1 +--- !u!50 &3997251302917059352 +Rigidbody2D: + serializedVersion: 4 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5304524770463492230} + m_BodyType: 1 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 1 + m_LinearDrag: 0 + m_AngularDrag: 0.05 + m_GravityScale: 1 + m_Material: {fileID: 0} + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 4 --- !u!1 &5453982149135371002 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Obstacles/HardObstacle.prefab b/Assets/Prefabs/Obstacles/HardObstacle.prefab new file mode 100644 index 0000000..f28c065 --- /dev/null +++ b/Assets/Prefabs/Obstacles/HardObstacle.prefab @@ -0,0 +1,162 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2827306491375899988 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2607014449971772197} + - component: {fileID: -4161144385216632757} + - component: {fileID: 3584062944757385923} + - component: {fileID: 1835648757843523848} + - component: {fileID: 1725399312431511591} + - component: {fileID: 3189895248152533610} + m_Layer: 0 + m_Name: HardObstacle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2607014449971772197 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2827306491375899988} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.6143043, y: -0.40863657, z: -1.5327958} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &-4161144385216632757 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2827306491375899988} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 0 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!95 &3584062944757385923 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2827306491375899988} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 69f9597ecec38b842969d718306a8a66, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!61 &1835648757843523848 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2827306491375899988} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 0.023439527, y: 0.038105845} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0.5, y: 0.5} + oldSize: {x: 1.28, y: 1.28} + newSize: {x: 1.28, y: 1.28} + adaptiveTilingThreshold: 0.5 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + serializedVersion: 2 + m_Size: {x: 1.0314424, y: 1.0260323} + m_EdgeRadius: 0 +--- !u!208 &1725399312431511591 +NavMeshObstacle: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2827306491375899988} + m_Enabled: 1 + serializedVersion: 3 + m_Shape: 1 + m_Extents: {x: 0.65, y: 0.65, z: 0.5} + m_MoveThreshold: 0.1 + m_Carve: 1 + m_CarveOnlyStationary: 1 + m_Center: {x: 0, y: 0, z: 0} + m_TimeToStationary: 0.5 +--- !u!114 &3189895248152533610 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2827306491375899988} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6bcb4ca5242cefc4bb06adff707d9c5f, type: 3} + m_Name: + m_EditorClassIdentifier: + lifeTime: 3 diff --git a/Assets/Prefabs/Obstacles/HardObstacle.prefab.meta b/Assets/Prefabs/Obstacles/HardObstacle.prefab.meta new file mode 100644 index 0000000..752486b --- /dev/null +++ b/Assets/Prefabs/Obstacles/HardObstacle.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a1ecb144f5ffc8c468342fd128328af3 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Events/HardObstacles.meta b/Assets/Resources/Events/HardObstacles.meta new file mode 100644 index 0000000..d068f7c --- /dev/null +++ b/Assets/Resources/Events/HardObstacles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eec6f9b6bc78c394d936d29421fa0a07 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Events/HardObstacles/HardObstacle Variant.prefab b/Assets/Resources/Events/HardObstacles/HardObstacle Variant.prefab new file mode 100644 index 0000000..25bd2f9 --- /dev/null +++ b/Assets/Resources/Events/HardObstacles/HardObstacle Variant.prefab @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &4510937209002914880 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalPosition.x + value: -2.2624502 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.114923835 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalPosition.z + value: -1.5327958 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2607014449971772197, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2701532041091318685, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2827306491375899988, guid: a1ecb144f5ffc8c468342fd128328af3, + type: 3} + propertyPath: m_Name + value: HardObstacle Variant + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: a1ecb144f5ffc8c468342fd128328af3, type: 3} diff --git a/Assets/Resources/Events/HardObstacles/HardObstacle Variant.prefab.meta b/Assets/Resources/Events/HardObstacles/HardObstacle Variant.prefab.meta new file mode 100644 index 0000000..a470784 --- /dev/null +++ b/Assets/Resources/Events/HardObstacles/HardObstacle Variant.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1415a21a1be86c941823ed672062410d +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Events/SoftObstacles.meta b/Assets/Resources/Events/SoftObstacles.meta new file mode 100644 index 0000000..db7b834 --- /dev/null +++ b/Assets/Resources/Events/SoftObstacles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bad9f5fc119919549a535f3bee4b27e6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Events/SoftObstacle Variant 1.prefab b/Assets/Resources/Events/SoftObstacles/SoftObstacle Variant 1.prefab similarity index 100% rename from Assets/Resources/Events/SoftObstacle Variant 1.prefab rename to Assets/Resources/Events/SoftObstacles/SoftObstacle Variant 1.prefab diff --git a/Assets/Resources/Events/SoftObstacle Variant 1.prefab.meta b/Assets/Resources/Events/SoftObstacles/SoftObstacle Variant 1.prefab.meta similarity index 100% rename from Assets/Resources/Events/SoftObstacle Variant 1.prefab.meta rename to Assets/Resources/Events/SoftObstacles/SoftObstacle Variant 1.prefab.meta diff --git a/Assets/Resources/Events/SoftObstacle Variant 2.prefab b/Assets/Resources/Events/SoftObstacles/SoftObstacle Variant 2.prefab similarity index 100% rename from Assets/Resources/Events/SoftObstacle Variant 2.prefab rename to Assets/Resources/Events/SoftObstacles/SoftObstacle Variant 2.prefab diff --git a/Assets/Resources/Events/SoftObstacle Variant 2.prefab.meta b/Assets/Resources/Events/SoftObstacles/SoftObstacle Variant 2.prefab.meta similarity index 100% rename from Assets/Resources/Events/SoftObstacle Variant 2.prefab.meta rename to Assets/Resources/Events/SoftObstacles/SoftObstacle Variant 2.prefab.meta diff --git a/Assets/Resources/Events/SoftObstacle Variant.prefab b/Assets/Resources/Events/SoftObstacles/SoftObstacle Variant.prefab similarity index 100% rename from Assets/Resources/Events/SoftObstacle Variant.prefab rename to Assets/Resources/Events/SoftObstacles/SoftObstacle Variant.prefab diff --git a/Assets/Resources/Events/SoftObstacle Variant.prefab.meta b/Assets/Resources/Events/SoftObstacles/SoftObstacle Variant.prefab.meta similarity index 100% rename from Assets/Resources/Events/SoftObstacle Variant.prefab.meta rename to Assets/Resources/Events/SoftObstacles/SoftObstacle Variant.prefab.meta diff --git a/Assets/Scenes/Tests/SampleScene.unity b/Assets/Scenes/Tests/SampleScene.unity index 4a59bff..e86183c 100644 --- a/Assets/Scenes/Tests/SampleScene.unity +++ b/Assets/Scenes/Tests/SampleScene.unity @@ -32568,6 +32568,12 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 2157073178828809470, guid: dfb09d229e85c1446bee2e4f9357610e, + type: 3} + propertyPath: m_NavMeshData + value: + objectReference: {fileID: 23800000, guid: 6bdd1fd9cb47841418b4891635a20f56, + type: 2} - target: {fileID: 2157073179154264261, guid: dfb09d229e85c1446bee2e4f9357610e, type: 3} propertyPath: nbMaxClients @@ -32581,7 +32587,7 @@ PrefabInstance: - target: {fileID: 2157073179154264261, guid: dfb09d229e85c1446bee2e4f9357610e, type: 3} propertyPath: clientSpawnChance - value: 50 + value: 100 objectReference: {fileID: 0} - target: {fileID: 2157073180203202244, guid: dfb09d229e85c1446bee2e4f9357610e, type: 3} @@ -32653,6 +32659,16 @@ PrefabInstance: propertyPath: range value: 1 objectReference: {fileID: 0} + - target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e, + type: 3} + propertyPath: maxHardObs + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e, + type: 3} + propertyPath: maxSoftObs + value: 10 + objectReference: {fileID: 0} - target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e, type: 3} propertyPath: nbMaxEvents @@ -32663,6 +32679,16 @@ PrefabInstance: propertyPath: spawnChance value: 30 objectReference: {fileID: 0} + - target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e, + type: 3} + propertyPath: EventRessourceFolder + value: Events/SoftObstalces + objectReference: {fileID: 0} + - target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e, + type: 3} + propertyPath: coroutineRefreshRate + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: dfb09d229e85c1446bee2e4f9357610e, type: 3} --- !u!1 &1809057616 diff --git a/Assets/Scenes/Tests/SampleScene/NavMesh-NavMesh 1.asset b/Assets/Scenes/Tests/SampleScene/NavMesh-NavMesh 1.asset new file mode 100644 index 0000000000000000000000000000000000000000..1c9289eceb920a6b6a10eb9f1356c9503468df07 GIT binary patch literal 16624 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 TUhwqJ*HQx?&+Omfzis~);04e% literal 0 HcmV?d00001 diff --git a/Assets/Scenes/Tests/SampleScene/NavMesh-NavMesh 1.asset.meta b/Assets/Scenes/Tests/SampleScene/NavMesh-NavMesh 1.asset.meta new file mode 100644 index 0000000..03285d1 --- /dev/null +++ b/Assets/Scenes/Tests/SampleScene/NavMesh-NavMesh 1.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6bdd1fd9cb47841418b4891635a20f56 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Client_controller.cs b/Assets/Scripts/Client_controller.cs index 2aaa860..0882fce 100644 --- a/Assets/Scripts/Client_controller.cs +++ b/Assets/Scripts/Client_controller.cs @@ -4,6 +4,8 @@ using UnityEngine; using UnityEngine.AI; //Define the behavior of a client +[RequireComponent(typeof(Animator))] +[RequireComponent(typeof(Rigidbody2D))] [RequireComponent(typeof(Collider2D))] [RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(NavMeshObstacle))] @@ -13,14 +15,18 @@ public class Client_controller : MonoBehaviour, IUsable public float waitingTime = 10.0f; //Patience after reaching seat public UITimer UIWaitingTimer = null; + Animator animator; string _status; - HashSet _availStatus = new HashSet(){"entering", "waiting", "consuming", "leaving"}; + string _prevStatus; + HashSet _availStatus = new HashSet(){"entering", "waiting", "consuming", "leaving", "event"}; public string status { get{ return _status;} set{ if (_availStatus.Contains(value)) + _prevStatus=_status; _status = value; + animator.SetTrigger(_status); //Update status in animator // Debug.Log(gameObject.name+" "+_status); switch (value) { @@ -31,8 +37,9 @@ public class Client_controller : MonoBehaviour, IUsable UIWaitingTimer.gameObject.SetActive(false); break; case "waiting": + EventManager.Instance.startCoroutine(gameObject); //Switch Agent to obstacle if waiting - agent.Warp(agent.destination); //Make sure agent become static at right position + agent.Warp(assigedPos); //Make sure agent become static at right position agent.enabled = false; navObstacle.enabled = true; @@ -48,6 +55,7 @@ public class Client_controller : MonoBehaviour, IUsable if(UIWaitingTimer != null) UIWaitingTimer.gameObject.SetActive(false); break; + case "event": case "leaving": EventManager.Instance.stopCoroutine(gameObject); navObstacle.enabled = false; @@ -69,7 +77,7 @@ public class Client_controller : MonoBehaviour, IUsable GameObject currentMug = null; //Mug currently held by the client //Navigation - Vector2 destination; + Vector2 assigedPos; //Chair to sit or destination to stay (leave) NavMeshAgent agent; NavMeshObstacle navObstacle; //Obstacle for other agents @@ -111,6 +119,27 @@ public class Client_controller : MonoBehaviour, IUsable } } + //Assign client to an event/destination. Restore its previous status if no event/destination is given. + public void assignToEvent(Vector2? destination=null) + { + if(destination is null) + { + status=_prevStatus; + // NavMeshHit hit; + // NavMesh.SamplePosition(gameObject.transform.position, out hit, agent.height*2, NavMesh.AllAreas); + // agent.Warp(hit.position); + if(agent.enabled) + agent.SetDestination(assigedPos); + else + gameObject.transform.position=assigedPos; + } + else + { + status="event"; + agent.SetDestination((Vector2)destination); + } + } + // Start is called before the first frame update void Start() { @@ -124,6 +153,8 @@ public class Client_controller : MonoBehaviour, IUsable else UIWaitingTimer.gameObject.SetActive(false); + animator = GetComponent(); + // Navigation // agent = GetComponent(); navObstacle = GetComponent(); @@ -132,7 +163,8 @@ public class Client_controller : MonoBehaviour, IUsable agent.updateRotation = false; agent.updateUpAxis = false; //Get target - agent.SetDestination(ClientManager.Instance.assignTarget()); + assigedPos = ClientManager.Instance.assignTarget(); //Chair to go + agent.SetDestination(assigedPos); //Assign Random priority to prevent two agent blocking each other agent.avoidancePriority=Random.Range(0, 99); @@ -154,21 +186,22 @@ public class Client_controller : MonoBehaviour, IUsable UIWaitingTimer.DisplayIcon(StockManager.Instance.consumableSprite(order)); } - if(status=="waiting") + else if(status=="waiting") { waitTimer -= Time.deltaTime; if (waitTimer < 0) //Waited too long { //Leave tavern status = "leaving"; - agent.SetDestination(ClientManager.Instance.assignTarget(agent.destination, true)); //Request next target + assigedPos = ClientManager.Instance.assignTarget(assigedPos, true); //Request leaving target + agent.SetDestination(assigedPos); } else if(UIWaitingTimer != null) //Update UI Waiting timer UIWaitingTimer.SetValue(waitTimer/waitingTime); } //Consume Timer - if(status=="consuming") //Consuming mug if there's one and reached destination + else if(status=="consuming") //Consuming mug if there's one and reached destination { consumeTimer -= Time.deltaTime; if(consumeTimer < 0) //Finished consuming mug ? @@ -190,11 +223,12 @@ public class Client_controller : MonoBehaviour, IUsable //Leave tavern status = "leaving"; - agent.SetDestination(ClientManager.Instance.assignTarget(agent.destination, true)); //Request next target + assigedPos = ClientManager.Instance.assignTarget(assigedPos, true); //Request leaving target + agent.SetDestination(assigedPos); } } - if(status=="leaving" && !agent.pathPending && agent.remainingDistance==0) + else if(status=="leaving" && !agent.pathPending && agent.remainingDistance==0) { Destroy(gameObject); } diff --git a/Assets/Scripts/Events.meta b/Assets/Scripts/Events.meta new file mode 100644 index 0000000..ff37607 --- /dev/null +++ b/Assets/Scripts/Events.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 026890d1556d5ae40adefad79d1eb3c4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Events/HardObstacle.cs b/Assets/Scripts/Events/HardObstacle.cs new file mode 100644 index 0000000..c5b1260 --- /dev/null +++ b/Assets/Scripts/Events/HardObstacle.cs @@ -0,0 +1,92 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.AI; + +//Define the behavior of a hard obstacle (Block movement) +[RequireComponent(typeof(Animator))] +[RequireComponent(typeof(Collider2D))] +[RequireComponent(typeof(NavMeshObstacle))] +public class HardObstacle : MonoBehaviour +{ + [SerializeField] + float lifeTime = -1.0f; //Time before self-destruct (Negative value to prevent self-destruct) + float lifeTimer; + + List angryClients = new List(); //Clients in the fight + + Collider2D ObsCollider; + NavMeshObstacle Obstacle; + // SpriteRenderer ObsRenderer; + Animator animator; + + bool gameRunning = true; + + // Start is called before the first frame update + void Start() + { + lifeTimer=lifeTime; + + ObsCollider = GetComponent(); + + Obstacle = GetComponent(); + Obstacle.enabled=false; //Don't block movement before client entounter + + animator = GetComponent(); + animator.SetBool("active fight", false); //Disable animation before client encounter + } + + // Update is called once per frame + void Update() + { + if(animator.GetBool("active fight") && lifeTimer>0) + { + lifeTimer -= Time.deltaTime; + if(lifeTimer<0) + { + Destroy(gameObject); + } + } + } + + void OnTriggerEnter2D(Collider2D other) + { + Client_controller newClient = other.GetComponent(); + if(newClient!=null && !angryClients.Contains(newClient)) + { + if(newClient.status!="event") //Make sure to set right status + newClient.assignToEvent(gameObject.transform.position); + angryClients.Add(newClient); + // Debug.Log("New fighting client. Current nb : "+angryClients.Count); + + if(angryClients.Count>1)//Start fight + { + foreach(Client_controller client in angryClients) //Turn off client (to merge for a fight) + client.gameObject.SetActive(false); + + animator.SetBool("active fight", true); + + //Block movement + Obstacle.enabled=true; + ObsCollider.isTrigger=false; //Trigger becoming solid + } + } + } + + void OnDestroy() + { + if(gameRunning) //Only apply if game is still running + foreach(Client_controller client in angryClients) //Clients return to their previous behavior + { + client.gameObject.SetActive(true); + client.assignToEvent(); //Restore previous behavior + } + + EventManager.Instance.destroyEvent(gameObject); + } + + void OnApplicationQuit() + { + gameRunning=false; + } +} diff --git a/Assets/Scripts/Events/HardObstacle.cs.meta b/Assets/Scripts/Events/HardObstacle.cs.meta new file mode 100644 index 0000000..7c90e81 --- /dev/null +++ b/Assets/Scripts/Events/HardObstacle.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6bcb4ca5242cefc4bb06adff707d9c5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/SoftObstacle.cs b/Assets/Scripts/Events/SoftObstacle.cs similarity index 80% rename from Assets/Scripts/SoftObstacle.cs rename to Assets/Scripts/Events/SoftObstacle.cs index ae15a65..7b3b851 100644 --- a/Assets/Scripts/SoftObstacle.cs +++ b/Assets/Scripts/Events/SoftObstacle.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using UnityEngine; -//Define the behavior of a soft obstacle +//Define the behavior of a soft obstacle (Slow movement and chance of falling) //TODO : Effect on clients ? (Lower Tips/Repu ?) [RequireComponent(typeof(Collider2D))] public class SoftObstacle : MonoBehaviour @@ -13,7 +13,7 @@ public class SoftObstacle : MonoBehaviour float mvtSlow = 1.0f; //Scale of movement slowdown (1.0f = no change). [SerializeField] - float lifeTime = 3.0f; //Time to consume currentMug + float lifeTime = -1.0f; //Time before self-destruct (Negative value to prevent self-destruct) float lifeTimer; Tavernkeeper_controller player; @@ -27,10 +27,13 @@ public class SoftObstacle : MonoBehaviour // Update is called once per frame void Update() { - lifeTimer -= Time.deltaTime; - if(lifeTimer<0) + if(lifeTimer>0) { - Destroy(gameObject); + lifeTimer -= Time.deltaTime; + if(lifeTimer<0) + { + Destroy(gameObject); + } } } //TODO : Trigger falling animation on tavernkeeper diff --git a/Assets/Scripts/SoftObstacle.cs.meta b/Assets/Scripts/Events/SoftObstacle.cs.meta similarity index 100% rename from Assets/Scripts/SoftObstacle.cs.meta rename to Assets/Scripts/Events/SoftObstacle.cs.meta diff --git a/Assets/Scripts/GameSystems/ClientManager.cs b/Assets/Scripts/GameSystems/ClientManager.cs index 06932a8..2bd55da 100644 --- a/Assets/Scripts/GameSystems/ClientManager.cs +++ b/Assets/Scripts/GameSystems/ClientManager.cs @@ -36,9 +36,15 @@ public sealed class ClientManager : MonoBehaviour [SerializeField] string ClientRessourceFolder = "Clients"; - private Object[] clients; + private Object[] clientsPrefab; GameObject ClientContainer = null; - List clientIDs = new List(); + + private List _clientList = new List(); + public List clientList + { + get{return _clientList;} + private set{_clientList=value;} + } Vector2 spawnPoint; Dictionary targets_dict; //Dict with target and wether they're taken by a client @@ -49,13 +55,14 @@ public sealed class ClientManager : MonoBehaviour //Return wether a new client was created public bool clientRequest(float SpawnChance=100.0f) { - if(Random.Range(0.0f, 99.9f) eventPrefabs = new Dictionary(); GameObject EventContainer=null; - List eventIDs = new List(); //List of active event ID + //List of active event ID + List softObsList = new List(); + List hardObsList = new List(); + + [SerializeField] + float coroutineRefreshRate = 1.0f; //Time (s) before refreshing a coroutine private Dictionary coroutines= new Dictionary(); //Dict of EventManager coroutines associated to each client ID //Spawn an event near position with a probability of spawnChance% - public void spawnEvent(Vector2 position, float spawnChance = 100.0f) + public void spawnSoftObs(Vector2 position, float spawnChance = 100.0f) { Vector3 spawnPoint; - if (Random.Range(0.0f, 99.9f) targetClients, Vector2 position, float spawnChance = 100.0f) + { + //TODO: Orienté client vers event + prefab + Vector3 spawnPoint; + if (Random.Range(0.0f, 99.9f)(); while(EventManager.Instance!=null){ if(GameSystem.Instance.serviceOpen) - EventManager.Instance.spawnEvent(position, spawnChance); - yield return new WaitForSeconds(1.0f); //Called every second + { + //Try to spawn softObs or hardObs randomly + if(Random.value<0.5 && client.status=="consuming") + EventManager.Instance.spawnSoftObs(clientObj.transform.position, spawnChance); + else + { + List otherClients = findNearClients(clientObj, 1.0f); + if(otherClients.Count>0) + { + foreach(GameObject ocl in otherClients) + Debug.DrawLine(clientObj.transform.position, ocl.transform.position, Color.red, coroutineRefreshRate); + // Debug.Log("Clients near"); + + GameObject tgtClient = otherClients[Random.Range(0, otherClients.Count)]; + //TODO : Compute spawnChance w/ clients happiness + Vector2 eventPos=(clientObj.transform.position+tgtClient.transform.position)/2; //Event pos between clients + List targetClients = new List(){client, tgtClient.GetComponent()}; + EventManager.Instance.spawnHardObs(targetClients, eventPos, spawnChance); + } + } + } + yield return new WaitForSeconds(coroutineRefreshRate); //Called every coroutineRefreshRate second } } + //Return the list of other clients in range of client. The client in event status are ignored. + List findNearClients(GameObject client, float range) + { + List res = new List(); + List clientList = ClientManager.Instance.clientList; + Vector3 originPos = client.transform.position; + Vector3 otherPos; + foreach(GameObject cl in clientList) + { + otherPos=cl.transform.position; + if(Vector2.Distance(originPos, otherPos)().status!="event")//Ignore clients already in event status + res.Add(cl); + } + return res; + } + + //Try to find a random point on NavMesh inside a range circle. A result would at a maximum distance of 2*range. + bool RandomPoint(Vector3 center, float range, out Vector3 result) + { + for (int i = 0; i < 50; i++) + { + Vector3 randomPoint = center + (Vector3)Random.insideUnitCircle * range; + NavMeshHit hit; + if (NavMesh.SamplePosition(randomPoint, out hit, range, NavMesh.AllAreas)) + { + result = hit.position; + return true; + } + } + result = Vector3.zero; + return false; + } + //Awake is called when the script instance is being loaded. void Awake() { @@ -116,10 +194,15 @@ public sealed class EventManager : MonoBehaviour if (EventContainer is null) throw new System.Exception("No EventManager found under GameSystem"); - events = Resources.LoadAll(EventRessourceFolder); - if (events.Length==0) + eventPrefabs["soft"] = Resources.LoadAll(SoftObsRessourceFolder); + eventPrefabs["hard"] = Resources.LoadAll(HardObsRessourceFolder); + if (eventPrefabs["soft"].Length==0) { - Debug.LogWarning("EventManager didn't find events prefab in ressource folder : "+EventRessourceFolder); + Debug.LogWarning("EventManager didn't find events prefab in ressource folder : "+SoftObsRessourceFolder); + } + if (eventPrefabs["hard"].Length==0) + { + Debug.LogWarning("EventManager didn't find events prefab in ressource folder : "+HardObsRessourceFolder); } ready = true; @@ -146,21 +229,4 @@ public sealed class EventManager : MonoBehaviour { StopAllCoroutines(); } - - //Try to find a random point on NavMesh inside a range circle. A result would at a maximum distance of 2*range. - bool RandomPoint(Vector3 center, float range, out Vector3 result) - { - for (int i = 0; i < 50; i++) - { - Vector3 randomPoint = center + (Vector3)Random.insideUnitCircle * range; - NavMeshHit hit; - if (NavMesh.SamplePosition(randomPoint, out hit, range, NavMesh.AllAreas)) - { - result = hit.position; - return true; - } - } - result = Vector3.zero; - return false; - } } diff --git a/Assets/Scripts/Tavernkeeper_controller.cs b/Assets/Scripts/Tavernkeeper_controller.cs index 492617b..3b5f882 100644 --- a/Assets/Scripts/Tavernkeeper_controller.cs +++ b/Assets/Scripts/Tavernkeeper_controller.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using UnityEngine; -[RequireComponent(typeof(Rigidbody))] +[RequireComponent(typeof(Rigidbody2D))] [RequireComponent(typeof(Animator))] public class Tavernkeeper_controller : MonoBehaviour { diff --git a/Assets/Scripts/Workshops.meta b/Assets/Scripts/Workshops.meta new file mode 100644 index 0000000..cad0295 --- /dev/null +++ b/Assets/Scripts/Workshops.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 18d1386fcf79908469f9c3aa3ab835b6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Cleaning_workshop.cs b/Assets/Scripts/Workshops/Cleaning_workshop.cs similarity index 100% rename from Assets/Scripts/Cleaning_workshop.cs rename to Assets/Scripts/Workshops/Cleaning_workshop.cs diff --git a/Assets/Scripts/Cleaning_workshop.cs.meta b/Assets/Scripts/Workshops/Cleaning_workshop.cs.meta similarity index 100% rename from Assets/Scripts/Cleaning_workshop.cs.meta rename to Assets/Scripts/Workshops/Cleaning_workshop.cs.meta diff --git a/Assets/Scripts/Production_workshop.cs b/Assets/Scripts/Workshops/Production_workshop.cs similarity index 100% rename from Assets/Scripts/Production_workshop.cs rename to Assets/Scripts/Workshops/Production_workshop.cs diff --git a/Assets/Scripts/Production_workshop.cs.meta b/Assets/Scripts/Workshops/Production_workshop.cs.meta similarity index 100% rename from Assets/Scripts/Production_workshop.cs.meta rename to Assets/Scripts/Workshops/Production_workshop.cs.meta diff --git a/Assets/Scripts/Workshop.cs b/Assets/Scripts/Workshops/Workshop.cs similarity index 100% rename from Assets/Scripts/Workshop.cs rename to Assets/Scripts/Workshops/Workshop.cs diff --git a/Assets/Scripts/Workshop.cs.meta b/Assets/Scripts/Workshops/Workshop.cs.meta similarity index 100% rename from Assets/Scripts/Workshop.cs.meta rename to Assets/Scripts/Workshops/Workshop.cs.meta diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset index a88505d..f22cbff 100644 --- a/ProjectSettings/NavMeshAreas.asset +++ b/ProjectSettings/NavMeshAreas.asset @@ -11,7 +11,7 @@ NavMeshProjectSettings: cost: 1 - name: Jump cost: 2 - - name: + - name: No Event cost: 1 - name: cost: 1