Multi-Floors Shoot Action

MultiFloors
Sascha 2023-08-19 15:09:45 +07:00
parent d18277e5ef
commit 9b78768a79
5 changed files with 41 additions and 38 deletions

@ -11,7 +11,7 @@ GameObject:
- component: {fileID: 3964987777475266848} - component: {fileID: 3964987777475266848}
- component: {fileID: 3732372307782677125} - component: {fileID: 3732372307782677125}
- component: {fileID: 2228715300700879584} - component: {fileID: 2228715300700879584}
- component: {fileID: 2293275901188804832} - component: {fileID: 3943989928321416028}
m_Layer: 6 m_Layer: 6
m_Name: Plane m_Name: Plane
m_TagString: Untagged m_TagString: Untagged
@ -26,13 +26,13 @@ Transform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3148356769724797727} m_GameObject: {fileID: 3148356769724797727}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 11, y: 0, z: 22} m_LocalPosition: {x: 11, y: 0, z: 22}
m_LocalScale: {x: 10, y: 10, z: 10} m_LocalScale: {x: 10, y: 10, z: 10}
m_ConstrainProportionsScale: 1 m_ConstrainProportionsScale: 1
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 11
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3732372307782677125 --- !u!33 &3732372307782677125
MeshFilter: MeshFilter:
@ -86,8 +86,8 @@ MeshRenderer:
m_SortingLayer: 0 m_SortingLayer: 0
m_SortingOrder: 0 m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0} m_AdditionalVertexStreams: {fileID: 0}
--- !u!64 &2293275901188804832 --- !u!65 &3943989928321416028
MeshCollider: BoxCollider:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
@ -104,7 +104,6 @@ MeshCollider:
m_IsTrigger: 0 m_IsTrigger: 0
m_ProvidesContacts: 0 m_ProvidesContacts: 0
m_Enabled: 1 m_Enabled: 1
serializedVersion: 5 serializedVersion: 3
m_Convex: 0 m_Size: {x: 9.999999, y: 2.220446e-16, z: 10}
m_CookingOptions: 30 m_Center: {x: 0, y: 0, z: 0.0000000060535967}
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}

@ -633,7 +633,7 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
obstaclesLayerMask: obstaclesLayerMask:
serializedVersion: 2 serializedVersion: 2
m_Bits: 256 m_Bits: 320
--- !u!114 &6863272398128881011 --- !u!114 &6863272398128881011
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

@ -10287,7 +10287,7 @@ PrefabInstance:
- target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8,
type: 3} type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: -8 value: -12
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8,
type: 3} type: 3}
@ -10297,7 +10297,7 @@ PrefabInstance:
- target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8,
type: 3} type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
value: 8 value: 16
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8,
type: 3} type: 3}
@ -14443,7 +14443,7 @@ PrefabInstance:
- target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8,
type: 3} type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: -4 value: -12
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8,
type: 3} type: 3}
@ -14453,7 +14453,7 @@ PrefabInstance:
- target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8,
type: 3} type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
value: 8 value: 6
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8, - target: {fileID: 4785646500396285758, guid: 1c577f9fe0c6219a992900cb942290f8,
type: 3} type: 3}

