2023. 9. 18. 18:00ㆍUnity
적절한 적 발사체 스프라이트를 찾아서 적용해주고 Tag, Layer를 추가하여 설정한다. RigidBody 2D, Box Collider 2D를 추가하고 EnemyShoot 스크립트를 새로 만든다.
Player와 EnemyShoot의 교차점을 체크하여 Physics를 적용한다.
public class EnemyShoot : MonoBehaviour
{
public float speed = 4;
void Start()
{
}
void Update()
{
transform.Translate(Vector3.left * speed * Time.deltaTime);
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
}
코드는 위와 같이 작성하여 왼쪽으로 진행되게 만든다.
이제 적이 미사일을 발사해야 하므로 EnemyScript를 수정하여 위에서 만든 적 미사일 스프라이트를 적용한다. 적 타입마다 쏘는 시간을 다르게 하기 위해 maxShootTime 변수를, 쏘는 속도도 다르게 하기 위해 shootSpeed 변수를 생성하였다.
public class EnemyScript : MonoBehaviour
{
public int type = 0;
public int hp = 3;
public float enemySpeed = 4;
public float gem;
public GameObject enemyShoot;
public float maxShootTime;
public float shootSpeed;
...
void Start()
{
switch (type)
{
case 0:
hp = 10; enemySpeed = 1.5f; gem = 3; maxShootTime = Random.Range(1, 3); shootSpeed = 3;
break;
case 1:
hp = 20; enemySpeed = 1.4f; gem = 4; maxShootTime = Random.Range(1, 3); shootSpeed = 4;
break;
}
}
void Update()
{
time += Time.deltaTime;
if(time > maxShootTime)
{
time = 0;
GameObject shootObj = Instantiate(enemyShoot, transform.position, Quaternion.identity);
EnemyShoot shootScript = shootObj.GetComponent<EnemyShoot>();
shootScript.speed = shootSpeed;
}
transform.position += Vector3.left * enemySpeed * Time.deltaTime;
}
이후 코드는 적 타입에 발사체 로딩 시간, 발사체 속도 변수를 넣어주고, time 변수를 하나 만들어서 일정 시간 이후 maxShootTime 값을 넘었을 때 시간을 초기화 하고 Instantiate로 enemyShoot을 가져오고 EnemyShoot 스크립트에서 스피드를 가져와 shootSpeed를 대입해준다.
이제 PlayerScript를 수정하여 다른 오브젝트의 콜라이더와 부딪혔을 때 파괴되는 기능을 넣을 것이다.
public class PlayerScript : MonoBehaviour
{
public GameObject explosion;
...
explosion에 이전에 만들었던 프리팹을 넣는다.
이제 OnTriggerEnter2D에 else if를 추가하여 "Enemy", "Asteroid", "EnemyShoot" 태그가 붙은 오브젝트의 콜라이더와 충돌하였을 때 둘 다 Destroy 되고 Instantiate으로 explosion 프리팹을 해당 위치에, 그리고 적과 소행성의 위치에 파괴되는 이펙트를 넣어준다.
void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.tag == "Item")
{
GemScript gemScript = collision.gameObject.GetComponent<GemScript>();
GameManager.instance.gem += gemScript.gem;
print("Gem" + GameManager.instance.gem);
Destroy(collision.gameObject);
}
else if(collision.gameObject.tag == "Enemy" || collision.gameObject.tag == "Asteroid")
{
Destroy(gameObject);
Destroy(collision.gameObject);
Instantiate(explosion, transform.position, Quaternion.identity);
Instantiate(explosion, collision.gameObject.transform.position, Quaternion.identity);
}
else if (collision.gameObject.tag == "EnemyShoot")
{
Destroy(gameObject);
Destroy(collision.gameObject);
Instantiate(explosion, transform.position, Quaternion.identity);
}
}
'Unity' 카테고리의 다른 글
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(13) 코인 점수 표시하기, UI 메뉴 이미지 추가하기 (0) | 2023.09.22 |
---|---|
[Unity] 캔버스(Canvas)와 UI, Text, RectTransform (0) | 2023.09.22 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(11) 젬 점수, 젬 먹기 (0) | 2023.09.18 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(10) 적 생성, 충돌, 제거 (0) | 2023.08.31 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(9) 소행성 랜덤 생성기 (0) | 2023.08.31 |