OneShotOneKill/Assets/Script/InGame/Actor/MobActor.cs

168 lines
4.6 KiB
C#

using CodeStage.AntiCheat.ObscuredTypes;
using System.Collections;
using UnityEngine;
public enum eMobState { Move, Attack, KnockBack, Die }
public class MobActor : MonoBehaviour
{
public MobShields m_MobShields;
bool bBoss;
MonsterTableData m_Data;
float FenceY, m_attackTimer;
eMobState m_State = eMobState.Move;
Animator m_Animator;
HUD_HP m_HUD_HP;
Vector3 v3_knockBack;
float t_knockback;
private void OnValidate()
{
m_MobShields = GetComponentInChildren<MobShields>();
}
string poolKey;
IngameMgr owner;
public void SetOwner(IngameMgr mgr, string key)
{
owner = mgr;
poolKey = key;
}
public void Die()
{
owner.ReturnMob(this);
}
public string GetPoolKey()
{
return poolKey;
}
ObscuredInt _Attack; public int m_Attack { get { return _Attack; } set { _Attack = value; _Attack.RandomizeCryptoKey(); } }
ObscuredInt _HP; public int m_HP { get { return _HP; } set { _HP = value; _HP.RandomizeCryptoKey(); } }
private void Awake()
{
var srs = GetComponentsInChildren<SpriteRenderer>(true);
for (int i = 0; i < srs.Length; i++)
srs[i].sortingOrder -= 5;
m_Animator = GetComponentInChildren<Animator>();
}
private void Update()
{
float distToFence = transform.position.y - FenceY;
switch (m_State)
{
case eMobState.Move:
if (distToFence <= m_Data.f_AttackRange)
OnEnterAttack();
else
Move();
break;
case eMobState.KnockBack:
t_knockback += Time.deltaTime;
transform.position = Vector3.Lerp(transform.position, v3_knockBack, t_knockback);
if (t_knockback >= 1f)
m_State = eMobState.Move;
break;
case eMobState.Attack:
Attack();
break;
}
}
public void Set(bool isboss, MonsterTableData data, float fenceY)
{
gameObject.SetActive(true);
if (m_HUD_HP == null)
m_HUD_HP = DSUtil.Get_Clone<HUD_HP>("HUD/HUD_HP", IngameMgr.Ins.tf_hudparent);
m_State = eMobState.Move;
m_Data = data;
FenceY = fenceY;
m_attackTimer = m_Data.f_AttackDelay;
bBoss = isboss;
var curstagedata = IngameMgr.Ins.Get_CurStageTData();
m_Attack = m_Data.n_DefaultAttack + (bBoss ? curstagedata.n_DefaultBossAttack : curstagedata.n_DefaultEnemyAttack);
m_HP = m_Data.n_DefaultHp + (bBoss ? curstagedata.n_DefaultBossHp : curstagedata.n_DefaultEnemyHp);
(m_HUD_HP.transform as RectTransform).anchoredPosition = Vector2.one * 10000f;
m_HUD_HP.Set(transform, m_HP);
m_MobShields.Set(data);
}
void Move()
{
transform.position += Vector3.down * Time.deltaTime * m_Data.f_MoveSpeed;
}
void OnEnterAttack()
{
m_State = eMobState.Attack;
// 이동 정지 시점 보정 (너무 파고들지 않게)
Vector3 pos = transform.position;
pos.y = FenceY + m_Data.f_AttackRange;
transform.position = pos;
// 애니메이션, 공격 쿨타임 초기화 등
}
void Attack()
{
m_attackTimer -= Time.deltaTime;
if (m_attackTimer > 0f)
return;
m_attackTimer = m_Data.f_AttackDelay;
//m_Animator.speed = 2f;
m_Animator.SetTrigger("att");
StartCoroutine(Co_AttackProjectile());
}
IEnumerator Co_AttackProjectile()
{
yield return new WaitForSeconds(1f);
ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData
{
IsPC = false,
m_Data = table_projectile.Ins.Get_Data(m_Data.n_ProjectileID),
tf_Start = transform,
Dmg = m_Attack
});
}
public void Get_Dmg(ProjectileData data)
{
m_HP -= data.Dmg;
m_HUD_HP.Set(m_HP);
if (m_HP <= 0)
{
if (m_State == eMobState.Die) return;
m_State = eMobState.Die;
IngameMgr.Ins.Add_MobKill(m_Data.n_DropExp);
gameObject.SetActive(false);
}
else if (!bBoss)
{
m_State = eMobState.KnockBack;
v3_knockBack = transform.position + new Vector3(0f,
data.m_Data.f_KnockbackDistance + IngameMgr.Ins.Get_SkillValue(eSkillType.Knockback));
t_knockback = 0f;
}
}
public void Off()
{
gameObject.SetActive(false);
m_HUD_HP.gameObject.SetActive(false);
}
}