Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

인텔리킴의 Unity Studying & Game Analysis

26. 유니티 2D 종스크롤 슈팅 - 적 유닛 만들기 본문

게임 개발 일지/유니티 엔진 공부

26. 유니티 2D 종스크롤 슈팅 - 적 유닛 만들기

인텔리킴 2024. 5. 23. 19:59

적 기체 프리펩

폴리곤 콜라이더

콜라이더 설정 다각형은 Polygon Collider

물리 충돌 변경

Custom Physic Shape로 물리 충돌 도형 변경 가능

옆 기체도 변경

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    public float speed;
    public int health;

    SpriteRenderer spriteRenderer;
    Rigidbody2D rigid;

    public Sprite[] sprites;
    void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
        rigid = GetComponent<Rigidbody2D>();
        rigid.velocity = Vector2.down * speed;
    }

    //적 피격 시 상호작용
    void onHit(int dmg)
    {
        health -= dmg;
        //평소 스프라이트는 0, 피격시 스프라이트는 1
        spriteRenderer.sprite = sprites[1];
        //데미지 들어오고 일정 시간 후 원래대로 스프라이트 돌아오게 함
        Invoke("ReturnSprite", 0.1f);
        if (health <= 0) {
            Destroy(gameObject);
        }
    }

    //적 피격 후 스프라이트 설정
    void ReturnSprite()
    {
        spriteRenderer.sprite = sprites[0];
    }

    void OnTriggerEnter2D(Collider2D collision)
    {
        //만약 경계선에 닿으면 사라짐
        if (collision.gameObject.tag == "BorderBullet")
            Destroy(gameObject);
        //총알에 닿으면 onHit함수 호출
        else if (collision.gameObject.tag == "Bullet") {
            Bullet bullet = collision.gameObject.GetComponent<Bullet>();
            onHit(bullet.bulletDamage);
            //부딫히면 총알 삭제
            Destroy(collision.gameObject);
                }
    }
}

velocity 값을 할당해서 속력을 부여함

히트 시 Bullet 함수에서 데미지를 가져와서 적에게 데미지 

 

적 기체 체력, 스피드, 스프라이트 이미지 삽입

 

피격 후 사라짐
이 후 적들 프리팹으로 저장

 

* 프리팹으로 저장후 Transform 초기화 해야함

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    //적, 소환 위치 설정
    public GameObject[] enemyObjects;
    public Transform[] spawnPoints;
    
    //적 스폰 딜레이 설정
    public float maxSpawnDelay;
    public float curSpawnDelay;
    
    void Update()
    {
        curSpawnDelay += Time.deltaTime;
        
        if (curSpawnDelay > maxSpawnDelay)
        {
            SpawnEnemy();
            maxSpawnDelay = Random.Range(0.5f, 2.0f);
            curSpawnDelay = 0;
        }
    }

    //적 소환 함수
    void SpawnEnemy()
    {
        //랜덤 변수를 통해 소환할 적과 적 위치 조정
        int randomEnemy = Random.Range(0, 3);
        int randomPoint = Random.Range(0, 5);

        Instantiate(enemyObjects[randomEnemy], spawnPoints[randomPoint].position, spawnPoints[randomPoint].rotation);
    }
}

RandomRange는 현재 사용하지 않는 함수

Random 함수는 매개변수에 따라 변수형이 변경

* Instantiate() : 매개변수 오브젝트를 생성하는 함수

인스펙터 창에서 아이콘 변경으로 안보이는 오브젝트 조정 가능
게임 매니저에 모두 채워넣음

* 배열에 빈 공간이 있으면 오류 날 확률 높음!

적이 랜덤 생성됨