From 4cfbf23960235322adc31ed64543c395ec005304 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Mon, 21 Feb 2022 15:53:23 +0300 Subject: [PATCH] Enemy Movement and BasicPatrollingEnemyAI has added --- Assets/Scripts/AI.meta | 8 + Assets/Scripts/AI/BasicPatrollingEnemyAI.cs | 58 ++++++ .../Scripts/AI/BasicPatrollingEnemyAI.cs.meta | 11 ++ Assets/Scripts/Movement/EnemyMovement.cs | 46 +++++ Assets/Scripts/Movement/EnemyMovement.cs.meta | 11 ++ ProjectSettings/SceneTemplateSettings.json | 167 ++++++++++++++++++ 6 files changed, 301 insertions(+) create mode 100644 Assets/Scripts/AI.meta create mode 100644 Assets/Scripts/AI/BasicPatrollingEnemyAI.cs create mode 100644 Assets/Scripts/AI/BasicPatrollingEnemyAI.cs.meta create mode 100644 Assets/Scripts/Movement/EnemyMovement.cs create mode 100644 Assets/Scripts/Movement/EnemyMovement.cs.meta create mode 100644 ProjectSettings/SceneTemplateSettings.json diff --git a/Assets/Scripts/AI.meta b/Assets/Scripts/AI.meta new file mode 100644 index 0000000..7d299ee --- /dev/null +++ b/Assets/Scripts/AI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d4e4f06743dc1be42806947cd62fb68e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AI/BasicPatrollingEnemyAI.cs b/Assets/Scripts/AI/BasicPatrollingEnemyAI.cs new file mode 100644 index 0000000..75be712 --- /dev/null +++ b/Assets/Scripts/AI/BasicPatrollingEnemyAI.cs @@ -0,0 +1,58 @@ +using Movement; +using UnityEngine; + +namespace AI +{ + public class BasicPatrollingEnemyAI : MonoBehaviour + { + [SerializeField] protected bool isMovingRight = false; + + [Space] + [Header("Left Detector")] + [SerializeField] protected Vector2 leftCliffDetectorOrigin = Vector2.left; + [SerializeField] protected Vector2 leftCliffDetectorSize = Vector2.one; + + [Space] + [Header("Right Detector")] + [SerializeField] protected Vector2 rightCliffDetectorOrigin = Vector2.right; + [SerializeField] protected Vector2 rightCliffDetectorSize = Vector2.one; + + [Space] + [Header("Right Detector")] + [SerializeField] protected LayerMask groundLayerMask = ~(1 << 6); // Everything except the "Player" layer + + protected IMovement movement = null; + protected Collider2D[] nonAllocColliderArray = new Collider2D[10]; + + protected Vector2 leftCliffPosition => GetCliffPositionInWorld(leftCliffDetectorOrigin); + protected Vector2 rightCliffPosition => GetCliffPositionInWorld(rightCliffDetectorOrigin); + + protected bool IsLeftDetectorCollided => Physics2D.OverlapBoxNonAlloc(leftCliffPosition, leftCliffDetectorSize, 0, nonAllocColliderArray, groundLayerMask) != 0; + protected bool IsRightDetectorCollided => Physics2D.OverlapBoxNonAlloc(rightCliffPosition, rightCliffDetectorSize, 0, nonAllocColliderArray, groundLayerMask) != 0; + + protected virtual void Awake() + { + movement = gameObject.AddComponent(); + } + + protected virtual void FixedUpdate() + { + if ((isMovingRight && !IsRightDetectorCollided) || (!isMovingRight && !IsLeftDetectorCollided)) + isMovingRight = !isMovingRight; + + movement.Move(isMovingRight ? 1f : -1f); + } + + protected Vector2 GetCliffPositionInWorld(Vector2 cliffPosition) + => cliffPosition + (Vector2)transform.position; + + protected virtual void OnDrawGizmosSelected() + { + Gizmos.color = IsLeftDetectorCollided ? Color.green : Color.red; + Gizmos.DrawWireCube(leftCliffPosition, leftCliffDetectorSize); + + Gizmos.color = IsRightDetectorCollided ? Color.green : Color.red; + Gizmos.DrawWireCube(rightCliffPosition, rightCliffDetectorSize); + } + } +} diff --git a/Assets/Scripts/AI/BasicPatrollingEnemyAI.cs.meta b/Assets/Scripts/AI/BasicPatrollingEnemyAI.cs.meta new file mode 100644 index 0000000..26dd4b0 --- /dev/null +++ b/Assets/Scripts/AI/BasicPatrollingEnemyAI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 321c5495f0d597749bf29c3a2966aa4a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Movement/EnemyMovement.cs b/Assets/Scripts/Movement/EnemyMovement.cs new file mode 100644 index 0000000..433a433 --- /dev/null +++ b/Assets/Scripts/Movement/EnemyMovement.cs @@ -0,0 +1,46 @@ +using UnityEngine; + +namespace Movement +{ + [RequireComponent(typeof(Rigidbody2D))] + public class EnemyMovement : MonoBehaviour, IMovement + { + private Rigidbody2D _rigidbody2D = null; + private bool _isPaused = false; + private float moveValue = 0f; + + public float BaseSpeed { get; set; } = 1f; + public bool IsPaused => _isPaused; + + private void Awake() + => _rigidbody2D = GetComponent(); + + private void FixedUpdate() + { + if (IsPaused) + return; + + Vector2 velocity = _rigidbody2D.velocity; + velocity.x = moveValue; + _rigidbody2D.velocity = velocity; + } + + public void Move(float value) + => moveValue = value * BaseSpeed; + + public void Pause() + { + _isPaused = true; + UpdateRigidbody(); + } + + public void Resume() + { + _isPaused = false; + UpdateRigidbody(); + } + + private void UpdateRigidbody() + => _rigidbody2D.simulated = !_isPaused; + } +} diff --git a/Assets/Scripts/Movement/EnemyMovement.cs.meta b/Assets/Scripts/Movement/EnemyMovement.cs.meta new file mode 100644 index 0000000..f3cca92 --- /dev/null +++ b/Assets/Scripts/Movement/EnemyMovement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ae10931055aaa44d8c518e9efa3d034 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/SceneTemplateSettings.json b/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 0000000..6f3e60f --- /dev/null +++ b/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,167 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": false + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicMaterial", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": false + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "ignore": false, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + "newSceneOverride": 0 +} \ No newline at end of file