@ -5,11 +5,11 @@ using UnityEngine;
namespace Actions { namespace Actions {
public class ShootAction : BaseAction { public class ShootAction : BaseAction {
private const float rotationSpeed = 10f; private const float ROTATION_SPEED = 10f;
private const float shootingStateTime = .2f; private const float SHOOTING_STATE_TIME = .2f;
private const float coolOffStateTime = 1f; private const float COOL_OFF_STATE_TIME = 1f;
private const float aimingStateTime = 1.5f; private const float AIMING_STATE_TIME = 1.5f;
private const float unitShoulderHeight = 1.7f; private const float UNIT_SHOULDER_HEIGHT = 1.7f;
[SerializeField] private LayerMask obstaclesLayerMask; [SerializeField] private LayerMask obstaclesLayerMask;
private bool canShootBullet; private bool canShootBullet;
@ -33,7 +33,8 @@ namespace Actions {
switch (state) { switch (state) {
case State.Aiming: case State.Aiming:
Vector3 aimDirection = (TargetUnit.GetWorldPosition() - Unit.GetWorldPosition()).normalized; 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; break;
case State.Shooting: case State.Shooting:
if (canShootBullet) { if (canShootBullet) {
@ -63,11 +64,11 @@ namespace Actions {
switch (state) { switch (state) {
case State.Aiming: case State.Aiming:
state = State.Shooting; state = State.Shooting;
stateTimer = shootingStateTime; stateTimer = SHOOTING_STATE_TIME;
break; break;
case State.Shooting: case State.Shooting:
state = State.Cooloff; state = State.Cooloff;
stateTimer = coolOffStateTime; stateTimer = COOL_OFF_STATE_TIME;
break; break;
case State.Cooloff: case State.Cooloff:
ActionComplete(); ActionComplete();
@ -82,7 +83,7 @@ namespace Actions {
canShootBullet = true; canShootBullet = true;
state = State.Aiming; state = State.Aiming;
stateTimer = aimingStateTime; stateTimer = AIMING_STATE_TIME;
ActionStart(onActionComplete); ActionStart(onActionComplete);
} }
@ -91,25 +92,27 @@ namespace Actions {
private List<GridPosition> GetValidActionGridPositionList(GridPosition unitGridPosition) { private List<GridPosition> GetValidActionGridPositionList(GridPosition unitGridPosition) {
List<GridPosition> validGridPositionList = new(); List<GridPosition> validGridPositionList = new();
for (int x = -MaxShootDistance; x <= MaxShootDistance; x++) { for (int xPosition = -MaxShootDistance; xPosition <= MaxShootDistance; xPosition++) {
for (int z = -MaxShootDistance; z <= MaxShootDistance; z++) { for (int zPosition = -MaxShootDistance; zPosition <= MaxShootDistance; zPosition++) {
GridPosition offsetGridPosition = new(x, z, 0); for (int floor = -MaxShootDistance; floor < MaxShootDistance; floor++) {
GridPosition testGridPosition = unitGridPosition + offsetGridPosition; GridPosition offsetGridPosition = new(xPosition, zPosition, floor);
GridPosition testGridPosition = unitGridPosition + offsetGridPosition;
if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition)) continue; //Only return valid grid positions if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition)) continue; //Only return valid grid positions
if (Mathf.Abs(x) + Mathf.Abs(z) > MaxShootDistance) continue; //Out of Range 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); Unit unitAtGridPosition = LevelGrid.Instance.GetUnitAtGridPosition(testGridPosition);
if (unitAtGridPosition.IsEnemy == Unit.IsEnemy) continue; //Both units are on the same 'team' if (unitAtGridPosition.IsEnemy == Unit.IsEnemy) continue; //Both units are on the same 'team'
TargetUnit = unitAtGridPosition; TargetUnit = unitAtGridPosition;
Vector3 unitWorldPosition = LevelGrid.Instance.GetWorldPosition(unitGridPosition); Vector3 unitWorldPosition = LevelGrid.Instance.GetWorldPosition(unitGridPosition);
Vector3 shootDir = (TargetUnit.GetWorldPosition() - unitWorldPosition).normalized; 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 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);
}
} }
} }

@ -4,14 +4,15 @@ using UnityEngine;
using UnityEngine.Serialization; using UnityEngine.Serialization;
public class UnitAnimator : MonoBehaviour { public class UnitAnimator : MonoBehaviour {
private const float UNIT_SHOULDER_HEIGHT = 1.7f;
private static readonly int isWalking = Animator.StringToHash("IsWalking"); private static readonly int isWalking = Animator.StringToHash("IsWalking");
private static readonly int shoot = Animator.StringToHash("Shoot"); private static readonly int shoot = Animator.StringToHash("Shoot");
private static readonly int swordSlash = Animator.StringToHash("SwordSlash"); private static readonly int swordSlash = Animator.StringToHash("SwordSlash");
private static readonly int jumpUp = Animator.StringToHash("JumpUp"); private static readonly int jumpUp = Animator.StringToHash("JumpUp");
private static readonly int jumpDown = Animator.StringToHash("JumpDown"); private static readonly int jumpDown = Animator.StringToHash("JumpDown");
[SerializeField] private Animator animator; [SerializeField] private Animator animator;
[SerializeField] private Transform bulletProjectilePrefab; [SerializeField] private Transform bulletProjectilePrefab;
[SerializeField] private Transform rifleTransform; [SerializeField] private Transform rifleTransform;
[SerializeField] private Transform swordTransform; [SerializeField] private Transform swordTransform;
@ -53,7 +54,7 @@ public class UnitAnimator : MonoBehaviour {
animator.SetTrigger(shoot); animator.SetTrigger(shoot);
Transform bulletProjectPrefab = Instantiate(bulletProjectilePrefab, shootPointTransform.position, Quaternion.identity); Transform bulletProjectPrefab = Instantiate(bulletProjectilePrefab, shootPointTransform.position, Quaternion.identity);
Vector3 targetUnitShootAtPosition = e.TargetUnit.GetWorldPosition(); Vector3 targetUnitShootAtPosition = e.TargetUnit.GetWorldPosition();
targetUnitShootAtPosition.y = shootPointTransform.position.y; targetUnitShootAtPosition.y = UNIT_SHOULDER_HEIGHT;
bulletProjectPrefab.GetComponent<BulletProjectile>().Setup(targetUnitShootAtPosition); bulletProjectPrefab.GetComponent<BulletProjectile>().Setup(targetUnitShootAtPosition);
} }