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: 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}

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

@ -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}

@ -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<GridPosition> GetValidActionGridPositionList(GridPosition unitGridPosition) {
List<GridPosition> 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);
}
}
}

@ -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<BulletProjectile>().Setup(targetUnitShootAtPosition);
}