몬스터 시스템
몬스터 시스템은 상태 기반 AI를 이용해 몬스터의 행동을 제어하는 전투 시스템이다.
몬스터는 대기, 순찰, 추적, 공격, 피격, 복귀, 사망과 같은 상태를 가지며 플레이어와의 거리 및 상황에 따라 상태가 전환된다.
또한 몬스터 머리 위에는 체력바 UI가 생성되어 플레이어와의 거리에 따라 표시되며, 피해를 입을 때마다 체력이 실시간으로 갱신된다.
몬스터가 사망하면 아이템이 드랍되고 퀘스트 처리가 함께 이루어진다.
목차
1. 유니티 구현
1.1. 몬스터 오브젝트 구성
1.2. Animator 기반 몬스터 애니메이션
1.3. NavMeshAgent를 이용한 몬스터 이동
1.4. 월드 공간 체력바 UI
2. 전체 코드
유니티 구현
1.1. 몬스터 오브젝트 구성
몬스터 오브젝트에는 이동, 전투, 충돌 판정을 처리하기 위해 여러 Unity 컴포넌트를 추가하였다.
몬스터의 물리 처리를 위해 Rigidbody 컴포넌트를 추가하였다.
Rigidbody는 Unity 물리 엔진에서 물리 연산의 대상이 되는 컴포넌트로, 중력, 충돌 반응 등을 처리한다.
몬스터는 환경 충돌은 필요하지만 물리적으로 넘어지거나 밀릴 필요는 없기 때문에 Use Gravity와 Is Kinematic을 활성화하여 물리 시뮬레이션의 영향을 최소화하면서 충돌 판정만 유지하도록 설정하였다.

플레이어와의 공격 판정을 위해 BoxCollider 컴포넌트를 추가하고 Is Trigger 옵션을 활성화하였다.
Trigger Collider는 물리적인 충돌 반응을 발생시키지 않고, 다른 Collider와 겹쳤을 때 이벤트를 전달하는 역할을 한다.
BoxCollider는 몬스터의 공격 범위 사이즈로 설정한다.
이를 통해 플레이어가 몬스터의 공격 범위 안에 들어왔는지 감지하고 전투 판정을 처리할 수 있다.
1.2. Animator 기반 몬스터 애니메이션
몬스터의 행동 상태에 따라 애니메이션이 자연스럽게 전환되도록 하기 위해 Unity Animator Controller를 사용하였다.
Animator는 상태(State)와 전이(Transition)로 구성된 상태 머신 구조로 동작하며, 몬스터의 행동 상태에 따라 Idle(기본 대기 상태), Walk(순찰 이동 상태), Run(추적 상태), Attack(공격), Damage(피격), Die(사망)와 같은 애니메이션이 전환되도록 구성하였다.

