유니티 보스 구현 - yuniti boseu guhyeon


유니티 게임 개발하기/2D 게임 개발일지

2015. 6. 10. 22:12

 보스의 패턴을 만들어서 넣어두면 조건에 맞춰서 그걸 발동해주는 
서랍 스크립트를 만들어 봤습니다.

스펠(패턴)레벨은 패턴을 여러개 넣을수록 늘어날 수 있고, 
보스의 HP가 몇일 때 다음 스펠로 넘어갈지를 KeyHp 변수에서 지정하여 패턴의 전환이 가능합니다.

실제 스펠을 실험용으로 만들어 넣고  실험해본 결과 
무리없이 돌아가는것을 확인했습니다.

실제로 보스는 한개가 아니라 여러개를 만들것이기 때문에, 

나름의 모듈화를 시켜서 해당 프리팹을 호출하면 바로 보스로 기능할 수 있도록 구현했습니다. 

실제 개발을 더 진행해봐야 알겟지만 아직까지는 정말 괜찮은 것 같아요.

다음은 스크립트 전체 내용입니다.

유니티 보스 구현 - yuniti boseu guhyeon

GetChild() 함수 가 참 사용법이 쉽고 유용하다는게 느껴집니다.

어떤 오브제인지 지정할 필요 없이 차일드화된 순서대로 차일드를 가져온다는건 정말 편한거 같아요.

'유니티 게임 개발하기/2D 게임 개발일지' Related Articles


보스를 한 번 구현해보자

보스의 기능은 단순하게 총알 쏘기 이다.

보통 보스들은 Phase1 , 2, 3 … 을 가지게 되므로 이를 대비하여 준비해보자.

유니티 보스 구현 - yuniti boseu guhyeon

복잡한 거 다 버리고

보스 구현을 위한 씬을 만들어주자.

유니티 보스 구현 - yuniti boseu guhyeon

이렇게 대충 보스를 넣어준다.

이제 총알을 쏘기 위한 준비가 필요하다.

Weapon Script 를 만들어 코드를 짜보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Weapon : MonoBehaviour
{
public GameObject prefab_Bullet;
public bool currentFire = false;
public bool isFiring = false;
public float attackDelay;
private float updateDelay = 0f;
private void FixedUpdate()
{
Update_Firing();
}
private void Update_Firing()
{
if (isFiring)
{
updateDelay += Time.deltaTime;
if (attackDelay <= updateDelay)
{
updateDelay = 0;
PlayFire(currentFire);
}
}
}
public void StartFire()
{
if (currentFire == isFiring)
{
currentFire = true;
PlayFire(currentFire);
}
else
currentFire = true;
}
public void StopFire()
{
currentFire = false;
}
void PlayFire(bool _isFire)
{
isFiring = _isFire;
if (currentFire)
PlaySkill();
}
protected virtual void PlaySkill()
{
}
}

이제 이를 상속받은 BossSkill01 Script 를 만들거다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BossSkill01 : Weapon
{
protected override void PlaySkill()
{
GameObject obj = Instantiate(prefab_Bullet, transform.position,
Quaternion.identity);
}
}

다음으로는 BossBullet 이 필요한데

이미지는 동그라미 아무 Sprite 나 가져오면 되고

Bullet 은 아래쪽으로 움직이도록 해주기 위해

Movement 라는 Script 를 만들자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public Rigidbody2D rb;
public float speed;
public Vector2 direction;
private void FixedUpdate()
{
rb.MovePosition(rb.position +
speed * direction * Time.deltaTime);
}
}

이제 Unity 로 돌아가 이들을 설정해주자.

유니티 보스 구현 - yuniti boseu guhyeon

총알에 Movement Script 를 넣어주고

유니티 보스 구현 - yuniti boseu guhyeon

Boss 자식으로 BossSkill01 이라는 객체를 만들어

BossSkill01 Script 를 넣어주고 BossBullet 과 Delay 를 입력한다.

다음으로 Boss Script 를 짜주자

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Boss : MonoBehaviour
{
public Weapon playWeapon;
public Weapon weaponPhase1;
void Start()
{
Phase1();
}
IEnumerator PlayWeapon()
{
while(playWeapon != null)
{
playWeapon.StartFire();
yield return new WaitForSeconds(playWeapon.attackDelay);
playWeapon.StopFire();
}
}
void SetWeapon(Weapon _weapon)
{
if (playWeapon != null)
playWeapon.gameObject.SetActive(false);
playWeapon = _weapon;
playWeapon.gameObject.SetActive(true);
}
void Phase1()
{
SetWeapon(weaponPhase1);
StartCoroutine(PlayWeapon());
}
}

다시 Unity 로 돌아가서

유니티 보스 구현 - yuniti boseu guhyeon

이렇게 설정을 해주고

위에서 빼먹었는데

유니티 보스 구현 - yuniti boseu guhyeon

Bullet Script 에 Rigidbody2D 를 넣어주자.

이제 테스트해보면

유니티 보스 구현 - yuniti boseu guhyeon

1초마다 총을 쏘는 Boss 가 완성되었다.

다음에는 보스의 체력에 따라 phase1 , 2 , 3 이 나오도록 해보자!

오늘은 여기까지 :)