diff --git a/Assets/Prefabs/Plane.prefab b/Assets/Prefabs/Plane.prefab index a143e821..f9c42f56 100644 --- a/Assets/Prefabs/Plane.prefab +++ b/Assets/Prefabs/Plane.prefab @@ -11,7 +11,7 @@ GameObject: - component: {fileID: 3964987777475266848} - component: {fileID: 3732372307782677125} - component: {fileID: 2228715300700879584} - - component: {fileID: 2293275901188804832} + - component: {fileID: 3943989928321416028} m_Layer: 6 m_Name: Plane m_TagString: Untagged @@ -26,13 +26,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3148356769724797727} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 11, y: 0, z: 22} m_LocalScale: {x: 10, y: 10, z: 10} m_ConstrainProportionsScale: 1 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &3732372307782677125 MeshFilter: @@ -86,8 +86,8 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!64 &2293275901188804832 -MeshCollider: +--- !u!65 &3943989928321416028 +BoxCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} @@ -104,7 +104,6 @@ MeshCollider: m_IsTrigger: 0 m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 5 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} + serializedVersion: 3 + m_Size: {x: 9.999999, y: 2.220446e-16, z: 10} + m_Center: {x: 0, y: 0, z: 0.0000000060535967} diff --git a/Assets/Prefabs/Unit.prefab b/Assets/Prefabs/Unit.prefab index 5f48c332..e9d2dc52 100644 --- a/Assets/Prefabs/Unit.prefab +++ b/Assets/Prefabs/Unit.prefab @@ -633,7 +633,7 @@ MonoBehaviour: m_EditorClassIdentifier: obstaclesLayerMask: serializedVersion: 2 - m_Bits: 256 + m_Bits: 320 --- !u!114 &6863272398128881011 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/GameScene_MultiFloors.unity b/Assets/Scenes/GameScene_MultiFloors.unity index 4c5a954e..e5daf756 100644 --- a/Assets/Scenes/GameScene_MultiFloors.unity +++ b/Assets/Scenes/GameScene_MultiFloors.unity @@ -10287,7 +10287,7 @@ PrefabInstance: - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, type: 3} propertyPath: m_LocalPosition.x - value: -8 + value: -12 objectReference: {fileID: 0} - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, type: 3} @@ -10297,7 +10297,7 @@ PrefabInstance: - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, type: 3} propertyPath: m_LocalPosition.z - value: 8 + value: 16 objectReference: {fileID: 0} - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, type: 3} @@ -14443,7 +14443,7 @@ PrefabInstance: - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, type: 3} propertyPath: m_LocalPosition.x - value: -4 + value: -12 objectReference: {fileID: 0} - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, type: 3} @@ -14453,7 +14453,7 @@ PrefabInstance: - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, type: 3} propertyPath: m_LocalPosition.z - value: 8 + value: 6 objectReference: {fileID: 0} - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, type: 3} diff --git a/Assets/Scripts/Actions/ShootAction.cs b/Assets/Scripts/Actions/ShootAction.cs index d47152f6..fbe834bc 100644 --- a/Assets/Scripts/Actions/ShootAction.cs +++ b/Assets/Scripts/Actions/ShootAction.cs @@ -5,11 +5,11 @@ using UnityEngine; namespace Actions { public class ShootAction : BaseAction { - private const float rotationSpeed = 10f; - private const float shootingStateTime = .2f; - private const float coolOffStateTime = 1f; - private const float aimingStateTime = 1.5f; - private const float unitShoulderHeight = 1.7f; + private const float ROTATION_SPEED = 10f; + private const float SHOOTING_STATE_TIME = .2f; + private const float COOL_OFF_STATE_TIME = 1f; + private const float AIMING_STATE_TIME = 1.5f; + private const float UNIT_SHOULDER_HEIGHT = 1.7f; [SerializeField] private LayerMask obstaclesLayerMask; private bool canShootBullet; @@ -33,7 +33,8 @@ namespace Actions { switch (state) { case State.Aiming: Vector3 aimDirection = (TargetUnit.GetWorldPosition() - Unit.GetWorldPosition()).normalized; - transform.forward = Vector3.Lerp(transform.forward, aimDirection, rotationSpeed * Time.deltaTime); + aimDirection.y = 0f; + transform.forward = Vector3.Slerp(transform.forward, aimDirection, ROTATION_SPEED * Time.deltaTime); break; case State.Shooting: if (canShootBullet) { @@ -63,11 +64,11 @@ namespace Actions { switch (state) { case State.Aiming: state = State.Shooting; - stateTimer = shootingStateTime; + stateTimer = SHOOTING_STATE_TIME; break; case State.Shooting: state = State.Cooloff; - stateTimer = coolOffStateTime; + stateTimer = COOL_OFF_STATE_TIME; break; case State.Cooloff: ActionComplete(); @@ -82,7 +83,7 @@ namespace Actions { canShootBullet = true; state = State.Aiming; - stateTimer = aimingStateTime; + stateTimer = AIMING_STATE_TIME; ActionStart(onActionComplete); } @@ -91,25 +92,27 @@ namespace Actions { private List GetValidActionGridPositionList(GridPosition unitGridPosition) { List validGridPositionList = new(); - for (int x = -MaxShootDistance; x <= MaxShootDistance; x++) { - for (int z = -MaxShootDistance; z <= MaxShootDistance; z++) { - GridPosition offsetGridPosition = new(x, z, 0); - GridPosition testGridPosition = unitGridPosition + offsetGridPosition; + for (int xPosition = -MaxShootDistance; xPosition <= MaxShootDistance; xPosition++) { + for (int zPosition = -MaxShootDistance; zPosition <= MaxShootDistance; zPosition++) { + for (int floor = -MaxShootDistance; floor < MaxShootDistance; floor++) { + GridPosition offsetGridPosition = new(xPosition, zPosition, floor); + GridPosition testGridPosition = unitGridPosition + offsetGridPosition; - if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition)) continue; //Only return valid grid positions - if (Mathf.Abs(x) + Mathf.Abs(z) > MaxShootDistance) continue; //Out of Range + if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition)) continue; //Only return valid grid positions + if (Mathf.Abs(xPosition) + Mathf.Abs(zPosition) > MaxShootDistance) continue; //Out of Range - if (!LevelGrid.Instance.HasAnyUnitOnGridPosition(testGridPosition)) continue; //Grid position is empty, no unit + if (!LevelGrid.Instance.HasAnyUnitOnGridPosition(testGridPosition)) continue; //Grid position is empty, no unit - Unit unitAtGridPosition = LevelGrid.Instance.GetUnitAtGridPosition(testGridPosition); - if (unitAtGridPosition.IsEnemy == Unit.IsEnemy) continue; //Both units are on the same 'team' - TargetUnit = unitAtGridPosition; + Unit unitAtGridPosition = LevelGrid.Instance.GetUnitAtGridPosition(testGridPosition); + if (unitAtGridPosition.IsEnemy == Unit.IsEnemy) continue; //Both units are on the same 'team' + TargetUnit = unitAtGridPosition; - Vector3 unitWorldPosition = LevelGrid.Instance.GetWorldPosition(unitGridPosition); - Vector3 shootDir = (TargetUnit.GetWorldPosition() - unitWorldPosition).normalized; - if (Physics.Raycast(unitWorldPosition + Vector3.up * unitShoulderHeight, shootDir, Vector3.Distance(unitWorldPosition, TargetUnit.GetWorldPosition()), obstaclesLayerMask)) continue; // Blocked by an obstacle + Vector3 unitWorldPosition = LevelGrid.Instance.GetWorldPosition(unitGridPosition); + Vector3 shootDir = (TargetUnit.GetWorldPosition() - unitWorldPosition).normalized; + if (Physics.Raycast(unitWorldPosition + Vector3.up * UNIT_SHOULDER_HEIGHT, shootDir, Vector3.Distance(unitWorldPosition, TargetUnit.GetWorldPosition()), obstaclesLayerMask)) continue; // Blocked by an obstacle - validGridPositionList.Add(testGridPosition); + validGridPositionList.Add(testGridPosition); + } } } diff --git a/Assets/Scripts/UnitAnimator.cs b/Assets/Scripts/UnitAnimator.cs index 6116f1be..9027951b 100644 --- a/Assets/Scripts/UnitAnimator.cs +++ b/Assets/Scripts/UnitAnimator.cs @@ -4,14 +4,15 @@ using UnityEngine; using UnityEngine.Serialization; public class UnitAnimator : MonoBehaviour { + private const float UNIT_SHOULDER_HEIGHT = 1.7f; private static readonly int isWalking = Animator.StringToHash("IsWalking"); private static readonly int shoot = Animator.StringToHash("Shoot"); private static readonly int swordSlash = Animator.StringToHash("SwordSlash"); private static readonly int jumpUp = Animator.StringToHash("JumpUp"); private static readonly int jumpDown = Animator.StringToHash("JumpDown"); + [SerializeField] private Animator animator; [SerializeField] private Transform bulletProjectilePrefab; - [SerializeField] private Transform rifleTransform; [SerializeField] private Transform swordTransform; @@ -53,7 +54,7 @@ public class UnitAnimator : MonoBehaviour { animator.SetTrigger(shoot); Transform bulletProjectPrefab = Instantiate(bulletProjectilePrefab, shootPointTransform.position, Quaternion.identity); Vector3 targetUnitShootAtPosition = e.TargetUnit.GetWorldPosition(); - targetUnitShootAtPosition.y = shootPointTransform.position.y; + targetUnitShootAtPosition.y = UNIT_SHOULDER_HEIGHT; bulletProjectPrefab.GetComponent().Setup(targetUnitShootAtPosition); }