EscapeShooter/My project/Assets/Project Files/Game/Scripts/Enemy/EnemyAnimationCallback.cs

168 lines
4.8 KiB
C#

using UnityEngine;
namespace Watermelon.SquadShooter
{
public class EnemyAnimationCallback : MonoBehaviour
{
private BaseEnemyBehavior baseEnemyBehavior;
public void Init(BaseEnemyBehavior baseEnemyBehavior)
{
this.baseEnemyBehavior = baseEnemyBehavior;
}
public void OnCallbackInvoked(EnemyCallbackType enemyCallbackType)
{
baseEnemyBehavior.OnAnimatorCallback(enemyCallbackType);
}
public void OnHitCallback()
{
OnCallbackInvoked(EnemyCallbackType.Hit);
}
public void OnLeftHitCallback()
{
OnCallbackInvoked(EnemyCallbackType.LeftHit);
}
public void OnRightHitCallback()
{
OnCallbackInvoked(EnemyCallbackType.RightHit);
}
public void OnHitFinishCallback()
{
OnCallbackInvoked(EnemyCallbackType.HitFinish);
}
public void OnBossLeftStepCallback()
{
OnCallbackInvoked(EnemyCallbackType.BossLeftStep);
}
public void OnBossRightStepCallback()
{
OnCallbackInvoked(EnemyCallbackType.BossRightStep);
}
public void OnBossDeathFallCallback()
{
OnCallbackInvoked(EnemyCallbackType.BossDeathFall);
}
public void OnBossEnterFallCallback()
{
OnCallbackInvoked(EnemyCallbackType.BossEnterFall);
}
public void OnBossKickCallback()
{
OnCallbackInvoked(EnemyCallbackType.BossKick);
}
public void OnBossEnterFallFinishedCallback()
{
OnCallbackInvoked(EnemyCallbackType.BossEnterFallFinished);
}
public void OnReloadFinishedCallback()
{
OnCallbackInvoked(EnemyCallbackType.ReloadFinished);
}
[SerializeField] float ragdollSizeMultiplier = 1;
[Button("Multiply Ragdoll Size")]
private void MultiplyRagdollWidth()
{
if (Application.isPlaying) return;
MultiplyRagdollWidthRecursively(transform);
}
private void MultiplyRagdollWidthRecursively(Transform parent)
{
for (int i = 0; i < parent.childCount; i++)
{
var child = parent.GetChild(i);
if (child.gameObject.layer == LayerMask.NameToLayer("Ragdoll"))
{
var sphereCollider = child.gameObject.GetComponent<SphereCollider>();
var capsuleCollider = child.gameObject.GetComponent<CapsuleCollider>();
var boxCollider = child.gameObject.GetComponent<BoxCollider>();
if (sphereCollider != null) sphereCollider.radius *= ragdollSizeMultiplier;
if (capsuleCollider != null) capsuleCollider.radius *= ragdollSizeMultiplier;
if(boxCollider != null)
{
boxCollider.size = boxCollider.size.MultX(ragdollSizeMultiplier).MultZ(ragdollSizeMultiplier);
}
}
MultiplyRagdollWidthRecursively(child);
}
}
[Button("Clear Ragdoll")]
private void ClearRagdoll()
{
if (Application.isPlaying) return;
ClearRagdollRecursively(transform);
}
private void ClearRagdollRecursively(Transform parent)
{
for(int i = 0; i < parent.childCount; i++)
{
var child = parent.GetChild(i);
if (child.gameObject.layer == LayerMask.NameToLayer("Ragdoll"))
{
var characterJoint = child.gameObject.GetComponent<CharacterJoint>();
if(characterJoint != null)
{
DestroyImmediate(characterJoint);
}
var rigidbody = child.gameObject.GetComponent<Rigidbody>();
if (rigidbody != null)
{
DestroyImmediate(rigidbody);
}
var collider = child.gameObject.GetComponent<Collider>();
while(collider != null)
{
DestroyImmediate(collider);
collider = child.gameObject.GetComponent<Collider>();
}
}
ClearRagdollRecursively(child);
}
}
}
public enum EnemyCallbackType
{
Hit = 0,
HitFinish = 1,
BossLeftStep = 2,
BossRightStep = 3,
BossDeathFall = 4,
BossEnterFall = 5,
BossKick = 6,
BossEnterFallFinished = 7,
ReloadFinished = 8,
LeftHit = 9,
RightHit = 10,
}
}