[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(10) 적 생성, 충돌, 제거
2023. 8. 31. 18:02ㆍUnity
728x90
반응형
스프라이트들로 Enemy 애니메이션을 생성하고, Rigidbody 2D, Circle Collider 2D를 추가한다. Tag와 Layer도 Enemy로 설정한다.
public class EnemyScript : MonoBehaviour
{
public int type = 0;
public int hp = 3;
public float enemySpeed = 4;
void Start()
{
switch (type)
{
case 0:
hp = 10; enemySpeed = 1.5f;
break;
case 1:
hp = 20; enemySpeed = 1.4f;
break;
}
}
void Update()
{
transform.position += Vector3.left * enemySpeed * Time.deltaTime;
}
}
새 스크립트를 만들어서 큰 적과 작은 적을 구분 지어 switch 함수를 통해 다른 체력과 스피드를 적용하였다.
Hierarchy 창에서 각각 다른 Type을 0, 1로 설정하면 된다.
각 타입에 맞게 잘 설정되었다.
이제, 적도 소행성처럼 랜덤 위치에서 랜덤 타입으로 생성되게 할 것이다.
public class GameManager : MonoBehaviour
{
public List<GameObject> enemies;
public GameObject asteroid;
public float time = 0;
public float spawnTime = 3;
float spawnSpeed;
void Update()
{
spawnSpeed = Random.Range(1.0f, 5.0f);
time += Time.deltaTime * spawnSpeed;
if(time > spawnTime)
{
time = 0;
int check = Random.Range(0, 2);
if(check == 0)
{
Instantiate(asteroid, new Vector3(Random.Range(9.0f, 12.0f), Random.Range(-4.0f, 4.0f), 0), Quaternion.identity);
}
else
{
int type = Random.Range(0, 2);
Instantiate(enemies[type], new Vector3(Random.Range(9.0f, 12.0f), Random.Range(-4.0f, 4.0f), 0), Quaternion.identity);
}
}
}
}
GameManager 스크립트를 수정한다. public List<GameObject> enemies;로 리스트를 추가하였고, check라는 int 변수에 0, 1, 2의 랜덤 중에서 0에 해당하면 소행성을, 1, 2에 해당하면 적을 생성한다. 적 또한 랜덤으로 소환한다. int 형태의 랜덤값은 최솟값 이상, 최댓값 미만이기 때문에 0과 1타입 중 랜덤으로 나온다.
플레이어의 미사일이 적에게 닿아 데미지를 입히고 적 오브젝트를 지우는 코드를 추가해야한다.
ShootScript에서 collision.tag에 "Enemy"를 추가하여 소행성과 같은 코드를 추가한다.
public class ShootScript : MonoBehaviour
{
public GameObject explosion;
public GameObject gem;
public GameObject hitEffect;
public float speed = 10;
void Update()
{
transform.position += Vector3.right * Time.deltaTime * speed;
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
void OnTriggerEnter2D(Collider2D collision)
{
print(collision.tag);
if(collision.tag == "Asteroid")
{
AsteroidScript asteroidScript = collision.gameObject.GetComponent<AsteroidScript>();
asteroidScript.hp -= 3;
Instantiate(hitEffect, transform.position, Quaternion.identity);
if(asteroidScript.hp <= 0 )
{
Instantiate(explosion, collision.transform.position, Quaternion.identity);
Vector3 randomPosGem = new Vector3(Random.Range(-0.1f, 0.1f), Random.Range(-0.1f, 0.1f), 0);
Instantiate(gem, transform.position + randomPosGem, Quaternion.identity);
Destroy(collision.gameObject);
}
Destroy(gameObject);
}
if (collision.tag == "Enemy")
{
EnemyScript enemyScript = collision.gameObject.GetComponent<EnemyScript>();
enemyScript.hp -= 3;
Instantiate(hitEffect, transform.position, Quaternion.identity);
if (enemyScript.hp <= 0)
{
Instantiate(explosion, collision.transform.position, Quaternion.identity);
Vector3 randomPosGem = new Vector3(Random.Range(-0.1f, 0.1f), Random.Range(-0.1f, 0.1f), 0);
Instantiate(gem, transform.position + randomPosGem, Quaternion.identity);
Destroy(collision.gameObject);
}
Destroy(gameObject);
}
}
}
Enemy 스크립트에 void OnBecameInvisible() 함수를 추가한다.
public class EnemyScript : MonoBehaviour
{
public int type = 0;
public int hp = 3;
public float enemySpeed = 4;
void Start()
{
switch (type)
{
case 0:
hp = 10; enemySpeed = 1.5f;
break;
case 1:
hp = 20; enemySpeed = 1.4f;
break;
}
}
void Update()
{
transform.position += Vector3.left * enemySpeed * Time.deltaTime;
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
}
728x90
반응형
'Unity' 카테고리의 다른 글
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(12) 적 미사일 추가, 미사일 충돌 (1) | 2023.09.18 |
---|---|
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(11) 젬 점수, 젬 먹기 (0) | 2023.09.18 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(9) 소행성 랜덤 생성기 (0) | 2023.08.31 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(8) 소행성 파괴 이펙트 (0) | 2023.08.31 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(7) 젬 생성 (0) | 2023.08.31 |