diff --git a/MrBigsock/Assets/Code/EmptyCollider.cs b/MrBigsock/Assets/Code/EmptyCollider.cs new file mode 100644 index 0000000000000000000000000000000000000000..b652a39227c30a48c0d708b4ed3007026c1598b9 --- /dev/null +++ b/MrBigsock/Assets/Code/EmptyCollider.cs @@ -0,0 +1,28 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using System; + +public class EmptyCollider : MonoBehaviour +{ + public event Action<Collider2D> OnColliderEnter2D_Action; + public event Action<Collider2D> OnColliderStay2D_Action; + public event Action<Collider2D> OnColliderExit2D_Action; + + private void OnTriggerEnter2D(Collider2D other) + { + Debug.Log("enter"); + OnColliderEnter2D_Action?.Invoke(other); + } + + private void OnTriggerStay2D(Collider2D other) + { + OnColliderStay2D_Action?.Invoke(other); + } + + private void OnTriggerExit2D(Collider2D other) + { + Debug.Log("exit"); + OnColliderExit2D_Action?.Invoke(other); + } +} diff --git a/MrBigsock/Assets/Code/PlayerController.cs b/MrBigsock/Assets/Code/PlayerController.cs index 2ca3d8e8420b0f05a601c3599111270dfeb0e461..becd86355722ce54ef7839f38c3cd672919998ae 100644 --- a/MrBigsock/Assets/Code/PlayerController.cs +++ b/MrBigsock/Assets/Code/PlayerController.cs @@ -1,4 +1,5 @@ using System.Collections; +using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; @@ -18,6 +19,13 @@ public class PlayerController : MonoBehaviour bool canMove = true; + + + public bool Alive { get; private set; } = true; + public double Hp { get; private set; } = 100; + public DateTime NextTimeCanTakeDamage { get; private set; } = DateTime.Now; + public TimeSpan IFrameDuration { get; private set; } = new TimeSpan(0, 0, 2); + // Start is called before the first frame update void Start() { @@ -26,6 +34,41 @@ public class PlayerController : MonoBehaviour spriteRenderer = GetComponent<SpriteRenderer>(); } + + /* + Adds damage to the player if they don't have IFrames. + */ + public bool TakeDamage(double amount) { + print($"[PlayerController.TakeDamage()] start. | {Hp} - {amount}"); + // Check if player has IFrames + if(NextTimeCanTakeDamage > DateTime.Now) + return false; + // Start new IFrames + NextTimeCanTakeDamage = DateTime.Now + IFrameDuration; + + // Add damage + Hp -= amount; + + TryKill(); + + return true; + } + + /* + Try to kill the player. + */ + public bool TryKill() { + print($"[PlayerController.TryKill()] start. | {Hp}, {Alive}"); + if(Alive && Hp <= 0) { + Alive = false; + + LockMovement(); + + return true; + } + return false; + } + private void FixedUpdate() { if(canMove) { // If movement input is not 0, try to move diff --git a/MrBigsock/Assets/Code/orc/enemyMovement.cs b/MrBigsock/Assets/Code/orc/enemyMovement.cs index a44932de440f37b221e5a4cd184d9c3dbc712027..c8e2e89af821d14af2ccc9e086cdaa20e7cc580a 100644 --- a/MrBigsock/Assets/Code/orc/enemyMovement.cs +++ b/MrBigsock/Assets/Code/orc/enemyMovement.cs @@ -1,81 +1,168 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using System.Linq; -public class enemyMovement : MonoBehaviour -{ - public float speed = 0.6f; - private Transform target; - Animator m_Animator; - private float distance; +public partial class enemyMovement : MonoBehaviour{ + public float speed = 0.6f; - public float attackSpeed = 1f; - private float canAttack; + public float collisionOffset = 0.05f; + public ContactFilter2D movementFilter; + List<RaycastHit2D> castCollisions = new List<RaycastHit2D>(); + + private Transform target; + Animator m_Animator; + private float distance; + + public float attackSpeed = 1f; + private float canAttack; + private float baseDamage = 1f; + + private EmptyCollider followCollider; + private EmptyCollider attackCollider; + + private bool isInMelee = false; + + + Rigidbody2D rb; + + // private Collider2D_Proxy secondCollider; - void Start() - { + void Start(){ + rb = GetComponent<Rigidbody2D>(); + m_Animator = gameObject.GetComponent<Animator>(); + + followCollider = transform.Find("followCollider").GetComponent<EmptyCollider>(); + followCollider.OnColliderEnter2D_Action += Move_OnColliderEnter2D; + followCollider.OnColliderStay2D_Action += Move_OnColliderStay2D; + followCollider.OnColliderExit2D_Action += Move_OnColliderExit2D; + + attackCollider = transform.Find("MeleeCollider").GetComponent<EmptyCollider>(); + attackCollider.OnColliderEnter2D_Action += Attack_OnColliderEnter2D; + attackCollider.OnColliderStay2D_Action += Attack_OnColliderStay2D; + attackCollider.OnColliderExit2D_Action += Attack_OnColliderExit2D; } - private void RotateAnimation() + private void RotateAnimation(Vector2 direction) { - if (Input.GetAxis("Horizontal") > 0.01f){ + if (direction.x > 0.01f){ gameObject.GetComponent<SpriteRenderer>().flipX = false; - gameObject.transform.Find("weapon_axe").GetComponent<SpriteRenderer>().flipX = false; } - else if (Input.GetAxis("Horizontal") < -0.01f){ + else if (direction.x < -0.01f){ gameObject.GetComponent<SpriteRenderer>().flipX = true; - gameObject.transform.Find("weapon_axe").GetComponent<SpriteRenderer>().flipX = true; - } } private void Update(){ - if (target != null){ - //walk + if (target != null && !isInMelee){ + + /* //walk float step = speed * Time.deltaTime; transform.position = Vector2.MoveTowards(transform.position, target.position, step); //distance = Vector3.Distance (transform.position, target.position); //roter RotateAnimation(); + */ + + TryMove((new Vector2(target.position.x, target.position.y) - rb.position).normalized); } else{ } } - private void OnCollisionStay2D(Collision2D other){ - if (other.gameObject.tag == "Player"){ - if(attackSpeed <= canAttack){ - //add at player møste liv - m_Animator.SetTrigger("attack"); - }else { - canAttack += Time.deltaTime; + private bool TryMove(Vector2 direction) { + + if(direction != Vector2.zero) { + + // Check for potential collisions + int count = rb.Cast( + direction, // X and Y values between -1 and 1 that represent the direction from the body to look for collisions + movementFilter, // The settings that determine where a collision can occur on such as layers to collide with + castCollisions, // List of collisions to store the found collisions into after the Cast is finished + speed * Time.fixedDeltaTime + collisionOffset); // The amount to cast equal to the movement plus an offset + //Debug.Log($"cast {string.Join(", ", castCollisions.Select(x => $"{x.collider.isTrigger}"))}"); + //Debug.Log($"rb.position : {rb.position}"); + //Debug.Log($"target.position : {target.position}"); + //Debug.Log($"direction : {direction}"); + if(count == 0){ + rb.MovePosition(rb.position + direction * speed * Time.fixedDeltaTime); + print($"rb.position {rb.position}"); + print($"direction {direction}"); + RotateAnimation(direction); + + return true; + } else { + return false; + } + } else { + // Can't move if there's no direction to move in + return false; } - } - } + + } +} - private void OnTriggerEnter2D(Collider2D other){ - if (other.gameObject.tag == "Player"){ - - m_Animator.SetTrigger("walk"); - target = other.transform; + public partial class enemyMovement { //attack + private void Attack_OnColliderEnter2D(Collider2D other){ + if (other.gameObject.tag == "Player") + isInMelee = true; + } + + + + private void Attack_OnColliderStay2D(Collider2D other){ + if (other.gameObject.tag == "Player"){ + var player = other.gameObject.GetComponent<PlayerController>(); + if(player.TakeDamage(baseDamage)){ + //knockback ? + //animer nå ? + + } + } + } + private void Attack_OnColliderExit2D(Collider2D other){ + if (other.gameObject.tag == "Player") + isInMelee = false; + } + + } + + public partial class enemyMovement { //move + + private void Move_OnColliderEnter2D(Collider2D other) + { + Debug.Log("enter"); + if (other.gameObject.tag == "Player"){ + Debug.Log("enter if"); + m_Animator.SetTrigger("walk"); + target = other.transform; + } } - } - - - private void OnTriggerExit2D(Collider2D other){ - if (other.gameObject.tag == "Player"){ - m_Animator.SetTrigger("idle"); - target = other.transform; - target = null; + private void Move_OnColliderStay2D(Collider2D other) + { + + if (other.gameObject.tag == "Player"){ + } } - } -} + + private void Move_OnColliderExit2D(Collider2D other) + { + if (other.gameObject.tag == "Player"){ + m_Animator.SetTrigger("idle"); + target = other.transform; + target = null; + } + } + + } + + diff --git a/MrBigsock/Assets/Prefabs/enemy_orc_warrior.prefab b/MrBigsock/Assets/Prefabs/enemy_orc_warrior.prefab index 6a505c92d0018ceab09a7dae73980e548cb2767d..79bd4893f6c7c7af46705055a0e9d3aa9533b7f5 100644 --- a/MrBigsock/Assets/Prefabs/enemy_orc_warrior.prefab +++ b/MrBigsock/Assets/Prefabs/enemy_orc_warrior.prefab @@ -1,89 +1,5 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &1240678898127397734 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3533211250365981028} - - component: {fileID: 4131390337475563008} - m_Layer: 0 - m_Name: weapon_axe - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3533211250365981028 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1240678898127397734} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.076, y: -0.003, z: 0} - m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7097463258699610772} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!212 &4131390337475563008 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1240678898127397734} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - 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: 21300000, guid: 0c02c87762e26c742a94ee93f48e55c3, type: 3} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_FlipX: 0 - m_FlipY: 0 - m_DrawMode: 0 - m_Size: {x: 0.09, y: 0.21} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 0 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 --- !u!1 &2996495149472241661 GameObject: m_ObjectHideFlags: 0 @@ -95,9 +11,9 @@ GameObject: - component: {fileID: 7097463258699610772} - component: {fileID: 65690667081962088} - component: {fileID: 8506405333948921944} - - component: {fileID: 229287625782917783} - component: {fileID: 5891912875293609069} - component: {fileID: 1992931693109878676} + - component: {fileID: 2395291586284291126} m_Layer: 0 m_Name: enemy_orc_warrior m_TagString: Untagged @@ -117,7 +33,8 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 3533211250365981028} + - {fileID: 2753253562357840752} + - {fileID: 1701851832504875480} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -161,7 +78,7 @@ SpriteRenderer: m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 m_SortingLayer: 0 - m_SortingOrder: 1 + m_SortingOrder: 2 m_Sprite: {fileID: 21300000, guid: dfb75b4c193e2994dabfcb50c3cf64e5, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 @@ -181,11 +98,11 @@ Rigidbody2D: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2996495149472241661} - m_BodyType: 1 + m_BodyType: 0 m_Simulated: 1 - m_UseFullKinematicContacts: 0 + m_UseFullKinematicContacts: 1 m_UseAutoMass: 1 - m_Mass: 0.032 + m_Mass: 0.6243647 m_LinearDrag: 0 m_AngularDrag: 0 m_GravityScale: 0 @@ -194,22 +111,6 @@ Rigidbody2D: m_SleepingMode: 1 m_CollisionDetection: 0 m_Constraints: 4 ---- !u!58 &229287625782917783 -CircleCollider2D: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2996495149472241661} - m_Enabled: 1 - m_Density: 1 - m_Material: {fileID: 0} - m_IsTrigger: 1 - m_UsedByEffector: 0 - m_UsedByComposite: 0 - m_Offset: {x: 0, y: 0} - serializedVersion: 2 - m_Radius: 1 --- !u!95 &5891912875293609069 Animator: serializedVersion: 4 @@ -243,4 +144,167 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: speed: 0.6 + collisionOffset: 0.05 + movementFilter: + useTriggers: 0 + useLayerMask: 1 + useDepth: 0 + useOutsideDepth: 0 + useNormalAngle: 0 + useOutsideNormalAngle: 0 + layerMask: + serializedVersion: 2 + m_Bits: 0 + minDepth: 0 + maxDepth: 0 + minNormalAngle: 0 + maxNormalAngle: 0 attackSpeed: 3 +--- !u!61 &2395291586284291126 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2996495149472241661} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 0.06446171, y: -0.1364619} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0.5, y: 0.5} + oldSize: {x: 1, y: 1.25} + newSize: {x: 0.16, y: 0.2} + adaptiveTilingThreshold: 0.5 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + serializedVersion: 2 + m_Size: {x: 0.6390133, y: 0.9770762} + m_EdgeRadius: 0 +--- !u!1 &7539630614846898202 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2753253562357840752} + - component: {fileID: 7566484513581878393} + - component: {fileID: 8365831662590702362} + m_Layer: 3 + m_Name: followCollider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2753253562357840752 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7539630614846898202} + 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_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7097463258699610772} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!58 &7566484513581878393 +CircleCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7539630614846898202} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 0, y: 0} + serializedVersion: 2 + m_Radius: 8 +--- !u!114 &8365831662590702362 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7539630614846898202} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 71e6597ff848be34e979f08b6041384a, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &8620845285361089561 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1701851832504875480} + - component: {fileID: 8983526051028480608} + - component: {fileID: 6373942986610437007} + m_Layer: 3 + m_Name: MeleeCollider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1701851832504875480 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8620845285361089561} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.04, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7097463258699610772} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!58 &8983526051028480608 +CircleCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8620845285361089561} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 0, y: 0} + serializedVersion: 2 + m_Radius: 0.7 +--- !u!114 &6373942986610437007 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8620845285361089561} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 71e6597ff848be34e979f08b6041384a, type: 3} + m_Name: + m_EditorClassIdentifier: