diff --git a/Assets/Prefabs/Arena.prefab b/Assets/Prefabs/Arena.prefab index 0a3af7b..0956e51 100644 --- a/Assets/Prefabs/Arena.prefab +++ b/Assets/Prefabs/Arena.prefab @@ -1760,4 +1760,4 @@ MonoBehaviour: - {x: -10, y: -10, z: 0} - {x: 10, y: -10, z: 0} stats: {fileID: 11400000, guid: fe319ad8c9a37b84e8b45268c913d54c, type: 2} - monsterPrefab: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + entityPrefab: {fileID: 197677485360569561, guid: b25a487d193f24049b6a791adf592b2e, type: 3} diff --git a/Assets/Prefabs/Gladiator.prefab b/Assets/Prefabs/Gladiator.prefab index 02961d2..4050a02 100644 --- a/Assets/Prefabs/Gladiator.prefab +++ b/Assets/Prefabs/Gladiator.prefab @@ -97,7 +97,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: k__BackingField: 100 - k__BackingField: 5 + k__BackingField: 2 k__BackingField: 3 fov: 30 k__BackingField: 1.5 diff --git a/Assets/Scenes/SoulahaScene.unity b/Assets/Scenes/SoulahaScene.unity index dd3d6ae..5d83459 100644 --- a/Assets/Scenes/SoulahaScene.unity +++ b/Assets/Scenes/SoulahaScene.unity @@ -123,6 +123,128 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1001 &343469760 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_RootOrder + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.x + value: -10.64 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.y + value: 5.28 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_Name + value: Monster (4) + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} +--- !u!1001 &378773076 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_RootOrder + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.x + value: 11.100103 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.y + value: -3.5810318 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_Name + value: Monster (2) + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} --- !u!1001 &647315810 PrefabInstance: m_ObjectHideFlags: 0 @@ -193,6 +315,67 @@ Transform: m_CorrespondingSourceObject: {fileID: 1214567908930553594, guid: 3e0aae8cda56aef44af9598dc5471020, type: 3} m_PrefabInstance: {fileID: 1942557562} m_PrefabAsset: {fileID: 0} +--- !u!1001 &804014058 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_RootOrder + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.x + value: 11.39 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.y + value: 4.18 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_Name + value: Monster (1) + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} --- !u!1001 &992672924 PrefabInstance: m_ObjectHideFlags: 0 @@ -204,6 +387,10 @@ PrefabInstance: propertyPath: m_Name value: Gladiator objectReference: {fileID: 0} + - target: {fileID: 197677485360569561, guid: b25a487d193f24049b6a791adf592b2e, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} - target: {fileID: 197677485360569565, guid: b25a487d193f24049b6a791adf592b2e, type: 3} propertyPath: m_RootOrder value: 1 @@ -259,8 +446,12 @@ PrefabInstance: m_Modifications: - target: {fileID: -7596782781093632548, guid: 581322f036f3ff1448d4d2ec70f295a4, type: 3} propertyPath: m_Enabled - value: 0 + value: 1 objectReference: {fileID: 0} + - target: {fileID: -7596782781093632548, guid: 581322f036f3ff1448d4d2ec70f295a4, type: 3} + propertyPath: monsterPrefab + value: + objectReference: {fileID: 197677485360569561, guid: b25a487d193f24049b6a791adf592b2e, type: 3} - target: {fileID: 9196727425507610130, guid: 581322f036f3ff1448d4d2ec70f295a4, type: 3} propertyPath: m_RootOrder value: 4 @@ -442,6 +633,67 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 81a29b049c6380f4abb3c18ed121efcd, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1001 &1622867918 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_RootOrder + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.x + value: -11 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.y + value: -3.29 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995968, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_Name + value: Monster (3) + objectReference: {fileID: 0} + - target: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} --- !u!1001 &1826994674 PrefabInstance: m_ObjectHideFlags: 0 @@ -497,6 +749,10 @@ PrefabInstance: propertyPath: m_Name value: Monster objectReference: {fileID: 0} + - target: {fileID: 2399377275812995980, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 5f633c05dee3f4b4784f5702b2365f02, type: 3} --- !u!1 &1836818727 diff --git a/Assets/Scripts/AIEntity.cs b/Assets/Scripts/AIEntity.cs index aa69dd0..8bc5bfe 100644 --- a/Assets/Scripts/AIEntity.cs +++ b/Assets/Scripts/AIEntity.cs @@ -7,7 +7,7 @@ public class AIEntity : Entity { [SerializeField] AIStats stats = null!; BaseState currentState = null!; - public string enemyName {get; protected set; } + public string[] enemies {get; protected set; } override protected void Awake(){ base.Awake(); currentState = new FindTargetState(this); @@ -35,6 +35,17 @@ public class AIEntity : Entity 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; @@ -66,10 +77,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; } @@ -89,7 +104,7 @@ public class AIEntity : Entity float lastDist = float.MaxValue; Entity chosenEntity = null!; foreach (Entity other in entities){// Find the closest entity - if(other.name == entity.enemyName && other.IsAlive()){ + if(entity.IsTargetable(other)){ float distance = Vector2.Distance(other.transform.position, entity.transform.position); if(distance < lastDist){ lastDist = distance; diff --git a/Assets/Scripts/Arena.cs b/Assets/Scripts/Arena.cs index 78c76bd..b87dfdf 100644 --- a/Assets/Scripts/Arena.cs +++ b/Assets/Scripts/Arena.cs @@ -6,7 +6,7 @@ public class Arena : MonoBehaviour { //TODO probably add initial direction too [SerializeField] Vector3[] spawners = null!; [SerializeField] ArenaStats stats = null!; - [SerializeField] GameObject monsterPrefab = null!; + [SerializeField] GameObject entityPrefab = null!; SafeZone safeZone = null!; @@ -15,9 +15,9 @@ public class Arena : MonoBehaviour { void Start() => StartCoroutine(SpawnEnemies()); void SpawnEnemy(int spawnerIndex) { - var monster = Instantiate(monsterPrefab, spawners[spawnerIndex], Quaternion.identity).GetComponent(); + var entity = Instantiate(entityPrefab, spawners[spawnerIndex], Quaternion.identity).GetComponent(); //TODO Replace hardcoded target with entity discovery - monster.SetTarget(FindObjectOfType().transform); + entity.SetTarget(FindObjectOfType().transform); } IEnumerator SpawnEnemies() { diff --git a/Assets/Scripts/Gladiator.cs b/Assets/Scripts/Gladiator.cs index 076e7b2..eba6602 100644 --- a/Assets/Scripts/Gladiator.cs +++ b/Assets/Scripts/Gladiator.cs @@ -9,7 +9,27 @@ public class Gladiator : AIEntity { base.Start(); base.entityName = "Gladiator"; - base.enemyName = "Monster"; + base.enemies = new string[]{"Monster", "Vampire"}; + } + + 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 b874f16..d3b0c10 100644 --- a/Assets/Scripts/Monster.cs +++ b/Assets/Scripts/Monster.cs @@ -9,7 +9,7 @@ public class Monster : AIEntity { base.Start(); base.entityName = "Monster"; - base.enemyName = "Gladiator"; + base.enemies = new string[]{"Gladiator"}; } } diff --git a/Assets/Scripts/PlayerMovement.cs b/Assets/Scripts/PlayerMovement.cs index 7d2b652..aa14687 100644 --- a/Assets/Scripts/PlayerMovement.cs +++ b/Assets/Scripts/PlayerMovement.cs @@ -85,6 +85,13 @@ public class PlayerMovement : MonoBehaviour { rb.isKinematic = !enabled; } + public bool IsInSafeZone(){ + if(safeZone is null){ + return false; + } + return safeZone.IsInSafeZone; + } + abstract class BaseStatePlayerMovement : BaseState{ protected PlayerMovement playerMovement; public BaseStatePlayerMovement(PlayerMovement playerMovement){ diff --git a/Assets/Scripts/VampireEntity.cs b/Assets/Scripts/VampireEntity.cs index 18cb063..845b99b 100644 --- a/Assets/Scripts/VampireEntity.cs +++ b/Assets/Scripts/VampireEntity.cs @@ -5,10 +5,12 @@ using UnityEngine; public class VampireEntity : Entity { [SerializeField] HealthBar healthBar; float initialHealth; + PlayerMovement playerMovement; protected override void Start() { base.Start(); base.entityName = "Vampire"; + playerMovement = GetComponent(); initialHealth = Health; } @@ -17,4 +19,11 @@ public class VampireEntity : Entity { base.TakeDamage(amount); healthBar.SetHealthFraction(Health / initialHealth); } + + public bool IsInSafeZone(){ + if(playerMovement is null){ + return false; + } + return playerMovement.IsInSafeZone(); + } } \ No newline at end of file