BossController.cs로 스크립트를 만들어 Boss 폴더에 저장합고 Boss에 어태치합니다.
변수
hp나 반응거리는 적캐릭터와 같습니다. 발사하는 총알의 속성도 같습니다. inAttack변수는 공격중인지 여부를 판단하는 값입니다.
// 체력
public int hp = 10;
// 반응 거리
public float reactionDistance = 7.0f;
public GameObject bulletPrefab; //총알
public float shootSpeed = 5.0f; //총알 속도
//공격중인지 여부
bool inAttack = false;
Update()
"Player" Tag로 Player를 찾아서 공격범위이면 inAttack=true, 공격 애니메이션 Play("BossAttack")등 공격처리를 합니다.
void Update() {
if (hp > 0) {
//Player 게임 오브젝트 가져오기
GameObject player = GameObject.FindGameObjectWithTag("Player");
if (player != null) {
//플레이어와의 거리 확인
Vector3 plpos = player.transform.position;
float dist = Vector2.Distance(transform.position, plpos);
if (dist <= reactionDistance && inAttack == false) {
//범위 안 & 공격 중이 아니면 공격 애니메이션
inAttack = true;
// 애니메이션 변경
GetComponent<Animator>().Play("BossAttack");
} else if (dist > reactionDistance && inAttack) {
inAttack = false;
// 애니메이션 변경
GetComponent<Animator>().Play("BossIdle");
}
} else {
inAttack = false;
// 애니메이션 변경
GetComponent<Animator>().Play("BossIdle");
}
}
}
OnCollisionEnter2D()
화살과 충돌하면 hp--처리하고 사망했다면 Play("BossDead")후 Destry()로 지우는 사망처리를 합니다.
private void OnCollisionEnter2D(Collision2D collision) {
if (collision.gameObject.tag == "Arrow") {
//데미지
hp--;
if (hp <= 0) {
//사망!
//충돌 판정 비활성
GetComponent<CircleCollider2D>().enabled = false;
// 애니메이션 변경
GetComponent<Animator>().Play("BossDead");
//1초 뒤에 제거
Destroy(gameObject, 1);
}
}
}
Attack()
플레이어와의 각도를 구해 총알을 발사합니다.
void Attack() {
//발사 위치 오브젝트 가져오기
Transform tr = transform.Find("gate");
GameObject gate = tr.gameObject;
//총알을 발사할 벡터 만들기
GameObject player = GameObject.FindGameObjectWithTag("Player");
if (player != null) {
float dx = player.transform.position.x - gate.transform.position.x;
float dy = player.transform.position.y - gate.transform.position.y;
//아크 탄젠트2 함수로 각도(라디안) 구하기
float rad = Mathf.Atan2(dy, dx);
//라디안을 각도로 변환
float angle = rad * Mathf.Rad2Deg;
//Prefab으로 총알 오브젝트 만들기(진행 방향으로 회전)
Quaternion r = Quaternion.Euler(0, 0, angle);
GameObject bullet = Instantiate(bulletPrefab, gate.transform.position, r);
float x = Mathf.Cos(rad);
float y = Mathf.Sin(rad);
Vector3 v = new Vector3(x, y) * shootSpeed;
//발사
Rigidbody2D rbody = bullet.GetComponent<Rigidbody2D>();
rbody.AddForce(v, ForceMode2D.Impulse);
}
}
애니메이션 이벤트 설정하기
씬뷰의 보스 캐릭터를 선택하고 애니메이션 창을 엽니다. 팝업메뉴에서 BossAttack를 선택하고 타임라인을 클릭후 이벤트추가▮+를 클릭하면 이벤트가 추가되고 추가된 이벤트를 선택하면 게임오브젝트에 어태치된 메서드 Attack()을 선택할 수 있습니다.
이제 애니메이션이 해당 프레임에 도달하면 Attack()메소드가 호출되면서 총알이 발사 됩니다.
Boss오브젝트 BossController.cs 컴포넌트의 Bullet Prefab에 프로젝트뷰 Boss폴더의 Bullet Prefab을 끌어다 놓습니다.
게임 실행하기
보스캐릭터가 플레이어 캐릭터를 향해 총알을 발사 합니다. 총알속도 반응 거리는 스크립트에서 설정할수 있습니다.
보스캐릭터를 Boss 폴더로 끌어다 프리팹으로 만듭니다.
'유니티2D게임 > 탑뷰 액션 게임 완성' 카테고리의 다른 글
10.3.x 최종 보스 스테이지 만들기 (0) | 2023.05.25 |
---|---|
10.3.x 보스 캐릭터 전투의 카메라 동작 조정하기 (0) | 2023.05.25 |
10.3.x 보스 캐릭터가 발사하는 총알 오브젝트 만들기 (0) | 2023.05.25 |
10.3 보스 스테이지 만들기 (0) | 2023.05.25 |
JSON을 사용해 씬의 상태 기록하기 (2) | 2023.05.25 |