몬스터는 게임 로직에서 상태가 변경될 때 Animator 파라미터 값을 변경하고, Animator Controller는 이 값을 기준으로 애니메이션을 전환한다.
Animator에는 몬스터 상태를 제어하기 위해 다음과 같은 파라미터를 사용하였다.
- Bool 값 : Idle, Walk, Run, Attack
- Trigger 값 : Damage, Die
이 파라미터들은 몬스터 AI 코드에서 상태에 따라 변경되며, Animator Controller는 이 값을 조건으로 애니메이션 전이를 수행한다.
예를 들어 몬스터가 플레이어를 추적하면 Run 파라미터가 true로 설정되고, Animator는 Idle 또는 Walk 상태에서 Run 상태로 전환된다.
피격(Damage)과 사망(Die) 상태는 현재 애니메이션과 관계없이 즉시 실행되어야 한다.
이를 위해 Animator Controller의 Any State 기능을 사용하였다.
Any State는 현재 어떤 애니메이션 상태에 있든지 관계없이 특정 조건이 충족되면 해당 상태로 바로 전환되는 기능이다.
다음과 같은 전이 구조를 사용하였다.
- Any State → Die
- Any State → Dizzy
Any State → Die / Dizzy 전이는 긴급 상태 전환이다.
예를 들어, 몬스터가 공격 중이거나 달리고 있는 상황에서 피격(Damage) 또는 사망(Die) 상태가 발생하면
현재 애니메이션이 끝날 때까지 기다리면 안 된다.
Has Exit Time이 true라면, 공격 애니메이션이 1초라고 할 때, 플레이어가 몬스터를 죽였는데, 공격 애니메이션 끝날 때까지 기다린 뒤 죽는다.
이는 매우 어색한 현상이고, 플레이어에게 몬스터가 살아있는 듯한 인식을 줄 수 있다.
따라서 Has Exit Time을 꺼서 즉시 전환해야 한다.
Has Exit Time이 off라면 즉시 전이한다.
이를 통해 몬스터가 이동 중이거나 공격 중이라도 피해를 입으면 즉시 피격 애니메이션이 재생되고, 체력이 0이 되면 즉시 사망 애니메이션이 실행되도록 구성하였다.
[ 이동 애니메이션 전환 ]
몬스터의 기본 이동 상태는 Idle, Walk, Run 세 가지 애니메이션으로 구성하였다.
이 상태들은 플레이어와의 거리와 몬스터 AI 상태에 따라 즉시 전환되어야 하기 때문에 Has Exit Time을 비활성화하였다.
예를 들어 Idle 상태에서 순찰 이동을 시작하면 Walk 파라미터가 true로 설정되며 Walk 애니메이션으로 전환된다.
Idle → Walk
- Has Exit Time : Off
- Condition : Idle(false), Walk(true)
반대로 이동이 끝나면 Walk 파라미터가 false가 되고 Idle 상태로 전환된다.
Walk → Idle
- Has Exit Time : Off
- Condition : Idle(true), Walk(false)
이런식으로 Idle ↔ Run, Walk ↔ Run 도 같은 구조이다.
[공격 애니메이션 전환]
몬스터가 플레이어의 공격 범위에 들어오면 Attack 애니메이션이 실행된다.
Idle → Attack
- Has Exit Time : Off
- Condition : Idle(false), Attack(true)
Walk → Attack
- Has Exit Time : Off
- Condition : Walk(false), Attack(true)
Run → Attack
- Has Exit Time : Off
- Condition : Attack(true), Run(false)
공격 애니메이션이 끝난 후에는 상황에 따라 Idle, Walk 또는 Run 상태로 다시 전환되도록 구성하였다.
이때 공격 애니메이션이 자연스럽게 끝난 뒤 전환되도록 일부 전이에서는 Has Exit Time을 활성화하였다.
Attack → Idle
- Has Exit Time : On
- Condition : Walk(true), Attack(false)
Attack → Walk
- Has Exit Time : On
- Condition : Walk(true), Attack(false)
Attack → Run
- Has Exit Time : On
- Condition : Attack(false), Run(true)
이렇게 생성된 Animator Controller을 몬스터 Animator의 Controller로 설정한다.

이때, Apply Root Motion는 Off로 비활성화 하였다.
Root Motion을 사용하지 않고 NavMeshAgent로 이동을 제어하기 때문에 Apply Root Motion은 비활성화하였다.
1.3. NavMeshAgent를 이용한 몬스터 이동
몬스터의 이동 AI는 Unity의 NavMeshAgent 컴포넌트를 사용하여 구현하였다.
NavMeshAgent는 Unity의 내비게이션 시스템에서 경로 탐색과 이동을 담당하는 컴포넌트로, 목적지까지의 최적 경로를 자동으로 계산한다.
몬스터는 기본적으로 지정된 영역을 순찰하다가 플레이어가 일정 거리 안에 들어오면 추적을 시작하고, 공격 범위에 도달하면 공격 상태로 전환된다.
플레이어가 일정 거리 이상 멀어지면 다시 시작 위치로 복귀하는 구조로 설계하였다.

몬스터가 NavMeshAgent를 통해 이동하려면 먼저 맵에서 이동 가능한 영역을 NavMesh로 생성하는 과정(Bake)이 필요하다.
NavMesh는 Unity 내비게이션 시스템에서 AI가 이동할 수 있는 영역을 미리 계산하여 저장한 데이터로, 몬스터는 이 영역을 기반으로 경로 탐색(Pathfinding)을 수행한다.
이를 위해 맵의 지면 오브젝트에 Navigation Static 설정을 활성화하여 내비게이션 계산 대상에 포함시켰다.
이후 Navigation 창에서 Bake를 실행하면 지면 영역이 파란색 NavMesh 영역으로 표시되며, 해당 영역이 몬스터가 이동할 수 있는 경로로 사용된다.
몬스터 오브젝트에는 NavMeshAgent 컴포넌트를 추가하고 목적지를 설정하면, NavMeshAgent는 Bake된 NavMesh 데이터를 기반으로 목적지까지의 최적 경로를 자동으로 계산한다.
이 구조를 통해 몬스터가 장애물을 피하면서 플레이어를 추적하거나 순찰 경로를 따라 자연스럽게 이동하도록 구현하였다.

NavMeshAgent에서 Base Offset을 0으로 설정하여 몬스터의 이동 기준 높이를 지면과 동일하게 설정하였다.
Radius는 0.5로 설정하여 몬스터 충돌 반경을 설정하여 이동 중 다른 오브젝트와 겹치지 않도록 하였다.
Height는 2로 설정하여 몬스터의 NavMesh 충돌 영역을 설정하였다.
1.4. 월드 공간 체력바 UI

몬스터의 체력 상태를 플레이어에게 보여주기 위해 World Space Canvas를 이용한 체력바 UI를 구현하였다.
체력바는 Canvas 오브젝트를 생성한 뒤 Render Mode를 World Space로 설정하여 구현하였다.
World Space Canvas는 UI가 화면 UI가 아니라 3D 월드 공간 안에서 렌더링되는 UI이다.
따라서 체력바는 몬스터 머리 위에 배치되어 실제 오브젝트처럼 동작하며, 카메라 위치에 따라 자연스럽게 보이도록 설정할 수 있다.
또한, World Space Canvas는 기본적으로 UI 좌표 기준 크기를 사용하기 때문에 그대로 사용할 경우 월드 공간에서 UI가 매우 크게 표시된다.
이를 해결하기 위해 Canvas의 Transform Scale을 (0.005, 0.005, 0.005) 로 조정하여 몬스터 머리 위에 적절한 크기로 보이도록 설정하였다.
World Space UI는 일반 Screen Space UI와 달리 실제 3D 오브젝트처럼 동작하기 때문에, UI의 크기 역시 Transform Scale을 통해 직접 조정해야 한다.
Canvas 설정을 마친 후 Canvas의 자식 오브젝트로 체력바 이미지를 추가하였다.
체력바는 몬스터의 체력 값에 따라 채워지는 정도가 달라져야 하기 때문에 Image 컴포넌트의 Image Type을 Filled로 설정하였다.
Fill Origin을 Horizontal로 설정하면 Fill Amount 값에 따라 이미지가 가로 방향으로 채워지게 된다.
이 값을 몬스터의 현재 체력 비율에 맞게 갱신하면 체력 변화에 따라 체력바가 자연스럽게 감소하도록 구현할 수 있다.

