diff --git a/Assets/Prefabs/Gladiator.prefab b/Assets/Prefabs/Gladiator.prefab index 474b0ff..2231809 100644 --- a/Assets/Prefabs/Gladiator.prefab +++ b/Assets/Prefabs/Gladiator.prefab @@ -102,7 +102,7 @@ MonoBehaviour: k__BackingField: 2 k__BackingField: 3 fov: 30 - attackRange: 1.5 + k__BackingField: 1.5 k__BackingField: 10 attackCooldown: 1 target: {fileID: 0} diff --git a/Assets/Prefabs/Monster.prefab b/Assets/Prefabs/Monster.prefab index afaebdd..7a9bf96 100644 --- a/Assets/Prefabs/Monster.prefab +++ b/Assets/Prefabs/Monster.prefab @@ -102,7 +102,7 @@ MonoBehaviour: k__BackingField: 2 k__BackingField: 3 fov: 30 - attackRange: 1.5 + k__BackingField: 1.5 k__BackingField: 10 attackCooldown: 1 target: {fileID: 0} diff --git a/Assets/Scenes/Soulaha.unity b/Assets/Scenes/Soulaha.unity deleted file mode 100644 index 95d70a0..0000000 --- a/Assets/Scenes/Soulaha.unity +++ /dev/null @@ -1,440 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &1710837668 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1710837671} - - component: {fileID: 1710837670} - - component: {fileID: 1710837669} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &1710837669 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1710837668} - m_Enabled: 1 ---- !u!20 &1710837670 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1710837668} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 1 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1710837671 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1710837668} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -10} - 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!1 &1736226631 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1736226635} - - component: {fileID: 1736226634} - - component: {fileID: 1736226633} - - component: {fileID: 1736226632} - - component: {fileID: 1736226637} - m_Layer: 0 - m_Name: Monster - m_TagString: Monster - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!65 &1736226632 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1736226631} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1736226633 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1736226631} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - 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: 31321ba15b8f8eb4c954353edc038b1d, 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!33 &1736226634 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1736226631} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1736226635 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1736226631} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1736226637 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1736226631} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7e480b0ef5998894283e8091830941cb, type: 3} - m_Name: - m_EditorClassIdentifier: - health: 100 - movementSpeed: 5 - rotSpeed: 3 - fov: 0 - attackRange: 1.5 - attackDmg: 10 - attackCooldown: 1 - target: {fileID: 1996499837} ---- !u!1 &1996499833 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1996499837} - - component: {fileID: 1996499836} - - component: {fileID: 1996499835} - - component: {fileID: 1996499834} - - component: {fileID: 1996499838} - m_Layer: 0 - m_Name: Gladiator - m_TagString: Gladiator - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!135 &1996499834 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1996499833} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1996499835 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1996499833} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - 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: 31321ba15b8f8eb4c954353edc038b1d, 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!33 &1996499836 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1996499833} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1996499837 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1996499833} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 6.2, y: -2.69, z: -0.43858913} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1996499838 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1996499833} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c537e1bd61b8d5c42b1ec03f90e14855, type: 3} - m_Name: - m_EditorClassIdentifier: - health: 100 - movementSpeed: 5 - rotSpeed: 3 - fov: 0 - attackRange: 1.5 - attackDmg: 10 - attackCooldown: 1 - target: {fileID: 1736226635} diff --git a/Assets/Scenes/Soulaha.unity.meta b/Assets/Scenes/Soulaha.unity.meta deleted file mode 100644 index 6aa4635..0000000 --- a/Assets/Scenes/Soulaha.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 766611c8d64568744820a8decaa60ebe -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/AI Stats.asset b/Assets/Scripts/AI Stats.asset index fc57117..33007e2 100644 --- a/Assets/Scripts/AI Stats.asset +++ b/Assets/Scripts/AI Stats.asset @@ -13,3 +13,16 @@ MonoBehaviour: m_Name: AI Stats m_EditorClassIdentifier: closeEnough: 2 + roamPositions: + - {x: -14, y: 6, z: 0} + - {x: -14, y: 0, z: 0} + - {x: -14, y: -6, z: 0} + - {x: -5, y: 6, z: 0} + - {x: -5, y: 0, z: 0} + - {x: -5, y: -6, z: 0} + - {x: 5, y: 6, z: 0} + - {x: 5, y: 0, z: 0} + - {x: 5, y: -6, z: 0} + - {x: 14, y: 0, z: 0} + - {x: 14, y: 0, z: 0} + - {x: 14, y: 0, z: 0} diff --git a/Assets/Scripts/AIEntity.cs b/Assets/Scripts/AIEntity.cs index db0b678..dc29f9f 100644 --- a/Assets/Scripts/AIEntity.cs +++ b/Assets/Scripts/AIEntity.cs @@ -7,7 +7,46 @@ using UnityEngine.Serialization; public class AIEntity : Entity { [FormerlySerializedAs("stats")] [SerializeField] AIStats AIStats = null!; - public string? ennemyName {get; protected set; } + BaseState currentState = null!; + public string[] enemies {get; protected set; } + override protected void Awake(){ + base.Awake(); + currentState = new FindTargetState(this); + } + + override protected void Start(){ + base.Start(); + currentState.EnterState(); + } + + override protected void Update() { + if (currentState.UpdateState() is {} newState) + SwitchState(newState); + } + + override protected void FixedUpdate() { + if (currentState.FixedUpdateState() is {} newState) + SwitchState(newState); + } + + void OnDrawGizmos() => currentState?.OnDrawGizmos(); + + void SwitchState(BaseState newState) { + currentState.LeaveState(); + currentState = newState; + newState.EnterState(); + } + + //Looks into enemy name list to see if the other is targetable + virtual protected bool IsTargetable(Entity other){ + foreach (string name in enemies){ + if(other.entityName == name && other.IsAlive()){ + return true; + } + } + + return false; + } abstract class BaseStateAI : BaseState{ protected AIEntity entity; @@ -22,6 +61,9 @@ public class AIEntity : Entity } public override BaseState? UpdateState(){ + if(!entity.IsAlive()){ + return new DeadState(entity); + } Entity targetEntity = entity.GetTarget().GetComponent(); if(targetEntity != null){ if(targetEntity.IsAlive()){//target is alive, keep chasing it @@ -36,10 +78,14 @@ public class AIEntity : Entity public override BaseState? FixedUpdateState(){ Transform target = entity.GetTarget(); entity.direction = Vector3.RotateTowards(entity.direction, (target.position - entity.transform.position), entity.rotSpeed*Time.fixedDeltaTime, 0.0f); - if(!entity.IsInAttackRange()){ - entity.rb.MovePosition(entity.transform.position + entity.direction * entity.movementSpeed * Time.fixedDeltaTime); + if(entity.IsTargetable(entity.GetTarget().GetComponent())){ + if(!entity.IsInAttackRange()){ + entity.rb.MovePosition(entity.transform.position + entity.direction * entity.movementSpeed * Time.fixedDeltaTime); + }else{ + return new AttackState(entity); + } }else{ - return new AttackState(entity); + return new FindTargetState(entity); } return null; } @@ -47,15 +93,19 @@ public class AIEntity : Entity class FindTargetState : BaseStateAI{ float closeEnough; + Vector3 roamPosition; public FindTargetState(AIEntity entity) : base(entity){ } public override BaseState? UpdateState(){ + if(!entity.IsAlive()){ + return new DeadState(entity); + } Entity[] entities = FindObjectsOfType(); - float lastDist = -1; + float lastDist = float.MaxValue; Entity chosenEntity = null!; foreach (Entity other in entities){// Find the closest entity - if(other.name == entity.ennemyName){ + if(entity.IsTargetable(other)){ float distance = Vector2.Distance(other.transform.position, entity.transform.position); if(distance < lastDist){ lastDist = distance; @@ -66,8 +116,24 @@ public class AIEntity : Entity } if(chosenEntity != null){ entity.SetTarget(chosenEntity.transform); + return new SeekState(entity); + }else{ + if(roamPosition == new Vector3()) roamPosition = entity.AIStats.getRandomRoamPositon(); + return null; } - return new SeekState(entity); + } + + public override BaseState? FixedUpdateState(){ + if(roamPosition == new Vector3()){ + return null; + } + entity.direction = Vector3.RotateTowards(entity.direction, (roamPosition - entity.transform.position), entity.rotSpeed*Time.fixedDeltaTime, 0.0f); + if(Vector2.Distance(entity.transform.position, roamPosition) >= entity.attackRange){ + entity.rb.MovePosition(entity.transform.position + entity.direction * entity.movementSpeed * Time.fixedDeltaTime); + }else{ + roamPosition = entity.AIStats.getRandomRoamPositon(); + } + return null; } } @@ -77,6 +143,9 @@ public class AIEntity : Entity } public override BaseState? UpdateState(){ + if(!entity.IsAlive()){ + return new DeadState(entity); + } if(entity.IsInAttackRange()){ if(entity.attackTimer >= entity.attackCooldown){ entity.attackTimer = 0; @@ -85,6 +154,8 @@ public class AIEntity : Entity entity.attackTimer += Time.deltaTime; } + }else{ + return new SeekState(entity); } return null; } @@ -101,4 +172,16 @@ public class AIEntity : Entity return null; } } + + class DeadState : BaseStateAI{ + public DeadState(AIEntity entity) : base(entity){ + Debug.Log("Dead!"); + } + + public override BaseState? UpdateState(){ + + + return null; + } + } } diff --git a/Assets/Scripts/AIStats.cs b/Assets/Scripts/AIStats.cs index e1d503a..3dd2ea6 100644 --- a/Assets/Scripts/AIStats.cs +++ b/Assets/Scripts/AIStats.cs @@ -3,4 +3,10 @@ using UnityEngine; [CreateAssetMenu] public class AIStats : ScriptableObject { public float closeEnough = 1f; + public Vector3[] roamPositions = null!; + + public Vector3 getRandomRoamPositon(){ + int randInd = Random.Range(0,roamPositions.Length-1); + return roamPositions[randInd]; + } } \ No newline at end of file diff --git a/Assets/Scripts/Entity.cs b/Assets/Scripts/Entity.cs index 93703c7..3b125db 100644 --- a/Assets/Scripts/Entity.cs +++ b/Assets/Scripts/Entity.cs @@ -17,18 +17,18 @@ public class Entity : MonoBehaviour [field: SerializeField]public float movementSpeed{get; private set; } [field: SerializeField]public float rotSpeed {get; private set; } [SerializeField]private float fov; - [SerializeField]private float attackRange; + [field: SerializeField]public float attackRange {get; private set; } [field: SerializeField]public float attackDmg {get; private set; } [SerializeField]protected float attackCooldown; protected float attackTimer; - [SerializeField]private Transform target; + [field: SerializeField]private Transform target; public string entityName {get; protected set; } private Collider atkCollider; public Vector3 direction {get; set; } public Rigidbody2D rb {get; private set;} bool beingPushed; - void Awake() => rb = GetComponent(); + virtual protected void Awake() => rb = GetComponent(); protected virtual void Start() { direction = new Vector3(1,0,0); @@ -70,19 +70,18 @@ public class Entity : MonoBehaviour return target; } - //Apply damage to the entity, returns true if it is still alive - public virtual bool TakeDamage(float amount){ + //Apply damage to the entity + public virtual void TakeDamage(float amount){ Health -= amount; if(Health <= 0){ isAlive = false; OnDied(); - return false; } - return true; } protected bool IsInAttackRange(){ - return Vector2.Distance(transform.position, target.position) <= attackRange; + float distance = Vector2.Distance(transform.position, target.position); + return distance <= attackRange; } protected bool IsLookingAtTarget(){ diff --git a/Assets/Scripts/Gladiator.cs b/Assets/Scripts/Gladiator.cs index e7097fd..eba6602 100644 --- a/Assets/Scripts/Gladiator.cs +++ b/Assets/Scripts/Gladiator.cs @@ -9,12 +9,27 @@ public class Gladiator : AIEntity { base.Start(); base.entityName = "Gladiator"; - base.ennemyName = "Monster"; + base.enemies = new string[]{"Monster", "Vampire"}; } - // Update is called once per frame - protected override void Update() - { - base.Update(); + override protected bool IsTargetable(Entity other){ + foreach (string name in enemies){ + if(other.entityName == name && other.IsAlive()){ + //If it is the vampire: check if it is in safezone + if(other.entityName == "Vampire"){ + VampireEntity vampireEntity = other.GetComponent(); + if(vampireEntity is null){ + return false; + } + if(vampireEntity.IsInSafeZone()){ + return false; + } + } + return true; + } + } + + return false; } + } diff --git a/Assets/Scripts/Monster.cs b/Assets/Scripts/Monster.cs index b636acd..d3b0c10 100644 --- a/Assets/Scripts/Monster.cs +++ b/Assets/Scripts/Monster.cs @@ -9,27 +9,7 @@ public class Monster : AIEntity { base.Start(); base.entityName = "Monster"; - base.ennemyName = "Gladiator"; + base.enemies = new string[]{"Gladiator"}; } - protected override void FixedUpdate() { - base.FixedUpdate(); - - MoveToTarget(); - } - - // Update is called once per frame - protected override void Update() - { - base.Update(); - - if(IsInAttackRange()){ - if(attackTimer >= attackCooldown){ - Attack(); - attackTimer = 0; - }else{ - attackTimer += Time.deltaTime; - } - } - } } diff --git a/Assets/Scripts/PlayerMovement.cs b/Assets/Scripts/PlayerMovement.cs index 21dc09f..d59fef2 100644 --- a/Assets/Scripts/PlayerMovement.cs +++ b/Assets/Scripts/PlayerMovement.cs @@ -106,6 +106,12 @@ public class PlayerMovement : MonoBehaviour { currentState = newState; newState.EnterState(); } + public bool IsInSafeZone(){ + if(safeZone is null){ + return false; + } + return safeZone.IsInSafeZone; + } abstract class BaseStatePlayerMovement : BaseState { protected PlayerMovement playerMovement; diff --git a/Assets/Scripts/VampireEntity.cs b/Assets/Scripts/VampireEntity.cs index 57f4a2a..0a04991 100644 --- a/Assets/Scripts/VampireEntity.cs +++ b/Assets/Scripts/VampireEntity.cs @@ -9,10 +9,12 @@ public class VampireEntity : Entity { HealthBar healthBar; [Min(10f)] float initialHealth; + PlayerMovement playerMovement; protected override void Start() { base.Start(); base.entityName = "Vampire"; + playerMovement = GetComponent(); initialHealth = Health; } @@ -26,11 +28,16 @@ public class VampireEntity : Entity { TakeDamage(playerStats.bloodLossRate * Time.deltaTime); } - public override bool TakeDamage(float amount) { - bool stillAlive = base.TakeDamage(amount); + public override void TakeDamage(float amount) { + base.TakeDamage(amount); healthBar.SetHealthFraction(Health / initialHealth); + } - return stillAlive; + public bool IsInSafeZone(){ + if(playerMovement is null){ + return false; + } + return playerMovement.IsInSafeZone(); } protected override void OnDied() => gameFlowManager.GameOver();