전체 코드
using UnityEngine;
using UnityEngine.UI;
// 몬스터 체력바 설정 클래스
public class MonsterHpBar : MonoBehaviour
{
public Image healthBar; // 체력바로 사용할 Image
private Monster target; // 이 체력바가 표시할 몬스터
Transform player; // 플레이어를 바라보도록 설정하기 위해서 플레이어를 받아옴
private void Awake()
{
player = GameObject.FindWithTag("Player").transform; // 플레이어를 태그를 통해 찾아옴
}
private void Start()
{
transform.gameObject.SetActive(false); // 처음 시작할 때 비활성화
}
// 체력바가 표시될 몬스터 설정 함수
public void SetTarget(Monster target)
{
this.target = target; // 매개변수로 넘어온 몬스터를 타겟으로 설정
healthBar.fillAmount = 1.0f; // 초기 체력은 100%
}
// 체력을 업데이트하는 함수
public void UpdateHealthBar(float healthPercent)
{
healthBar.fillAmount = healthPercent;
}
void Update()
{
if (target == null) Destroy(healthBar); // 만약 타겟(몬스터)이 없으면, 체력바를 생성하지 않음
if (player != null) // 만약 플레이어가 Null이 아니면,
{
Vector3 lookPosition = player.position; // 체력바들이 플레이어를 바라보도록
lookPosition.y = transform.position.y; // 체력바들의 y값(위아래)는 움직이지 않도록.
transform.LookAt(lookPosition); // 최종 벡터값을 바라보도록 설정
}
}
}
using UnityEngine;
using UnityEngine.AI;
public class Monster : MonoBehaviour
{
public static Monster instance;
public enum State
{
IDLE =0,
MOVE,
CHASE,
ATTACK,
DAMAGED,
RETURN,
DIE
};
public State state;
public bool isDie;
public bool isRaidMonster = false;
public string monsterName;
public float maxHp;
[Header("[ 몬스터 스테이터스 ]")]
public float curHp;
public float speed;
public float atk;
[Header("[ 몬스터 범위관련 ]")]
public float chaseDist; //플레이어 인지해서 추적 시작 범위
public float attackDist; //몬스터가 플레이어 공격 시작 범위
public float maxChaseDist; //몬스터 최대 이동 거리(이 거리 밖으로 나가면 원위치)
public NavMeshAgent agent;
public GameObject hpBar;
private void Awake()
{
instance = this;
}
public void CreateHealthBar(float y)
{
// 체력바를 몬스터의 자식으로 인스턴스화
hpBar = Instantiate(Resources.Load<GameObject>("Prefabs/MonsterHpBar"), transform.position, Quaternion.identity);
hpBar.transform.SetParent(this.transform, false);
hpBar.gameObject.SetActive(false);
hpBar.transform.localPosition = new Vector3(0, y, 0); // 몬스터의 머리 위에 위치 조정
hpBar.transform.localScale = new Vector3(0.005f, 0.005f, 0.005f); // 적절한 스케일 조정
hpBar.GetComponent<MonsterHpBar>().SetTarget(this); // 이 몬스터를 체력바에 연결
}
public void UpdateHpBar()
{
hpBar.GetComponent<MonsterHpBar>().UpdateHealthBar(curHp / maxHp); // 맞았을 때, 체력 업데이트
}
public void HpBarActive(float? distance)
{
if (distance != null && distance <= 15) hpBar.SetActive(true);
else hpBar.SetActive(false);
}
public void GetDamage(int n)
{
UpdateHpBar();
curHp -= n;
state = State.DAMAGED;
}
public void GetDamage(float f)
{
curHp -= f;
if (curHp > 0)
{
UpdateHpBar();
state = State.DAMAGED;
}
else if (curHp <= 0)
{
state = State.DIE;
if (hpBar) hpBar.GetComponent<MonsterHpBar>().UpdateHealthBar(0); ;
}
}
// 레이드 관련
public void KillCount(int n)
{
for (int i = 0; i < RegisterQuest.instance.registerQuest.Count; i++)
{
if (RegisterQuest.instance.registerQuest[i].questID == n)
{
RegisterQuest.instance.MonsterKill(monsterName);
}
}
}
public void MonsterKill()
{
if (!isRaidMonster)
{
spawnMonster.instance.KillCount(monsterName);
}
}
}
using UnityEngine;
using UnityEngine.AI;
public class Mushroom : Monster
{
[Header("[ 몬스터 드랍템 ]")]
[SerializeField] Item dropItemPrefabs;
protected Animator anime;
protected Transform target;
protected Vector3 startPos;
protected Vector3 patrolPos;
protected float idleTimer;
protected float idleDuration = 3f;
protected bool isReturningToStart = false;
protected bool isAtk; // 공격 판정용
protected void Awake()
{
anime = GetComponent<Animator>();
agent = GetComponent<NavMeshAgent>();
target = GameObject.FindWithTag("Player").transform;
startPos = transform.position;
}
protected virtual void Start()
{
curHp = maxHp;
state = State.MOVE;
SetRandomPatrolPoint();
CreateHealthBar(1.5f);
}
protected virtual void Update()
{
if (isDie) return;
float distToPlayer = Vector3.Distance(transform.position, target.position);
float distFromStart = Vector3.Distance(transform.position, startPos);
HpBarActive(distToPlayer);
switch (state)
{
case State.IDLE:
UpdateIdle(distToPlayer);
break;
case State.MOVE:
UpdatePatrol(distToPlayer);
break;
case State.CHASE:
UpdateChase(distToPlayer, distFromStart);
break;
case State.ATTACK:
UpdateAttack(distToPlayer, distFromStart);
break;
case State.RETURN:
UpdateReturn();
break;
case State.DAMAGED:
UpdateDamaged();
break;
case State.DIE:
Die();
break;
}
}
// ───────────── 순찰 영역 ─────────────
protected virtual void UpdateIdle(float dist)
{
if (dist <= chaseDist)
{
state = State.CHASE;
return;
}
idleTimer -= Time.deltaTime;
if (idleTimer <= 0f)
{
if (isReturningToStart)
{
// 시작 위치에서 대기 후 랜덤 지점으로
isReturningToStart = false;
SetRandomPatrolPoint();
}
else
{
// 랜덤 지점에서 대기 후 시작 위치로
ReturnToStart();
}
}
}
protected void UpdatePatrol(float dist)
{
if (dist <= chaseDist)
{
state = State.CHASE;
return;
}
if (!agent.pathPending &&
agent.remainingDistance <= agent.stoppingDistance)
{
agent.isStopped = true;
isReturningToStart = false;
state = State.IDLE;
idleTimer = idleDuration;
Animation(true, false, false, false);
}
}
protected void SetRandomPatrolPoint()
{
patrolPos = startPos + new Vector3(
Random.Range(-5f, 5f),
0,
Random.Range(-5f, 5f)
);
agent.isStopped = false;
agent.speed = speed;
agent.SetDestination(patrolPos);
state = State.MOVE;
Animation(false, true, false, false);
}
protected virtual void UpdateReturn()
{
if (!agent.pathPending &&
agent.remainingDistance <= agent.stoppingDistance)
{
agent.isStopped = true;
// 정확한 위치 보정
transform.position = startPos;
state = State.IDLE;
idleTimer = idleDuration;
isReturningToStart = true;
Animation(true, false, false, false);
}
}
protected void ReturnToStart()
{
state = State.RETURN;
agent.isStopped = false;
agent.speed = speed * 2f;
agent.SetDestination(startPos);
Animation(false, false, true, false);
}
// ───────────── 전투 영역 ─────────────
protected void UpdateChase(float dist, float distFromStart)
{
// 최대 추적 거리 도달 즉시 복귀
if (distFromStart >= maxChaseDist - 0.1f)
{
ReturnToStart();
return;
}
if (dist > chaseDist)
{
ReturnToStart();
return;
}
if (dist <= attackDist)
{
state = State.ATTACK;
agent.isStopped = true;
Animation(false, false, false, true);
return;
}
agent.isStopped = false;
agent.speed = speed * 1.5f;
agent.SetDestination(target.position);
LookAtTarget(target.position, 10f);
Animation(false, false, true, false);
}
protected virtual void UpdateAttack(float dist, float distFromStart)
{
if (distFromStart >= maxChaseDist - 0.1f || dist > chaseDist)
{
ReturnToStart();
return;
}
if (dist > attackDist)
{
state = State.CHASE;
return;
}
LookAtTarget(target.position, 15f);
}
// ───────────── 피격 / 사망 ─────────────
protected virtual void UpdateDamaged()
{
anime.SetTrigger("Damage");
if (curHp <= 0)
state = State.DIE;
else
state = isRaidMonster ? State.IDLE : State.CHASE;
}
protected virtual void Die()
{
anime.SetTrigger("Die");
agent.isStopped = true;
isDie = true;
UiManager_.instance.DropItem(dropItemPrefabs, 3);
KillCount(4);
MonsterKill();
Destroy(gameObject, 1f);
}
// ───────────── 플레이어 공격 판정 ─────────────
protected virtual void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
isAtk = true;
}
}
protected virtual void OnTriggerStay(Collider other)
{
if (other.CompareTag("Player")) isAtk = true;
}
protected virtual void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
isAtk = false;
}
}
public void PlayerDamage() // 공격 애니메이션 이벤트
{
if (isAtk)
{
StatusManager.instance.CurrentHp -= atk;
}
}
// ───────────── 공통 ─────────────
protected void Animation(bool idle, bool walk, bool run, bool attack)
{
anime.SetBool("Idle", idle);
anime.SetBool("Walk", walk);
anime.SetBool("Run", run);
anime.SetBool("Attack", attack);
}
protected void LookAtTarget(Vector3 targetPos, float rotSP)
{
Vector3 dir = targetPos - transform.position;
dir.y = 0;
Quaternion rot = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(
transform.rotation,
rot,
Time.deltaTime * rotSP
);
}
// ───────────── 레이드 관련 ─────────────
void TargetSet(GameObject obj)
{
isRaidMonster = true;
target = obj.transform;
chaseDist = 125;
maxChaseDist = 125;
}
}using System.Collections;
using UnityEngine;
public class MushroomBoss : Mushroom
{
[Header("[ 스킬 관리 ]")]
public bool skillFlip; // 스킬 번갈아 쓰기용
public BossSkill[] skills;
private Coroutine recoveryCoroutine;
protected override void Start()
{
base.Start();
CreateHealthBar(2.5f);
}
protected override void Update()
{
if (isDie) return;
UpdateCooltime();
base.Update();
}
// ───────────── 순찰 로직 ─────────────
protected override void UpdateIdle(float dist)
{
if (dist <= chaseDist) StopRecovery();
base.UpdateIdle(dist);
}
protected override void UpdateReturn()
{
// 부모 로직 실행 (도착 체크)
bool wasReturning = state == State.RETURN;
base.UpdateReturn();
// 방금 도착해서 IDLE로 바뀌었다면 회복 시작
if (wasReturning && state == State.IDLE)
{
StartRecovery();
}
}
// ───────────── 전투 및 복귀 로직 ─────────────
protected override void UpdateAttack(float dist, float distFromStart)
{
if (isDie || state == State.DIE) return;
base.UpdateAttack(dist, distFromStart);
// 스킬 사용 시도, 실패 시 기본 공격 애니메이션
if (!TryUseSkill())
{
anime.SetTrigger("Attack");
}
}
// ───────────── 보스 특화 로직 (회복/스킬) ─────────────
void StartRecovery()
{
if (recoveryCoroutine == null && curHp < maxHp)
{
recoveryCoroutine = StartCoroutine(RecoveryHpRoutine());
}
}
void StopRecovery()
{
if (recoveryCoroutine != null)
{
StopCoroutine(recoveryCoroutine);
recoveryCoroutine = null;
}
}
IEnumerator RecoveryHpRoutine()
{
while (curHp < maxHp)
{
yield return new WaitForSeconds(5f);
curHp = Mathf.Min(curHp + 10f, maxHp); // 5초당 10씩 회복
UpdateHpBar();
}
recoveryCoroutine = null;
}
private bool TryUseSkill()
{
// 현재 체력 상황에 따라 사용 가능한 스킬 활성화
if (curHp <= maxHp * 0.6f) skills[0].useAble = true;
if (curHp <= maxHp * 0.3f) skills[1].useAble = true;
int idx = skillFlip ? 1 : 0;
// 선택된 스킬이 준비되지 않았다면 반대쪽 스킬 체크
if (!skills[idx].IsReady() || !skills[idx].useAble)
{
idx = 1 - idx;
}
if (skills[idx].useAble && skills[idx].IsReady())
{
skills[idx].UseSkill();
anime.SetTrigger(skills[idx].skillName);
skillFlip = !skillFlip; // 다음엔 다른 스킬 시도
return true;
}
return false;
}
void UpdateCooltime()
{
foreach (var s in skills)
if (s.useAble) s.UpdateCooldown();
}
// ───────────── 애니메이션 이벤트/판정 ─────────────
public void UseJumpSkill()
{
if (isDie) return;
if (Vector3.Distance(transform.position, target.position) <= 3f)
StatusManager.instance.CurrentHp -= skills[0].damage;
}
public void UseKickSkill()
{
if (isDie) return;
if (isAtk)
StatusManager.instance.CurrentHp -= skills[1].damage;
}
// ───────────── 피격 및 공통 ─────────────
protected override void UpdateDamaged()
{
StopRecovery(); // 맞으면 회복 중단
anime.SetTrigger("Damage");
state = (curHp <= 0) ? State.DIE : State.CHASE;
}
protected override void Die()
{
if (isDie) return;
isDie = true;
state = State.DIE;
StopAllCoroutines();
StopRecovery();
agent.isStopped = true;
agent.ResetPath();
// 기존 트리거 제거
anime.ResetTrigger("Attack");
anime.ResetTrigger("Damage");
foreach (var s in skills)
anime.ResetTrigger(s.skillName);
Animation(false, false, false, false);
anime.CrossFade("Die", 0.1f);
spawnMonster.instance.KillBoss(monsterName);
Destroy(gameObject, 2f);
}
}